From 4aea89fd8c940e609f28361d37f5a4ebb70fc937 Mon Sep 17 00:00:00 2001 From: "klaus.schauer" <> Date: Mon, 28 Sep 2020 17:49:27 +0000 Subject: [PATCH] 10_EnOcean: environmentApp: windStrength calculation corrected, readings renamed git-svn-id: https://svn.fhem.de/fhem/trunk@22876 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_EnOcean.pm | 342 ++++++++++++++++------------------------ 1 file changed, 135 insertions(+), 207 deletions(-) diff --git a/fhem/FHEM/10_EnOcean.pm b/fhem/FHEM/10_EnOcean.pm index 25b8bc06b..19226ccea 100755 --- a/fhem/FHEM/10_EnOcean.pm +++ b/fhem/FHEM/10_EnOcean.pm @@ -1,4 +1,13 @@ # $Id$ +# 2020-09-28 +# Added new EEP: +# Remote Management: +# EEP changed: environmentApp: windStrength calculation corrected, readings renamed +# GP changed: +# Secure: +# EnOcean_Notify(): +# EnOcean_Attr(): +# commandref: further explanations added package main; use strict; @@ -2838,7 +2847,7 @@ sub EnOcean_Set($@) readingsBulkUpdate($hash, "waitingCmds", $cmd); readingsEndUpdate($hash, 0); # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); CommandDeleteReading(undef, "$name setpointTempSet"); Log3 $name, 3, "EnOcean set $name $cmd $a[1]"; shift(@a); @@ -2857,7 +2866,7 @@ sub EnOcean_Set($@) readingsEndUpdate($hash, 0); # PID regulator active my $activatePID = AttrVal($name, 'pidCtrl', 'off') eq 'on' ? 'start' : 'stop'; - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef, 'temperature'); CommandDeleteReading(undef, "$name setpointSet"); Log3 $name, 3, "EnOcean set $name $cmd $setpointTemp"; shift(@a); @@ -2872,7 +2881,7 @@ sub EnOcean_Set($@) readingsBulkUpdate($hash, "waitingCmds", $cmd); readingsEndUpdate($hash, 0); # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); CommandDeleteReading(undef, "$name setpointSet"); CommandDeleteReading(undef, "$name setpointTempSet"); Log3 $name, 3, "EnOcean set $name $cmd"; @@ -2896,7 +2905,7 @@ sub EnOcean_Set($@) readingsBulkUpdate($hash, "waitingCmds", $cmd); readingsEndUpdate($hash, 0); # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); CommandDeleteReading(undef, "$name setpointTempSet"); Log3 $name, 3, "EnOcean set $name $cmd $a[1]"; shift(@a); @@ -2915,7 +2924,7 @@ sub EnOcean_Set($@) readingsEndUpdate($hash, 0); # PID regulator active my $activatePID = AttrVal($name, 'pidCtrl', 'on') eq 'on' ? 'start' : 'stop'; - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef, 'temperature'); CommandDeleteReading(undef, "$name setpointSet"); Log3 $name, 3, "EnOcean set $name $cmd $setpointTemp"; shift(@a); @@ -2929,7 +2938,7 @@ sub EnOcean_Set($@) readingsBulkUpdate($hash, "waitingCmds", $cmd); readingsEndUpdate($hash, 0); # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); CommandDeleteReading(undef, "$name setpointSet"); CommandDeleteReading(undef, "$name setpointTempSet"); Log3 $name, 3, "EnOcean set $name $cmd"; @@ -2955,7 +2964,7 @@ sub EnOcean_Set($@) readingsBulkUpdate($hash, "waitingCmds", $cmd); readingsEndUpdate($hash, 0); # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); CommandDeleteReading(undef, "$name setpointTempSet"); Log3 $name, 3, "EnOcean set $name $cmd $a[1]"; shift(@a); @@ -2974,7 +2983,7 @@ sub EnOcean_Set($@) readingsEndUpdate($hash, 0); # PID regulator active my $activatePID = AttrVal($name, 'pidCtrl', 'off') eq 'on' ? 'start' : 'stop'; - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef, 'temperature'); CommandDeleteReading(undef, "$name setpointSet"); Log3 $name, 3, "EnOcean set $name $cmd $setpointTemp"; shift(@a); @@ -2989,7 +2998,7 @@ sub EnOcean_Set($@) readingsBulkUpdate($hash, "waitingCmds", $cmd); readingsEndUpdate($hash, 0); # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); CommandDeleteReading(undef, "$name setpointSet"); CommandDeleteReading(undef, "$name setpointTempSet"); CommandDeleteReading(undef, "$name alarm"); @@ -8003,7 +8012,7 @@ sub EnOcean_Parse($$) if (AttrVal($name, 'windowOpenCtrl', 'disable') eq 'enable' && $window eq 'open') { # valve will be closed if the window is open # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8019,7 +8028,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "valveOpens") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8058,14 +8067,14 @@ sub EnOcean_Parse($$) $waitingCmds = 0x10; } # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); CommandDeleteReading(undef, "$name setpointSet"); CommandDeleteReading(undef, "$name setpointTemp"); CommandDeleteReading(undef, "$name setpointTempSet"); } elsif ($waitingCmds eq "runInit") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8084,7 +8093,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "liftSet") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8103,7 +8112,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "setpoint") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($maintenanceMode eq "valveOpend:runInit") { $setpointSet = 100; $db[2] = 0x20; @@ -8125,7 +8134,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "setpointTemp") { if ($maintenanceMode eq "valveOpend:runInit") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; $db[2] = 0x20; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); @@ -8136,11 +8145,11 @@ sub EnOcean_Parse($$) } else { if (AttrVal($name, "pidCtrl", 'on') eq 'on') { # activate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'actuator', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'actuator', undef, 'temperature'); $setpointSet = ReadingsVal($name, "setpointSet", $setpoint); } else { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); # setpoint temperature $setpointSet = $setpointTempSet * 255 / 40; $setpointSelect = 4; @@ -8156,7 +8165,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "summerMode") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8173,7 +8182,7 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "setpoint") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($maintenanceMode eq "valveOpend:runInit") { $setpointSet = 100; $db[2] = 0x20; @@ -8192,7 +8201,7 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "setpointTemp") { if ($maintenanceMode eq "valveOpend:runInit") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; $db[2] = 0x20; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); @@ -8203,11 +8212,11 @@ sub EnOcean_Parse($$) } else { if (AttrVal($name, "pidCtrl", 'on') eq 'on') { # activate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'actuator', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'actuator', undef, 'temperature'); $setpointSet = ReadingsVal($name, "setpointSet", $setpointSet); } else { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); # setpoint temperature $setpointSet = $setpointTempSet * 255 / 40; $setpointSelect = 4; @@ -8222,7 +8231,7 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "summerMode") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = $setpointSummerMode; $db[2] = (40 - $temperature) * 255 / 40; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); @@ -8232,7 +8241,7 @@ sub EnOcean_Parse($$) } elsif ($maintenanceMode eq "valveOpend:runInit") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; $db[2] = 0x20; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); @@ -8247,7 +8256,7 @@ sub EnOcean_Parse($$) } elsif ($maintenanceMode eq "valveClosed") { # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 0; $db[2] = 0x20; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); @@ -8410,7 +8419,7 @@ sub EnOcean_Parse($$) if ($waitingCmds eq "valveOpens") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); push @event, "3:maintenanceMode:valveOpend:runInit"; @@ -8437,14 +8446,14 @@ sub EnOcean_Parse($$) $waitingCmds = 3; } # stop PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); CommandDeleteReading(undef, "$name setpointSet"); CommandDeleteReading(undef, "$name setpointTemp"); CommandDeleteReading(undef, "$name setpointTempSet"); } elsif ($waitingCmds eq "runInit") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); push @event, "3:maintenanceMode:runInit"; @@ -8457,7 +8466,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "setpoint") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($maintenanceMode eq "valveOpend:runInit") { $setpointSet = 100; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); @@ -8477,7 +8486,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "setpointTemp") { if ($maintenanceMode eq "valveOpend:runInit") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); push @event, "3:maintenanceMode:runInit"; @@ -8485,7 +8494,7 @@ sub EnOcean_Parse($$) $waitingCmds = 2; } else { # activate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef, 'temperature'); $setpointSet = ReadingsVal($name, "setpointSet", $setpoint); $setpointTemp = $setpointTempSet; push @event, "3:setpointTemp:$setpointTemp"; @@ -8499,7 +8508,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "summerMode") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); push @event, "3:maintenanceMode:off"; @@ -8512,7 +8521,7 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "setpoint") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($maintenanceMode eq "valveOpend:runInit") { $setpointSet = 100; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); @@ -8532,7 +8541,7 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "setpointTemp") { if ($maintenanceMode eq "valveOpend:runInit") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); push @event, "3:maintenanceMode:off"; @@ -8540,7 +8549,7 @@ sub EnOcean_Parse($$) $waitingCmds = 2; } else { # activate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, $activatePID, undef, 'temperature'); $setpointSet = ReadingsVal($name, "setpointSet", $setpointSet); push @event, "3:setpointTemp:$setpointTemp"; push @event, "3:maintenanceMode:off"; @@ -8553,7 +8562,7 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "summerMode") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = 100; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); push @event, "3:maintenanceMode:off"; @@ -8715,7 +8724,7 @@ sub EnOcean_Parse($$) if (AttrVal($name, 'windowOpenCtrl', 'disable') eq 'enable' && $window eq 'open') { # valve will be closed if the window is open # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8730,7 +8739,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "runInit") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8743,7 +8752,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "standby") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8757,7 +8766,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "setpoint") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); push @event, "3:maintenanceMode:off"; push @event, "3:operationMode:setpoint"; CommandDeleteReading(undef, "$name setpointTemp"); @@ -8768,11 +8777,11 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "setpointTemp") { if (AttrVal($name, "pidCtrl", 'on') eq 'on') { # activate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'actuator', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'actuator', undef, 'temperature'); $setpointSet = ReadingsVal($name, "setpointSet", $setpoint); } else { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); # setpoint temperature $setpointSet = int($setpointTempSet * 2); $setpointSelect = 4; @@ -8787,7 +8796,7 @@ sub EnOcean_Parse($$) } elsif ($waitingCmds eq "summerMode") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); if ($operationMode eq 'setpoint') { readingsSingleUpdate($hash, 'setpointSetRestore', $setpointSet, 1); } @@ -8803,7 +8812,7 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "setpoint") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); push @event, "3:maintenanceMode:off"; push @event, "3:operationMode:setpoint"; $waitingCmds = 0; @@ -8811,11 +8820,11 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "setpointTemp") { if (AttrVal($name, "pidCtrl", 'on') eq 'on') { # activate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'actuator', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'actuator', undef, 'temperature'); $setpointSet = ReadingsVal($name, "setpointSet", $setpointSet); } else { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); # setpoint temperature $setpointSet = int($setpointTempSet * 2); $setpointSelect = 4; @@ -8828,7 +8837,7 @@ sub EnOcean_Parse($$) } elsif ($operationMode eq "summerMode") { # deactivate PID regulator - ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef); + ($err, $logLevel, $response) = EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); $setpointSet = $setpointSummerMode; readingsSingleUpdate($hash, 'setpointSet', $setpointSet, 1); push @event, "3:maintenanceMode:off"; @@ -10274,7 +10283,7 @@ sub EnOcean_Parse($$) my $isRaining = $db[0] & 2 ? "yes" : "no"; my @windStrength = (0.2, 1.5, 3.3, 5.4, 7.9, 10.7, 13.8, 17.1, 20.7, 24.4, 28.4, 32.6); my $windStrength = 0; - while($windSpeed > $windStrength[$windStrength] && $windStrength <= @windStrength + 1) { + while($windSpeed > $windStrength[$windStrength] && $windStrength < @windStrength) { $windStrength ++; } push @event, "3:dayNight:$dayNight"; @@ -10331,8 +10340,8 @@ sub EnOcean_Parse($$) } elsif ($identifier == 5) { # Direction exchange (EEP A5-13-05) my $elevation = $db[3] - 90; - push @event, "3:elevation:$elevation"; - push @event, "3:azimuth:" . hex(substr($data, 2, 4)); + push @event, "3:sunElevation:$elevation"; + push @event, "3:sunAzimuth:" . hex(substr($data, 2, 4)); my $twilight = ($elevation + 12) / 18 * 100; $twilight = 0 if ($twilight < 0); $twilight = 100 if ($twilight > 100); @@ -13772,9 +13781,9 @@ sub EnOcean_Attr(@) if (!defined $attrVal){ } elsif (lc($attrVal) eq "on") { - EnOcean_setPID(undef, $hash, 'start', ReadingsVal($name, "setpoint", undef)); + EnOcean_setPID(undef, $hash, 'start', ReadingsVal($name, "setpoint", undef), 'temperature'); } elsif (lc($attrVal) eq "off") { - EnOcean_setPID(undef, $hash, 'stop', undef); + EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); } else { $err = "attribute-value [$attrName] = $attrVal wrong"; } @@ -14397,9 +14406,9 @@ sub EnOcean_Notify(@) if ($attr{$name}{subType} =~ m/^hvac\.0(1|4|6)$/) { # control PID regulatior if (AttrVal($name, 'pidCtrl', 'on') eq 'on' && ReadingsVal($name, 'maintenanceMode', 'off') eq 'off') { - EnOcean_setPID(undef, $hash, 'start', ReadingsVal($name, "setpoint", undef)); + EnOcean_setPID(undef, $hash, 'start', ReadingsVal($name, "setpoint", undef), 'temperature'); } else { - EnOcean_setPID(undef, $hash, 'stop', undef); + EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); } } elsif ($attr{$name}{subType} eq 'environmentApp' && AttrVal($name, 'devMode', 'slave') eq 'master') { @{$hash->{helper}{periodic}{time}} = ($hash, 'time', $attr{$name}{sendTimePeriodic}, 30, -1, undef); @@ -14423,9 +14432,9 @@ sub EnOcean_Notify(@) if ($attr{$name}{subType} =~ m/^hvac\.0(1|4|6)$/) { # control PID regulatior if (AttrVal($name, 'pidCtrl', 'on') eq 'on' && ReadingsVal($name, 'maintenanceMode', 'off') eq 'off') { - EnOcean_setPID(undef, $hash, 'start', ReadingsVal($name, "setpoint", undef)); + EnOcean_setPID(undef, $hash, 'start', ReadingsVal($name, "setpoint", undef), 'temperature'); } else { - EnOcean_setPID(undef, $hash, 'stop', undef); + EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); } } elsif ($attr{$name}{subType} eq 'environmentApp' && AttrVal($name, 'devMode', 'slave') eq 'master') { @{$hash->{helper}{periodic}{time}} = ($hash, 'time', $attr{$name}{sendTimePeriodic}, 30, -1, undef); @@ -14451,9 +14460,9 @@ sub EnOcean_Notify(@) if ($attr{$name}{subType} =~ m/^hvac\.0(1|4|6)$/) { # control PID regulatior if (AttrVal($name, 'pidCtrl', 'on') eq 'on' && ReadingsVal($name, 'maintenanceMode', 'off') eq 'off') { - EnOcean_setPID(undef, $hash, 'start', ReadingsVal($name, "setpoint", undef)); + EnOcean_setPID(undef, $hash, 'start', ReadingsVal($name, "setpoint", undef), 'temperature'); } else { - EnOcean_setPID(undef, $hash, 'stop', undef); + EnOcean_setPID(undef, $hash, 'stop', undef, 'temperature'); } } elsif ($attr{$name}{subType} eq 'environmentApp' && AttrVal($name, 'devMode', 'slave') eq 'master') { @{$hash->{helper}{periodic}{time}} = ($hash, 'time', $attr{$name}{sendTimePeriodic}, 30, -1, undef); @@ -14772,11 +14781,11 @@ EnOcean_Encapsulation($$$$) } # set PID regulator -sub EnOcean_setPID($$$$) { - my ($ctrl, $hash, $cmd, $adjust) = @_; +sub EnOcean_setPID($$$$$) { + my ($ctrl, $hash, $cmd, $adjust, $actualVar) = @_; my $name = $hash->{NAME}; my ($err, $response, $logLevel) = (undef, 'start', 5); - @{$hash->{helper}{calcPID}} = (undef, $hash, $cmd, $adjust); + @{$hash->{helper}{calcPID}} = (undef, $hash, $cmd, $adjust, $actualVar); if ($cmd eq 'stop' || AttrVal($name, 'pidCtrl', 'on') eq 'off') { $hash->{helper}{stopped} = 1; readingsSingleUpdate($hash, "pidState", 'stopped', 0); @@ -14794,7 +14803,7 @@ sub EnOcean_setPID($$$$) { # calc valve setpoint (PID regulator) sub EnOcean_calcPID($) { my ($pidParam) = @_; - my ($ctrl, $hash, $cmd, $adjust) = @$pidParam; + my ($ctrl, $hash, $cmd, $adjust, $actualVar) = @$pidParam; my $name = $hash->{NAME}; my ($err, $response, $logLevel, $setpoint) = (undef, $cmd, 5, 0); my $reUINT = '^([\\+]?\\d+)$'; # uint without whitespaces @@ -14802,53 +14811,45 @@ sub EnOcean_calcPID($) { my $reINT = '^([\\+,\\-]?\\d+$)'; # int my $reFloatpos = '^([\\+]?\\d+\\.?\d*$)'; # gleitpunkt positiv float my $reFloat = '^([\\+,\\-]?\\d+\\.?\d*$)'; # float - my $sensor = $name; - my $reading = 'temperature'; + #my $sensor = $name; + #my $reading = $actualVar; my $regexp = $reFloat; - my $DEBUG_Sensor = AttrVal( $name, 'pidDebugSensor', '0' ) eq '1'; - my $DEBUG_Actuation = AttrVal( $name, 'pidDebugActuation', '0' ) eq '1'; - my $DEBUG_Delta = AttrVal( $name, 'pidDebugDelta', '0' ) eq '1'; - my $DEBUG_Calc = AttrVal( $name, 'pidDebugCalc', '0' ) eq '1'; - my $DEBUG_Update = AttrVal( $name, 'pidDebugUpdate', '0' ) eq '1'; - my $DEBUG = $DEBUG_Sensor || $DEBUG_Actuation || $DEBUG_Calc || $DEBUG_Delta || $DEBUG_Update; my $actuation = ""; my $actuationDone = ReadingsVal($name,'setpointSet', ReadingsVal($name, 'setpoint', "")); my $actuationCalc = ReadingsVal($name, 'setpointCalc', ""); my $actuationCalcOld = $actuationCalc; - my $actorTimestamp = - ( $hash->{helper}{actorTimestamp} ) - ? $hash->{helper}{actorTimestamp} - : FmtDateTime( gettimeofday() - 3600 * 24 ); + my $actorTimestamp = $hash->{helper}{actorTimestamp} ? $hash->{helper}{actorTimestamp} : FmtDateTime(gettimeofday() - 3600 * 24); my $desired = ''; - my $sensorStr = ReadingsVal($name, 'temperature', ""); + my $sensorStr = ReadingsVal($name, $actualVar, ""); my $sensorValue = ""; - my $sensorTS = ReadingsTimestamp($name, 'temperature', undef); + my $sensorTS = ReadingsTimestamp($name, $actualVar, undef); my $sensorIsAlive = 0; - my $iPortion = ReadingsVal( $name, 'p_i', 0 ); - my $pPortion = ReadingsVal( $name, 'p_p', "" ); - my $dPortion = ReadingsVal( $name, 'p_d', "" ); + my $iPortion = ReadingsVal($name, 'p_i', 0); + my $pPortion = ReadingsVal($name, 'p_p', ""); + my $dPortion = ReadingsVal($name, 'p_d', ""); my $stateStr = ""; - CommandDeleteReading(undef, "$name pidAlarm"); - my $deltaOld = ReadingsVal( $name, 'delta', 0 ); + readingsDelete($hash, 'pidAlarm'); + #CommandDeleteReading(undef, "$name pidAlarm"); + my $deltaOld = ReadingsVal($name, 'delta', 0); my $delta = ""; - my $deltaGradient = ( $hash->{helper}{deltaGradient} ) ? $hash->{helper}{deltaGradient} : 0; - my $calcReq = 0; + my $deltaGradient = $hash->{helper}{deltaGradient} ? $hash->{helper}{deltaGradient} : 0; + my $calcReq = 0; - # ---------------- check conditions + # check conditions while (1) { - # --------------- retrive values from attributes + # retrive values from attributes my $wakeUpCycle = AttrVal($name, 'wakeUpCycle', ReadingsVal($name, 'wakeUpCycle', 300)); my $pidCycle = $wakeUpCycle / 3; $pidCycle = 10 if ($pidCycle < 10); $hash->{helper}{actorInterval} = 10; #$hash->{helper}{actorThreshold} = 0; - $hash->{helper}{actorThreshold} = AttrVal($name, 'pidActorTreshold', 1); + $hash->{helper}{actorThreshold} = AttrVal($name, 'pidActorTreshold', 1); $hash->{helper}{actorKeepAlive} = $pidCycle; $hash->{helper}{actorValueDecPlaces} = 0; $hash->{helper}{actorErrorAction} = AttrVal($name, 'pidActorErrorAction', 'freeze'); - $hash->{helper}{actorErrorPos} = AttrVal($name, 'pidActorErrorPos', 0); + $hash->{helper}{actorErrorPos} = AttrVal($name, 'pidActorErrorPos', 0); $hash->{helper}{calcInterval} = $pidCycle; - $hash->{helper}{deltaTreshold} = AttrVal($name, 'pidDeltaTreshold', 0); + $hash->{helper}{deltaTreshold} = AttrVal($name, 'pidDeltaTreshold',0); if (AttrVal($name, 'measurementCtrl', 'enable') eq 'enable') { $hash->{helper}{sensorTimeout} = $wakeUpCycle * 4; } else { @@ -14870,31 +14871,18 @@ sub EnOcean_calcPID($) { } $desired = ReadingsVal( $name, 'setpointTempSet', ReadingsVal($name, 'setpointTemp', "")); - #my $desired = ReadingsVal( $name, $hash->{helper}{desiredName}, "" ); - - # sensor found - #PID20_Log $hash, 2, "--------------------------" if ($DEBUG); - #PID20_Log $hash, 2, "S1 sensorStr:$sensorStr sensorTS:$sensorTS" if ($DEBUG_Sensor); if ( !$sensorStr && !$stateStr ) { $stateStr = "alarm"; $err = 'no_temperature_value'; } # sensor alive - if ( $sensorStr && $sensorTS ) - { + if ( $sensorStr && $sensorTS ) { my $timeDiff = EnOcean_TimeDiff($sensorTS); $sensorIsAlive = 1 if ( $timeDiff <= $hash->{helper}{sensorTimeout} ); $sensorStr =~ m/$regexp/; $sensorValue = $1; $sensorValue = "" if ( !defined($sensorValue) ); - #PID20_Log $hash, 2, - # "S2 timeOfDay:" - # . gettimeofday() - # . " timeDiff:$timeDiff sensorTimeout:" - # . $hash->{helper}{sensorTimeout} - # . " --> sensorIsAlive:$sensorIsAlive" - # if ($DEBUG_Sensor); } # sensor dead @@ -14910,22 +14898,14 @@ sub EnOcean_calcPID($) { } # check delta threshold - $delta = ( $desired ne "" && $sensorValue ne "" ) ? $desired - $sensorValue : ""; - $calcReq = 1 if ( !$stateStr && $delta ne "" && ( abs($delta) >= abs( $hash->{helper}{deltaTreshold} ) ) ); - - #PID20_Log $hash, 2, - # "D1 desired[" . ( $desired ne "" ) ? sprintf( "%.1f", $desired ) - # : "" . "] - sensorValue: [" . ( $sensorValue ne "" ) ? sprintf( "%.1f", $sensorValue ) - # : "" . "] = delta[" . ( $delta ne "" ) ? sprintf( "%.2f", $delta ) - # : "" . "] calcReq:$calcReq" - # if ($DEBUG_Delta); + $delta = ($desired ne "" && $sensorValue ne "") ? $desired - $sensorValue : ""; + $calcReq = 1 if (!$stateStr && $delta ne "" && (abs($delta) >= abs($hash->{helper}{deltaTreshold}))); #request for calculation - # ---------------- calculation request if ($calcReq) { # reverse action requested - my $workDelta = ( $hash->{helper}{reverseAction} == 1 ) ? -$delta : $delta; - my $deltaOld = -$deltaOld if ( $hash->{helper}{reverseAction} == 1 ); + my $workDelta = ($hash->{helper}{reverseAction} == 1) ? -$delta : $delta; + my $deltaOld = -$deltaOld if ($hash->{helper}{reverseAction} == 1); # calc p-portion $pPortion = $workDelta * $hash->{helper}{factor_P}; @@ -14936,16 +14916,15 @@ sub EnOcean_calcPID($) { # calc i-portion respecting windUp # freeze i-portion if windUp is active my $isWindup = $actuationCalcOld - && ( ( $workDelta > 0 && $actuationCalcOld > $actorLimitUpper ) - || ( $workDelta < 0 && $actuationCalcOld < $actorLimitLower ) ); + && (($workDelta > 0 && $actuationCalcOld > $actorLimitUpper) + || ($workDelta < 0 && $actuationCalcOld < $actorLimitLower)); $hash->{helper}{adjust} = $adjust if(defined $adjust); if (defined $hash->{helper}{adjust}) { - $iPortion = $hash->{helper}{adjust} - ( $pPortion + $dPortion ); - $iPortion = $actorLimitUpper if ( $iPortion > $actorLimitUpper ); - $iPortion = $actorLimitLower if ( $iPortion < $actorLimitLower ); - #PID20_Log $hash, 5, "adjust request with:" . $hash->{helper}{adjust} . " ==> p_i:$iPortion"; + $iPortion = $hash->{helper}{adjust} - ($pPortion + $dPortion); + $iPortion = $actorLimitUpper if ($iPortion > $actorLimitUpper); + $iPortion = $actorLimitLower if ($iPortion < $actorLimitLower); delete $hash->{helper}{adjust}; - } elsif ( !$isWindup ) # integrate only if no windUp + } elsif (!$isWindup) # integrate only if no windUp { # normalize the intervall to minute=60 seconds $iPortion = $iPortion + $workDelta * $hash->{helper}{factor_I} * $hash->{helper}{calcInterval} / 60; @@ -14955,39 +14934,22 @@ sub EnOcean_calcPID($) { $hash->{helper}{isWindUP} = $isWindup; # check callback for iPortion - my $iportionCallBeforeSetting = AttrVal( $name, 'pidIPortionCallBeforeSetting', undef ); - if ( defined($iportionCallBeforeSetting) && exists &$iportionCallBeforeSetting ) - { - #PID20_Log $hash, 5, 'start callback ' . $iportionCallBeforeSetting . ' with iPortion:' . $iPortion; + my $iportionCallBeforeSetting = AttrVal($name, 'pidIPortionCallBeforeSetting', undef); + if (defined($iportionCallBeforeSetting) && exists &$iportionCallBeforeSetting) { no strict "refs"; - $iPortion = &$iportionCallBeforeSetting( $name, $iPortion ); + $iPortion = &$iportionCallBeforeSetting($name, $iPortion); use strict "refs"; - #PID20_Log $hash, 5, 'return value of ' . $iportionCallBeforeSetting . ':' . $iPortion; } # calc actuation $actuationCalc = $pPortion + $iPortion + $dPortion; - - #PID20_Log $hash, 2, "P1 delta:" . sprintf( "%.2f", $delta ) . " isWindup:$isWindup" if ($DEBUG_Calc); - - #PID20_Log $hash, 2, - # "P2 pPortion:" - # . sprintf( "%.2f", $pPortion ) - # . " iPortion:" - # . sprintf( "%.2f", $iPortion ) - # . " dPortion:" - # . sprintf( "%.2f", $dPortion ) - # . " actuationCalc:" - # . sprintf( "%.2f", $actuationCalc ) - # if ($DEBUG_Calc); } - # ---------------- acutation request - my $noTrouble = ( $desired ne "" && $sensorIsAlive ); + # acutation request + my $noTrouble = ($desired ne "" && $sensorIsAlive); # check actor fallback in case of sensor fault if (!$sensorIsAlive && ($hash->{helper}{actorErrorAction} eq "errorPos")) { - #$stateStr .= "- force pid-output to errorPos"; $err .= ':actuator_in_errorPos'; $actuationCalc = $hash->{helper}{actorErrorPos}; $actuationCalc = "" if ( !defined($actuationCalc) ); @@ -14997,25 +14959,19 @@ sub EnOcean_calcPID($) { $actuation = $actuationCalc; # limit $actuation - $actuation = $actorLimitUpper if ( $actuation ne "" && ( $actuation > $actorLimitUpper ) ); - $actuation = $actorLimitLower if ( $actuation ne "" && ( $actuation < $actorLimitLower ) ); + $actuation = $actorLimitUpper if ($actuation ne "" && ($actuation > $actorLimitUpper)); + $actuation = $actorLimitLower if ($actuation ne "" && ($actuation < $actorLimitLower)); # check if round request my $fmt = "%." . $hash->{helper}{actorValueDecPlaces} . "f"; - $actuation = sprintf( $fmt, $actuation ) if ( $actuation ne "" ); - my $actuationDiff = abs( $actuation - $actuationDone ) - if ( $actuation ne "" && $actuationDone ne "" ); - #PID20_Log $hash, 2, - # "A1 act:$actuation actDone:$actuationDone " - # . " actThreshold:" - # . $hash->{helper}{actorThreshold} - # . " actDiff:$actuationDiff" - # if ($DEBUG_Actuation); + $actuation = sprintf($fmt, $actuation) if ($actuation ne ""); + my $actuationDiff = abs($actuation - $actuationDone) + if ($actuation ne "" && $actuationDone ne ""); # check threshold-condition for actuation my $rsTS = $actuationDone ne "" && $actuationDiff >= $hash->{helper}{actorThreshold}; - # ...... special handling if acutation is in the black zone between actorLimit and (actorLimit - actorThreshold) + # special handling if acutation is in the black zone between actorLimit and (actorLimit - actorThreshold) # upper range my $rsUp = $actuationDone ne "" @@ -15031,27 +14987,16 @@ sub EnOcean_calcPID($) { && $actuation <= $actorLimitLower; # upper or lower limit are exceeded - my $rsLimit = $actuationDone ne "" && ( $actuationDone < $actorLimitLower || $actuationDone > $actorLimitUpper ); - - my $actuationByThreshold = (( $rsTS || $rsUp || $rsDown) && $noTrouble); - #PID20_Log $hash, 2, "A2 rsTS:$rsTS rsUp:$rsUp rsDown:$rsDown noTrouble:$noTrouble" - # if ($DEBUG_Actuation); + my $rsLimit = $actuationDone ne "" && ($actuationDone < $actorLimitLower || $actuationDone > $actorLimitUpper); + my $actuationByThreshold = (($rsTS || $rsUp || $rsDown) && $noTrouble); # check time condition for actuation my $actTimeDiff = EnOcean_TimeDiff($actorTimestamp); # $actorTimestamp is valid in each case - my $actuationByTime = ($noTrouble) && ( $actTimeDiff > $hash->{helper}{actorInterval} ); - #PID20_Log $hash, 2, - # "A3 actTS:$actorTimestamp" - # . " actTimeDiff:" - # . sprintf( "%.2f", $actTimeDiff ) - # . " actInterval:" - # . $hash->{helper}{actorInterval} - # . "-->actByTime:$actuationByTime " - # if ($DEBUG_Actuation); + my $actuationByTime = ($noTrouble) && ($actTimeDiff > $hash->{helper}{actorInterval}); # check keep alive condition for actuation - my $actuationKeepAliveReq = ( $actTimeDiff >= $hash->{helper}{actorKeepAlive} ) - if ( defined($actTimeDiff) && $actuation ne "" ); + my $actuationKeepAliveReq = ($actTimeDiff >= $hash->{helper}{actorKeepAlive}) + if (defined($actTimeDiff) && $actuation ne ""); # build total actuation request my $actuationReq = ( @@ -15061,19 +15006,11 @@ sub EnOcean_calcPID($) { || $actuationDone eq "" # startup condition ) && $actuation ne ""; # acutation is initialized - #PID20_Log $hash, 2, - # "A4 (actByTh:$actuationByThreshold && actByTime:$actuationByTime)" - # . "||actKeepAlive:$actuationKeepAliveReq" - # . "||rsLimit:$rsLimit=actnReq:$actuationReq" - # if ($DEBUG_Actuation); - - # ................ perform output to actor - #if ($actuationReq) { + # perform output to actor if ($cmd =~ m/^start|actuator$/) { # check calback for actuation - my $actorCallBeforeSetting = AttrVal( $name, 'pidActorCallBeforeSetting', undef ); + my $actorCallBeforeSetting = AttrVal($name, 'pidActorCallBeforeSetting', undef); if (defined($actorCallBeforeSetting) && exists(&$actorCallBeforeSetting)) { - #PID20_Log $hash, 5, 'start callback ' . $actorCallBeforeSetting . ' with actuation:' . $actuation; no strict "refs"; $actuation = &$actorCallBeforeSetting($name, $actuation); use strict "refs"; @@ -15086,8 +15023,8 @@ sub EnOcean_calcPID($) { } readingsBeginUpdate($hash); - #readingsBulkUpdate( $hash, $hash->{helper}{desiredName}, $desired ) if ( $desired ne "" ); - #readingsBulkUpdate( $hash, $hash->{helper}{measuredName}, $sensorValue ) if ( $sensorValue ne "" ); + #readingsBulkUpdate($hash, $hash->{helper}{desiredName}, $desired) if ($desired ne ""); + #readingsBulkUpdate($hash, $hash->{helper}{measuredName}, $sensorValue) if ($sensorValue ne ""); readingsBulkUpdate($hash, 'delta', $delta ) if ($delta ne ""); readingsBulkUpdate($hash, 'p_p', $pPortion) if ($pPortion ne ""); readingsBulkUpdate($hash, 'p_d', $dPortion) if ($dPortion ne ""); @@ -15101,35 +15038,26 @@ sub EnOcean_calcPID($) { readingsBulkUpdate($hash, 'setpointSet', $actuationDone) if ($actuationDone ne ""); $setpoint = $actuationDone; } - readingsEndUpdate( $hash, 1 ); - + readingsEndUpdate($hash, 1); last; - } # end while + } - # ........ update statePID. + # update statePID. $stateStr = 'idle' if ($stateStr eq '' && !$calcReq); $stateStr = 'processing' if ($stateStr eq '' && $calcReq); - #PID20_Log $hash, 2, "C1 stateStr:$stateStr calcReq:$calcReq" if ($DEBUG_Calc); - - #......... timer setup - #my $next = gettimeofday() + $hash->{helper}{calcInterval}; - #RemoveInternalTimer($name); # prevent multiple timers for same hash - #InternalTimer( $next, "PID20_Calc", $name, 1 ); - - #PID20_Log $hash, 2, "InternalTimer next:".FmtDateTime($next)." PID20_Calc name:$name DEBUG_Calc:$DEBUG_Calc"; readingsBeginUpdate($hash); readingsBulkUpdate($hash, 'pidState', $stateStr); readingsBulkUpdate($hash, 'pidAlarm', $err) if (defined $err); readingsEndUpdate($hash, 1); Log3($name, 5, "EnOcean $name EnOcean_calcPID Cmd: $cmd pidState: $stateStr T: $sensorValue SP: $setpoint SPT: $desired"); - @{$hash->{helper}{calcPID}} = (undef, $hash, 'periodic', undef); + @{$hash->{helper}{calcPID}} = (undef, $hash, 'periodic', undef, $actualVar); RemoveInternalTimer($hash->{helper}{calcPID}); InternalTimer(gettimeofday() + $hash->{helper}{calcInterval} * 1.02, "EnOcean_calcPID", $hash->{helper}{calcPID}, 0); return ($err, $logLevel, $response); } -# sent message to Multisnesor Window Handle (EEP D2-06-01) +# sent message to Multisensor Window Handle (EEP D2-06-01) sub EnOcean_multisensor_01Snd($$$) { @@ -17996,11 +17924,11 @@ EnOcean_Delete($$) Security features