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
880+900=1780
daher
wait 0,1780
Zwei DOELSE Zweige in einem DOIF sind ungewöhnlich, sollte ich eine Weiterentwicklung verschlafen haben?
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.
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.----------->
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]
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.
So, jetzt aber ;) Also so wie auf dem Bild. Aber löst das jetzt mein "Wait" Problem??
Funktioniert es denn jetzt nicht?
Was Du noch selbst probieren könntest, https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche
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.
Wozu definierst du den DOELSE-Fall?
Poste mal die Ausgabe von "list Automatik.Kreis.2.und.3" in der Kommandozeile.
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
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.
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?
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.
:) So Läuft es jetzt. Habe den DOELSE gelöscht. Was mir allerdings immer noch nicht klar ist, ich hatte diesen leeren DOELSE Fall nur deswegen drin, weil sich das DOIF trotz geänderten readings nur ein einziges mal nach "initialisiert" ausgeführ hat (cmd1), und dann nie wieder. Es ist also nicht in cmd2 gekommen. Scheinbar hab ich da auch ein Fehler drin. Hatte es mit verschieden attr versucht, also do always/resetwait, check all, aber ging nie. nur mit dem lerren DOELSE lief es zumindest halbwegs. Muss dann nochmal nachsehen im cmd2 ob da alles so passt und Testen.
:)Vielen vielen Dank für die Unterstützung!!! Kämpfe da schon seit wochen mit :(
gruß
Tom