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
This commit is contained in:
justme1968
2020-01-14 21:07:21 +00:00
parent a019db9fe0
commit 01d7741805
2 changed files with 58 additions and 36 deletions

View File

@@ -96,23 +96,28 @@ HUEBridge_Read($)
Log3 $name, 5, "$name: websocket data: ". Dumper $obj; Log3 $name, 5, "$name: websocket data: ". Dumper $obj;
} else { } else {
Log3 $name, 2, "$name: unhandled websocket text $data"; 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' ) { 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} ) { if( my $chash = $modules{HUEDevice}{defptr}{$code} ) {
HUEDevice_Parse($chash, $obj); HUEDevice_Parse($chash, $obj);
HUEBridge_updateGroups($hash, $chash->{ID}) if( !$chash->{helper}{devtype} ); 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 { } else {
Log3 $name, 4, "$name: message for unknown device received: $code"; 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' ) { } elsif( $obj->{t} eq 'event' && $obj->{e} eq 'added' ) {
Log3 $name, 5, "$name: websocket add: $data"; 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' ) { } elsif( $obj->{t} eq 'event' && $obj->{e} eq 'deleted' ) {
Log3 $name, 5, "$name: todo: handle websocket delete $data"; Log3 $name, 5, "$name: todo: handle websocket delete $data";
@@ -1907,31 +1918,13 @@ HUEBridge_dispatch($$$;$)
$changed .= "," if( $changed ); $changed .= "," if( $changed );
$changed .= $chash->{ID}; $changed .= $chash->{ID};
} }
} elsif( HUEDevice_moveToBridge( $lights->{$id}{uniqueid}, $name, $id ) ) {
HUEDevice_Parse($hash, $lights->{$id});
} else { } else {
my $found; Log3 $name, 3, "$name: message for unknown device received: $code";
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} );
my $cname = $chash->{NAME};
my $old = AttrVal( $cname, 'IODev', '<unknown>' );
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 ); HUEBridge_updateGroups($hash, $changed) if( $changed );

View File

@@ -323,8 +323,37 @@ HUEDevice_IODevChanged($$$;$)
return $new; 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', '<unknown>' );
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) = @_; my ($hash, $def) = @_;
return $@ unless ( FHEM::Meta::SetInternals($hash) ); return $@ unless ( FHEM::Meta::SetInternals($hash) );