on-for-timer in verbindung mit attr wait geht nicht "Beregnungssteuerung"

Begonnen von TW911, 21 Juni 2018, 18:00:35

Vorheriges Thema - Nächstes Thema

TW911

Hallo Zusammen, ich habe mir eine Beregungssteuerung für mein Rasen mit einem HM-MOD-Re-8 (56E453 1-4)  in verbindung mit Bodenfeuchtesensoren gebaut. Leider komme ich bei dem DOIF nicht wirklich weiter. Ich hätte gerne das wenn HM_5C33F5_T1:temperature] <76 oder [HM_5C31A1_T1:temperature] <76 und HM_580DC9:state] eq "closed" und [HM_56E453_Sw_01:state] eq "off" und  [05:40-06:30] oder [19:41-21:15] die Beregnung für HM_56E453_Sw_03 ein für 900 sek.     --> warte 880sek.  HM_56E453_Sw_02 ein für 900 sek.
Also wenn einer der beiden Sensoren sagt  <76, und der Rasenmäher in der Station (580DC9) ,sowie es zwischen 5:40 und 6:30 oder 19:41 und 21:15 Uhr ist, und Kreis 1 (56E453) aus. Soll die Beregung für Kreis 2 900 sek. an und nach 880 sek soll Kreis 3 für 900 sek an sein.  Allerdings wird immer nur Kreis 2 für 900 sek eingeschaltet und dann passiert nichts mehr. Als attr habe ich wait 0,880 eingegeben. Doch leider Ohne Erfolg. Vielleicht hat jemand eine Idee warum? Wenn ich das attr wait drausen lassen geht sofort Kreis 2 und Kreis 3 für jeweils 900 Sek an. Was allerdings meine Wasserpumpe vpn der Menge nicht schafft. Daher die Verzögerung.
define Automatik.Kreis.2.und.3 DOIF (([HM_5C33F5_T1:temperature] <76.5 or [HM_5C31A1_T1:temperature] <77.5) and [HM_580DC9:state] eq "closed" and [HM_56E453_Sw_01:state] eq "off" and ([05:40-06:30] or [19:41-21:15])) (set HM_56E453_Sw_03 on-for-timer 900)(set HM_56E453_Sw_02 on-for-timer 900)\
DOELSE\
()\
DOELSEIF\
(([HM_5C33F5_T1:temperature] >79 and [HM_5C31A1_T1:temperature] >79 and ([HM_56E453_Sw_02:state] eq "on" or [HM_56E453_Sw_03:state] eq "on")) or ([HM_580DC9:state] eq "open" and ([HM_56E453_Sw_02:state] eq "on" or [HM_56E453_Sw_03:state] eq "on"))) (set HM_56E453_Sw_02 off, set HM_56E453_Sw_03 off) (set TeleBot _msg Beregnung Kreis 2 und 3 wurde abgebrochen)\
DOELSE\
()
attr Automatik.Kreis.2.und.3 room Neu
attr Automatik.Kreis.2.und.3 wait 0,880


danke für eure Hilfe

gruß
Tom

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Zwei DOELSE Zweige in einem DOIF sind ungewöhnlich, sollte ich eine Weiterentwicklung verschlafen haben?

Damian

Zitat von: Ellert am 21 Juni 2018, 18:15:08
Zwei DOELSE Zweige in einem DOIF sind ungewöhnlich, sollte ich eine Weiterentwicklung verschlafen haben?

Nein. Die ungewöhnliche Syntax ist mir auch gerade aufgefallen.

DOELSE ...
...
DOELSEIF ...


geht nicht.

Es gibt pro Modul höchstens nur ein DOELSE am Ende - wie auch in allen üblichen Programmiersprachen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TW911

