2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-04 05:16:45 +00:00

30_HUEBridge.pm: better autocreate and ignore handling, added some internal debug commands

git-svn-id: https://svn.fhem.de/fhem/trunk@25539 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
justme-1968 2022-01-21 21:56:31 +00:00
parent fe19a7ddf4
commit 06e1c02383

View File

@ -588,7 +588,8 @@ HUEBridge_OpenDev($)
return undef; return undef;
} }
sub HUEBridge_Pair($) sub
HUEBridge_Pair($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
@ -1437,7 +1438,12 @@ HUEBridge_Get($@)
return $ret; return $ret;
} elsif($cmd eq 'ignored' ) { } elsif($cmd eq 'ignored' ) {
return join( "\n", keys %{$hash->{helper}{ignored}} ); return join( "\n", sort keys %{$hash->{helper}{ignored}} );
} elsif($cmd eq 'get2resources' ) {
HUEBridge_getv2resources($hash, 1);
return "done";
} elsif($cmd eq 'v2resource' ) { } elsif($cmd eq 'v2resource' ) {
if( $arg ) { if( $arg ) {
@ -1880,7 +1886,8 @@ HUEBridge_Autocreate($;$$)
next; next;
} }
if( $result->{$id}{type} eq 'CLIPGenericStatus' ) { if( $result->{$id}{recycle}
|| $result->{$id}{type} eq 'CLIPGenericStatus' ) {
Log3 $name, 4, "$name: ignoring sensor $id ($result->{$id}{name}) of type $result->{$id}{type} in autocreate"; Log3 $name, 4, "$name: ignoring sensor $id ($result->{$id}{name}) of type $result->{$id}{type} in autocreate";
$ignored[2]++; $ignored[2]++;
$hash->{helper}{ignored}{$code} = 1; $hash->{helper}{ignored}{$code} = 1;
@ -2188,12 +2195,26 @@ HUEBridge_HTTP_Call2($$$$;$)
} }
} }
sub
HUEBridge_schedule($$;$)
{
my ($hash,$fn,$delay) = @_;
$delay = 5 if( !$delay );
my $name = $hash->{NAME};
Log3 $name, 4, "$name: scheduling $fn in $delay secs";
RemoveInternalTimer($hash,$fn);
InternalTimer(gettimeofday()+$delay, $fn, $hash, 0);
}
sub sub
HUEBridge_getv2resources($;$) HUEBridge_getv2resources($;$)
{ {
my ($hash,$blocking) = @_; my ($hash,$blocking) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
return if( !$hash->{has_v2_api} );
my $params = { my $params = {
url => "https://$hash->{host}/clip/v2/resource", url => "https://$hash->{host}/clip/v2/resource",
method => 'GET', method => 'GET',
@ -2251,18 +2272,24 @@ HUEBridge_dispatch($$$;$)
} elsif( defined($type) && $type eq 'resource' ) { } elsif( defined($type) && $type eq 'resource' ) {
$json = eval { JSON->new->utf8(0)->decode($data) }; $json = eval { JSON->new->utf8(0)->decode($data) };
Log3 $name, 2, "$name: json error: $@ in $data" if( $@ ); Log3 $name, 2, "$name: json error: $@ in $data" if( $@ );
Log3 $name, 1, "$name: error: ". Dumper $json->{errors} if( scalar @{$json->{errors}} );
my $current = $hash->{helper}{resource};
delete $hash->{helper}{resource}; delete $hash->{helper}{resource};
return undef if( !$json ); return undef if( !$json );
Log3 $name, 1, "$name: error: ". Dumper $json->{errors} if( scalar @{$json->{errors}} );
$hash->{helper}{resource} = $json; $hash->{helper}{resource} = $json;
Log3 $name, 5, "$name: received: ". Dumper $json; Log3 $name, 5, "$name: received: ". Dumper $json;
foreach my $item (@{$hash->{helper}{resource}{data}}) { my $count = 0;
foreach my $item (@{$json->{data}}) {
$hash->{helper}{resource}{by_id}{$item->{id}} = $item; $hash->{helper}{resource}{by_id}{$item->{id}} = $item;
$count++ if( $current && !$current->{by_id}{$item->{id}} );
} }
Log3 $name, 4, "$name: found $count new resources";
HUEBridge_Autocreate($hash) if( $count );
return undef; return undef;
} elsif( defined($type) && $type eq 'event' ) { } elsif( defined($type) && $type eq 'event' ) {
@ -2325,6 +2352,7 @@ HUEBridge_dispatch($$$;$)
my(undef, $t, $id) = split( '/', $data->{id_v1} ); my(undef, $t, $id) = split( '/', $data->{id_v1} );
if( !defined($t) || !defined($id) ) { if( !defined($t) || !defined($id) ) {
Log3 $name, 3, "$name: EventStream: ignoring event type $data->{type}"; Log3 $name, 3, "$name: EventStream: ignoring event type $data->{type}";
Log3 $name, 5, Dumper $data;
next; next;
} }
@ -2335,6 +2363,7 @@ HUEBridge_dispatch($$$;$)
if( !$code ) { if( !$code ) {
# handle events for scenes ? # handle events for scenes ?
Log3 $name, 4, "$name: EventStream: ignoring event for $t"; Log3 $name, 4, "$name: EventStream: ignoring event for $t";
Log3 $name, 5, Dumper $data;
next; next;
} }
@ -2351,14 +2380,13 @@ HUEBridge_dispatch($$$;$)
my $device = $hash->{helper}{resource}{by_id}{$obj->{v2_id}}; my $device = $hash->{helper}{resource}{by_id}{$obj->{v2_id}};
if( !$device ) { if( !$device ) {
Log3 $name, 2, "$name: EventStream: event for unknown device received, tying to refresh resouces"; Log3 $name, 2, "$name: EventStream: event for unknown device received, trying to refresh resouces";
HUEBridge_getv2resources($hash, 1); HUEBridge_getv2resources($hash, 1);
HUEBridge_Autocreate($hash);
$device = $hash->{helper}{resource}{by_id}{$obj->{v2_id}}; $device = $hash->{helper}{resource}{by_id}{$obj->{v2_id}};
} }
my $service = $hash->{helper}{resource}{by_id}{$obj->{v2_service}}; my $service = $hash->{helper}{resource}{by_id}{$obj->{v2_service}};
if( !$service ) { if( !$service ) {
Log3 $name, 2, "$name: EventStream: event for unknown service received, tying to refresh resouces"; Log3 $name, 2, "$name: EventStream: event for unknown service received, trying to refresh resouces";
HUEBridge_getv2resources($hash, 1); HUEBridge_getv2resources($hash, 1);
$service = $hash->{helper}{resource}{by_id}{$obj->{v2_service}}; $service = $hash->{helper}{resource}{by_id}{$obj->{v2_service}};
} }
@ -2416,23 +2444,28 @@ HUEBridge_dispatch($$$;$)
} elsif( $data->{type} eq 'entertainment_configuration' ) { } elsif( $data->{type} eq 'entertainment_configuration' ) {
Log3 $name, 4, "$name: ignoring resource type $data->{type}"; Log3 $name, 4, "$name: ignoring resource type $data->{type}";
Log3 $name, 5, Dumper $data;
$handled = 0; $handled = 0;
} elsif( $data->{type} eq 'bridge_home' ) { } elsif( $data->{type} eq 'bridge_home' ) {
HUEBridge_getv2resources($hash, 1); HUEBridge_schedule($hash,'HUEBridge_Autocreate');
Log3 $name, 4, "$name: ignoring resource type $data->{type}"; Log3 $name, 4, "$name: ignoring resource type $data->{type}";
Log3 $name, 5, Dumper $data;
$handled = 0; $handled = 0;
} elsif( $data->{type} eq 'room' ) { } elsif( $data->{type} eq 'room' ) {
Log3 $name, 4, "$name: ignoring resource type $data->{type}"; Log3 $name, 4, "$name: ignoring resource type $data->{type}";
Log3 $name, 5, Dumper $data;
$handled = 0; $handled = 0;
} elsif( $data->{type} eq 'zone' ) { } elsif( $data->{type} eq 'zone' ) {
Log3 $name, 4, "$name: ignoring resource type $data->{type}"; Log3 $name, 4, "$name: ignoring resource type $data->{type}";
Log3 $name, 5, Dumper $data;
$handled = 0; $handled = 0;
} elsif( $data->{type} eq 'grouped_light' ) { } elsif( $data->{type} eq 'grouped_light' ) {
Log3 $name, 4, "$name: ignoring resource type $data->{type}"; Log3 $name, 4, "$name: ignoring resource type $data->{type}";
Log3 $name, 5, Dumper $data;
$handled = 0; $handled = 0;
} elsif( $data->{type} eq 'light' } elsif( $data->{type} eq 'light'
@ -2484,8 +2517,7 @@ HUEBridge_dispatch($$$;$)
} elsif( $event->{type} eq 'add' ) { } elsif( $event->{type} eq 'add' ) {
Log3 $name, 4, "$name: EventStream: got $event->{type} event"; Log3 $name, 4, "$name: EventStream: got $event->{type} event";
HUEBridge_getv2resources($hash, 1); HUEBridge_schedule($hash,'HUEBridge_getv2resources');
HUEBridge_Autocreate($hash);
} elsif( $event->{type} eq 'delete' ) { } elsif( $event->{type} eq 'delete' ) {
Log3 $name, 4, "$name: EventStream: got $event->{type} event"; Log3 $name, 4, "$name: EventStream: got $event->{type} event";
@ -2561,6 +2593,7 @@ HUEBridge_dispatch($$$;$)
} elsif( !$hash->{helper}{ignored}{$code} ) { } elsif( !$hash->{helper}{ignored}{$code} ) {
Log3 $name, 3, "$name: data for unknown sensor received: $code"; Log3 $name, 3, "$name: data for unknown sensor received: $code";
HUEBridge_schedule($hash,'HUEBridge_Autocreate');
} }
} }
} }
@ -2578,6 +2611,7 @@ HUEBridge_dispatch($$$;$)
} elsif( !$hash->{helper}{ignored}{$code} ) { } elsif( !$hash->{helper}{ignored}{$code} ) {
Log3 $name, 2, "$name: data for unknown group received: $code"; Log3 $name, 2, "$name: data for unknown group received: $code";
HUEBridge_schedule($hash,'HUEBridge_Autocreate');
} }
} }
} }
@ -2907,9 +2941,9 @@ __END__
<li>updateschedule &lt;id&gt; &lt;attributes json&gt;<br> <li>updateschedule &lt;id&gt; &lt;attributes json&gt;<br>
updates the given schedule in the bridge with &lt;attributes json&gt; </li> updates the given schedule in the bridge with &lt;attributes json&gt; </li>
<li>enableschedule &lt;id&gt;<br> <li>enableschedule &lt;id&gt;<br>
enables the given shedule</li> enables the given schedule</li>
<li>disableschedule &lt;id&gt;<br> <li>disableschedule &lt;id&gt;<br>
disables the given shedule</li> disables the given schedule</li>
<li>createrule &lt;name&gt; &lt;conditions&amp;actions json&gt;<br> <li>createrule &lt;name&gt; &lt;conditions&amp;actions json&gt;<br>
Creates a new rule in the bridge.</li> Creates a new rule in the bridge.</li>
<li>deleterule &lt;id&gt;<br> <li>deleterule &lt;id&gt;<br>