From d1bf9b06af22f12c74a4acbf8b1da1ca04075e6b Mon Sep 17 00:00:00 2001 From: gvzdus Date: Fri, 22 Jan 2021 21:30:09 +0000 Subject: [PATCH] 36_ShellyMonitor: Support for Shelly i3 + Shelly Button git-svn-id: https://svn.fhem.de/fhem/trunk@23588 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/36_ShellyMonitor.pm | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/fhem/FHEM/36_ShellyMonitor.pm b/fhem/FHEM/36_ShellyMonitor.pm index 602dacccd..cc63c5974 100644 --- a/fhem/FHEM/36_ShellyMonitor.pm +++ b/fhem/FHEM/36_ShellyMonitor.pm @@ -218,7 +218,8 @@ my %DEVID_MODEL = ( "SHWT-1" => "generic", "SHHT-1" => "generic", "SHGS-1" => "generic", - "SHBTN-2" => "generic" + "SHBTN-2" => "generic", + "SHIX3-1" => "generic" ); # Mapping of DeviceId in Multicast to suggested generic name @@ -238,7 +239,8 @@ my %DEVID_PREFIX = ( "SHWT-1" => "shelly_flood", "SHHT-1" => "shelly_ht", "SHGS-1" => "shelly_gas", - "SHBTN-2" => "shelly_button" + "SHBTN-2" => "shelly_button", + "SHIX3-1" => "shelly_i3" ); # Mapping of DeviceId in Multicast to additional attributes on creation @@ -325,6 +327,7 @@ sub MCast_Open { $err = "Error adding mcast interface"; $conn->mcast_add('224.0.1.187') or $err = "Cannot open Multicast socket: $^E"; } + $conn->sockopt(IO::Socket::SO_RCVBUF, 65535); $err = undef; $hash->{".JSON"} = JSON->new->utf8; 1; @@ -664,7 +667,6 @@ sub ShellyMonitor_DoRead if (defined $defarr) { my $rname = $defarr->{"desc"}; - #$rname .= "(" . $defarr->{"unit"} . ")" if ($defarr->{"unit"}); if ($rname =~ /^(power|output|energy|brightness)_(.).*/ || $rname =~ /^(roller.*|mode|L-.*|colorTemp)$/) { my $rtype = $1; @@ -730,7 +732,20 @@ sub ShellyMonitor_DoRead # We want to set the mode also for shadow devices my $model = $_->{model}; my $device = $defs{$_->{name}}; + next unless ($device); $svalue = join (' ', @$svalue) if (ref $svalue eq "ARRAY"); + # In case of inputEventCnt_x, we have to determine the old device reading + # to check for changes: + if ($rname =~ /^inputEventCnt_(\d)$/) { + if (ReadingsVal($_->{name}, $rname, "-1") ne $svalue && $svalue>0) { + $_->{inputEventCnt} = {} unless ($_->{inputEventCnt}); + $_->{inputEventCnt}->{$1} = 1; + } + } + if ($rname eq "wakeupEvent" && $svalue eq "button") { + # inputEventCnt_0 will be always one, so we force an update: + $_->{inputEventCnt} = { "0" => "1" }; + } readingsBulkUpdateIfChanged($device, $rname, $svalue) if (defined $device && (( ! defined $model ) || ($model eq "generic"))); } @@ -749,6 +764,14 @@ sub ShellyMonitor_DoRead readingsBulkUpdateIfChanged($device, "rgb", sprintf("%02X%02X%02X", $rgb{"red"},$rgb{"green"},$rgb{"blue"})); } + if ($_->{inputEventCnt}) { + foreach my $i ( keys %{$_->{inputEventCnt}}) { + my $rname = "inputEvent_$i"; + # Old news is recent news :-) + readingsBulkUpdate ($device, $rname, ReadingsVal($device->{NAME}, $rname, undef)); + } + delete $_->{inputEventCnt}; + } readingsEndUpdate($device, 1) if ($device); } }