Guten Morgen,
ich überwache meine Heizung mit einem Lichtsensor, da diese des Häufigeren ausfällt. Da die Erkennung über die Intensität zu ungenau ist, habe ich mir gedacht, dass ich einen Timer setze, der kontrolliert, ob regelmäßig Werte ins Log geschrieben werden.
define act_on_KG_HK_Brenner.Light notify KG_HK_Brenner.*luminosity.* {\
fhem("set Brennerstatus OK;; define TON_Brennerstörung at +00:35:00 set Brennerstatus FEHLER")}
Genau letzte Nacht hat es aber - mal wieder - nicht funktioniert:
2015-01-22_20:14:52 KG_HK_Brenner luminosity: 1.35
2015-01-22_20:17:11 KG_HK_Brenner luminosity: 0.27
2015-01-23_02:20:04 KG_HK_Brenner luminosity: 1.41
2015-01-23_02:22:47 KG_HK_Brenner luminosity: 0.27
2015-01-23_06:26:18 KG_HK_Brenner luminosity: 20.44
2015-01-23_06:28:48 KG_HK_Brenner luminosity: 0
2015-01-23_06:31:04 KG_HK_Brenner luminosity: 4.96
Event-on-change-reading und -min Intervall sind gesetzt. Hat jemand eine Idee?
Danke & Gruß,
Markus
Für solche Fälle gibt es watchdog.
BTW: Welches Licht wird da überwacht?
Hi Starkstrombastler,
watchdog guck ich mir mal an. Die Brennerbetriebsleuchte. Die ist farbig, weshalb es mit dem Universalsensor schwierig ist, über die Lichtintensität die Farbe herauszubekommen. Zumal ich das Gefühl habe, dass sich der Wert auch noch mit der Batteriespannung ändert...
Aber mir ist auch nicht klar, warum mein Code nicht funktioniert?!?
Zitat von: m2th3o am 23 Januar 2015, 07:16:41
Hi Starkstrombastler,
watchdog guck ich mir mal an. Die Brennerbetriebsleuchte. Die ist farbig, weshalb es mit dem Universalsensor schwierig ist, über die Lichtintensität die Farbe herauszubekommen. Zumal ich das Gefühl habe, dass sich der Wert auch noch mit der Batteriespannung ändert...
Aber mir ist auch nicht klar, warum mein Code nicht funktioniert?!?
Oder mit der neuen Version von DOIF probieren siehe: http://fhem.de/commandref_DE.html#DOIF
Konkret dort:
Anwendungsbeispiel: Meldung beim Ausbleiben eines Events
Gruß
Damian
Zitat von: m2th3o am 23 Januar 2015, 07:00:34
define act_on_KG_HK_Brenner.Light notify KG_HK_Brenner.*luminosity.* {\
fhem("set Brennerstatus OK;; define TON_Brennerstörung at +00:35:00 set Brennerstatus FEHLER")}
Nach einem Event wird also das device
TON_Brennerstörung mit
define angelegt. Problematisch wird es, wenn innerhalb der nächsten 35 Minuten erneut ein Event kommt (was gem. Log ja auch passiert). Ein bereits angelegtes device darf nicht nochmal definiert werden. Für diesen Vorgang müsste
modify benutzt werden. Damit das
at nicht nach einmaligen Aufruf gelöscht wird, müsste es zyklisch wiederholt werden.
Hallo,
also ich habe mich jetzt schon geraume Zeit mit DOIF versucht, aber es noch nicht ganz hinbekommen. Evtl. habt ihr noch eine Idee:
Es soll der dummy "Brennerstatus" je nach Ergebnis gesetzt werden. Reading updated sich nicht mehr --> FEHLER, Reading schickt wieder neuen Wert --> OK. Ich hab irgendwie bisher nur den ersten Teil und insbesondere resettet sich das ganze nicht, wenn wieder ein Wert kommt.
define di_push DOIF ([AB_NORD_THSensor:temperature:sec] < 30)(set Brennerstatus DOIF_Failed)
attr di_push do resetwait
Wo hab ich evtl noch einen Denkfehler drin? Reset wäre wichtig, OK statt FAILED könnte ich wahrscheinlich mit DOELSE machen, oder?
Zitat von: m2th3o am 24 Januar 2015, 17:25:28
Hallo,
also ich habe mich jetzt schon geraume Zeit mit DOIF versucht, aber es noch nicht ganz hinbekommen. Evtl. habt ihr noch eine Idee:
Es soll der dummy "Brennerstatus" je nach Ergebnis gesetzt werden. Reading updated sich nicht mehr --> FEHLER, Reading schickt wieder neuen Wert --> OK. Ich hab irgendwie bisher nur den ersten Teil und insbesondere resettet sich das ganze nicht, wenn wieder ein Wert kommt.
define di_push DOIF ([AB_NORD_THSensor:temperature:sec] < 30)(set Brennerstatus DOIF_Failed)
attr di_push do resetwait
Wo hab ich evtl noch einen Denkfehler drin? Reset wäre wichtig, OK statt FAILED könnte ich wahrscheinlich mit DOELSE machen, oder?
define di_push DOIF ([AB_NORD_THSensor:temperature])(set Brennerstatus DOIF_Failed)
attr di_push wait 1800
attr di_push do resetwait
Entspricht dem Beispiel in der Commandref und bedeutet: Wenn nach 30 Minuten (1800 Sekunden) nicht erneut der Sensor sendet, dann kommt die Meldung.
Gruß
Damian
Ok.. soweit hatte ich das verstanden. Mein Problem ist eher, dass - wenn der DOIF einmal ausgelöst hat - der Reset nicht mehr wirksam ist. Oder aber das doelse nicht funktioniert:
define di_push DOIF ([AB_NORD_THSensor:temperature])(set Brennerstatus DOIF_Failed) DOELSE (set Brennerstatus OK)
attr di_push wait 30
attr di_push do resetwait
Zitat von: m2th3o am 24 Januar 2015, 18:07:36
Ok.. soweit hatte ich das verstanden. Mein Problem ist eher, dass - wenn der DOIF einmal ausgelöst hat - der Reset nicht mehr wirksam ist. Oder aber das doelse nicht funktioniert:
define di_push DOIF ([AB_NORD_THSensor:temperature])(set Brennerstatus DOIF_Failed) DOELSE (set Brennerstatus OK)
attr di_push wait 30
attr di_push do resetwait
Die Abfrage ([AB_NORD_THSensor:temperature]) ist immer Wahr, daher kann der DOELSE-Fall nie vorkommen.
dann eher:
define di_push DOIF ([AB_NORD_THSensor:temperature] and [?Brennerstatus] eq "OK")(set Brennerstatus DOIF_Failed) DOELSE (set Brennerstatus OK)
attr di_push wait 30
attr di_push repeatsame 0:1
attr di_push do resetwait
wenn bereits nach 30 Sekunden! Failed kommen soll.
Gruß
Damian
Folgender Watchdog sollte nach 35 Min auf "Fehler" setzen, sofern kein Event luminosity kam:
define mywd watchdog KG_HK_Brenner.*luminosity.* 00:35:00 SAME set Brennerstatus FEHLER;;trigger mywd .
Moin,
also ich hab gestern noch lange links- und rechtsrum versucht. Grundsätzlich find ich das mit DOIF eigentlich eine ziemlich schicke Sache. Mit dem Code mit beiden Zuständen (OK und FEHLER) blieb er aber nach 2-3 Wechseln in einem Zustand hängen. Ich hab dann erstmal folgendes gemacht:
define BrennerOK notify KG_HK_Brenner.*luminosity.* set Brennerstatus OK
define di_push DOIF ([KG_HK_Brenner:luminosity])(set Brennerstatus FEHLER)
attr di_push do resetwait
attr di_push wait 2700
Damit wird der Status bei event immer erstmal auf OK gesetzt und dann läuft der Timer. Jetzt habe ich aber zwei komische Sachen festgestellt, die mir noch nicht ganz gefallen:
- State ist irgendwie immer in cmd_2, was bei nur einem cmd etwas komisch ist
- Der Timer läuft nur jedes 2. Mal. Als wenn das erste Event den DOIF resettet und erst das zweite Event wieder das DOIF lostritt. Ich möchte aber natürlich Reset und Timerstart in einem Event von luminosity.
Habt ihr noch eine Idee??? Vielen Dank & Gruß,
Markus
Zitat von: m2th3o am 25 Januar 2015, 11:20:41
Moin,
also ich hab gestern noch lange links- und rechtsrum versucht. Grundsätzlich find ich das mit DOIF eigentlich eine ziemlich schicke Sache. Mit dem Code mit beiden Zuständen (OK und FEHLER) blieb er aber nach 2-3 Wechseln in einem Zustand hängen. Ich hab dann erstmal folgendes gemacht:
define BrennerOK notify KG_HK_Brenner.*luminosity.* set Brennerstatus OK
define di_push DOIF ([KG_HK_Brenner:luminosity])(set Brennerstatus FEHLER)
attr di_push do resetwait
attr di_push wait 2700
Damit wird der Status bei event immer erstmal auf OK gesetzt und dann läuft der Timer. Jetzt habe ich aber zwei komische Sachen festgestellt, die mir noch nicht ganz gefallen:
- State ist irgendwie immer in cmd_2, was bei nur einem cmd etwas komisch ist
- Der Timer läuft nur jedes 2. Mal. Als wenn das erste Event den DOIF resettet und erst das zweite Event wieder das DOIF lostritt. Ich möchte aber natürlich Reset und Timerstart in einem Event von luminosity.
Habt ihr noch eine Idee??? Vielen Dank & Gruß,
Markus
Der Wert cmd2 kann nur vorkommen, wenn die Bedingung nicht wahr ist. Dass könnte mit dieser Abfrage vorkommen, wenn luminosity gleich Null ist.
Du kannst neuerdings bei DOIF wie bei notify auch nur auf ein Ereignis reagieren. Das könnte dann bei dir so aussehen (man beachte das Fragezeichen):
define di_push DOIF ([KG_HK_Brenner:?luminosity])(set Brennerstatus FEHLER)
Die restlichen Definitionen müssen beibehalten werden. Wenn etwas nicht gewünscht funktioniert, bitte immer die Ausgabe von
list di_push von diesem Vorfall hier posten, dann habe ich mehr Informationen, die ein Problem erklären können.
Gruß
Damian
Hier Damian,
Juhu!!! Genau das war das Problem. Ziemlich genau jeder zweite Wert war "null" - warum auch immer. Im Log des Sensors stand aber "0". Jetzt mit dem ? und damit Triggern auf Event klappt es ganz hervorragend und wie gewünscht. DOIF ist schon ein echt mächtiges Modul.
Danke & Gruß,
Markus