Mein DOIF taktet und ich finde den Fehler nicht

Begonnen von Jogi, 02 April 2021, 09:49:34

Vorheriges Thema - Nächstes Thema

Jogi

Hallo,
ich habe folgendes DOIF, welches zu den aktuellen Bedingungen immer zwischen cmd4 und cmd6 taktet. Meiner Meinung nach müsste es aber bei cmd4 stehen bleiben.
Das einzige was ich mit ziemlicher Sicherheit weiß ist, dass der Fehler bei mir liegt, aber ich finde ihn nicht. Daher würde ich mich über einen Tipp freuen.

Hier das list des DOIF:

Internals:
   DEF        ([Fenster_Speicher:pct] > 10 and [Wetter:WindKm] > 12) (set Fenster_Speicher closed) ## 1 Dachfenster bei Wind schliessen
DOELSEIF ([?Fenster_Speicher:pct] > 20 and ([19:00-23:59] or [00:01-08:00]) and [Aussentemperatur1] <19 and [$SELF] ne "cmd_1" and [$SELF] ne "cmd_3") (set Fenster_Speicher pct 20)  ## 2 Dachfenster Nachts schliessen, wenn es zu kalt ist 
DOELSEIF ([?Fenster_Speicher:pct] > 20 and [Wetter:Regen] > 0.1 and [$SELF] ne "cmd_1")(set Fenster_Speicher pct 20) ## 3 Dachfenster bei Regen schliessen wenn kein Wind ist
DOELSEIF ([?Fenster_Speicher:pct] < 90 and [Raumtemperatur:Temperature] > 27 and [Aussentemperatur1] < 23 and [$SELF] ne "cmd_1" and [$SELF] ne "cmd_2" and [$SELF] ne "cmd_3")(set Fenster_Speicher open) ## 4 Dachfenster automatisch öffnen wenn es zu warm ist und kein Regen und kein Wind ist
DOELSEIF ([?Fenster_Speicher:pct] > 25 and [Raumtemperatur:Temperature] >27 and (([Aussentemperatur1]+2) > [Raumtemperatur:Temperature]) and [$SELF] ne "cmd_1" and [$SELF] ne "cmd_2" and [$SELF] ne "cmd_3")(set Fenster_Speicher pct 20) ## 5 Dachfenster automatisch schliessen wenn es außßen wärmer als Innen ist und kein Regen und kein Wind ist
DOELSE ## 6 nothing
   FUUID      60606d5e-f33f-8efe-d3a4-ef72d276c7fca56b
   MODEL      FHEM
   NAME       DachfensterWindDOIF
   NOTIFYDEV  global,Raumtemperatur,Wetter,Fenster_Speicher,Aussentemperatur1,DachfensterWindDOIF
   NR         3153
   NTFY_ORDER 50-DachfensterWindDOIF
   STATE      cmd_6
   TYPE       DOIF
   VERSION    24100 2021-03-27 20:15:23
   READINGS:
     2021-04-02 09:48:38   Device          Aussentemperatur1
     2021-04-02 09:48:31   cmd             6
     2021-04-02 09:48:31   cmd_event       Aussentemperatur1
     2021-04-02 09:48:31   cmd_nr          6
     2021-04-02 09:48:38   e_Aussentemperatur1_STATE 7.3
     2021-04-02 09:47:22   e_DachfensterWindDOIF_STATE cmd_6
     2021-04-02 09:42:22   e_Fenster_Speicher_pct 20
     2021-04-02 09:41:12   e_Wetter_Regen  0.00
     2021-04-02 09:41:12   e_Wetter_WindKm 3.22
     2021-04-02 09:47:22   mode            enabled
     2021-04-02 09:48:31   state           cmd_6
     2021-04-01 23:59:00   timer_01_c02    02.04.2021 19:00:00
     2021-04-01 23:59:00   timer_02_c02    02.04.2021 23:59:00
     2021-04-02 08:00:00   timer_03_c02    03.04.2021 00:01:00
     2021-04-02 08:00:00   timer_04_c02    03.04.2021 08:00:00
     2021-04-02 09:48:38   wait_timer      02.04.2021 09:48:41 cmd_6 Aussentemperatur1
   Regex:
     accu:
     cond:
       Aussentemperatur1:
         0:
         1:
           &STATE     ^Aussentemperatur1$
         2:
         3:
           &STATE     ^Aussentemperatur1$
         4:
           &STATE     ^Aussentemperatur1$
       DachfensterWindDOIF:
         0:
         1:
           &STATE     ^DachfensterWindDOIF$
         2:
           &STATE     ^DachfensterWindDOIF$
         3:
           &STATE     ^DachfensterWindDOIF$
         4:
           &STATE     ^DachfensterWindDOIF$
       Fenster_Speicher:
         0:
           pct        ^Fenster_Speicher$:^pct:
         1:
         2:
         3:
         4:
       Raumtemperatur:
         3:
           Temperature ^Raumtemperatur$:^Temperature:
         4:
           Temperature ^Raumtemperatur$:^Temperature:
       Wetter:
         0:
           WindKm     ^Wetter$:^WindKm:
         1:
         2:
           Regen      ^Wetter$:^Regen:
         3:
         4:
   attr:
     cmdState:
     wait:
       0:
         3
       1:
         300
       2:
         3
       3:
         60
       4:
         600
       5:
         3
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Fenster_Speicher','pct') > 10 and ::ReadingValDoIf($hash,'Wetter','WindKm') > 12
     1          ::ReadingValDoIf($hash,'Fenster_Speicher','pct') > 20 and (::DOIF_time($hash,0,1,$wday,$hms) or ::DOIF_time($hash,2,3,$wday,$hms)) and ::InternalDoIf($hash,'Aussentemperatur1','STATE') <19 and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_1" and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_3"
     2          ::ReadingValDoIf($hash,'Fenster_Speicher','pct') > 20 and ::ReadingValDoIf($hash,'Wetter','Regen') > 0.1 and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_1"
     3          ::ReadingValDoIf($hash,'Fenster_Speicher','pct') < 90 and ::ReadingValDoIf($hash,'Raumtemperatur','Temperature') > 27 and ::InternalDoIf($hash,'Aussentemperatur1','STATE') < 23 and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_1" and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_2" and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_3"
     4          ::ReadingValDoIf($hash,'Fenster_Speicher','pct') > 25 and ::ReadingValDoIf($hash,'Raumtemperatur','Temperature') >27 and ((::InternalDoIf($hash,'Aussentemperatur1','STATE')+2) > ::ReadingValDoIf($hash,'Raumtemperatur','Temperature')) and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_1" and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_2" and ::InternalDoIf($hash,'DachfensterWindDOIF','STATE') ne "cmd_3"
   days:
   do:
     0:
       0          set Fenster_Speicher closed
     1:
       0          set Fenster_Speicher pct 20
     2:
       0          set Fenster_Speicher pct 20
     3:
       0          set Fenster_Speicher open
     4:
       0          set Fenster_Speicher pct 20
     5:
       0         
   helper:
     DEVFILTER  ^global$|^Aussentemperatur1$|^Wetter$|^Raumtemperatur$|^Fenster_Speicher$|^DachfensterWindDOIF$
     NOTIFYDEV  global|Aussentemperatur1|Wetter|Raumtemperatur|Fenster_Speicher|DachfensterWindDOIF
     event      7.3
     globalinit 1
     last_timer 4
     sleepdevice Aussentemperatur1
     sleepsubtimer 0
     sleeptimer 5
     timerdev   Aussentemperatur1
     timerevent 7.3
     triggerDev Aussentemperatur1
     timerevents:
       7.3
     timereventsState:
       state: 7.3
     triggerEvents:
       7.3
     triggerEventsState:
       state: 7.3
   internals:
     all         Aussentemperatur1:STATE DachfensterWindDOIF:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
   intervalfunc:
   intervaltimer:
   localtime:
     0          1617382800
     1          1617400740
     2          1617400860
     3          1617429600
   readings:
     all         Fenster_Speicher:pct Wetter:WindKm Wetter:Regen Raumtemperatur:Temperature
   realtime:
     0          19:00:00
     1          23:59:00
     2          00:01:00
     3          08:00:00
   time:
     0          19:00:00
     1          23:59:00
     2          00:01:00
     3          08:00:00
   timeCond:
     0          1
     1          1
     2          1
     3          1
   timer:
     0          0
     1          0
     2          0
     3          0
   timers:
     1           0  1  2  3
   trigger:
   triggertime:
     1617382800:
       localtime  1617382800
       hash:
     1617400740:
       localtime  1617400740
       hash:
     1617400860:
       localtime  1617400860
       hash:
     1617429600:
       localtime  1617429600
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   startup    set $SELF checkall
   wait       3:300:3:60:600:3


