Hauptmenü

DOIF Batterieüberwachung

Begonnen von weini, 02 Juni 2016, 23:35:59

Vorheriges Thema - Nächstes Thema

weini

Hallo zusammen!

Habe jetzt meine DOIF Batterieüberwachung am laufen. Die einfache "Notify"-Variante aus dem Wiki hat mir nicht gereicht, da ich ein paar unzuverlässige Termperaturfühler habe, die manchmal eine Batteriewarnung senden, diese dann aber sofort wieder zurückziehen.
Ich wollte das mit DOIF über die WAIT Funktion abfedern. Das geht so aber leider nicht, weil die Events von verschiedenen Devices auf ein zentrales DOIF treffen.

Letztlich habe ich jetzt eine Counter-basierende Lösung gebaut, bei der die Anzahl Events je Device konfiguriert werden kann, ab denen dann tatsächlich der Alarm ausgelöst wird.


define dif_Batteriewarnung DOIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and [?dif_Batteriewarnung:$DEVICE] eq "0") ( {SendEMail('postmaster@domain.com', 'FHEM Batteriewarnung', "$DEVICE: $EVENT")}, {Log 3,"$DEVICE: Batteriewarnung $EVENT"}, setreading dif_Batteriewarnung $DEVICE low) \
DOELSEIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and [?dif_Batteriewarnung:$DEVICE] eq "ok") (setreading dif_Batteriewarnung $DEVICE [dif_Batteriewarnung:delayCounter])\
DOELSEIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and [?dif_Batteriewarnung:$DEVICE] > "0" and [?dif_Batteriewarnung:$DEVICE] <= [?dif_Batteriewarnung:delayCounter]) (setreading dif_Batteriewarnung $DEVICE {([dif_Batteriewarnung:$DEVICE])-1})\
DOELSEIF ( ([":^battery:.*ok"] or [":^battery:.*1"]) and [?dif_Batteriewarnung:$DEVICE] ne "ok") (setreading dif_Batteriewarnung $DEVICE ok)
attr dif_Batteriewarnung userattr delayCounter
attr dif_Batteriewarnung delayCounter 2
attr dif_Batteriewarnung do always
attr dif_Batteriewarnung notexist "ok"
attr dif_Batteriewarnung userReadings delayCounter { AttrVal($name,"delayCounter",0);; }


Im Attribut "delayCounter" wird die Anzahl konfiguriert, nach der ein Alarm erfolgt. Da DOIF (noch) nicht direkt Attribute abfragen kann habe ich ein einfaches userReading eingefügt. Die Funktion zum Senden der Email ist proprietär, es gibt aber zig Beispiele im Forum.

Hoffentlich nutzt es dem einen oder anderen...

Christian

Damian

Zitat von: weini am 02 Juni 2016, 23:35:59
Hallo zusammen!

Habe jetzt meine DOIF Batterieüberwachung am laufen. Die einfache "Notify"-Variante aus dem Wiki hat mir nicht gereicht, da ich ein paar unzuverlässige Termperaturfühler habe, die manchmal eine Batteriewarnung senden, diese dann aber sofort wieder zurückziehen.
Ich wollte das mit DOIF über die WAIT Funktion abfedern. Das geht so aber leider nicht, weil die Events von verschiedenen Devices auf ein zentrales DOIF treffen.

Letztlich habe ich jetzt eine Counter-basierende Lösung gebaut, bei der die Anzahl Events je Device konfiguriert werden kann, ab denen dann tatsächlich der Alarm ausgelöst wird.


define dif_Batteriewarnung DOIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and [?dif_Batteriewarnung:$DEVICE] eq "0") ( {SendEMail('postmaster@domain.com', 'FHEM Batteriewarnung', "$DEVICE: $EVENT")}, {Log 3,"$DEVICE: Batteriewarnung $EVENT"}, setreading dif_Batteriewarnung $DEVICE low) \
DOELSEIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and [?dif_Batteriewarnung:$DEVICE] eq "ok") (setreading dif_Batteriewarnung $DEVICE [dif_Batteriewarnung:delayCounter])\
DOELSEIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and [?dif_Batteriewarnung:$DEVICE] > "0" and [?dif_Batteriewarnung:$DEVICE] <= [?dif_Batteriewarnung:delayCounter]) (setreading dif_Batteriewarnung $DEVICE {([dif_Batteriewarnung:$DEVICE])-1})\
DOELSEIF ( ([":^battery:.*ok"] or [":^battery:.*1"]) and [?dif_Batteriewarnung:$DEVICE] ne "ok") (setreading dif_Batteriewarnung $DEVICE ok)
attr dif_Batteriewarnung userattr delayCounter
attr dif_Batteriewarnung delayCounter 2
attr dif_Batteriewarnung do always
attr dif_Batteriewarnung notexist "ok"
attr dif_Batteriewarnung userReadings delayCounter { AttrVal($name,"delayCounter",0);; }