Danke für die schnell antwort Damian  :) . Habe mich glaube falsch ausgedrückt, oder ich stehe auf der Leitung.... Es soll Kreis 2 gestartet werden und nach 880 sek. Kreis 3. Also soll der waittimer zeitgleich mit Kreis 2 starten. So das wenn Kreis 2 an ist nach 880 sek Kreis 3 gestartet wird. Dann hätte ich ca 20 sek beide Kreise laufen und nach diesen 20 sek. müsste Kreis 2 aus gehen und Kreis 3 noch 880 sek laufen. Habe das mal mit niedrigeren werten mal getestet.  Also Kreis 2 10 sek zeitgleich wait auf 8 sek und dann Kreis 3 auf 10 sek. das geht. Warum auch immer?!
Kreis 2 on --------------900sek.--------------> off
Wait         --------------880sek. ------> Kreis 3 on -------------900sek.----------->


TW911

Also muss ein DOELSE raus? hatte davon zwei drin da das DOIF immer auf dem letzten cmd hängen blieb. Also müsste das so dann auch gehen?
define Automatik.Kreis.2.und.3 DOIF (([HM_5C33F5_T1:temperature] <76.5 or [HM_5C31A1_T1:temperature] <77.5) and [HM_580DC9:state] eq "closed" and [HM_56E453_Sw_01:state] eq "off" and ([05:40-06:30] or [19:41-21:15])) (set HM_56E453_Sw_03 on-for-timer 900)(set HM_56E453_Sw_02 on-for-timer 900)\
DOELSEIF\
(([HM_5C33F5_T1:temperature] >79 and [HM_5C31A1_T1:temperature] >79 and ([HM_56E453_Sw_02:state] eq "on" or [HM_56E453_Sw_03:state] eq "on")) or ([HM_580DC9:state] eq "open" and ([HM_56E453_Sw_02:state] eq "on" or [HM_56E453_Sw_03:state] eq "on"))) (set HM_56E453_Sw_02 off, set HM_56E453_Sw_03 off) (set TeleBot _msg Beregnung Kreis 2 und 3 wurde abgebrochen)\
DOELSE\
()

(([HM_5C33F5_T1:temperature] >79 and [HM_5C31A1_T1:temperature] >79 and ([HM_56E453_Sw_02:state] eq "on" or [HM_56E453_Sw_03:state] eq "on")) or ([HM_580DC9:state] eq "open" and ([HM_56E453_Sw_02:state] eq "on" or [HM_56E453_Sw_03:state] eq "on"))) (set HM_56E453_Sw_02 off, set HM_56E453_Sw_03 off) (set TeleBot _msg Beregnung Kreis 2 und 3 wurde abgebrochen)
attr Automatik.Kreis.2.und.3 room Neu
attr Automatik.Kreis.2.und.3 wait 0,880[/code]

Ellert

Zitat von: TW911 am 21 Juni 2018, 18:26:25
Also müsste das so dann auch gehen?

Nö.
Zitat von: Damian am 21 Juni 2018, 18:19:48
  ein DOELSE am Ende
Das heisst als letzter Zweig, falls überhaupt erforderlich.

TW911

So, jetzt aber ;) Also so wie auf dem Bild. Aber löst das jetzt mein "Wait" Problem??

Ellert


TW911

So eben mal getestet, leider geht es immer noch nicht. Es wird beim starten Kreis 2 auf "on" gesetzt, nach 900 Sek. geht dieser aus und der Ablauf ist beendet. Also Kreis 3 wird weder verzögert noch überhaupt gestartet. Noch ideen??

Habe eben nochmal in der ComRef nachgesehen. Kann es sein das wenn ich set cmd1 im DOIF sende, nicht gehen kann??
Auführen von Befehlszweigen ohne Auswertung der Bedingung   back

Mit set <DOIF-modul> cmd_<nr> lässt sich ein Befehlszweig (cmd_1, cmd_2, usw.) bedingunglos ausführen.

Der Befehl hat folgende Eigenschaften:

1) der set-Befehl übersteuert alle Attribute wie z. B. wait, do, usw.       <---- ???
2) ein laufender Wait-Timer wird unterbrochen                                      <----- ???

3) beim deaktivierten oder im Modus disable befindlichen Modul wird der set Befehl ignoriert

Sollte dann nicht aber trotzdem Kreis 2 und Kreis 3 gestartet werden nur ohne verzögerung? Habe zum Testen immer set cmd1 gesendet.

