From e397a535495fe4a9886722c75df22b4325b40e41 Mon Sep 17 00:00:00 2001 From: justme1968 Date: Mon, 2 May 2016 14:10:04 +0000 Subject: [PATCH] HUE: enabled new scene api, use new scene api in LightScene git-svn-id: https://svn.fhem.de/fhem/trunk@11366 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/30_HUEBridge.pm | 30 +++++++++++++++++------------- fhem/FHEM/31_HUEDevice.pm | 20 +++++++++++++++++--- fhem/FHEM/31_LightScene.pm | 22 +++++++++++++++------- 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/fhem/FHEM/30_HUEBridge.pm b/fhem/FHEM/30_HUEBridge.pm index 386292a06..0ab6dcd17 100644 --- a/fhem/FHEM/30_HUEBridge.pm +++ b/fhem/FHEM/30_HUEBridge.pm @@ -387,19 +387,23 @@ HUEBridge_Set($@) return undef; } elsif($cmd eq 'savescene') { - return "usage: savescene " if( @args < 3 ); - - my $obj = { 'name' => join( ' ', @args[1..@args-2]), - 'lights' => HUEBridge_string2array($args[@args-1]), - }; - my $result; - if( 0 && $hash->{helper}{apiversion} && $hash->{helper}{apiversion} >= (1<<16) + (11<<8) ) { - #FIXME: currently not supported. LightScene needs scene id. - $obj->{recycle} = JSON::true if( $arg ); + if( $hash->{helper}{apiversion} && $hash->{helper}{apiversion} >= (1<<16) + (11<<8) ) { + return "usage: savescene " if( @args < 2 ); + + my $obj = { 'name' => join( ' ', @args[0..@args-2]), + 'recycle' => JSON::true, + 'lights' => HUEBridge_string2array($args[@args-1]), + }; + $result = HUEBridge_Call($hash, undef, "scenes", $obj, 'POST'); } else { + return "usage: savescene " if( @args < 3 ); + + my $obj = { 'name' => join( ' ', @args[1..@args-2]), + 'lights' => HUEBridge_string2array($args[@args-1]), + }; $result = HUEBridge_Call($hash, undef, "scenes/$arg", $obj, 'PUT'); } @@ -531,12 +535,12 @@ HUEBridge_Get($@) my $ret = ""; foreach my $key ( sort {$a cmp $b} keys %{$result} ) { $ret .= sprintf( "%-20s %-20s", $key, $result->{$key}{name} ); - $ret .= sprintf( "%i %i %i %-20s %-20s", $result->{$key}{recycle}, $result->{$key}{locked},$result->{$key}{version}, $result->{$key}{owner}, $result->{$key}{lastupdated} ) if( $arg eq 'detail' ); + $ret .= sprintf( "%i %i %i %-40s %-20s", $result->{$key}{recycle}, $result->{$key}{locked},$result->{$key}{version}, $result->{$key}{owner}, $result->{$key}{lastupdated}?$result->{$key}{lastupdated}:'' ) if( $arg && $arg eq 'detail' ); $ret .= sprintf( " %s\n", join( ",", @{$result->{$key}{lights}} ) ); } if( $ret ) { my $header = sprintf( "%-20s %-20s", "ID", "NAME" ); - $header .= sprintf( "%s %s %s %-20s %-20s", "R", "L", "V", "OWNER", "LAST UPDATE" ) if( $arg eq 'detail' ); + $header .= sprintf( "%s %s %s %-40s %-20s", "R", "L", "V", "OWNER", "LAST UPDATE" ) if( $arg && $arg eq 'detail' ); $header .= sprintf( " %s\n", "LIGHTS" ); $ret = $header . $ret; } @@ -1291,14 +1295,14 @@ HUEBridge_HTTP_Request($$$@) The lights are given as a comma sparated list of fhem device names or bridge light numbers.
  • deletegroup <name>|<id>
    Deletes the given group in the bridge and deletes the associated fhem device.
  • -
  • savescene <id> <name> <lights>
    +
  • 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.
  • -
  • deletwhitelist <key>
    +
  • deletewhitelist <key>
    Deletes the given key from the whitelist in the bridge.
  • touchlink
    perform touchlink action
  • diff --git a/fhem/FHEM/31_HUEDevice.pm b/fhem/FHEM/31_HUEDevice.pm index 3a9b605b9..e63a0c600 100644 --- a/fhem/FHEM/31_HUEDevice.pm +++ b/fhem/FHEM/31_HUEDevice.pm @@ -543,9 +543,22 @@ HUEDevice_Set($@) return undef; } elsif( $cmd eq 'savescene' ) { - return "usage: savescene " if( @args != 1 ); + if( $defs{$name}->{IODev}->{helper}{apiversion} && $defs{$name}->{IODev}->{helper}{apiversion} >= (1<<16) + (11<<8) ) { + return "usage: savescene " if( @args < 1 ); - return fhem( "set $hash->{IODev}{NAME} savescene $aa[1] $aa[1] $hash->{NAME}" ); + return fhem( "set $hash->{IODev}{NAME} savescene ". join( ' ', @aa[1..@aa-1]). " $hash->{NAME}" ); + + } else { + return "usage: savescene " if( @args != 1 ); + + return fhem( "set $hash->{IODev}{NAME} savescene $aa[1] $aa[1] $hash->{NAME}" ); + + } + + } elsif( $cmd eq 'deletescene' ) { + return "usage: deletescene " if( @args != 1 ); + + return fhem( "set $hash->{IODev}{NAME} deletescene $aa[1]" ); } elsif( $cmd eq 'scene' ) { return "usage: scene " if( @args != 1 ); @@ -682,7 +695,7 @@ HUEDevice_Set($@) #$list .= " dim06% dim12% dim18% dim25% dim31% dim37% dim43% dim50% dim56% dim62% dim68% dim75% dim81% dim87% dim93% dim100%" if( $subtype =~ m/dimmer/ ); $list .= " lights" if( $hash->{helper}->{devtype} eq 'G' ); - $list .= " savescene scene" if( $hash->{helper}->{devtype} eq 'G' ); + $list .= " savescene deletescene scene" if( $hash->{helper}->{devtype} eq 'G' ); $list .= " rename"; return SetExtensions($hash, $list, $name, @aa); @@ -1276,6 +1289,7 @@ HUEDevice_Parse($$)
  • immediateUpdate

  • savescene <id>
  • +
  • deletescene <id>
  • scene

  • lights <lights>
    diff --git a/fhem/FHEM/31_LightScene.pm b/fhem/FHEM/31_LightScene.pm index 40e2db5d9..ca55fd6fb 100644 --- a/fhem/FHEM/31_LightScene.pm +++ b/fhem/FHEM/31_LightScene.pm @@ -413,12 +413,13 @@ LightScene_Load($) } sub -LightScene_SaveDevice($$;$) +LightScene_SaveDevice($$;$$) { - my($hash,$d,$scene) = @_; + my($hash,$d,$scene,$desc) = @_; my $state = ""; my $icon = undef; + my $id = undef; my $type = $defs{$d}->{TYPE}; $type = "" if( !defined($type) ); @@ -496,10 +497,16 @@ LightScene_SaveDevice($$;$) if( $defs{$d}->{helper}->{devtype} eq "G" ) { if( $scene ) { - my $id = "FHEM-$hash->{NAME}-$scene"; + if( ref($desc) eq 'HASH' ) { + $id = $desc->{id} if( $desc->{id} ); + fhem( "set $d deletescene $id" ); + } + my $name = "FHEM-$hash->{NAME}-$scene"; + my $ret = fhem( "set $d savescene $name" ); + if( $ret =~ m/^created (.*)/ ) { + $id = $1; + } $state = "scene $id"; - #FIXME: id too long, new POST api does not use id - fhem( "set $d savescene $id" ); } else { $state = ""; } @@ -537,7 +544,7 @@ LightScene_SaveDevice($$;$) $state = Value($d); } - return($state,$icon,$type); + return($state,$icon,$type,$id); } sub @@ -665,13 +672,14 @@ LightScene_Set($@) } if( $cmd eq "save" ) { - my($state,$icon,$type) = LightScene_SaveDevice($hash,$d,$scene); + my($state,$icon,$type,$id) = LightScene_SaveDevice($hash,$d,$scene,$hash->{SCENES}{$scene}{$d}); if( $icon || ref($state) eq 'ARRAY' || $type eq "SWAP_0000002200000003" || $type eq "HUEDevice" ) { my %desc; $desc{state} = $state; my ($icon, $link, $isHtml) = FW_dev2image($d); $desc{icon} = $icon; + $desc{id} = $id if( $id ); $hash->{SCENES}{$scene}{$d} = \%desc; } else { $hash->{SCENES}{$scene}{$d} = $state;