FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Michi240281 am 17 September 2015, 15:05:50

Titel: Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Michi240281 am 17 September 2015, 15:05:50
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
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: marvin78 am 17 September 2015, 15:07:24
Ich würde das mit einem watchdog lösen.
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Loredo am 17 September 2015, 15:14:28
genau der Fall ist doch in der deutschen Commandref für DOIF beschrieben
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Michi240281 am 17 September 2015, 15:29:40
@Marvin: Ob watchdog oder DI ist ja an sich egal

@Loredo: Echt? Dann schau ich da mal, danke!!!
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Michi240281 am 20 September 2015, 21:15:21
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?
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag 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
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Damian am 27 September 2015, 22:12:18
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
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Michi240281 am 29 September 2015, 16:54:16
Kannst du mir den Absatz evtl. erklären? Ist nicht selbsterklärend finde ich....
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Damian am 29 September 2015, 16:58:00
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
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag 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")
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Damian am 30 September 2015, 13:33:09
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
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Michi240281 am 30 September 2015, 14:41:29
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?
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: marvin78 am 30 September 2015, 14:43:36
@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")
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Damian am 30 September 2015, 15:32:55
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
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: marvin78 am 30 September 2015, 15:46:19
Grr. Das Fragezeichen habe ich schlicht vergessen bzw. rausgelöscht.
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Michi240281 am 30 September 2015, 16:07:08
Besten Dank, werde ich heute Abend testen! DANKE!!!!
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag 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?
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Damian am 01 Oktober 2015, 20:13:09
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
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag 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
Titel: Antw:Enigma: DOIF wenn Reading sich nicht ändert
Beitrag von: Damian am 13 August 2016, 21:39:59
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