cwagner

Vor lauter Bedingungen sieht man da ja den Walt nicht mehr .-)
Also: Ich halte die [$Self] cmd Bedingungen für überflüssig, weil DOIF ja von selbst bei der ersten er füllten Bedingung stehen bleibt. Wenn er also bei Bedingung 4 ist, ist klar, dass Bedingung 1,2,3 "ne" sind.

Nächster Schritt: Du brauchst immer einen Trigger und meine Erfahrung sagt, dass es schwierig wird, wenn in solchen Bedingungskaskaden mehrere unterschiedliche Trigger auftauchen. Will sagen: Mal ist der Auslöser die Raumtemperatur, mal das Wetter. So wie ich es verstehe, ist der eigentlich Trigger der die Temperatur. Wenn zuviel Wind, passiert nix, wenn wenig Wind, dann soll gehandelt werden und zwar nur, wenn der Fenster nicht schon zu ist. Wind und Fenster sind also keine Trigger, sondern nur Bedingungen (Abfrage mit ?), die die weitere Entscheidung beeinflussen:
Zuviel Wind und Fenster offen: Fenster schließen
Wenig Wind und Temperatur< 27 und ?Fenster offen: Fenster schließen
Wenig Wind und Temperatur>27 und ?Fenster zu: Fenster öffnen.

