Hallo zusammen,
ich würde gerne mit dem Enigma-Modul und einem DOIF erreichen, dass eine Nachricht auf dem Screen angezeigt wird, wenn sich ein Reading z.B. 2h lang nicht ändert.
Anwendungsfall: Man schaut abends fern und schläft dabei ein. Dann soll nach z.B. 2h auf dem gleichen Kanal eine Mitteilung auf dem Screen erscheinen, dass man umschalten soll und wenn das nicht innerhalb von x Minuten passiert, geht der Receiver aus (und damit laufen dann weitere Folgereaktionen ab).
Nur wie bekommt man die Bedingung irgendwie formuliert, dass sich ein Reading NICHT ÄNDERT?
Besten Dank an Euch
Viele Grüße
Michael
Ich würde das mit einem watchdog lösen.
genau der Fall ist doch in der deutschen Commandref für DOIF beschrieben
@Marvin: Ob watchdog oder DI ist ja an sich egal
@Loredo: Echt? Dann schau ich da mal, danke!!!
Das scheint nicht zu funktionieren:
Internals:
CFGFN
DEF ([DM500HD:channel:sec] > 20) (set DM500HD msg message 30 TEST)
NAME DM500HD_Test
NR 92076
NTFY_ORDER 50-DM500HD_Test
STATE initialized
TYPE DOIF
Readings:
2015-09-20 21:13:46 Device DM500HD
2015-09-20 21:13:46 e_DM500HD_channel SAT.1_HD
2015-09-20 21:12:33 state initialized
Condition:
0 ReadingSecDoIf('DM500HD','channel') > 20
Devices:
0 DM500HD
all DM500HD
Do:
0:
0 set DM500HD msg message 30 TEST
1:
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Internals:
Itimer:
Readings:
0 DM500HD:channel
all DM500HD:channel
State:
Timerfunc:
Trigger:
Attributes:
do always
Ne Idee, woran das liegen kann?
@Damian: Hast du vllt ne Idee?
ALso scheinbar funktioniert das nicht so, wie ich das verstanden habe. Dachte, mit folgendem Audruck könnte ich darauf reagieren, wenn sich das Reading 60 Minuten nicht ändert:
([Spark_One:channel:sec] > 3600) (set Spark_One msg message 30 TEST)
Aber da passiert einfach überhaupt nichts!
@Damian: Ist das Modul in dieser Hinsicht unvollständig?
Habe es jetzt so gelöst, dass ich auf "< 10" prüfe und dann einen wait-timer starte, der 3600 Sekunden läuft. Funktioniert, aber ist ja irgendwie nicht die elegante Lösung! Haste ne Idee dazu?
Danke und Gruß
Michael
Zitat von: Michi240281 am 27 September 2015, 21:55:24
ALso scheinbar funktioniert das nicht so, wie ich das verstanden habe. Dachte, mit folgendem Audruck könnte ich darauf reagieren, wenn sich das Reading 60 Minuten nicht ändert:
([Spark_One:channel:sec] > 3600) (set Spark_One msg message 30 TEST)
Aber da passiert einfach überhaupt nichts!
@Damian: Ist das Modul in dieser Hinsicht unvollständig?
Habe es jetzt so gelöst, dass ich auf "< 10" prüfe und dann einen wait-timer starte, der 3600 Sekunden läuft. Funktioniert, aber ist ja irgendwie nicht die elegante Lösung! Haste ne Idee dazu?
Danke und Gruß
Michael
So wird es nicht funktionieren. Man muss nur die richtige Stelle in der Commandref finden:
ZitatAnwendungsbeispiel: Meldung beim Ausbleiben eines Events
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
Gruß
Damian
Kannst du mir den Absatz evtl. erklären? Ist nicht selbsterklärend finde ich....
Zitat von: Michi240281 am 29 September 2015, 16:54:16
Kannst du mir den Absatz evtl. erklären? Ist nicht selbsterklärend finde ich....
Mit Wait wird der Trigger verzögert, mit do resetwait wird die Verzögerungszeit wieder neu gesetzt, wenn in der Wait-Phase wieder ein Trigger kommt.
Das ist alles, nicht mehr und auch nicht weniger.
Gruß
Damian
Aber dann muss ich in der Abfrage nur das Device angeben, ohne reading etc.?
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
Zitat von: Michi240281 am 30 September 2015, 13:20:18
Aber dann muss ich in der Abfrage nur das Device angeben, ohne reading etc.?
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
oder einfach einen beliebigen Trigger des Devices (eingleitet mit einem Fragezeichen), also:
define di_push DOIF ([mein_device:?])(set pushmsg "sensor failed again")
Gruß
Damian
Ok, so richtig leuchtet mir das aber nicht ein! Könnte ja dann sein, dass sich irgendein Reading ändert.....ich will aber ja dann reagieren, wenn das reading "channel" sich 60 Minuten nicht ändert? Bin ich zu doof das zu verstehen?
@Michi: Bist du wieder zum nicht lesen über gegangen?
Damian schreibt
Zitat von: Damian am 30 September 2015, 13:33:09
oder einfach einen beliebigen Trigger des Devices (eingleitet mit einem Fragezeichen), also:
define di_push DOIF ([mein_device:?])(set pushmsg "sensor failed again")
Edit: Wobei das für deine Anwedung eher so lautet
define di_push DOIF ([mein_device:channel])(set pushmsg "sensor failed again")
Zitat von: marvin78 am 30 September 2015, 14:43:36
@Michi: Bist du wieder zum nicht lesen über gegangen?
Damian schreibt
Edit: Wobei das für deine Anwedung eher so lautet
define di_push DOIF ([mein_device:channel])(set pushmsg "sensor failed again")
ja, allerdings wird dann ja das Reading channel ausgewertet und wenn das Reading Null ist, dann ist die Bedingung nicht wahr.
Besser wäre in diesem Fall das Event auszuwerten und das wird bei DOIF, um es von der Auswertung eines Readings zu unterscheiden (wie oben angegeben), mit einem Fragezeichen eingeleitet.
dann also:
define di_push DOIF ([mein_device:?channel])(set pushmsg "sensor failed again")
Gruß
Damian
Grr. Das Fragezeichen habe ich schlicht vergessen bzw. rausgelöscht.
Besten Dank, werde ich heute Abend testen! DANKE!!!!
Funktioniert, jetzt ist nur die Frage, wie ich ein 2. Kommando zeitverzögert mit in dem DI untergebracht bekomme? Eine 2. Bedingung wird denke ich ja nicht funktionieren, da dann Bedingung 1 und 2 identisch sind. Ist das irgendwie möglich, innerhalb einer Bedingung 2 Kommandos zu unterschiedlichen Zeitpunkten auszuführen? Ansonsten müsste ich erst den Status eines Dummies ändern und ein 2., eigenständiges DI fürs Ausschalten des Receivers erstellen....
EDIT: Ahhh, habs in der commandref gefunden! Trennung mit ","...........allerdings habe ich ja schon ein wait Attribut gesetzt! Kann man das da dennoch mit unterbringen?
Zitat von: Michi240281 am 01 Oktober 2015, 09:13:44
Funktioniert, jetzt ist nur die Frage, wie ich ein 2. Kommando zeitverzögert mit in dem DI untergebracht bekomme? Eine 2. Bedingung wird denke ich ja nicht funktionieren, da dann Bedingung 1 und 2 identisch sind. Ist das irgendwie möglich, innerhalb einer Bedingung 2 Kommandos zu unterschiedlichen Zeitpunkten auszuführen? Ansonsten müsste ich erst den Status eines Dummies ändern und ein 2., eigenständiges DI fürs Ausschalten des Receivers erstellen....
EDIT: Ahhh, habs in der commandref gefunden! Trennung mit ","...........allerdings habe ich ja schon ein wait Attribut gesetzt! Kann man das da dennoch mit unterbringen?
Wenn du mehrere Wait-Angaben für eine Abfolge definieren willst dann musst du die einzelnen Sequenzen Klammern:
DOIF (Bedingung) (set ..., set ...)(set... ,set ...)
wait 1,2
Gruß
Damian
Hallo zusammen
Darf ich eine Frage zu dem Thema hier stellen:
Ich verstehe nicht ganz diese Logik hinter diesem Code:
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
Die Zeile DOIF sagt doch, wenn der Tempsensor ein Reading hat, dann soll DOIF ein SET PUSH ausführen. Korrekt?
Was machen dann das Wait und das Resetwait genau? Es soll ja so sein, dass eben genau erst nach 1800Sekunden das SET PUSH ausgeführt werden soll, wenn innerhalb dieser Zeit der Gartensensor kein Reading hatte..oder?
Was ist aber wenn der Garensensor nach 30 Sekunden ein Reading kriegt...wieso wir dann korrekterweise kein Setpush gemacht?
Danke und Gruss
Alen
Zitat von: alen am 13 August 2016, 08:11:17
Hallo zusammen
Darf ich eine Frage zu dem Thema hier stellen:
Ich verstehe nicht ganz diese Logik hinter diesem Code:
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
Die Zeile DOIF sagt doch, wenn der Tempsensor ein Reading hat, dann soll DOIF ein SET PUSH ausführen. Korrekt?
Was machen dann das Wait und das Resetwait genau? Es soll ja so sein, dass eben genau erst nach 1800Sekunden das SET PUSH ausgeführt werden soll, wenn innerhalb dieser Zeit der Gartensensor kein Reading hatte..oder?
Was ist aber wenn der Garensensor nach 30 Sekunden ein Reading kriegt...wieso wir dann korrekterweise kein Setpush gemacht?
Danke und Gruss
Alen
Wenn Tempsensor ein Event erzeugt, dann wird zuerst der Wait-Timer mit 1800 Sekunden für die Ausführung von pushmsg gesetzt. Wenn in dieser Zeit kein weiteres Event von Tempsensor kommt, dann wird pushmsg ausgeführt. Wenn allerdings vorher (innerhalb der 1800 Sekunden) wieder ein Event von Tempsensor kommt, dann wird der Wait-Timer wieder auf 1800 Sekunden gesetzt. Das wird durch das Attribut do resetwait provoziert. Wäre dagegen do always gesetzt, dann würde ein laufender Waittimer nicht neu gesetzt, sondern würde weiter laufen bis er abläuft und anschließend der Befehl ausgeführt wird.
Gruß
Damian