diff --git a/fhem/FHEM/98_THRESHOLD.pm b/fhem/FHEM/98_THRESHOLD.pm index c16102449..3fa1ee8f2 100644 --- a/fhem/FHEM/98_THRESHOLD.pm +++ b/fhem/FHEM/98_THRESHOLD.pm @@ -35,7 +35,7 @@ THRESHOLD_Initialize($) $hash->{SetFn} = "THRESHOLD_Set"; $hash->{AttrFn} = "THRESHOLD_Attr"; $hash->{NotifyFn} = "THRESHOLD_Notify"; - $hash->{AttrList} = "disable:0,1 loglevel:0,1,2,3,4,5,6 state_format state_cmd1_gt state_cmd2_lt"; + $hash->{AttrList} = "disable:0,1 loglevel:0,1,2,3,4,5,6 state_format state_cmd1_gt state_cmd2_lt target_func number_format"; } @@ -184,6 +184,7 @@ THRESHOLD_Define($$$) $attr{$pn}{state_cmd2_lt} = "on"; $cmd_default = 2; $attr{$pn}{state_format} = "_m _dv _sc"; + $attr{$pn}{number_format} = "%.1f"; } } else { # actor parameters $cmd1_gt = $b[1] if (defined($b[1])); @@ -207,6 +208,7 @@ THRESHOLD_Define($$$) $attr{$pn}{state_format} = "_sc"; } else { $attr{$pn}{state_format} = "_m _dv"; + $attr{$pn}{number_format} = "%.1f"; } } @@ -442,6 +444,18 @@ THRESHOLD_Check($) my $instr = $defs{$target_sensor}{READINGS}{$target_reading}{VAL}; $instr =~ /[^\d^\-^.]*([-\d.]*)/; $t_value = $1; + my $target_func = AttrVal($pn, "target_func", ""); + if ($target_func) + { + $target_func =~ s/\_tv/$t_value/g; + my $ret = eval $target_func; + if ($@) { + my $msg = "$pn: error in target_func: $target_func, ".$@; + Log3 $pn,2, $msg; + return""; + } + $t_value=$ret; + } $sensor_max = $t_value+$hash->{offset}; $sensor_min = $t_value-$hash->{hysteresis}+$hash->{offset}; } @@ -549,6 +563,11 @@ THRESHOLD_set_state($) # my %h_state_cmd = (cmd1_gt=>state_cmd1_gt, cmd2_lt=>state_cmd2_lt); my $state_cmd = AttrVal ($pn, "state_".$cmd,""); my $state_format = AttrVal($pn, "state_format", "_m _dv"); + my $number_format = AttrVal($pn, "number_format", ""); + if ($number_format ne "") { + $desired_value =sprintf($number_format,$desired_value) if ($desired_value ne ""); + $sensor_value =sprintf($number_format,$sensor_value) if ($sensor_value ne ""); + } $state_format =~ s/\_m/$mode/g; $state_format =~ s/\_dv/$desired_value/g; $state_format =~ s/\_s1v/$sensor_value/g; @@ -871,6 +890,15 @@ THRESHOLD_setValue($$)
attr TH_heating target_func -0.578*_tv+33.56define TH_room THRESHOLD indoor OR TH_outdoor:state:off heatingset TH_room desired 21define TH_heating THRESHOLD flow:temperature:2:outdoor:temperature heatingattr TH_heating target_func -0.578*_tv+33.56define W_heating weekdaytimer TH_heating 05:00|0 22:00|-10 set @ offset %