2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 18:59:33 +00:00

93_PWMR.pm : add readings for more readable tempRules

git-svn-id: https://svn.fhem.de/fhem/trunk@12291 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jamesgo 2016-10-07 06:17:09 +00:00
parent 1ca97763e8
commit 9dfc2cb6c8

View File

@ -33,6 +33,8 @@
# 29.06.16 GA add "set frostProtect on|off"
# 16.08.16 GA add event-min-interval
# 23.09.16 GA fix changes on commandref based on suggestions from user "sledge"
# 28.09.16 GA add readings for tempRules (single reading for Mo to So)
# 04.10.16 GA fix adjust readings for tempRules if temperature changes
# module for PWM (Pulse Width Modulation) calculation
@ -1069,10 +1071,113 @@ PWMR_normTime ($)
}
sub
PWMR_NormalizeRules(@)
{
my ($hash) = @_;
my $name = $hash->{NAME};
my $rule;
my @week = ();
Log3 ($hash, 2, "PWMR_NormalizeRules");
if ($hash->{c_autoCalcTemp} == 0 or $hash->{c_desiredTempFrom} ne "")
{
Log3 ($hash, 2, "PWMR_NormalizeRules delete readings timer._..");
delete ($hash->{READINGS}{timer1_Mo}) if (defined ($hash->{READINGS}{timer1_Mo}));
delete ($hash->{READINGS}{timer2_Di}) if (defined ($hash->{READINGS}{timer2_Di}));
delete ($hash->{READINGS}{timer3_Mi}) if (defined ($hash->{READINGS}{timer3_Mi}));
delete ($hash->{READINGS}{timer4_Do}) if (defined ($hash->{READINGS}{timer4_Do}));
delete ($hash->{READINGS}{timer5_Fr}) if (defined ($hash->{READINGS}{timer5_Fr}));
delete ($hash->{READINGS}{timer6_Sa}) if (defined ($hash->{READINGS}{timer6_Sa}));
delete ($hash->{READINGS}{timer7_So}) if (defined ($hash->{READINGS}{timer7_So}));
return;
}
foreach my $var ("c_tempRule1", "c_tempRule2", "c_tempRule3", "c_tempRule4", "c_tempRule5")
{
$rule = $hash->{$var};
if ($rule ne "") { # valid rule is 1-5 0600,D 1800,C 2200,N
Log3 ($hash, 5, "PWMR_NormalizeRules from $var: $rule");
my ($day, @points) = split (" ", $rule);
my ($dayFromNo, $dayToNo) = split ("-", $day);
$dayFromNo = 7 if ($dayFromNo == 0);
$dayToNo = 7 if ($dayToNo == 0);
my $lastTime = "";
my $lastTempId = "";
my $lastTemp = "";
my $ruleLong = "";
foreach my $step (@points) {
$step =~ /^(..)(..),(.)$/;
my ($actTime, $actTempId) = ($1.":".$2, $3);
if ($lastTime ne "") {
$ruleLong .= sprintf ("%s-%s,%s,%s ", $lastTime, $actTime, $lastTempId, $lastTemp);
}
$lastTime = $actTime;
$lastTempId = $actTempId;
if ($actTempId eq "D") {
$lastTemp = $hash->{c_tempD};
} elsif ($actTempId eq "E") {
$lastTemp = $hash->{c_tempE};
} elsif ($actTempId eq "C") {
$lastTemp = $hash->{c_tempC};
} else {
$lastTemp = $hash->{c_tempN};
}
}
if (uc($lastTempId) ne "N") {
$ruleLong .= sprintf "%s-%s,%s,%s ", $lastTime, "23:59", $lastTempId, $lastTemp;
}
Log3 ($hash, 5, "PWMR_NormalizeRules to $var: $dayFromNo-$dayToNo $ruleLong");
for (my $i=1; $i<=7; $i++)
{
# only first rule matches
if ($dayFromNo <= $dayToNo) {
# rule 1 .. 5
if ($i >= $dayFromNo and $i <= $dayToNo) {
$week[$i] = $ruleLong if (!defined($week[$i]));
}
} else {
# rule 7 .. 1
if ($i >= $dayFromNo or $i <= $dayToNo) {
$week[$i] = $ruleLong if (!defined($week[$i]));
}
}
}
}
}
# update Readings
readingsBeginUpdate ($hash);
readingsBulkUpdate ($hash, "timer1_Mo", (defined($week[1]) ? $week[1] : ""));
readingsBulkUpdate ($hash, "timer2_Di", (defined($week[2]) ? $week[2] : ""));
readingsBulkUpdate ($hash, "timer3_Mi", (defined($week[3]) ? $week[3] : ""));
readingsBulkUpdate ($hash, "timer4_Do", (defined($week[4]) ? $week[4] : ""));
readingsBulkUpdate ($hash, "timer5_Fr", (defined($week[5]) ? $week[5] : ""));
readingsBulkUpdate ($hash, "timer6_Sa", (defined($week[6]) ? $week[6] : ""));
readingsBulkUpdate ($hash, "timer7_So", (defined($week[7]) ? $week[7] : ""));
readingsEndUpdate($hash, 0);
}
sub
PWMR_CheckTempRule(@)
{
my ($hash, $var, $vals) = @_;
my ($hash, $attrname, $var, $vals) = @_;
my $name = $hash->{NAME};
my $valid = "";
@ -1083,8 +1188,7 @@ PWMR_CheckTempRule(@)
Log3 ($hash, 4, "PWMR_CheckTempRule: $hash->{NAME} $var <$vals>");
my @points = split (" ", $vals);
my $day = $points[0];
my ($day, @points) = split (" ", $vals);
unless ( $day =~ /-/ ) { # normalise Mo to Mo-Mo
$day = "$day-$day";
@ -1103,8 +1207,6 @@ PWMR_CheckTempRule(@)
Log3 ($hash, 4, "PWMR_CheckTempRule: $name day valid: $valid");
shift @points;
foreach my $point (@points) {
#Log3 ($hash, 4, "loop: $point");
my ($from, $temp) = split(",", $point);
@ -1127,6 +1229,8 @@ PWMR_CheckTempRule(@)
Log3 ($hash, 4, "PWMR_CheckTempRule: $name $var <$valid>");
$hash->{$var} = $valid;
PWMR_NormalizeRules($hash);
return undef
}
@ -1150,86 +1254,102 @@ PWMR_CheckTemp(@)
return "$error";
}
$hash->{$var} = $vals;
return undef;
$hash->{$var} = $vals;
PWMR_NormalizeRules($hash);
return undef;
}
sub
PWMR_Attr(@)
{
my @a = @_;
#my @a = @_;
my ($action, $name, $attrname, $attrval) = @_;
#my $name = $a[1];
#my $attr = $a[2];
#my $val = defined ($a[3]) ? $a[3] : "";
#my $val = $a[3];
my $name = $a[1];
my $hash = $defs{$name};
my $attr = $a[2];
my $val = $a[3];
$attrval = "" unless defined ($attrval);
#Log3 ($hash, 2, "Attr cmd: $action, Attr $attrname value <$attrval> attr <$attr{$name}{$attrname}>");
if ($a[0] eq "del") {
if ($action eq "del") {
Log3 ($hash, 4, "PWMR_Attr: $name, delete $attrname");
if ($attr eq "tempRule1") {
if ($attrname eq "tempRule1") {
$hash->{c_tempRule1} = "";
} elsif ($attr eq "tempRule2") {
PWMR_NormalizeRules($hash);
} elsif ($attrname eq "tempRule2") {
$hash->{c_tempRule2} = "";
} elsif ($attr eq "tempRule3") {
PWMR_NormalizeRules($hash);
} elsif ($attrname eq "tempRule3") {
$hash->{c_tempRule3} = "";
} elsif ($attr eq "tempRule4") {
PWMR_NormalizeRules($hash);
} elsif ($attrname eq "tempRule4") {
$hash->{c_tempRule4} = "";
} elsif ($attr eq "tempRule5") {
PWMR_NormalizeRules($hash);
} elsif ($attrname eq "tempRule5") {
$hash->{c_tempRule5} = "";
} elsif ($attr eq "frostProtect") {
PWMR_NormalizeRules($hash);
} elsif ($attrname eq "frostProtect") {
$hash->{c_frostProtect} = 0;
} elsif ($attr eq "desiredTempFrom") {
} elsif ($attrname eq "desiredTempFrom") {
$hash->{c_desiredTempFrom} = "";
delete($hash->{d_name});
delete($hash->{d_reading});
delete($hash->{d_regexpTemp});
} elsif ($attr eq "autoCalcTemp") {
PWMR_NormalizeRules($hash);
} elsif ($attrname eq "autoCalcTemp") {
$hash->{c_autoCalcTemp} = 1;
$hash->{STATE} = "Calculating";
PWMR_NormalizeRules($hash);
}
if ($attr eq "valueFormat" and defined ($hash->{helper}{$attr})) {
delete ($hash->{helper}{$attr});
if ($attrname eq "valueFormat" and defined ($hash->{helper}{$attrname})) {
delete ($hash->{helper}{$attrname});
}
PWMR_NormalizeRules($hash);
return undef;
}
if (!defined($val)) {
Log3 ($hash, 4, "PWMR_Attr: $name, delete $attr ($val)");
return undef;
} else {
Log3 ($hash, 4, "PWMR_Attr: $name, $attr, $val");
}
Log3 ($hash, 4, "PWMR_Attr: $name, $attrname, $attrval");
if ($attr eq "frostProtect") { # frostProtect 0/1
if ($val eq 0 or $val eq 1) {
$hash->{c_frostProtect} = $val;
} elsif ($val eq "") {
if ($attrname eq "frostProtect") { # frostProtect 0/1
if ($attrval eq 0 or $attrval eq 1) {
$hash->{c_frostProtect} = $attrval;
} elsif ($attrval eq "") {
$hash->{c_frostProtect} = 0;
} else {
return "valid values are 0 or 1";
}
} elsif ($attr eq "autoCalcTemp") { # autoCalcTemp 0/1
if ($val eq 0) {
} elsif ($attrname eq "autoCalcTemp") { # autoCalcTemp 0/1
if ($attrval eq 0) {
$hash->{c_autoCalcTemp} = 0;
$hash->{STATE} = "Manual";
} elsif ( $val eq 1) {
} elsif ( $attrval eq 1) {
$hash->{c_autoCalcTemp} = 1;
$hash->{STATE} = "Calculating";
} elsif ($val eq "") {
} elsif ($attrval eq "") {
$hash->{c_autoCalcTemp} = 1;
$hash->{STATE} = "Calculating";
} else {
return "valid values are 0 or 1";
}
PWMR_NormalizeRules($hash);
} elsif ($attr eq "desiredTempFrom") { # desiredTempFrom
$hash->{c_desiredTempFrom} = $val;
} elsif ($attrname eq "desiredTempFrom") { # desiredTempFrom
$hash->{c_desiredTempFrom} = $attrval;
my ( $d_name, $d_reading, $d_regexpTemp) = split (":", $val, 3);
my ( $d_name, $d_reading, $d_regexpTemp) = split (":", $attrval, 3);
# set defaults
@ -1241,56 +1361,57 @@ PWMR_Attr(@)
unless (defined($defs{$hash->{d_name}})) {
return "error: $hash->{d_name} does not exist.";
}
PWMR_NormalizeRules($hash);
} elsif ($attr eq "tempDay") { # tempDay
return PWMR_CheckTemp($hash, "c_tempD", $val);
} elsif ($attrname eq "tempDay") { # tempDay
return PWMR_CheckTemp($hash, "c_tempD", $attrval);
} elsif ($attr eq "tempNight") { # tempNight
return PWMR_CheckTemp($hash, "c_tempN", $val);
} elsif ($attrname eq "tempNight") { # tempNight
return PWMR_CheckTemp($hash, "c_tempN", $attrval);
} elsif ($attr eq "tempCosy") { # tempCosy
return PWMR_CheckTemp($hash, "c_tempC", $val);
} elsif ($attrname eq "tempCosy") { # tempCosy
return PWMR_CheckTemp($hash, "c_tempC", $attrval);
} elsif ($attr eq "tempEnergy") { # tempEnergy
return PWMR_CheckTemp($hash, "c_tempE", $val);
} elsif ($attrname eq "tempEnergy") { # tempEnergy
return PWMR_CheckTemp($hash, "c_tempE", $attrval);
} elsif ($attr eq "tempRule1") { # tempRule1
return PWMR_CheckTempRule($hash, "c_tempRule1", $val);
} elsif ($attrname eq "tempRule1") { # tempRule1
return PWMR_CheckTempRule($hash, $attrname, "c_tempRule1", $attrval);
} elsif ($attr eq "tempRule2") { # tempRule2
return PWMR_CheckTempRule($hash, "c_tempRule2", $val);
} elsif ($attrname eq "tempRule2") { # tempRule2
return PWMR_CheckTempRule($hash, $attrname, "c_tempRule2", $attrval);
} elsif ($attr eq "tempRule3") { # tempRule3
return PWMR_CheckTempRule($hash, "c_tempRule3", $val);
} elsif ($attrname eq "tempRule3") { # tempRule3
return PWMR_CheckTempRule($hash, $attrname, "c_tempRule3", $attrval);
} elsif ($attr eq "tempRule4") { # tempRule4
return PWMR_CheckTempRule($hash, "c_tempRule4", $val);
} elsif ($attrname eq "tempRule4") { # tempRule4
return PWMR_CheckTempRule($hash, $attrname, "c_tempRule4", $attrval);
} elsif ($attr eq "tempRule5") { # tempRule5
return PWMR_CheckTempRule($hash, "c_tempRule5", $val);
} elsif ($attrname eq "tempRule5") { # tempRule5
return PWMR_CheckTempRule($hash, $attrname, "c_tempRule5", $attrval);
}
if ($attr eq "valueFormat") {
my $attrVal = $val;
if( $attrVal =~ m/^{.*}$/s && $attrVal =~ m/=>/ && $attrVal !~ m/\$/ ) {
my $av = eval $attrVal;
if ($attrname eq "valueFormat") {
my $attrValTmp = $attrval;
if( $attrValTmp =~ m/^{.*}$/s && $attrValTmp =~ m/=>/ && $attrValTmp !~ m/\$/ ) {
my $av = eval $attrValTmp;
if( $@ ) {
Log3 ($hash->{NAME}, 3, $hash->{NAME} ." $attr: ". $@);
Log3 ($hash->{NAME}, 3, $hash->{NAME} ." $attrname: ". $@);
} else {
$attrVal = $av if( ref($av) eq "HASH" );
$attrValTmp = $av if( ref($av) eq "HASH" );
}
$hash->{helper}{$attr} = $attrVal;
$hash->{helper}{$attrname} = $attrValTmp;
foreach my $key (keys %{$hash->{helper}{$attr}}) {
Log3 ($hash->{NAME}, 3, $hash->{NAME} ." $key ".$hash->{helper}{$attr}{$key});
foreach my $key (keys %{$hash->{helper}{$attrname}}) {
Log3 ($hash->{NAME}, 3, $hash->{NAME} ." $key ".$hash->{helper}{$attrname}{$key});
}
#return "$attr set to $attrVal";
#return "$attrname set to $attrValTmp";
} else {
# if valueFormat is not verified sucessfully ... the helper is deleted (=not used)
delete $hash->{helper}{$attr};
delete $hash->{helper}{$attrname};
}
return undef;
}