Im Attribut "delayCounter" wird die Anzahl konfiguriert, nach der ein Alarm erfolgt. Da DOIF (noch) nicht direkt Attribute abfragen kann habe ich ein einfaches userReading eingefügt. Die Funktion zum Senden der Email ist proprietär, es gibt aber zig Beispiele im Forum.

Hoffentlich nutzt es dem einen oder anderen...

Christian

Du kannst es kürzer und allgemeiner halten, wenn du statt dif_Batteriewarnung $SELF angibst.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

weini

Danke dir für den Hinweis!
Zusätzlich hat auch die Initialisierung der Readings nicht mehr sauber funktioniert. Hier die aktualiseirte Fassung:


define dif_Batteriewarnung DOIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and [?$SELF:$DEVICE] eq "0") ( {SendEMail('postmaster@domain.com', 'FHEM Batteriewarnung', "$DEVICE: $EVENT")}, {Log 3,"$DEVICE: Batteriewarnung $EVENT"}, setreading $SELF $DEVICE low) \
DOELSEIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and ([?$SELF:$DEVICE] eq "ok" or [?$SELF:$DEVICE] eq "novalue")) (setreading $SELF $DEVICE [$SELF:delayCounter])\
DOELSEIF ( ([":^battery:.*low"] or [":^battery:.*0"]) and [?$SELF:$DEVICE] > "0" and [?$SELF:$DEVICE] <= [?$SELF:delayCounter]) (setreading $SELF $DEVICE {([$SELF:$DEVICE])-1})\
DOELSEIF ( ([":^battery:.*ok"] or [":^battery:.*1"]) and [?$SELF:$DEVICE] ne "ok") (setreading $SELF $DEVICE ok)
attr dif_Batteriewarnung userattr delayCounter
attr dif_Batteriewarnung delayCounter 2
attr dif_Batteriewarnung do always
attr dif_Batteriewarnung notexist "novalue"
attr dif_Batteriewarnung userReadings delayCounter { AttrVal($name,"delayCounter",0);; }

moonsorrox

Hallo ich setze dieses DOIF seit einiger Zeit ein und habe heute Nacht seit dem Einsatz das erste mal eine Batteriemeldung bekommen verbunden mit ne Menge Perl Fehler die ganze Nacht hindurch bis ich jetzt die Batterien getauscht habe.

Ist das bei dir auch der Fall..?
Siehe meinen Beitrag von heute
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

weini

Mit Perl-Fehlern hatte ich bisher keine Probleme. Ich hatte allerdings auch erst einmal eine "echte" Batteriewarnung und das war vor mehreren Monaten.

Auf was steht denn der "delayCounter" bei dir?

moonsorrox

steht bei mir auf "2" vorher hatte ich ihn auf "1"
Aber trotzdem sollten, egal wo der steht keine Perlfehler erzeugt werden oder täusche ich mich da..?
Jetzt ist auch alles wieder ruhig, mal schauen wenn es die nächste Batteriewarnung gibt, denn dadurch hatte ich diese Fehler ja
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

weini

Völlig richtig, es sollten keine Perl-Fehler auftreten.
Wenn du das Problem nochmal hast, dann wäre einer Liste sämtlicher Readings am DOIF hilfreich.

moonsorrox

dies sind die Readings jetzt:
Readings:
     2016-06-04 00:52:15   BWM_Terrasse    ok
     2016-08-28 17:13:24   Device          EG_TK_Eingang
     2016-06-04 01:20:07   EG_TK_Eingang   ok
     2016-06-04 06:47:41   FB_RC_8         ok
     2016-06-06 13:24:40   FB_RC_8_WZ      ok
     2016-06-04 06:00:04   Temperatur_Arbeitszimmer ok
     2016-07-10 11:57:38   Temperatur_Bad  ok
     2016-06-04 00:51:07   Temperatur_Kueche ok
     2016-06-04 00:51:35   Temperatur_Norden ok
     2016-06-04 00:53:41   Temperatur_Terrasse ok
     2016-08-25 12:24:04   Temperatur_Wohnzimmer ok
     2016-06-04 01:16:50   WZ_TK_Terrasse  ok
     2016-08-25 12:24:04   cmd             4
     2016-08-28 17:13:24   delayCounter    2
     2016-08-25 12:22:09   matched_event_c1_1 battery: low
     2016-08-25 12:22:09   matched_event_c2_1 battery: low
     2016-08-25 12:22:09   matched_event_c3_1 battery: low
     2016-08-28 17:13:24   matched_event_c4_1 battery: ok
     2016-08-27 14:07:21   state           initialize


andere sind das nicht und der Sensor für das Wohnzimmer hatte die Batteriemeldung  ;)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