Damian

Wozu definierst du den DOELSE-Fall?

Poste mal die Ausgabe von "list Automatik.Kreis.2.und.3" in der Kommandozeile.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TW911

Das ??

Internals:
   DEF        (([HM_5C33F5_T1:temperature] <76.5 or [HM_5C31A1_T1:temperature] <77.5) and [HM_580DC9:state] eq "closed" and [HM_56E453_Sw_01:state] eq "off" and ([05:40-06:30] or [19:41-21:15])) (set HM_56E453_Sw_03 on-for-timer 900)(set HM_56E453_Sw_02 on-for-timer 900)
DOELSEIF
(([HM_5C33F5_T1:temperature] >79 and [HM_5C31A1_T1:temperature] >79 and ([HM_56E453_Sw_02:state] eq "on" or [HM_56E453_Sw_03:state] eq "on")) or ([HM_580DC9:state] eq "open" and ([HM_56E453_Sw_02:state] eq "on" or [HM_56E453_Sw_03:state] eq "on"))) (set HM_56E453_Sw_02 off, set HM_56E453_Sw_03 off) (set TeleBot _msg Beregnung Kreis 2 und 3 wurde abgebrochen)
DOELSE
()
   MODEL      FHEM
   NAME       Automatik.Kreis.2.und.3
   NR         448
   NTFY_ORDER 50-Automatik.Kreis.2.und.3
   STATE      cmd_3
   TYPE       DOIF
   READINGS:
     2018-06-21 19:23:53   Device          HM_5C33F5_T1
     2018-06-21 18:50:32   cmd             3
     2018-06-21 18:50:32   cmd_event       HM_5C31A1_T1
     2018-06-21 18:50:32   cmd_nr          3
     2018-06-21 19:04:48   e_HM_580DC9_state closed
     2018-06-21 19:23:23   e_HM_5C31A1_T1_temperature 78.9
     2018-06-21 19:23:53   e_HM_5C33F5_T1_temperature 77.4
     2018-06-21 18:49:24   mode            enabled
     2018-06-21 18:50:32   state           cmd_3
     2018-06-21 18:49:25   timer_01_c01    22.06.2018 05:40:00
     2018-06-21 18:49:25   timer_02_c01    22.06.2018 06:30:00
     2018-06-21 18:49:25   timer_03_c01    21.06.2018 19:41:00
     2018-06-21 18:49:25   timer_04_c01    21.06.2018 21:15:00
   Regex:
   attr:
     cmdState:
     wait:
       0:
         0
         880
     waitdel:
   condition:
     0          (ReadingValDoIf($hash,'HM_5C33F5_T1','temperature') <76.5 or ReadingValDoIf($hash,'HM_5C31A1_T1','temperature') <77.5) and ReadingValDoIf($hash,'HM_580DC9','state') eq "closed" and ReadingValDoIf($hash,'HM_56E453_Sw_01','state') eq "off" and (DOIF_time($hash,0,1,$wday,$hms) or DOIF_time($hash,2,3,$wday,$hms))
     1          (ReadingValDoIf($hash,'HM_5C33F5_T1','temperature') >79 and ReadingValDoIf($hash,'HM_5C31A1_T1','temperature') >79 and (ReadingValDoIf($hash,'HM_56E453_Sw_02','state') eq "on" or ReadingValDoIf($hash,'HM_56E453_Sw_03','state') eq "on")) or (ReadingValDoIf($hash,'HM_580DC9','state') eq "open" and (ReadingValDoIf($hash,'HM_56E453_Sw_02','state') eq "on" or ReadingValDoIf($hash,'HM_56E453_Sw_03','state') eq "on"))
   days:
   devices:
     0           HM_5C33F5_T1 HM_5C31A1_T1 HM_580DC9 HM_56E453_Sw_01
     1           HM_5C33F5_T1 HM_5C31A1_T1 HM_56E453_Sw_02 HM_56E453_Sw_03 HM_580DC9
     all         HM_5C33F5_T1 HM_5C31A1_T1 HM_580DC9 HM_56E453_Sw_01 HM_56E453_Sw_02 HM_56E453_Sw_03
   do:
     0:
       0          set HM_56E453_Sw_03 on-for-timer 900
       1          set HM_56E453_Sw_02 on-for-timer 900
     1:
       0          set HM_56E453_Sw_02 off, set HM_56E453_Sw_03 off
       1          set TeleBot _msg Beregnung Kreis 2 und 3 wurde abgebrochen
     2:
       0         
   helper:
     event      T: 77.4,temperature: 77.4
     globalinit 1
     last_timer 4
     sleeptimer -1
     timerdev   HM_5C33F5_T1
     timerevent T: 77.4,temperature: 77.4
     triggerDev HM_5C33F5_T1
     DOIF_eventas:
       cmd_nr: 3
       cmd: 3
       cmd_event: HM_5C31A1_T1
       state: cmd_3
     timerevents:
       T: 77.4
       temperature: 77.4
     timereventsState:
       state: T: 77.4
       temperature: 77.4
     triggerEvents:
       T: 77.4
       temperature: 77.4
     triggerEventsState:
       state: T: 77.4
       temperature: 77.4
   internals:
   interval:
     0          -1
     1          0
     2          -1
     3          2
   intervalfunc:
   itimer:
   localtime:
     0          1529638800
     1          1529641800
     2          1529602860
     3          1529608500
   readings:
     0           HM_5C33F5_T1:temperature HM_5C31A1_T1:temperature HM_580DC9:state HM_56E453_Sw_01:state
     1           HM_5C33F5_T1:temperature HM_5C31A1_T1:temperature HM_56E453_Sw_02:state HM_56E453_Sw_03:state HM_580DC9:state
     all         HM_5C33F5_T1:temperature HM_5C31A1_T1:temperature HM_580DC9:state HM_56E453_Sw_01:state HM_56E453_Sw_02:state HM_56E453_Sw_03:state
   realtime:
     0          05:40:00
     1          06:30:00
     2          19:41:00
     3          21:15:00
   time:
     0          05:40:00
     1          06:30:00
     2          19:41:00
     3          21:15:00
   timeCond:
     0          0
     1          0
     2          0
     3          0
   timer:
     0          0
     1          0
     2          0
     3          0
   timers:
     0           0  1  2  3
   trigger:
   triggertime:
     1529602860:
       localtime  1529602860
       hash:
     1529608500:
       localtime  1529608500
       hash:
     1529638800:
       localtime  1529638800
       hash:
     1529641800:
       localtime  1529641800
       hash:
   uiState:
   uiTable:
Attributes:
   room       Neu
   wait       0,880

Damian

Du befindest dich im DOELSE-Fall ausgelöst durch HM_5C31A1_T1, deswegen kommt der zweite Befehl nicht mehr zum Zuge.

     2018-06-21 19:23:53   Device          HM_5C33F5_T1
     2018-06-21 18:50:32   cmd             3
     2018-06-21 18:50:32   cmd_event       HM_5C31A1_T1


Lösche einfach den DOELSE-Fall, dann sollte es funktionieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TW911

Sorry das ich auf der Leitung stehe, aber welchen DOELSE Fall bin leider noch nicht so fit mit Fhem??
den letzten, also DOELSE () ? oder DOELSEIF?
Verstehe ich das so richtig wie im bild?

Damian

Zitat von: TW911 am 21 Juni 2018, 19:35:54
Sorry das ich auf der Leitung stehe, aber welchen DOELSE Fall bin leider noch nicht so fit mit Fhem??
den letzten, also DOELSE () ? oder DOELSEIF?
Verstehe ich das so richtig wie im bild?

ja und es gibt nur einen DOELSE-Fall, das hatten wir doch schon, das andere sind DOELESIF-Zweige.

Nimm dir etwas Zeit für die Commandref zu DOIF, dann werden sich viele Fragen von selbst erledigen.

Man möchte am Anfang schnell zum Erfolg kommen, aber mir jeder Definition werden die Definitionen umfangreicher und komplexer - daher sind die Grundlagen entscheidend um unnötigen Frust zu vermeiden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF