From 01d77418058b5efd08122f7617144ff549fa629b Mon Sep 17 00:00:00 2001 From: justme1968 Date: Tue, 14 Jan 2020 21:07:21 +0000 Subject: [PATCH] HUE: try to move also for websocket events autosave after move git-svn-id: https://svn.fhem.de/fhem/trunk@20980 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/30_HUEBridge.pm | 61 +++++++++++++++++---------------------- fhem/FHEM/31_HUEDevice.pm | 33 +++++++++++++++++++-- 2 files changed, 58 insertions(+), 36 deletions(-) diff --git a/fhem/FHEM/30_HUEBridge.pm b/fhem/FHEM/30_HUEBridge.pm index 14e4ad2e8..fe36d8a00 100644 --- a/fhem/FHEM/30_HUEBridge.pm +++ b/fhem/FHEM/30_HUEBridge.pm @@ -96,23 +96,28 @@ HUEBridge_Read($) Log3 $name, 5, "$name: websocket data: ". Dumper $obj; } else { Log3 $name, 2, "$name: unhandled websocket text $data"; + } + my $code; + my $id = $obj->{id}; + $code = $name ."-". $id if( $obj->{r} eq 'lights' ); + $code = $name ."-S". $id if( $obj->{r} eq 'sensors' ); + $code = $name ."-G". $id if( $obj->{r} eq 'groups' ); + if( !$code ) { + Log3 $name, 5, "$name: ignoring event: $code"; + return; } if( $obj->{t} eq 'event' && $obj->{e} eq 'changed' ) { - my $code; - my $id = $obj->{id}; - $code = $name ."-". $id if( $obj->{r} eq 'lights' ); - $code = $name ."-S". $id if( $obj->{r} eq 'sensors' ); - $code = $name ."-G". $id if( $obj->{r} eq 'groups' ); - if( !$code ) { - Log3 $name, 5, "$name: ignoring event: $code"; - return; - } - if( my $chash = $modules{HUEDevice}{defptr}{$code} ) { HUEDevice_Parse($chash, $obj); HUEBridge_updateGroups($hash, $chash->{ID}) if( !$chash->{helper}{devtype} ); + + } elsif( HUEDevice_moveToBridge( $obj->{uniqueid}, $name, $obj->{id} ) ) { + if( my $chash = $modules{HUEDevice}{defptr}{$code} ) { + HUEDevice_Parse($chash, $obj); + } + } else { Log3 $name, 4, "$name: message for unknown device received: $code"; } @@ -123,7 +128,13 @@ HUEBridge_Read($) } elsif( $obj->{t} eq 'event' && $obj->{e} eq 'added' ) { Log3 $name, 5, "$name: websocket add: $data"; - HUEBridge_Autocreate($hash); + if( !HUEDevice_moveToBridge( $obj->{uniqueid}, $name, $obj->{id} ) ) { + HUEBridge_Autocreate($hash); + } + + if( my $chash = $modules{HUEDevice}{defptr}{$code} ) { + HUEDevice_Parse($chash, $obj); + } } elsif( $obj->{t} eq 'event' && $obj->{e} eq 'deleted' ) { Log3 $name, 5, "$name: todo: handle websocket delete $data"; @@ -1907,31 +1918,13 @@ HUEBridge_dispatch($$$;$) $changed .= "," if( $changed ); $changed .= $chash->{ID}; } + + } elsif( HUEDevice_moveToBridge( $lights->{$id}{uniqueid}, $name, $id ) ) { + HUEDevice_Parse($hash, $lights->{$id}); + } else { - my $found; - if( my $serial = $lights->{$id}{uniqueid} ) { - foreach my $chash ( values %{$modules{HUEDevice}{defptr}} ) { - next if( !$chash->{uniqueid} ); - next if( $chash->{helper}{devtype} ); - next if( $serial ne $chash->{uniqueid} ); + Log3 $name, 3, "$name: message for unknown device received: $code"; - my $cname = $chash->{NAME}; - my $old = AttrVal( $cname, 'IODev', '' ); - - Log3 $name, 2, "moving $cname [$serial] from $old to $name"; - - HUEDevice_IODevChanged($chash, undef, $name, $id); - - HUEDevice_Parse($chash, $lights->{$id}); - - $found = 1; - last; - } - } - - if( !$found ) { - Log3 $name, 3, "$name: message for unknown device received: $code"; - } } } HUEBridge_updateGroups($hash, $changed) if( $changed ); diff --git a/fhem/FHEM/31_HUEDevice.pm b/fhem/FHEM/31_HUEDevice.pm index 0e3c33e15..952789e7e 100644 --- a/fhem/FHEM/31_HUEDevice.pm +++ b/fhem/FHEM/31_HUEDevice.pm @@ -323,8 +323,37 @@ HUEDevice_IODevChanged($$$;$) return $new; } -sub HUEDevice_Define($$) -{ +sub +HUEDevice_moveToBridge($$$) { + my ($serial, $new, $new_id) = @_; + + my $found; + + return $found if( !$serial ); + return $found if( !$new_id ); + + foreach my $hash ( values %{$modules{HUEDevice}{defptr}} ) { + next if( !$hash->{uniqueid} ); + next if( $hash->{helper}{devtype} ); + next if( $serial ne $hash->{uniqueid} ); + + my $name = $hash->{NAME}; + my $old = AttrVal( $name, 'IODev', '' ); + + Log3 $name, 2, "moving $name [$serial] from $old to $new"; + + HUEDevice_IODevChanged($hash, undef, $new, $new_id); + CommandSave(undef,undef) if( AttrVal( "autocreate", "autosave", 1 ) ); + + $found = 1; + last; + } + + return $found; +} + +sub +HUEDevice_Define($$) { my ($hash, $def) = @_; return $@ unless ( FHEM::Meta::SetInternals($hash) );