2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-19 12:46:03 +00:00

10_EnOcean: environmentApp: windStrength calculation corrected, readings renamed

git-svn-id: https://svn.fhem.de/fhem/trunk@22876 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klaus.schauer 2020-09-28 17:49:27 +00:00
parent c71fbd76df
commit 4aea89fd8c

View File

@ -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,41 +14811,33 @@ 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 $stateStr = "";
CommandDeleteReading(undef, "$name pidAlarm");
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 $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);
@ -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
@ -14913,15 +14901,7 @@ sub EnOcean_calcPID($) {
$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);
#request for calculation
# ---------------- calculation request
if ($calcReq) {
# reverse action requested
my $workDelta = ($hash->{helper}{reverseAction} == 1) ? -$delta : $delta;
@ -14943,7 +14923,6 @@ sub EnOcean_calcPID($) {
$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";
delete $hash->{helper}{adjust};
} elsif (!$isWindup) # integrate only if no windUp
{
@ -14956,38 +14935,21 @@ sub EnOcean_calcPID($) {
# 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;
if (defined($iportionCallBeforeSetting) && exists &$iportionCallBeforeSetting) {
no strict "refs";
$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
# 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) );
@ -15005,17 +14967,11 @@ sub EnOcean_calcPID($) {
$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);
# 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 ""
@ -15032,22 +14988,11 @@ sub EnOcean_calcPID($) {
# 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);
# 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);
# check keep alive condition for actuation
my $actuationKeepAliveReq = ($actTimeDiff >= $hash->{helper}{actorKeepAlive})
@ -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);
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";
@ -15102,34 +15039,25 @@ sub EnOcean_calcPID($) {
$setpoint = $actuationDone;
}
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($$)
<b>Security features</b><br>
<ul>
The receiving and sending of encrypted messages is supported. This module currently allows the secure operating mode of PTM 215
based switches.<br>
The receiving and sending of encrypted messages is supported. This module currently allows the secure operating mode of
a variety of sensors and PTM 215 based switches.<br>
To receive secured telegrams, you first have to start the teach in mode via<br><br>
<code>set &lt;IODev&gt; teach &lt;t/s&gt;</code><br><br>
and then doing the following on the PTM 215 module:<br>
On the PTM 215 module doing the following:<br>
<ul>
<li>Remove the switch cover of the module</li>
<li>Press both buttons of one rocker side (A0 & A1 or B0 & B1)</li>
@ -20158,10 +20086,10 @@ EnOcean_Delete($$)
Command being executed after an message from the aktor is received and before an response message is sent.
If &lt;command&gt; is enclosed in {}, then it is a perl expression, if it is enclosed in "", then it is a shell command,
else it is a "plain" fhem.pl command (chain). In the &lt;command&gt; you can access the name of the device by using $NAME
and the current readings $ACTUATORSTATE, $BATTERY, $COVER, $ENERGYINPUT, $ENERGYSTORAGE, $MAINTENANCEMODE, $OPERATIONMODE,
$ROOMTEMP, $SELFCTRL, $SETPOINT, $SETPOINTTEMP, $SUMMERMODE, $TEMPERATURE, $WINDOW for the subType hvac.01, $NAME,
and the current readings<br> $ACTUATORSTATE, $BATTERY, $COVER, $ENERGYINPUT, $ENERGYSTORAGE, $MAINTENANCEMODE, $OPERATIONMODE,
$ROOMTEMP, $SELFCTRL, $SETPOINT, $SETPOINTTEMP, $SUMMERMODE, $TEMPERATURE, $WINDOW for the subType hvac.01,<br> $NAME,
$BATTERY, $FEEDTEMP, $MAINTENANCEMODE, $OPERATIONMODE, $ROOMTEMP, $SETPOINT, $SETPOINTTEMP, $SUMMERMODE, $TEMPERATURE
for the subType hvac.04 and $ACTUATORSTATE, $BATTERY, $ENERGYINPUT, $ENERGYSTORAGE, $FEEDTEMP, $MAINTENANCEMODE, $OPERATIONMODE,
for the subType hvac.04 and<br> $ACTUATORSTATE, $BATTERY, $ENERGYINPUT, $ENERGYSTORAGE, $FEEDTEMP, $MAINTENANCEMODE, $OPERATIONMODE,
$RADIOCOMERR, $RADIOSIGNALSTRENGTH, $ROOMTEMP, $SETPOINT, $SETPOINTTEMP, $SETPOINTTEMPLOCAL, $SUMMERMODE, $TEMPERATURE, $WINDOW
for the subType hvac.06.
This data is available as a local variable in perl, as environment variable for shell
@ -21521,11 +21449,11 @@ EnOcean_Delete($$)
Direction Exchange (EEP A5-13-05)<br>
Geographic Exchange (EEP A5-13-06)<br>
<ul>
<li>azimuth: &alpha;/&deg; (Sensor Range: &alpha; = 0 &deg; ... 359 &deg;)</li>
<li>date: JJJJ-MM-DD</li>
<li>elevation: &beta;/&deg; (Sensor Range: &beta; = -90 &deg; ... 90 &deg;)</li>
<li>latitude: &phi;/&deg; (Sensor Range: &phi; = -90 &deg; ... 90 &deg;)</li>
<li>longitude: &lambda;/&deg; (Sensor Range: &lambda; = -180 &deg; ... 180 &deg;)</li>
<li>sunAzimuth: &alpha;/&deg; (Sensor Range: &alpha; = 0 &deg; ... 359 &deg;)</li>
<li>sunElevation: &beta;/&deg; (Sensor Range: &beta; = -90 &deg; ... 90 &deg;)</li>
<li>time: hh:mm:ss [AM|PM]</li>
<li>timeSource: GPS|RTC</li>
<li>twilight: T/% (Sensor Range: T = 0 % ... 100 %)</li>