From 881ec3aa3ad40aa58bb374ae8fc342f2d35f9984 Mon Sep 17 00:00:00 2001 From: justme1968 Date: Wed, 3 Aug 2016 18:39:57 +0000 Subject: [PATCH] 30_HUEBridge.pm: added createsensor, deletesensor, setsensor commands, added optional detail parameter to sensors command git-svn-id: https://svn.fhem.de/fhem/trunk@11887 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/30_HUEBridge.pm | 102 +++++++++++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 6 deletions(-) diff --git a/fhem/FHEM/30_HUEBridge.pm b/fhem/FHEM/30_HUEBridge.pm index fcffcdd24..8941e4156 100644 --- a/fhem/FHEM/30_HUEBridge.pm +++ b/fhem/FHEM/30_HUEBridge.pm @@ -468,6 +468,84 @@ HUEBridge_Set($@) return undef; + } elsif($cmd eq 'createsensor') { + return "usage: createsensor " if( @args < 5 ); + + return "usage: type must be one of: Switch OpenClose Presence Temperature Humidity GenericFlag GenericStatus " if( @args[@args-2] !~ m/Switch|OpenClose|Presence|Temperature|Humidity|GenericFlag|GenericStatus/ ); + + my $obj = { 'name' => join( ' ', @args[0..@args-5]), + 'modelid' => @args[@args-4], + 'swversion' => @args[@args-3], + 'type' => "CLIP@args[@args-2]", + 'uniqueid' => @args[@args-1], + 'manufacturername' => 'FHEM-HUE', + }; + + my $result = HUEBridge_Call($hash, undef, 'sensors', $obj, 'POST'); + return $result->{error}{description} if( $result->{error} ); + +# if( $result->{success} ) { +# my $code = $name ."-S". $result->{success}{id}; +# my $devname = "HUEDevice" . $id; +# $devname = $name ."_". $devname if( $hash->{helper}{count} ); +# my $define = "$devname HUEDevice sensor $id IODev=$name"; +# +# Log3 $name, 4, "$name: create new device '$devname' for address '$id'"; +# +# my $cmdret= CommandDefine(undef,$define); +# +# return "created $modules{HUEDevice}{defptr}{$code}->{NAME}" if( defined($modules{HUEDevice}{defptr}{$code}) ); +# } + + return undef; + + } elsif($cmd eq 'deletesensor') { + return "usage: deletesensor " if( @args != 1 ); + + if( defined $defs{$arg} && $defs{$arg}{TYPE} eq 'HUEDevice' ) { + return "$arg is not a hue sensors" if( $defs{$arg}{ID} != m/^G/ ); + $defs{$arg}{ID} =~ m/G(.*)/; + $arg = $1; + } + + my $code = $name ."-G". $arg; + if( defined($modules{HUEDevice}{defptr}{$code}) ) { + CommandDelete( undef, "$modules{HUEDevice}{defptr}{$code}{NAME}" ); + CommandSave(undef,undef) if( AttrVal( "autocreate", "autosave", 1 ) ); + } + + return "$arg is not hue sensors number" if( $arg !~ m/^\d+$/ ); + + my $result = HUEBridge_Call($hash, undef, "sensors/$arg", undef, 'DELETE'); + return $result->{error}{description} if( $result->{error} ); + + return undef; + + } elsif($cmd eq 'setsensor') { + return "usage: setsensor " if( @args < 2 ); + + my $id = $args[0]; + if( defined $defs{$arg} && $defs{$arg}{TYPE} eq 'HUEDevice' ) { + return "$arg is not a hue sensors" if( $defs{$id}{ID} != m/^G/ ); + $defs{$arg}{ID} =~ m/G(.*)/; + $id = $1; + } + + return "$id is not hue sensors number" if( $id !~ m/^\d+$/ ); + + my $state = join( ' ', @args[1..@args-1]); + my $decoded = eval { decode_json($state) }; + if( $@ ) { + Log3 $name, 2, "$name: json error: $@ in $state"; + return undef; + } + $state = $decoded; + + my $result = HUEBridge_Call($hash, undef, "sensors/$id/state", $state, 'PUT'); + return $result->{error}{description} if( $result->{error} ); + + return undef; + } elsif($cmd eq 'deletewhitelist') { return "usage: deletewhitelist " if( @args != 1 ); @@ -502,7 +580,7 @@ HUEBridge_Set($@) } else { - my $list = "delete creategroup deletegroup savescene deletescene modifyscene scene deletewhitelist touchlink:noArg checkforupdate:noArg autodetect:noArg autocreate:noArg statusRequest:noArg"; + my $list = "delete creategroup deletegroup savescene deletescene modifyscene scene createsensor deletesensor setsensor deletewhitelist touchlink:noArg checkforupdate:noArg autodetect:noArg autocreate:noArg statusRequest:noArg"; $list .= " swupdate:noArg" if( defined($hash->{updatestate}) && $hash->{updatestate} =~ '^2' ); return "Unknown argument $cmd, choose one of $list"; } @@ -575,9 +653,15 @@ HUEBridge_Get($@) my $code = $name ."-S". $key; my $fhem_name =""; $fhem_name = $modules{HUEDevice}{defptr}{$code}->{NAME} if( defined($modules{HUEDevice}{defptr}{$code}) ); - $ret .= sprintf( "%2i: %-15s %-15s %-15s\n", $key, $result->{$key}{name}, $fhem_name, $result->{$key}{type} ); + $ret .= sprintf( "%2i: %-15s %-15s %-20s", $key, $result->{$key}{name}, $fhem_name, $result->{$key}{type} ); + $ret .= sprintf( " %s", encode_json($result->{$key}{state}) ) if( $arg && $arg eq 'detail' ); + $ret .= "\n"; + } + if( $arg && $arg eq 'detail' ) { + $ret = sprintf( "%2s %-15s %-15s %-20s %s\n", "ID", "NAME", "FHEM", "TYPE", "STATE" ) .$ret if( $ret ); + } else { + $ret = sprintf( "%2s %-15s %-15s %-20s\n", "ID", "NAME", "FHEM", "TYPE" ) .$ret if( $ret ); } - $ret = sprintf( "%2s %-15s %-15s %-15s\n", "ID", "NAME", "FHEM", "TYPE" ) .$ret if( $ret ); return $ret; } elsif($cmd eq 'whitelist') { @@ -1351,7 +1435,7 @@ HUEBridge_Attr($$$) list the groups known to the bridge.
  • scenes [detail]
    list the scenes known to the bridge.
  • -
  • sensors
    +
  • sensors [detail]
    list the sensors known to the bridge.
  • whitelist
    list the whitlist of the bridge.
  • @@ -1376,10 +1460,16 @@ HUEBridge_Attr($$$)
  • savescene <name> <lights>
    Create a scene from the current state of <lights> in the bridge. The lights are given as a comma sparated list of fhem device names or bridge light numbers.
  • -
  • scene <id>
    - Recalls the scene with the given id.
  • modifyscene <id> <light> <light-args>
    Modifys the given scene in the bridge.
  • +
  • scene <id>
    + Recalls the scene with the given id.
  • +
  • createsensor <name> <modelid> <swversion> <type> <uniqueid>
    + Creates a new CLIP (IP) sensor in the bridge.
  • +
  • deletesensor <id>
    + Deletes the given sensor in the bridge and deletes the associated fhem device.
  • +
  • setsensor <id> <json>
    + Deletes the given key from the whitelist in the bridge.
  • deletewhitelist <key>
    Deletes the given key from the whitelist in the bridge.
  • touchlink