Hauptmenü

do always selektiv verwenden?

Begonnen von FHEMAN, 27 Oktober 2020, 23:49:51

Vorheriges Thema - Nächstes Thema

FHEMAN

Hallo,

ich habe ein Beschattungs-DOIF mit 3 Bedingungen - grundsätzlich:

  • cmd_1=Rollos runter (und hoch) bei Sonne, Sonnenwinkel etc.
  • cmd_2=Alle Rollos hoch, wenn keine Sonne
  • cmd_3=doelse()
Dabei möchte ich, dass do always nur bei Bedingung 1 immer wieder den Ausführungsteil durchgeht. Da sonst nachts alle 3 Min. unnötig Traffic stattfindet durch den Temperatursensor bei CMD_2.
Kann ich das konfigurieren?
Oder muss ich das aktuelle CMD im Ausführungsteil abfragen?

if ("[$SELF:cmd,0]" eq "2") {
return;
}

Ich vermute, es gibt eine elegantere Lösung?

cmd_2 in cmd_1 integrieren kann ich vermutlich schlecht, weil sonst der Temperatursensor nicht triggert bzw. nur mittels Abfragewert, der immer true ist?

Viele Grüße
Ronny

List vom DOIF
Internals:
   DEF        ([?isDay:state] eq "on" and [TempDiffSen.01:T2_T1] >= 2.5 and [Twilight:compasspointEx] =~ "north|east|south|west" and [?TempDiffSen.01:Aussentemperatur,0] > 10 and [?proplanta:fc0_tempMax,0] > 17 and [?proplanta:fc0_tempMin,0] > 10 and [?proplanta:fc0_sun,20] >= 20) (
{
my @DirUp = ("NORD","OST","SUED","WEST");
my @DirDown;
my $CompassPoint = "[Twilight:compasspointEx]";
my $waitUp =("[$SELF:cmd_event,0]" eq "TempDiffSen.01") ? AttrVal("$SELF", "waitUp", 0) : 0;
my $waitDown = (("[$SELF:cmd_event,0]" eq "TempDiffSen.01") || (ReadingsVal("TempDiffSen.01", "Aussentemperatur", 23) >= 23) || (ReadingsVal("Wandthermostat.3.Weather", "temperature", 23.5) >= 23.5) || (ReadingsVal("Wandthermostat.2.Weather", "temperature", 23.5) >= 23.5)) ? 90 : AttrVal("$SELF", "waitDown", 0);
if ($CompassPoint=~"north") {
push @DirDown, "NORD";
@DirUp = grep(!/NORD/, @DirUp);
}
if ($CompassPoint=~"east") {
push @DirDown, "OST";
@DirUp = grep(!/OST/, @DirUp);
}
if ($CompassPoint=~"south") {
push @DirDown, "SUED";
@DirUp = grep(!/SUED/, @DirUp);
}
if ($CompassPoint=~"west") {
push @DirDown, "WEST";
@DirUp = grep(!/WEST/, @DirUp);
}
my $RollosDirDown = join ("|",@DirDown);
my $RollosDirUp = join ("|",@DirUp);
my $FILTER1 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=1.*" : "";
my $FILTER0 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=0.*" : "";
fhem("setreading NAME=Rollos.($RollosDirDown)$FILTER1 Beschattung 1,$waitDown");
fhem("setreading NAME=Rollos.($RollosDirUp)$FILTER0 Beschattung 0,$waitUp");
fhem("setreading NAME=Rollo.(E|O)G.*:FILTER=Himmelsrichtung=($RollosDirDown)$FILTER1 Beschattung 1");
fhem("setreading NAME=Rollo.(E|O)G.*:FILTER=Himmelsrichtung=($RollosDirUp)$FILTER0 Beschattung 0");
$RollosDirDown = ($RollosDirDown) ? $RollosDirDown : "0";
fhem("setreading doif.Autobeschattung Beschattung $RollosDirDown");
}
) DOELSEIF ([?isDay:state] eq "off" or [TempDiffSen.01:T2_T1]<2.5) (
{
if ("[$SELF:cmd,0]" eq "2") {
return;
}
my $waitUp = ("[$SELF:cmd_event,0]" eq "TempDiffSen.01") ? AttrVal("$SELF", "waitUp", 0) : 0;
my $FILTER0 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=0.*" : "";
fhem("setreading NAME=Rollos.(NORD|OST|SUED|WEST)$FILTER0 Beschattung 0,$waitUp");
fhem("setreading NAME=Rollo.(E|O)G.*$FILTER0 Beschattung 0");
fhem("setreading doif.Autobeschattung Beschattung 0");
}
) DOELSE()
   FUUID      5c5a08ea-f33f-6078-1036-bfb79dd58b81e9a4
   MODEL      FHEM
   NAME       doif.Autobeschattung
   NOTIFYDEV  global,TempDiffSen.01,Twilight
   NR         538
   NTFY_ORDER 50-doif.Autobeschattung
   STATE      0 (enabled)
   TYPE       DOIF
   VERSION    22764 2020-09-12 20:06:36
   READINGS:
     2020-10-27 23:30:19   Beschattung     0
     2020-10-27 23:32:55   Device          TempDiffSen.01
     2020-10-27 23:32:55   cmd             2
     2020-10-27 23:32:55   cmd_event       TempDiffSen.01
     2020-10-27 23:32:55   cmd_nr          2
     2020-10-27 23:32:55   e_TempDiffSen.01_T2_T1 0.2
     2020-10-27 23:27:48   e_Twilight_compasspointEx unknown
     2020-10-27 23:09:57   mode            enabled
     2020-10-27 23:32:55   state           cmd_2
   Regex:
     accu:
     cond:
       TempDiffSen.01:
         0:
           T2_T1      ^TempDiffSen.01$:^T2_T1:
         1:
           T2_T1      ^TempDiffSen.01$:^T2_T1:
       Twilight:
         0:
           compasspointEx ^Twilight$:^compasspointEx:
         1:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'isDay','state') eq "on" and ::ReadingValDoIf($hash,'TempDiffSen.01','T2_T1') >= 2.5 and ::ReadingValDoIf($hash,'Twilight','compasspointEx') =~ "north|east|south|west" and ::ReadingValDoIf($hash,'TempDiffSen.01','Aussentemperatur','0') > 10 and ::ReadingValDoIf($hash,'proplanta','fc0_tempMax','0') > 17 and ::ReadingValDoIf($hash,'proplanta','fc0_tempMin','0') > 10 and ::ReadingValDoIf($hash,'proplanta','fc0_sun','20') >= 20
     1          ::ReadingValDoIf($hash,'isDay','state') eq "off" or ::ReadingValDoIf($hash,'TempDiffSen.01','T2_T1')<2.5
   do:
     0:
       0            { my @DirUp = ("NORD","OST","SUED","WEST"); my @DirDown; my $CompassPoint = "[Twilight:compasspointEx]"; my $waitUp =("[doif.Autobeschattung:cmd_event,0]" eq "TempDiffSen.01") ? AttrVal("doif.Autobeschattung", "waitUp", 0) : 0; my $waitDown = (("[doif.Autobeschattung:cmd_event,0]" eq "TempDiffSen.01") || (ReadingsVal("TempDiffSen.01", "Aussentemperatur", 23) >= 23) || (ReadingsVal("Wandthermostat.3.Weather", "temperature", 23.5) >= 23.5) || (ReadingsVal("Wandthermostat.2.Weather", "temperature", 23.5) >= 23.5)) ? 90 : AttrVal("doif.Autobeschattung", "waitDown", 0); if ($CompassPoint=~"north") { push @DirDown, "NORD"; @DirUp = grep(!/NORD/, @DirUp); if ($CompassPoint=~"east") { push @DirDown, "OST"; @DirUp = grep(!/OST/, @DirUp); } if ($CompassPoint=~"south") { push @DirDown, "SUED"; @DirUp = grep(!/SUED/, @DirUp); if ($CompassPoint=~"west") { push @DirDown, "WEST"; @DirUp = grep(!/WEST/, @DirUp); } my $RollosDirDown = join ("|",@DirDown); my $RollosDirUp = join ("|",@DirUp); my $FILTER1 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=1.*" : ""; my $FILTER0 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=0.*" : ""; fhem("setreading NAME=Rollos.($RollosDirDown)$FILTER1 Beschattung 1,$waitDown"); fhem("setreading NAME=Rollos.($RollosDirUp)$FILTER0 Beschattung 0,$waitUp"); fhem("setreading NAME=Rollo.(E|O)G.*:FILTER=Himmelsrichtung=($RollosDirDown)$FILTER1 Beschattung 1"); fhem("setreading NAME=Rollo.(E|O)G.*:FILTER=Himmelsrichtung=($RollosDirUp)$FILTER0 Beschattung 0"); $RollosDirDown = ($RollosDirDown) ? $RollosDirDown : "0"; fhem("setreading doif.Autobeschattung Beschattung $RollosDirDown"); }
     1:
       0            { if ("[doif.Autobeschattung:cmd,0]" eq "2") { return; } my $waitUp = ("[doif.Autobeschattung:cmd_event,0]" eq "TempDiffSen.01") ? AttrVal("doif.Autobeschattung", "waitUp", 0) : 0; my $FILTER0 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=0.*" : ""; fhem("setreading NAME=Rollos.(NORD|OST|SUED|WEST)$FILTER0 Beschattung 0,$waitUp"); fhem("setreading NAME=Rollo.(E|O)G.*$FILTER0 Beschattung 0"); fhem("setreading doif.Autobeschattung Beschattung 0"); }
     2:
       0         
   helper:
     DEVFILTER  ^global$|^Twilight$|^TempDiffSen.01$
     NOTIFYDEV  global|Twilight|TempDiffSen.01
     event      Aussentemperatur: 8.6,T2_T1: 0.2
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   TempDiffSen.01
     timerevent Aussentemperatur: 8.6,T2_T1: 0.2
     triggerDev TempDiffSen.01
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: TempDiffSen.01
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: TempDiffSen.01
       state: cmd_2
     timerevents:
       Aussentemperatur: 8.6
       T2_T1: 0.2
     timereventsState:
       Aussentemperatur: 8.6
       T2_T1: 0.2
     triggerEvents:
       Aussentemperatur: 8.6
       T2_T1: 0.2
     triggerEventsState:
       Aussentemperatur: 8.6
       T2_T1: 0.2
   internals:
   readings:
     all         TempDiffSen.01:T2_T1 Twilight:compasspointEx
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Autobeschattung DOIF
   do         always
   event-on-change-reading .*
   group      Rollos
   room       Klima,Rollos
   stateFormat Beschattung (mode)
   userattr   waitUp waitDown
   verbose    1
   waitDown   600
   waitUp     1800
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Per

Weil noch keiner geantwortet hat...
Zitat von: FHEMAN am 27 Oktober 2020, 23:49:51Kann ich das konfigurieren?
Oder muss ich das aktuelle CMD im Ausführungsteil abfragen?

if ("[$SELF:cmd,0]" eq "2") {
return;
}

Ich vermute, es gibt eine elegantere Lösung?
Ob eleganter weiss ich nicht, aber du kannst im Zweit 2 abfragen, ob es noch nicht Zweig 2 ist.
DOELSEIF ([$SELF.cmd]<>2 and...
Dann kannst du do always lassen. Auf DOELSE musst du aber verzichten, sonst wechselt der Zustand zwischen 2 und 3. Oder du prüfst auf cmd < 2, da weiss ich nicht, ob deine Voraussetzungen das gergeben.

Bei deiner Menge Perl-Code kannst du aber bestimmt auch gleich in den Perl-Mode wechseln, das kennt kein eh do always.