weini

Die vom DOIF für die Verwaltung angelegten Readings ("Temperatur...") sehen alle korrekt aus.

Interessant ist der Wert "low" bei den "matched..." Readings, diese legt das DOIF Modul bzw. FHEM an. Wenn es hier beim Vergleich zu einem Perl Fehler kommt, dann wasche ich meine Hände erst mal in Unschuld (lasse mich aber gerene eines besseren belehren).

moonsorrox

ich hatte mich damit noch gar nicht beschäftigt, wurde nur durch die 1. Warnmeldung drauf aufmerksam.
Da das Teil sehr kompakt ist habe ich mir die Mühe gespart und das ganze DOIF so wie es hier in Post #2 steht komplett übernommen ohne mir groß Gedanken zu machen.  ;)

Na mal schauen was die nächste Fehlermeldung bringt, die kommt ja solange bis die Batterien gewechselt werden, war zumindest bei mir so...!



Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

moonsorrox

heute nun wieder eine Batteriewarnung bekommen und leider bin ich nicht zuhause. Er schreibt mir jetzt bis zum Wechsel der Batterie das log wieder voll...
Das muss dann wohl ein Fehler im DOIF sein

2016.09.06 08:15:02 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2235173) line 1.
2016.09.06 08:12:21 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2232111) line 1.
2016.09.06 08:09:26 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2230089) line 1.
2016.09.06 08:07:21 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2228654) line 1.
2016.09.06 08:05:01 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2227101) line 1.
2016.09.06 08:02:26 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2226901) line 1.
2016.09.06 07:59:38 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2226581) line 1.
2016.09.06 07:56:34 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2226230) line 1.
2016.09.06 07:54:21 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2225954) line 1.
2016.09.06 07:51:53 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2225675) line 1.
2016.09.06 07:49:10 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2225380) line 1.
2016.09.06 07:46:13 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2225078) line 1.
2016.09.06 07:44:06 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2224737) line 1.
2016.09.06 07:41:44 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2224430) line 1.
2016.09.06 07:39:08 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2224115) line 1.
2016.09.06 07:36:17 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2223683) line 1.
2016.09.06 07:33:12 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2223358) line 1.
2016.09.06 07:30:57 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2223093) line 1.
2016.09.06 07:28:27 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2222875) line 1.
2016.09.06 07:25:42 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2222494) line 1.
2016.09.06 07:22:44 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2222169) line 1.
2016.09.06 07:20:35 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2221870) line 1.
2016.09.06 07:18:11 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2221559) line 1.
2016.09.06 07:15:33 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2221254) line 1.
2016.09.06 07:12:41 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2220895) line 1.
2016.09.06 07:10:38 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2220668) line 1.
2016.09.06 07:08:21 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2220360) line 1.
2016.09.06 07:05:49 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2220050) line 1.
2016.09.06 07:03:03 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2219738) line 1.
2016.09.06 07:00:02 1: PERL WARNING: Argument "low" isn't numeric in numeric gt (>) at (eval 2219377) line 1.
2016.09.06 06:57:53 3: Temperatur_Bad: Batteriewarnung battery: low


ich habe das DOIF erst einmal deaktiviert

im DOIF ist folgendes zu sehen
matched_event_c1_1 battery: low 2016-09-06 08:15:02
matched_event_c2_1 battery: low 2016-09-06 08:15:02
matched_event_c3_1 battery: low 2016-09-06 08:15:02
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Ellert

Zitat[?$SELF:$DEVICE] > "0" and [?$SELF:$DEVICE]
an dieser Stelle wird "low" numerisch mit "0" verglichen, das führt zur Warnung, besser lt.

weini

Erst mal vielen Dank an Ellert für den Tipp!

Sehr eigenartig finde ich, dass ich das Problem nicht nachgestellt bekomme. Ich ab extra ein Dummy-Device angelegt, damit ich die Readings entsprechend setzen kann. Bei mir löst der Alarm aber nach Ablauf der konfigurierten Iterationen korrekt aus. Eine Warning im Log bekomme ich nicht.

@moonsorrox: Kannst du den Tipp von Ellert bei dir testen, ob das dein Problem löst?

moonsorrox

Zitat von: Ellert am 06 September 2016, 09:10:27
an dieser Stelle wird "low" numerisch mit "0" verglichen, das führt zur Warnung, besser lt.

ich glaube ich hab grad nen Brett vorm Kopf, was meinst du mit "besser lt."
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

weini

Ellert meint vermutlich "lt" als Ersatz für ">". Nach meinem Verständnis müsste das aber "gt" sein, also:
[?$SELF:$DEVICE] gt "0" and [?$SELF:$DEVICE]

Wie gesagt, ich kann es selbst nicht testen, weil der Fehler bei mir nicht reproduzierbar ist.