From 79b15243da1709ada1d7727c1d9e25e1f34dfc99 Mon Sep 17 00:00:00 2001 From: damian-s Date: Sat, 3 May 2014 18:20:32 +0000 Subject: [PATCH] new Attributes: number_format target_func git-svn-id: https://svn.fhem.de/fhem/trunk@5739 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_THRESHOLD.pm | 49 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) 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($$)
  • state_cmd1_gt
  • state_cmd2_lt
  • state_format
  • +
  • number_format
  • + The specified format is used in the state for formatting desired_value (_dv) and Sensor_value (_s1v) using the sprintf function.
    + The default value is "% .1f" to one decimal place. Other formatting, see Formatting in the sprintf function in the Perldokumentation.
    + If the attribute is deleted, numbers are not formatted in the state.
    +
  • target_func
  • + Here, a Perl expression used to calculate a target value from a value of the external sensor.
    + The sensor value is given as "_tv" in the expression.
    + Example:
    + attr TH_heating target_func -0.578*_tv+33.56

    @@ -952,6 +980,18 @@ THRESHOLD_setValue($$) define TH_room THRESHOLD indoor OR TH_outdoor:state:off heating
    set TH_room desired 21

    + Steuerung einer Heizung nach einer Heizkennlinie:
    +
    + Berechnung der Solltemperatur für die Vorlauftemperatur für Fußbodenheizung mit Hilfe der 0,8-Heizkennlinie anhand der Außentemperatur :
    +
    + define TH_heating THRESHOLD flow:temperature:2:outdoor:temperature heating
    + attr TH_heating target_func -0.578*_tv+33.56
    +
    + Nachtabsenkung lässt sich zeitgesteuert durch das Setzen von "offset" realisieren.
    + Von 22:00 bis 5:00 Uhr soll die Vorlauftemperatur um 10 Grad herabgesetzt werden:
    +
    + define W_heating weekdaytimer TH_heating 05:00|0 22:00|-10 set @ offset %
    +

    Beispiele für Belüftungssteuerung:

    @@ -1224,6 +1264,13 @@ THRESHOLD_setValue($$)
  • state_cmd1_gt
  • state_cmd2_lt
  • state_format
  • +
  • number_format
  • + Das angegebene Format wird im Status für die Formatierung von desired_value (_dv) und sensor_value (_s1v) über die sprintf-Funktion benutzt.
    + Voreingestellt ist "%.1f" für eine Nachkommastelle. Für weiter Formatierungen - siehe Formatierung in der sprintf-Funktion in der Perldokumentation.
    + Wenn das Attribut gelöscht wird, werden Zahlen im Status nicht formatiert.
    +
  • target_func
  • + Hier kann ein Perlausdruck angegeben werden, um aus dem Vorgabewert eines externen Sensors (target_value) einen Sollwert zu berechnen.
    + Der Sensorwert wird mit "_tv" im Ausdruck angegeben. Siehe dazu Beispiele oben zur Steuerung der Heizung nach einer Heizkennlinie.