From 03ee68e7a0bbfc377ed18d90281aa1b88f2895a6 Mon Sep 17 00:00:00 2001 From: damian-s <> Date: Wed, 20 Mar 2013 18:44:26 +0000 Subject: [PATCH] new: state_cmd1, state_cmd2 git-svn-id: https://svn.fhem.de/fhem/trunk@2953 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_THRESHOLD.pm | 189 +++++++++++++++++++++++++------------- 1 file changed, 123 insertions(+), 66 deletions(-) diff --git a/fhem/FHEM/98_THRESHOLD.pm b/fhem/FHEM/98_THRESHOLD.pm index e15be8b51..80209a74e 100644 --- a/fhem/FHEM/98_THRESHOLD.pm +++ b/fhem/FHEM/98_THRESHOLD.pm @@ -46,12 +46,15 @@ THRESHOLD_Define($$$) my @a = split("[ \t][ \t]*", $b[0]); my $cmd1=""; my $cmd2=""; + my $state_cmd1=""; + my $state_cmd2=""; my $cmd_default=0; my $actor; - if (@b > 4 || @a < 3 || @a > 6) { + if (@b > 5 || @a < 3 || @a > 6) { my $msg = "wrong syntax: define THRESHOLD " . - "[:[:][:] [AND|OR [:][:]] [][|][|][|]"; + "[:[][:[][:]]] [AND|OR [:[][:]]] ". + "[][|[][|[][|[][|[[][:]]]]]]"; Log 2, $msg; return $msg; } @@ -134,20 +137,25 @@ THRESHOLD_Define($$$) } else { # actor parameters $cmd1 = $b[1] if (defined($b[1])); $cmd2 = $b[2] if (defined($b[2])); - if (defined($b[3])) { - $cmd_default = $b[3]; - if ($cmd_default !~ m/^[0-2]$/ ) { - my $msg = "$pn: value:$cmd_default, cmd_default_index needs 0,1,2"; - Log 2, $msg; - return $msg; - } - } - } + $cmd_default = (!($b[3])) ? 0 : $b[3]; + if ($cmd_default !~ m/^[0-2]$/ ) { + my $msg = "$pn: value:$cmd_default, cmd_default_index needs 0,1,2"; + Log 2, $msg; + return $msg; + } + if (defined($b[4])) { + my ($st_cmd1, $st_cmd2) = split(":", $b[4], 2); + $state_cmd1 = $st_cmd1 if (defined($st_cmd1)); + $state_cmd2 = $st_cmd2 if (defined($st_cmd2)); + } + } if (defined($actor)) { $cmd1 =~ s/@/$actor/g; $cmd2 =~ s/@/$actor/g; } - + + $hash->{helper}{state_cmd1} = $state_cmd1; + $hash->{helper}{state_cmd2} = $state_cmd2; $hash->{helper}{actor_cmd1} = SemicolonEscape($cmd1); $hash->{helper}{actor_cmd2} = SemicolonEscape($cmd2); $hash->{helper}{actor_cmd_default} = $cmd_default; @@ -155,8 +163,9 @@ THRESHOLD_Define($$$) if (defined ($init_desired_value)) { + my $set_state =($state_cmd1 eq "" and $state_cmd2 eq "") ? 1 : 0; readingsBeginUpdate ($hash); - readingsBulkUpdate ($hash, "state", "active $init_desired_value"); + readingsBulkUpdate ($hash, "state", "active $init_desired_value") if ($set_state); readingsBulkUpdate ($hash, "threshold_min", $init_desired_value-$hysteresis); readingsBulkUpdate ($hash, "cmd","wait for next cmd"); readingsBulkUpdate ($hash, "desired_value", $init_desired_value); @@ -174,22 +183,26 @@ THRESHOLD_Set($@) my $ret=""; return "$pn, need a parameter for set" if(@a < 2); my $arg = $a[1]; + my $value = (defined $a[2]) ? $a[2] : ""; my $desired_value; + my $set_state = ($hash->{helper}{state_cmd1} eq "" and $hash->{helper}{state_cmd2} eq "") ? 1 : 0; + + if ($arg eq "desired" ) { - return "$pn: set desired value:$a[2], desired value needs a numeric parameter" if(@a != 3 || $a[2] !~ m/^[-\d\.]*$/); - Log GetLogLevel($pn,3), "set $pn $arg $a[2]"; + return "$pn: set desired value:$value, desired value needs a numeric parameter" if(@a != 3 || $value !~ m/^[-\d\.]*$/); + Log GetLogLevel($pn,3), "set $pn $arg $value"; readingsBeginUpdate ($hash); - readingsBulkUpdate ($hash, "state", "active $a[2]"); - readingsBulkUpdate ($hash, "threshold_min",$a[2]-$hash->{hysteresis}); + readingsBulkUpdate ($hash, "state", "active $value") if ($set_state); + readingsBulkUpdate ($hash, "threshold_min",$value-$hash->{hysteresis}); readingsBulkUpdate ($hash, "cmd","wait for next cmd"); - readingsBulkUpdate ($hash, "desired_value", $a[2]); + readingsBulkUpdate ($hash, "desired_value", $value); readingsEndUpdate ($hash, 1); } elsif ($arg eq "deactivated" ) { $desired_value = ReadingsVal($pn,"desired_value",""); return "$pn: set deactivated, set desired value first" if (!$desired_value); $ret=CommandAttr(undef, "$pn disable 1"); if (!$ret) { - readingsSingleUpdate ($hash, "state", "deactivated $desired_value",1); + readingsSingleUpdate ($hash, "state", "deactivated $desired_value",1) if ($set_state); } } elsif ($arg eq "active" ) { $desired_value = ReadingsVal($pn,"desired_value",""); @@ -197,13 +210,13 @@ THRESHOLD_Set($@) $ret=CommandDeleteAttr(undef, "$pn disable"); if (!$ret) { readingsBeginUpdate ($hash); - readingsBulkUpdate ($hash, "state", "active $desired_value"); + readingsBulkUpdate ($hash, "state", "active $desired_value") if ($set_state); readingsBulkUpdate ($hash, "cmd","wait for next cmd"); readingsEndUpdate ($hash, 1); } } elsif ($arg eq "hysteresis" ) { - return "$pn: set hysteresis value:$a[2], hysteresis needs a numeric parameter" if ($a[2] !~ m/^[\d\.]*$/ ); - $hash->{hysteresis} = $a[2]; + return "$pn: set hysteresis value:$value, hysteresis needs a numeric parameter" if (@a != 3 || $value !~ m/^[\d\.]*$/ ); + $hash->{hysteresis} = $value; $desired_value = ReadingsVal($pn,"desired_value",""); if ($desired_value) { readingsBeginUpdate ($hash); @@ -306,21 +319,26 @@ THRESHOLD_setValue($$) { my ($hash, $cmd_nr) = @_; my $pn = $hash->{NAME}; - my $ret=0; - my @cmd =($hash->{helper}{actor_cmd1},$hash->{helper}{actor_cmd2}); my @cmd_sym = ("cmd1","cmd2"); - my $cmd_now = $cmd[$cmd_nr-1]; my $cmd_sym_now = $cmd_sym[$cmd_nr-1]; - - if (ReadingsVal($pn,"cmd","") ne $cmd_sym_now) { - if ($cmd_now eq "") { - readingsSingleUpdate ($hash, "cmd",$cmd_sym_now, 1); - } elsif ($ret = AnalyzeCommandChain(undef, $cmd_now)) { - Log GetLogLevel($pn,3), "output of $pn $cmd_now: $ret"; - } else { - readingsSingleUpdate ($hash, "cmd",$cmd_sym_now, 1); - } - } + + if (ReadingsVal($pn,"cmd","") ne $cmd_sym_now) { + my $ret=0; + my @cmd =($hash->{helper}{actor_cmd1},$hash->{helper}{actor_cmd2}); + my @state_cmd = ($hash->{helper}{state_cmd1},$hash->{helper}{state_cmd2}); + my $cmd_now = $cmd[$cmd_nr-1]; + my $state_cmd_now = $state_cmd[$cmd_nr-1]; + if ($cmd_now ne "") { + if ($ret = AnalyzeCommandChain(undef, $cmd_now)) { + Log GetLogLevel($pn,3), "output of $pn $cmd_now: $ret"; + return ""; + } + } + readingsBeginUpdate ($hash); + readingsBulkUpdate ($hash, "state",$state_cmd_now) if (($state_cmd_now) ne ""); + readingsBulkUpdate ($hash, "cmd",$cmd_sym_now); + readingsEndUpdate ($hash, 1); + } } 1; @@ -345,7 +363,7 @@ THRESHOLD_setValue($$) Define

    - define <name> THRESHOLD <sensor>[:<reading>][:<hysteresis>][:<init_desired_value>] [AND|OR <sensor2>[:<reading2>][:<state>]] [<actor>][|<cmd1>][|<cmd2>][|<cmd_default_index>]
    + define <name> THRESHOLD <sensor>[:[<reading>][:[<hysteresis>][:<init_desired_value>]]] [AND|OR <sensor2>[:[<reading2>][:<state>]]] [<actor>][|[<cmd1>][|[<cmd2>][|[<cmd_default_index>][|[[<state_cmd1>][:<state_cmd2>]]]]]]


  • sensor
    @@ -395,17 +413,28 @@ THRESHOLD_setValue($$) 0 - no command
    1 - cmd1
    2 - cmd2
    - Defaultwert: 2, if actor defined, else 0
    + default value: 2, if actor defined, else 0
  • +
    +
  • state_cmd1
    + state, which is displayed, if FHEM/Perl-command cmd1 was executed. If state_cmd1 state ist set, other states, such as active or deactivated are suppressed. +
    + default value: none +
  • +
  • state_cmd2
    + state, which is displayed, if FHEM/Perl-command cmd1 was executed. If state_cmd1 state ist set, other states, such as active or deactivated are suppressed. +
    + default value: none +


  • Examples:

    Example for heating:

    - define Thermostat THRESHOLD temp_sens heating
    + define thermostat THRESHOLD temp_sens heating

    - set Thermostat desired 20
    + set thermostat desired 20

    Description:

    @@ -414,7 +443,7 @@ THRESHOLD_setValue($$)
    Example for heating with window contact:

    - define Thermostat THRESHOLD temp_sens OR win_sens heating
    + define thermostat THRESHOLD temp_sens OR win_sens heating

    Example for heating with multiple window contacts:

    @@ -424,24 +453,32 @@ THRESHOLD_setValue($$)
    then:

    - define Thermostat THRESHOLD S1 OR W_ALL heating
    + define thermostat THRESHOLD S1 OR W_ALL heating

    - More examples:
    + More examples for dehumidification, air conditioning, watering:

    - define Hygrostat THRESHOLD hym_sens:humidity dehydrator|set @ on|set @ off|1
    - define Hygrostat THRESHOLD hym_sens:humidity AND Sensor2:state:close dehydrator|set @ on|set @ off|1
    - define Thermostat THRESHOLD temp_sens:temperature:1 aircon|set @ on|set @ off|1
    - define Thermostat THRESHOLD temp_sens AND Sensor2:state:close aircon|set @ on|set @ off|1
    - define Hygrostat THRESHOLD hym_sens:humidity:20 watering|set @ off|set @ on|2
    + define hygrostat THRESHOLD hym_sens:humidity dehydrator|set @ on|set @ off|1
    + define hygrostat THRESHOLD hym_sens:humidity AND Sensor2:state:close dehydrator|set @ on|set @ off|1
    + define thermostat THRESHOLD temp_sens:temperature:1 aircon|set @ on|set @ off|1
    + define thermostat THRESHOLD temp_sens AND Sensor2:state:close aircon|set @ on|set @ off|1
    + define hygrostat THRESHOLD hym_sens:humidity:20 watering|set @ off|set @ on|2

    - Alternatively, each Perl commands are given.
    + It can also FHEM/perl command chains are specified:

    Examples:

    - define Thermostat THRESHOLD Sensor |{fhem("set Switch1 on;set Switch2 on")}|{fhem("set Switch1 off;set Switch2 off")}|1
    - define Thermostat THRESHOLD Sensor Alarm|{Log 2,"value is exceeded"}|{fhem("set @ on;set Switch2 on")}
    - define Thermostat THRESHOLD Sensor ||{Log 2,"value is reached"}|
    + define thermostat THRESHOLD sensor |set Switch1 on;set Switch2 on|set Switch1 off;set Switch2 off|1
    + define thermostat THRESHOLD sensor alarm|{Log 2,"value is exceeded"}|set @ on;set Switch2 on
    + define thermostat THRESHOLD sensor ||{Log 2,"value is reached"}|

    + Example for status display on/off:
    +
    + define thermostat THRESHOLD sensor heating|set @ off|set @ on|2|off:on
    +
    + Example for status display (eg for state evaluation in other modules), if temperature drops below 30 degrees or above:
    +
    + define thermostat THRESHOLD sensor:temperature:0:30 ||||on:off
    +