Das sind für mich die drei Cases, die ich (auf einen zugegebenen oberflächlichen) Blick als Denkanstoß sehe.

Herzliche Grüße und schöne Ostertage - bei dem Wetter bleibt das Fenster zu .-)

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Jogi

Denke für Deinen Input,
aber es gibt schon ein paar mehr Bedingungen und über die Abfrage der cmd´s möchte ich eine Priorität realisieren. Mag sein, dass mein Denkansatz da falsch ist.
Ursprünglich waren das mal 2 DOIF (eins für Wind und eins für Regen) die beide funktioniert haben. Dann wollte ich noch eine zusätzliche Bedingung realisieren (Lüften wenn Raumtemperatur hoch ist und wenn Aussentemperatur niedriger als Raumtemperatur). Da habe ich gedacht, ich mache nicht ein drittes DOIF, sondern packe das in eins. Irgendwie muss das doch möglich sein.
Folgendes will ich realisieren:
Prio1: Wenn Wind ist soll das Dachfenster komplett schliessen. (mein cmd1)
Prio2: Wenn es regnet soll das Dachfenster auf 20% fahren. (mein cmd2)
Prio3: Wenn die Raumtemperatur hoch ist und wenn die Aussentemperatur niedriger als Raumtemperatur ist, soll das Fenster komplett auffahren. (mein cmd3)
Prio4: Dachfenster auf 20% fahren, wenn es außen wärmer als innen ist. (mein cmd4)

([Fenster_Speicher:pct] > 10 and [Wetter:WindKm] > 12) (set Fenster_Speicher closed) ## 1 Dachfenster bei Wind schliessen
DOELSEIF ([?Fenster_Speicher:pct] > 20 and ([19:00-23:59] or [00:01-08:00]) and [Aussentemperatur1] <19 and [$SELF] ne "cmd_1" and [$SELF] ne "cmd_3") (set Fenster_Speicher pct 20)  ## 2 Dachfenster Nachts schliessen, wenn es zu kalt ist 
DOELSEIF ([?Fenster_Speicher:pct] > 20 and [Wetter:Regen] > 0.1 and [$SELF] ne "cmd_1")(set Fenster_Speicher pct 20) ## 3 Dachfenster bei Regen schliessen wenn kein Wind ist
DOELSEIF ([?Fenster_Speicher:pct] < 90 and [Raumtemperatur:Temperature] > 27 and [Aussentemperatur1] < 23 and [$SELF] ne "cmd_1" and [$SELF] ne "cmd_2" and [$SELF] ne "cmd_3")(set Fenster_Speicher open) ## 4 Dachfenster automatisch öffnen wenn es zu warm ist und kein Regen und kein Wind ist
DOELSEIF ([?Fenster_Speicher:pct] > 25 and [Raumtemperatur:Temperature] >27 and (([Aussentemperatur1]+2) > [Raumtemperatur:Temperature]) and [$SELF] ne "cmd_1" and [$SELF] ne "cmd_2" and [$SELF] ne "cmd_3")(set Fenster_Speicher pct 20) ## 5 Dachfenster automatisch schliessen wenn es außßen wärmer als Innen ist und kein Regen und kein Wind ist
DOELSE ## 6 nothing


Was ich gerade zusätzlich bemerkt habe: Ich habe noch keinen Zweig, der das Fenster wieder auf 20% fährt wenn die Raumtemperatur unter 27 Grad fällt und keine andere Bedingung zutrifft. Das wäre dann Prio5.
Aber zuerst muss ich mal die anderen Fälle lösen  ::)