From 90678fee5f546ebf9e9427519dae9240ef706abf Mon Sep 17 00:00:00 2001 From: justme-1968 Date: Mon, 24 Jan 2022 19:11:34 +0000 Subject: [PATCH] 30_HUEBridge.pm, 31_HUEDevice.pm: deconz event fixes, more button event readings git-svn-id: https://svn.fhem.de/fhem/trunk@25553 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/30_HUEBridge.pm | 10 +++++++--- fhem/FHEM/31_HUEDevice.pm | 32 ++++++++++++++++++-------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/fhem/FHEM/30_HUEBridge.pm b/fhem/FHEM/30_HUEBridge.pm index 98e3917b6..821cb6f44 100644 --- a/fhem/FHEM/30_HUEBridge.pm +++ b/fhem/FHEM/30_HUEBridge.pm @@ -104,6 +104,8 @@ HUEBridge_Read($) if( $data eq '?' ) { #ignore keepalive + #RemoveInternalTimer($hash, 'HUEBridge_openWebsocket' ); + #InternalTimer(gettimeofday()+300, 'HUEBridge_openWebsocket', $hash, 0); } elsif( $op == 0x01 ) { my $obj = eval { JSON->new->utf8(0)->decode($data) }; @@ -364,6 +366,8 @@ HUEBridge_closeWebsocket($) my ($hash) = @_; my $name = $hash->{NAME}; + RemoveInternalTimer($hash, 'HUEBridge_openWebsocket' ); + delete $hash->{buf}; delete $hash->{websocket}; @@ -1440,7 +1444,7 @@ HUEBridge_Get($@) } elsif($cmd eq 'ignored' ) { return join( "\n", sort keys %{$hash->{helper}{ignored}} ); - } elsif($cmd eq 'get2resources' ) { + } elsif($cmd eq 'getv2resources' ) { HUEBridge_getv2resources($hash, 1); return "done"; @@ -2422,8 +2426,8 @@ HUEBridge_dispatch($$$;$) $buttonevent = "${input}003"; } - #$obj->{state}{input} = $input; - #$obj->{state}{eventtype} = $eventtype; + $obj->{state}{input} = $input; + $obj->{state}{eventtype} = $eventtype; $obj->{state}{buttonevent} = $buttonevent; } elsif( $data->{type} eq 'temperature' ) { diff --git a/fhem/FHEM/31_HUEDevice.pm b/fhem/FHEM/31_HUEDevice.pm index 1857c1d6f..9af1427aa 100644 --- a/fhem/FHEM/31_HUEDevice.pm +++ b/fhem/FHEM/31_HUEDevice.pm @@ -589,7 +589,7 @@ HUEDevice_SetParam($$@) if($cmd eq 'on') { $obj->{'on'} = JSON::true; - # temporary disablea for everything. hast do be disabled for groups. + # temporary disable for everything. hast do be disabled for groups. # see https://forum.fhem.de/index.php/topic,11020.msg497825.html#msg497825 #$obj->{'bri'} = 254 if( $name && ReadingsVal($name,"bri","0") eq 0 && AttrVal($name, 'subType', 'dimmer') ne 'switch' ); $obj->{'transitiontime'} = $value * 10 if( defined($value) ); @@ -1481,25 +1481,26 @@ HUEDevice_Parse($$) Log3 $name, 4, "parse status message for $name"; #Log3 $name, 5, Dumper $result if($HUEDevice_hasDataDumper); - if( !defined($hash->{has_v2_api}) # only if not already checked - && $result->{v2_service} # only for updates from eventstream events + if( !defined($hash->{has_events}) # only if not already checked + && ($result->{v2_service} || $result->{v2_service}{t}) # only for updates from events && defined($hash->{IODev} && $hash->{IODev}{TYPE} eq 'HUEBridge') ) { - $hash->{has_v2_api} = $hash->{IODev}{has_v2_api} if( defined($hash->{IODev}{has_v2_api}) ); - $hash->{has_v2_api} = 0 if( $hash->{IODev}{is_DECONZ} ); + $hash->{has_events} = $hash->{IODev}{has_v2_api} if( defined($hash->{IODev}{has_v2_api}) ); + $hash->{has_events} = 1 if( $hash->{IODev}{is_DECONZ} ); - Log3 $name, 4, "$name: bridge has v2 api: ". ($hash->{has_v2_api} ? 1 : 0); + Log3 $name, 4, "$name: bridge has events api: ". ($hash->{has_events} ? 1 : 0); - if( $hash->{INTERVAL} && $hash->{has_v2_api} ) { - if( defined($hash->{IODev}{EventStream}) && $hash->{IODev}{EventStream} eq 'connected' ) { + if( $hash->{INTERVAL} && $hash->{has_events} ) { + if( $hash->{IODev}{websocket} + || (defined($hash->{IODev}{EventStream}) && $hash->{IODev}{EventStream} eq 'connected' )) { delete $hash->{INTERVAL}; - Log3 $name, 2, "$name: bridge has v2 api, EventStream connected, removing interval"; + Log3 $name, 2, "$name: bridge has events api, events connected, removing interval"; RemoveInternalTimer($hash); InternalTimer(gettimeofday()+$hash->{INTERVAL}, "HUEDevice_GetUpdate", $hash, 0) if( $hash->{INTERVAL} ); } else { - delete $hash->{has_v2_api}; - Log3 $name, 2, "$name: bridge has v2 api, EventStream not jet connected"; + delete $hash->{has_events}; + Log3 $name, 2, "$name: bridge has events api, events not jet connected"; } } @@ -1753,12 +1754,14 @@ HUEDevice_Parse($$) $readings{state} = $state->{flag}?'1':'0' if( defined($state->{flag}) ); $readings{state} = $state->{open}?'open':'closed' if( defined($state->{open}) ); $readings{state} = $state->{lightlevel} if( defined($state->{lightlevel}) && !defined($state->{lux}) ); - #$readings{state} = $state->{input} if( defined($state->{input}) ); - #$readings{state} = $state->{eventtype} if( defined($state->{eventtype}) ); $readings{state} = $state->{buttonevent} if( defined($state->{buttonevent}) ); $readings{state} = $state->{presence}?'motion':'nomotion' if( defined($state->{presence}) ); $readings{state} = $state->{fire}?'fire':'nofire' if( defined($state->{fire}) ); + $readings{input} = $state->{input} if( defined($state->{input}) ); + $readings{eventtype} = $state->{eventtype} if( defined($state->{eventtype}) ); + $readings{eventduration} = $state->{eventduration} if( defined($state->{eventduration}) ); + $readings{dark} = $state->{dark}?'1':'0' if( defined($state->{dark}) ); $readings{humidity} = $state->{humidity} * 0.01 if( defined($state->{humidity}) ); $readings{daylight} = $state->{daylight}?'1':'0' if( defined($state->{daylight}) ); @@ -1817,7 +1820,8 @@ HUEDevice_Parse($$) if( defined($readings{$key}) ) { if( $lastupdated ) { my $rut = ReadingsTimestamp($name,$key,undef); - if( !defined($result->{v2_service}) && $ts && defined($rut) && $ts <= time_str2num($rut) ) { + if( (!defined($result->{v2_service}) || !defined($result->{t})) + && $ts && defined($rut) && $ts <= time_str2num($rut) ) { Log3 $name, 4, "$name: ignoring reading $key with timestamp $lastupdated, current reading timestamp is $rut"; next; }