Hallo!
Ich versuche ein Doif zum warten zu bekommen das das Cmd erst auslöst wenn sich der state in dieser Zeit nicht ändernt, ist sowas möglich?
Ich stelle meine Heizung über eine Anwesendheits erkennung an und aus was auch super klappt, nun würde ich gerne das wenn man kurz aus dem Haus ist um Brötchen zu holen nicht gleich umgeschaltet wird sondern erst nach 30min.
Hier mein Doif:
([HZAutomatik] eq "on") ({Heating_Control_SetAllTemps()},(set teleBot message @@Katja_Handy @@Steffen_Handy Heizung wird Eingeschaltet)) DOELSE (set Heizung_Gesamt desired-temp 17.0,set teleBot message @@Katja_Handy @@Steffen_Handy Heizung wird Ausgeschaltet)
wait-Attribut, siehe CommandRef...
Hallo,
mit "wait" hatte ich es ja versucht aber dann wird der Cmd ja trotzdem ausgeführt obwohl sich der Status ändert in dem Timer und das soll ja nicht passieren?!?
Mfg Steffen
Das wait wird erst unterbrochen wenn ein Zustandswechsel stattgefunden hat.
Er muß also in ein anderes CMD springen um den wait ab zu stellen.
z.B. DOELSEIF (Jemand-da-event) ()
Damit wechselt er in das jemand-da CMD ohne etwas auszuführen.
([HZAutomatik] eq "on") ({Heating_Control_SetAllTemps()},(set teleBot message @@Katja_Handy @@Steffen_Handy Heizung wird Eingeschaltet)) DOELSEIF ([HZAutomatik] eq "off") (set Heizung_Gesamt desired-temp 17.0,set teleBot message @@Katja_Handy @@Steffen_Handy Heizung wird Ausgeschaltet)
dazu wait
Frank war schneller ;)
Wie wäre es mit "resetwait (https://fhem.de/commandref_DE.html#DOIF_do_resetwait)"?
Zitat von: Per am 11 Oktober 2017, 10:42:39
Wie wäre es mit "resetwait (https://fhem.de/commandref_DE.html#DOIF_do_resetwait)"?
daran hatte ich auch schon gedacht aber dann muss ja die gleiche bedingung nochmal wahr werden, was ja nicht der Fall ist wenn ich nur kurz wieder in die Wohnung zurück komme, das beste wäre wenn in der Zeit vom Timer der Timer selber gelöscht wird wenn der state von meiner Anwesend erkennung wieder "wahr" wird und danach das doif wieder auf das Event von "HZAutomatik" wartet?!?
Mfg Steffen
Die Frage ist noch ob man diese Toleranz Zeit an der Heizung oder an "jemand nicht mehr da" festmacht. So wie oben konstruiert (ohne Wissen Deiner Inhalte) mache ich das mit Personen:
defmod di_Dev_Otto DOIF ([st_Dev_Otto] eq "absent")(set PersonOtto absent) DOELSEIF ([st_Dev_Otto] eq "present")(set PersonOtto present)
attr di_Dev_Otto room Status
attr di_Dev_Otto wait 300
Das funktioniert prima, ich kann auch mal das Smartphone neu starten.
Gruß Otto
Zitat von: Otto123 am 11 Oktober 2017, 11:06:52
Die Frage ist noch ob man diese Toleranz Zeit an der Heizung oder an "jemand nicht mehr da" festmacht.
Ich würde es gerne an der Heizung fest machen da ich noch andere Werte gekoppelt habe mit Anwesend wie zum bsp. eine Auto-Tür öffnung usw.!
Mfg Steffen
Hallo Steffen,
Du verstehst mich falsch, ich meine nicht anwesend, ich meinte abwesend. Mein Beispiel macht:
Anwesend - sofort
Abwesend - nach Zeit 5 min (Wenn ich innerhalb dieser Zeit wiederkomme, bin ich sofort wieder anwesend und war nie weg.
Zusätzlich kann man nach gleichem Schema weitere Zeitverzögerungen bei "abwesend" einbauen.
Gruß Otto
Bei Abwesend habe ich Aktuell 3min verzögerung, da ich wenn ich auch da in kurzer Zeit wieder komme die Tür wieder aufgemacht wird, also eine Verlängerung ist da dann auch nicht so gut.
Bis jetzt kam ich mit meinen System sehr gut zu recht, nun wollte ich eigentlich nur noch die Heizung zu nehmen und darum dachte ich es gäbe in DOIF diese Funktion, einen gestarteten Timer zu löschen wenn eine Bedingung in diesem Fall "HZAutomatik" in diese Zeit wieder wahr wird...
dann muss ich mir was anderes einfallen lassen, das ein weiteres DOIF den Timer direkt löscht.
Mfg Steffen
Alles gut - warum nimmst Du nicht genau die gleiche Konstruktion? Hast Du meinen weiter oben Vorschlag probiert? Geht der nicht?
Der sollte genau das machen was Du willst.
Gruß Otto
Guten Abend,
ich habe jetzt mal den Code von dir genommen und werde ihn morgen Live testen, danke erstmal schon für die geduld und hilfe!
Sollte ich den wait Timer auf das 2 cmd setzten,
also "0:600"?
Mfg Steffen
Hi Steffen,
ja ich denke der Gedanke mit dem wait ist richtig, Du willst ja das zweite "IF" verzögern. Er wird Dir bloß immer wieder die erste Nachricht schicken wenn Du wiederkommst bevor der Timer abgelaufen ist. Das musst Du irgendwie anders abfangen.
Nachricht separat und event-on-change-reading als Gedanke dazu.
Gruß Otto
Guten Morgen!
Also mit dem Timer auf dem zweiten If klappt soweit, aber das wahre ist es auch nicht, denn er führt ja dann bei änderung der Bedingung das cmd 1 wieder aus und das bedeutet "({Heating_Control_SetAllTemps()}" wird ausgeführt und meine Manuelle einstellungen werden dadurch verändert ganz zu schweigen von den benachrichtigungen.
Ich dachte es gäbe ein Funktion in Doif die bei einer erneuten Bedingung im dem Timer ganz einfach ein Timer löschen könnte.
Mfg Steffen
Moin,
wie schon gesagt, mein Ansatz wäre mehrstufig. Vielleicht gibt es auch eine andere Lösung, aber ich kenne sie nicht.
Wenn Du zunächst in einem DOIF den gewünschten Status Deiner Heizung ermittelst kannst Du in einer zweiten Funktion (DOIF oder notify) die Vorgänge auslösen. Die zweite Funktion reagiert auf einen Event bei der Veränderung eines readings der ersten Funktion. Mit event-on-change-reading wird verhindert das ein Event erzeugt wird wenn das reading mehrfach auf den gleichen Wert gesetzt wird.
Ich hoffe das war verständlich?
Gruß Otto