(Gelöst) Wenn state bestimmte Zeit vorliegt...

Begonnen von is2late, 31 Januar 2023, 17:54:13

Vorheriges Thema - Nächstes Thema

is2late

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

Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

Jogi

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.

is2late

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!
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

Icinger

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.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

is2late

#4
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
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

Nobbynews

#5
Laß'  mal hinter on und off jeweils das ".*" weg.
Macht doch mMn keinen Sinn.
Und natürlich das 'attr autoRestart 1' gesetzt lassen.

is2late

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.
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

Jogi

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?

is2late

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 ;-)
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox

Nobbynews

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 

is2late

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!
Pi4, Tahoma Jalousien, Hue, Echo, Sonos, Lupusec XT3, FritzBox