diff --git a/fhem/CHANGED b/fhem/CHANGED index 8545878a3..55a130d55 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 30_HUEBridge, 31_HUEDevice: added deCONZ scenes (by shadowghost) - feature: 14_SD_RSL.PM: support for setExtensions added - change: 59_Weather: delete table options in commandref - bugfix: 73_AutoShuttersControl: fix Commandref, skip ExternalTrigger Drive diff --git a/fhem/FHEM/30_HUEBridge.pm b/fhem/FHEM/30_HUEBridge.pm index c79eb18c1..316e4f395 100644 --- a/fhem/FHEM/30_HUEBridge.pm +++ b/fhem/FHEM/30_HUEBridge.pm @@ -522,6 +522,31 @@ HUEBridge_scene2id($$) return ''; } +sub +HUEBridge_scene2id_deCONZ($$) +{ + my ($hash,$id) = @_; + my $name = $hash->{NAME}; + #Log3 $name, 4, "HUEBridge_scene2id_deCONZ: $id, hash: " . Dumper $hash; + $hash = $defs{$hash} if( ref($hash) ne 'HASH' ); + return undef if( !$hash ); + + if( $id =~ m/\[id=(.*)\]$/ ) { + $id = $1; + } + + if( my $scenes = $hash->{scenes} ) { + $id = lc($id); + $id =~ s/\((.*)\)$/\\\($1\\\)/; + for my $scene ( @{$scenes} ) { + #Log3 $name, 4, "HUEBridge_scene2id_deCONZ scene:". Dumper $scene; + return $scene->{id} if( lc($scene->{name}) =~ m/^$id$/ ); + } + } + + return ''; +} + sub HUEbridge_groupOfLights($$) { @@ -1330,7 +1355,7 @@ HUEBridge_updateGroups($$) #Log 1, "$hue $sat $bri"; $readings{colormode} = 'hs'; $readings{hue} = int($hue * 65535); - $readings{sat} = int($sat * 254/ $count + 0.5); + $readings{sat} = int($sat * 254 / $count + 0.5); $readings{bri} = int($bri * 254 / $count + 0.5); $readings{pct} = int($bri * 100 / $count + 0.5); diff --git a/fhem/FHEM/31_HUEDevice.pm b/fhem/FHEM/31_HUEDevice.pm index 71ee359c5..c9bfd6ff8 100644 --- a/fhem/FHEM/31_HUEDevice.pm +++ b/fhem/FHEM/31_HUEDevice.pm @@ -741,11 +741,21 @@ HUEDevice_Set($@) } elsif( $cmd eq 'scene' ) { return "usage: scene |" if( !@args ); my $arg = join( ' ', @args ); - $arg = HUEBridge_scene2id($hash->{IODev}, $arg) if( $hash->{IODev} && $hash->{IODev}{TYPE} eq 'HUEBridge' ); + my $deConz; + if( $hash->{IODev} && $hash->{IODev}{TYPE} eq 'HUEBridge' ) { + if( $hash->{IODev}{modelid} eq 'deCONZ' ) { + $deConz = 1; + $arg = HUEBridge_scene2id_deCONZ($hash, $arg); + } else { + $arg = HUEBridge_scene2id($hash->{IODev}, $arg); + } + } my $obj = {'scene' => $arg}; $hash->{helper}->{update} = 1; - my $result = HUEDevice_ReadFromServer($hash,"$hash->{ID}/action",$obj); + my $result; + $result = HUEDevice_ReadFromServer($hash,"$hash->{ID}/action",$obj) if( !$deConz ); + $result = HUEDevice_ReadFromServer($hash,"$hash->{ID}/scenes/$arg/recall",$obj) if( $deConz ); return $result->{error}{description} if( $result->{error} ); if( defined($result) && $result->{'error'} ) { @@ -991,7 +1001,18 @@ HUEDevice_Set($@) } } - if( my $scenes = $hash->{IODev}{helper}{scenes} ) { + if( $hash->{IODev} && $hash->{IODev}{modelid} ne 'deCONZ' ) { + if( my $scenes = $hash->{scenes} ) { + my @names; + for my $scene (@{$scenes}) { + push(@names, $scene->{name}); + } + # my $s_scenes = join (",",(my $names = map { $_->{name}} @$scenes)); + my $s_scenes = join (',', @names); + $list .= " scene:".$s_scenes; + } + + } elsif( my $scenes = $hash->{IODev}{helper}{scenes} ) { local *containsOneOfMyLights = sub($) { return 1 if( !defined($hash->{helper}{lights}) ); @@ -1014,8 +1035,10 @@ HUEDevice_Set($@) $scene =~ s/ /#/g; $scene; } } keys %{$scenes} ); + } else { $list .= " scene"; + } return SetExtensions($hash, $list, $name, @aa);