From 3f2a754de6b73b24c85ccbdefe6bd709b617152d Mon Sep 17 00:00:00 2001 From: "klaus.schauer" Date: Mon, 28 Oct 2024 15:25:54 +0000 Subject: [PATCH] 10_EnOcean: new event alarm: reset, new attribute rocker git-svn-id: https://svn.fhem.de/fhem/trunk@29308 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_EnOcean.pm | 57 ++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/fhem/FHEM/10_EnOcean.pm b/fhem/FHEM/10_EnOcean.pm index 040526325..f8f221b89 100755 --- a/fhem/FHEM/10_EnOcean.pm +++ b/fhem/FHEM/10_EnOcean.pm @@ -859,12 +859,12 @@ sub EnOcean_Initialize($) { "pollInterval postmasterID productID rampTime rcvRespAction:textField-long ". "releasedChannel:A,B,C,D,I,0,auto repeatingAllowed:yes,no remoteCode remoteEEP remoteID remoteManufID " . "remoteManagement:client,manager,off rlcAlgo:no,2++,3++,4++ rlcRcv rlcSnd rlcTX:true,false " . - "reposition:directly,opens,closes rltRepeat:16,32,64,128,256 rltType:1BS,4BS rotationSpeed:select,high,low " . + "reposition:directly,opens,closes rltRepeat:16,32,64,128,256 rltType:1BS,4BS rocker:A,B rotationSpeed:select,high,low " . "scaleDecimals:0,1,2,3,4,5,6,7,8,9 scaleMax scaleMin secMode:rcv,snd,biDir " . "secLevel:encapsulation,encryption,off sendDevStatus:no,yes sendTimePeriodic sensorMode:switch,pushbutton " . "serviceOn:no,yes setCmdTrigger:man,refDev setpointRefDev setpointSummerMode:slider,0,5,100 settingAccuracy:high,low " . - "signal:off,on signOfLife:off,on signOfLifeInterval setpointTempRefDev shutTime shutTimeCloses subDef " . - "subDef0 subDefI subDefA subDefB subDefC subDefD subDefH subDefW " . + "signal:off,on signOfLife:off,on signOfLifeInterval setpointTempRefDev shutTime shutTimeCloses " . + "subDef subDef0 subDefI subDefA subDefB subDefC subDefD subDefH subDefW " . "subType:$subTypeList subTypeSet:$subTypeList subTypeReading:$subTypeList " . "summerMode:off,on switchMode:switch,pushbutton " . "switchHysteresis switchType:direction,universal,channel,central " . @@ -3309,7 +3309,7 @@ sub EnOcean_Set($@) { ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature', 'setpoint', 'Temp'); readingsDelete($hash, "setpointSet"); readingsDelete($hash, "setpointTempSet"); - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); Log3 $name, 3, "EnOcean set $name $cmd"; $updateState = 2; @@ -8271,7 +8271,7 @@ sub EnOcean_Parse($$) { EnOcean_CommandSave(undef, undef); } push @event, "3:state:" . ($db[0] & 1 ? "closed" : "open"); - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'off') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -8557,7 +8557,7 @@ sub EnOcean_Parse($$) { } readingsSingleUpdate($hash, 'wakeUpCycle', $wakeUpCycle, 1); # set alarm timer - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'no_response_from_actuator', 1, 3); InternalTimer(gettimeofday() + $wakeUpCycle * 1.1, "EnOcean_readingsSingleUpdate", $hash->{helper}{timer}{alarm}, 0); @@ -8913,7 +8913,7 @@ sub EnOcean_Parse($$) { push @event, "3:alarm:" . $failureCode{$db[1]}; $battery = "empty" if ($db[1] == 18); } else { - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); } } else { if ($db[0] & 0x80) { @@ -8923,7 +8923,7 @@ sub EnOcean_Parse($$) { # room temperature $roomTemp = sprintf("%0.1f", ($db[1] * 20 / 255 + 10)); push @event, "3:roomTemp:$roomTemp"; - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); } } if (!defined(AttrVal($name, "temperatureRefDev", undef))) { @@ -9266,7 +9266,7 @@ sub EnOcean_Parse($$) { } readingsSingleUpdate($hash, 'wakeUpCycle', $wakeUpCycle, 1); # set alarm timer - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if ($waitingCmds ne "standby") { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'no_response_from_actuator', 1, 3); @@ -9590,7 +9590,7 @@ sub EnOcean_Parse($$) { $temp = sprintf "%0.1f", 62.3 - (($db[2] << 8) | $db[1]) / 10 if ($st eq "tempSensor.30"); push @event, "3:temperature:$temp"; push @event, "3:state:$temp"; - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'off') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -9848,7 +9848,7 @@ sub EnOcean_Parse($$) { } } push @event, "3:temperature:$temp"; - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'off') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -10238,7 +10238,7 @@ sub EnOcean_Parse($$) { push @event, "3:state:T: $temp H: $humi B: $battery"; push @event, "3:humidity:$humi"; push @event, "3:temperature:$temp"; - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'off') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -10256,7 +10256,7 @@ sub EnOcean_Parse($$) { push @event, "3:humidity:$humi"; push @event, "3:temperature:$temp"; push @event, "3:telegramType:" . ($db[0] & 1 ? "event" : "heartbeat"); - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'off') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -10303,7 +10303,7 @@ sub EnOcean_Parse($$) { } push @event, "3:brightness:$lux"; push @event, "3:state:$lux"; - readingsDelete($hash, 'alarm'); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'on') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -10412,7 +10412,7 @@ sub EnOcean_Parse($$) { InternalTimer(gettimeofday() + AttrVal($name, 'trackerWakeUpCycle', 30) * 1.1, 'EnOcean_readingsSingleUpdate', $hash->{helper}{timer}{motion}, 0); InternalTimer(gettimeofday() + AttrVal($name, 'trackerWakeUpCycle', 30) * 1.1, 'EnOcean_readingsSingleUpdate', $hash->{helper}{timer}{state}, 0); } else { - readingsDelete($hash, 'alarm'); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'on') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -10506,7 +10506,7 @@ sub EnOcean_Parse($$) { } push @event, "3:brightness:$lux"; push @event, "3:motion:$motion"; - readingsDelete($hash, 'alarm'); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'on') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -11065,7 +11065,7 @@ sub EnOcean_Parse($$) { push @event, "1:vibration:$vibration"; push @event, "1:voltage:$voltage"; push @event, "1:state:C: $contact V: $vibration E: $lux U: $voltage"; - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'on') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -11083,7 +11083,7 @@ sub EnOcean_Parse($$) { push @event, "1:vibration:$vibration"; push @event, "1:voltage:$voltage"; push @event, "1:state:C: $doorContact B: $lockContact V: $vibration U: $voltage"; - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'on') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -11101,7 +11101,7 @@ sub EnOcean_Parse($$) { push @event, "1:voltage:$voltage"; push @event, "1:window:$window"; push @event, "1:state:W: $window V: $vibration U: $voltage"; - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'on') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -12303,7 +12303,7 @@ sub EnOcean_Parse($$) { } else { } - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'on') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -12413,7 +12413,7 @@ sub EnOcean_Parse($$) { } else { } - readingsDelete($hash, "alarm"); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); if (AttrVal($name, "signOfLife", 'on') eq 'on') { RemoveInternalTimer($hash->{helper}{timer}{alarm}) if(exists $hash->{helper}{timer}{alarm}); @{$hash->{helper}{timer}{alarm}} = ($hash, 'alarm', 'dead_sensor', 1, 5); @@ -12480,7 +12480,7 @@ sub EnOcean_Parse($$) { } elsif ($st eq "multiFuncSensor.40") { # Multi Sensor [EnOcean STM 550 / EMSIA] # (D2-14-40 - D2-14-41) - readingsDelete($hash, 'alarm'); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); my $temperature = ($db[8] << 8 | $db[7]) >> 6; if ($temperature <= 1000) { $temperature = sprintf "%0.1f", $temperature / 10 - 40; @@ -15750,7 +15750,7 @@ sub EnOcean_environmentAppCustomCmd($) { $hash->{helper}{customCmdAlarmOff}{do} = 1; EnOcean_CustomCmdStart($hash, 'customCmdAlarmOff', $customCmdAlarmOff, 'once'); } - readingsDelete($hash, 'alarm'); + EnOcean_ReadingsDelete($hash, 'alarm', 'reset', 1); } delete $hash->{helper}{customCmdAlarmOff}; if (AttrVal($name, "signOfLife", 'on') eq 'on') { @@ -17928,6 +17928,15 @@ sub EnOcean_cdmClearHashVal($) { return; } +# +sub EnOcean_ReadingsDelete($$$$) { + my ($hash, $reading, $event, $trigger) = @_; + return if (!exists $hash->{READINGS}{$reading}); + DoTrigger($hash->{NAME}, "$reading: $event", 1) if ($trigger); + readingsDelete($hash, $reading); + return; +} + # sub EnOcean_CommandDelete($) { my ($functionHash) = @_; @@ -21855,7 +21864,7 @@ sub EnOcean_Delete($$) { [signal] = off is default.
Activate the request functions of signal telegram messages. -
  • signOfLife off|on, [signOfLive] = off is default.
    +
  • signOfLife off|on, [signOfLife] = off is default.
    Monitoring signOfLife telegrams from sensors.
  • signOfLifeInterval 1...65535