FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: is2late am 31 Januar 2023, 17:54:13

Titel: (Gelöst) Wenn state bestimmte Zeit vorliegt...
Beitrag von: is2late am 31 Januar 2023, 17:54:13
Hi,

ich beiße an Folgendem herum:

Nach Eintritt einer Bedingung soll eine Action ausgelöst werden. Die Bedingung ist das Vorliegen eines State über bestimmte Zeit (hier: 10 Sekunden)
defmod d_HeizungBueroM DOIF ([HeizungBueroM:state] eq "on" >10) ({fhem("set Sonos_Wohnzimmer Speak 50 de.......

Angezeigt wird mir ein Syntax Error im Bereich der Zeitangabe. Ich vergleiche hier wohl "on" mit einer Zahl ;-)  Aber wie ist die richtige Syntax?

Weiß jemand Rat?

LG Ingo

Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: Jogi am 31 Januar 2023, 18:17:22
Das wird so nicht funktionieren.
Im DOIF kannst du das über "wait" lösen (einfach die >10 weglassen und das Attribut wait mit 10 setzen) oder ganz anders mit einem watchdog.
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: is2late am 31 Januar 2023, 18:29:59
Ein Wait würde wohl dazu führen, dass nach Zeitablauf keine Bedingungsprüfung mehr stattfindet -das wäre unerwünscht. Watchdog probiere ich mal, danke!
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: Icinger am 31 Januar 2023, 18:38:40
ZitatEin Wait würde wohl dazu führen, dass nach Zeitablauf keine Bedingungsprüfung mehr stattfindet
stimmt nur dann, wenn du nicht ein passendes DOELSEIF verwendest. Ansonsten startet ja dieses ELSE und der wait wird nicht ausgeführt.
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: is2late am 01 Februar 2023, 16:34:35
Hab es jetzt einmal mit einem Watchdog versucht:

defmod w_HeizungM watchdog HeizungBueroM:on.* 00:00:10 HeizungBueroM:off.* set ECHO_G090LF1072270A6S speak Achtung, die Schreibtischheizung ist noch eingeschaltet!;; trigger w_HeizungM .

Das funktioniert zwar, aber nur einmalig - trotz "trigger....". Habs alternativ mit autoRestart 1 versucht, aber erfolglos. STATE ist defined.

Sieht jemand, was ich falsch mache?  Hab einen Verdacht: Der Watchdog wird vom Event "on" getriggert, aber der wiederholt sich ja nicht, wenn das Dummy auf "on" bleibt....
Müsste man da wohl auf den Zustand abstellen?

LG
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: Nobbynews am 01 Februar 2023, 17:06:04
Laß'  mal hinter on und off jeweils das ".*" weg.
Macht doch mMn keinen Sinn.
Und natürlich das 'attr autoRestart 1' gesetzt lassen.
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: is2late am 01 Februar 2023, 17:25:31
Hi Nobbynews,

hab ich gemacht. Ändert sich nichts, dh die Meldung wird nicht wiederholt. Ich schiebe es weiterhin darauf, dass das Event sich nicht wiederholt, wenn die Heizung einfach eingeschaltet bleibt.
Deshalb dachte ich, dass der Zustand abgefragt werden müsste.
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: Jogi am 01 Februar 2023, 17:51:29
Zitat von: Jogi am 31 Januar 2023, 18:17:22
Das wird so nicht funktionieren.
Im DOIF kannst du das über "wait" lösen (einfach die >10 weglassen und das Attribut wait mit 10 setzen) oder ganz anders mit einem watchdog.
Probiere es doch mit DOIF.
Z.B. so:
defmod d_HeizungBueroM DOIF ([HeizungBueroM:state] eq "on") ({fhem("set Sonos_Wohnzimmer Speak 50 de.....
DOELSE ## nothing

Wait auf 10 setzen.

Dann wird bei [HeizungBueroM:state] eq "on" nach 10s der Befehl ausgelöst.
Ändert sich der Zustand von [HeizungBueroM:state]  auf nicht "on" geht DOIF in Zweig 2 und macht nichts.

Das ist es doch was Du willst, oder?
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: is2late am 01 Februar 2023, 17:59:12
Hallo Jogi,

vielen Dank!

Ich möchte eigentlich, dass die Meldung so oft wiederholt wird, bis der Dummy auf off steht.
Hab jetzt folgende primitive Lösung gefunden, die das Problem des nicht wiederholten Events löst:

defmod w_HeizungM watchdog HeizungBueroM:on.* 02:00:00 HeizungBueroM:off.* set ECHO_G090LF1072270A6S speak Achtung....... ;; set HeizungBueroM off ;; sleep 10 ;; set HeizungBueroM on
attr w_HeizungM autoRestart 1


Ich schalte also den Dummy kurz aus- und dann wieder ein und bekomme so ein neues Event, auf das der Watchdog reagieren kann.

Wenn aber jemand eine elegante Lösung kennt, die sich auf das state bezieht, wäre ich dankbar - man will ja auch was lernen ;-)
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: Nobbynews am 01 Februar 2023, 19:11:20
Zitat von: is2late am 01 Februar 2023, 17:59:12
Ich möchte eigentlich, dass die Meldung so oft wiederholt wird, bis der Dummy auf off steht.
Dafür ist mMn watchdog nicht geeignet.
Zitat aus dem Wiki:
Zitatdefine <name> watchdog <regexp1> <timespec> <regexp2> <command>
Define
Führe Befehl <command> aus, wenn nach Ereignis <regexp1> nicht innerhalb der Zeitspanne <timespec> das Ereignis <regexp2> auftritt. 
Also verhält sich watchdog korrekt.
Was Du möchtest, sollte tatsächlich mit DOIF funktionieren.
ZitatWiederholung von Befehlsausführung   back

Wiederholungen der Ausführung von Kommandos werden pro Befehlsfolge über das Attribut repeatcmd definiert. Syntax:

attr <DOIF-modul> repeatcmd <Sekunden für Befehlsfolge des ersten DO-Falls>:<Sekunden für Befehlsfolge des zweiten DO-Falls>:...

Statt Sekundenangaben können ebenfalls Status in eckigen Klammen oder Perlbefehle angegeben werden.

Die Wiederholung findet so lange statt, bis der Zustand des Moduls in einen anderen DO-Fall wechselt.

Anwendungsbeispiel: Nach dem Eintreffen des Ereignisses wird die push-Meldung stündlich wiederholt, bis Frost ungleich "on" ist.

define di_push DOIF ([frost] eq "on")(set pushmsg "danger of frost")
attr di_push repeatcmd 3600

Eine Begrenzung der Wiederholungen kann mit dem Attribut repeatsame vorgenommen werden
attr di_push repeatsame 3 
Titel: Antw:Wenn state bestimmte Zeit vorliegt...
Beitrag von: is2late am 02 Februar 2023, 10:47:53
Super, danke, die Funktion kannte ich noch nicht!

Jetzt ist es perfekt....   DOIF mit attr repeatcmd, repeatsame und wait (s.o. Jogi) ...klappt wunderbar.

Herzlichen Dank, Nobbynews und Jogi!