Notify, wenn keine neuen Werte

Begonnen von m2th3o, 23 Januar 2015, 07:00:34

Vorheriges Thema - Nächstes Thema

m2th3o

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

Starkstrombastler

Für solche Fälle gibt es watchdog.

BTW: Welches Licht wird da überwacht?
IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200

m2th3o

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?!?

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Starkstrombastler

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.
IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200

m2th3o

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?

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

m2th3o

#7
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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Starkstrombastler

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 .

IPC\Ubuntu + Fhem, 1wire, Shellies, Siemens Logo!, Z-Wave, PhilipsTV, Vu+duo2, KM200

m2th3o

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

Damian

#11
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

m2th3o

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