Set @@ -503,7 +540,7 @@ THRESHOLD_setValue($$) Define

    - define <name> THRESHOLD <sensor>[:<reading>][:<hysteresis>][:<init_desired_value>] [AND|OR <sensor2>[:<reading2>][:<state>]] [<actor>][|<cmd1>][|<cmd2>][|<cmd_default_index>]
    + define <name> THRESHOLD <sensor>[:[<reading>][:[<hysteresis>][:<init_desired_value>]]] [AND|OR <sensor2>[:[<reading2>][:<state>]]] [<actor>][|[<cmd1>][|[<cmd2>][|[<cmd_default_index>][|[[<state_cmd1>][:<state_cmd2>]]]]]]


  • sensor
    @@ -560,13 +597,25 @@ THRESHOLD_setValue($$) Defaultwert: 2, wenn Aktor angegeben ist, sonst 0

  • +
  • state_cmd1
    + Status, der angezeigt wird, wenn FHEM/Perl-Befehl cmd1 ausgeführt wurde. Wenn state_cmd1 gesetzt ist, werden andere Stati, wie active oder deactivated unterdrückt. +
    + Defaultwert: keiner +
  • +
  • state_cmd2
    + Status, der angezeigt wird, wenn FHEM/Perl-Befehl cmd2 ausgeführt wurde. Wenn state_cmd2 gesetzt ist, werden andere Stati, wie active oder deactivated unterdrückt. +
    + Defaultwert: keiner +
  • +
    +
    Beispiele:

    Beispiel für Heizung:

    - define Thermostat THRESHOLD temp_sens heating
    + define thermostat THRESHOLD temp_sens heating

    - set Thermostat desired 20
    + set thermostat desired 20

    Beschreibung:

    @@ -574,7 +623,7 @@ THRESHOLD_setValue($$)
    Beispiel für Heizung mit Fensterkontakt:

    - define Thermostat THRESHOLD temp_sens OR win_sens heating
    + define thermostat THRESHOLD temp_sens OR win_sens heating

    Beispiel für Heizung mit mehreren Fensterkontakten:

    @@ -584,24 +633,32 @@ THRESHOLD_setValue($$)
    danach:

    - define Thermostat THRESHOLD S1 OR W_ALL heating
    + define thermostat THRESHOLD S1 OR W_ALL heating

    - einige weitere Bespiele:
    + Einige weitere Bespiele für Entfeuchtung, Klimatisierung, Bewässerung:

    - define Hygrostat THRESHOLD hym_sens:humidity dehydrator|set @ on|set @ off|1
    - define Hygrostat THRESHOLD hym_sens:humidity AND Sensor2:state:close dehydrator|set @ on|set @ off|1
    - define Thermostat THRESHOLD temp_sens:temperature:1 aircon|set @ on|set @ off|1
    - define Thermostat THRESHOLD temp_sens AND Sensor2:state:close aircon|set @ on|set @ off|1
    - define Hygrostat THRESHOLD hym_sens:humidity:20 watering|set @ off|set @ on|2
    + define hygrostat THRESHOLD hym_sens:humidity dehydrator|set @ on|set @ off|1
    + define hygrostat THRESHOLD hym_sens:humidity AND Sensor2:state:close dehydrator|set @ on|set @ off|1
    + define thermostat THRESHOLD temp_sens:temperature:1 aircon|set @ on|set @ off|1
    + define thermostat THRESHOLD temp_sens AND Sensor2:state:close aircon|set @ on|set @ off|1
    + define hygrostat THRESHOLD hym_sens:humidity:20 watering|set @ off|set @ on|2

    - Alternativ können jeweils Perl-Befehle angegeben werden.
    + Es können ebenso FHEM/Perl-Befehlsketten angegeben werden:

    Beispiele:

    - define Thermostat THRESHOLD Sensor |{fhem("set Switch1 on;set Switch2 on")}|{fhem("set Switch1 off;set Switch2 off")}|1
    - define Thermostat THRESHOLD Sensor Alarm|{Log 2,"Wert überschritten"}|{fhem("set @ on;set Switch2 on")}
    - define Thermostat THRESHOLD Sensor ||{Log 2,"Wert unterschritten"}|
    + define thermostat THRESHOLD sensor |set Switch1 on;set Switch2 on|set Switch1 off;set Switch2 off|1
    + define thermostat THRESHOLD sensor alarm|{Log 2,"Wert überschritten"}|set @ on;set Switch2 on
    + define thermostat THRESHOLD sensor ||{Log 2,"Wert unterschritten"}|

    + Beispiele mit Statusanzeige:
    +
    + define thermostat THRESHOLD sensor heating|set @ off|set @ on|2|aus:an
    +
    + Beispiel für reine Zustandanzeige (z. B. für Zustandsauswertung in anderen Modulen), wenn Temperatur von 30 Grad über- oder unterschritten wird:
    +
    + define thermostat THRESHOLD sensor:temperature:0:30 ||||on:off
    +
Set