Batteriewarnungen abfangen

Begonnen von Mave, 26 März 2018, 09:54:34

Vorheriges Thema - Nächstes Thema

Mave

Sorry für die Anfängerfrage, aber ich hänge echt an dem Thema fest.

Ich versuche die unterschiedlichen Batteriewarnungen meiner unterschiedlichen Komponenten mit einem Notify abzufangen.

Die Schwierigkeit besteht darin, dass die Readings unterschiedlich sind.

Wie kann ich z.B. prüfen, ob ein Reading 0.LOWBAT auf "1" gewechselt hat? Oder ob ein Reading battery auf "nicht ok" gewechselt hat?

Vielen Dank für den richtigen Hinweis.

Grüße Mave

thgorjup

#1
Mit regulären Ausdrücken wie .*:battery kannst du alle Devices mit diesem oder ähnlichem Reading erfassen und dir den Status anzeigen lassen.


define ZE.Batterie readingsGroup .*:battery
attr ZE.Batterie notime 1
attr ZE.Batterie room 11_Drinnen
attr ZE.Batterie valueFormat {return "0" if( $VALUE eq "low" );; return "100" if( $VALUE eq "ok" );; return "25" if( $VALUE < 2.1 );; return "50" if( $VALUE < 2.3 );; return "75" if( $VALUE < 2.5 );; return "100"}
attr ZE.Batterie valueIcon {'battery.0' => 'measure_battery_0@red','battery.100' => 'measure_battery_100@green','Battery.0' => 'measure_battery_0@red','Battery.100' => 'measure_battery_100@green','batteryLevel.0' => 'measure_battery_0@red','batteryLevel.25' => 'measure_battery_25@red','batteryLevel.50' => 'measure_battery_50@orange','batteryLevel.75' => 'measure_battery_75@green','batteryLevel.100' => 'measure_battery_100@green'}


Mit einem notify kannst du dir dann bei jedem Event eine Mail schicken lassen.
Hier kannst du auch mit regulären Ausdrücken arbeiten: .*:[Bb]attery:.*


define not_BatteryCheck notify .*:[Bb]attery:.* { if ($EVENT !~ m/ok/ ) { \
  { system("echo 'FHEM Batteriewarnung - $NAME:$EVENT' | mail -s 'FHEM Batteriewarnung' vorname.nachname\@domain.tld") };; \
   Log 3, "$NAME : Batteriewarnung $EVENT";; \
  } \
}


FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

Mave

Vielen Dank für Deine Nachricht.

Wenn ich mit einem notify auf einen Event reagiere, bekomme ich bei jedem Neustart von FHEM Messages von alle Komponenten.
Ich möchte gerne nur benachrichtigt werden, wenn ein Reading von 0 auf 1 gewechselt hat.

Muss ich da nicht mit einem DOIF arbeiten anstatt mit notify?

thgorjup

In der Datei fhem.save ist der Zustand aller Readings gespeichert. Demenstprechend sollte keine Benachrichtig bei einem Neustart erfolgen.
Nur wenn sich ein entsprechendes Reading ändern.
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

helmut

Zitat von: Mave am 26 März 2018, 09:54:34
Ich versuche die unterschiedlichen Batteriewarnungen meiner unterschiedlichen Komponenten mit einem Notify abzufangen.

Hallo Mave,

vielleicht ist dieses Modul fuer Dich interessant: https://forum.fhem.de/index.php/topic,82637.0.html

Gruss Helmut
   
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

Mave

helmut,

vielen Dank, das werde ich mir mal anschauen.

Vielleicht kannst Du mir trotzdem noch kurz meine Verständnisprobleme lösen:
Ein Event ist die Änderung eines Readings, egal welchen Wert das Reading annimmt?
Mit notify kann ich nur auf Events reagieren und keine Readingwerte abfragen?

Mit .*:battery sind die battery Readings aller Devices gemeint?
Mit .*:bat* sind alle Readings, die mit bat beginnen, aller Devices gemeint?

Vielen Dank.

Otto123

Hallo Mave,

Ein Event ist die Änderung eines Readings, egal welchen Wert das Reading annimmt?
-> normalerweise werden Events erzeugt wenn readings geändert werden, aber ein Event ist nicht damit gleichzusetzen

Mit notify kann ich nur auf Events reagieren und keine Readingwerte abfragen?
-> Ja - Nein: Ein notify wird von einem Event getriggert und im Ausführungsteil kannst Du alles mögliche abfragen, auch Readingwerte. Wenn der Event Readingswerte enthält kannst Du die im regEx auch schon filtern.

Mit .*:battery sind die battery Readings aller Devices gemeint? -> ja

Mit .*:bat* sind alle Readings, die mit bat beginnen, aller Devices gemeint? -> nein das wäre dann .*:bat.*
bat* würde auf Wörter zu treffen die mit ba beginnen und mit beliebig vielen t enden
bat.* würde auf Wörter zu treffen die mit bat beginnen und mit irgendetwas in beliebiger Anzahl enden.

http://regexp-evaluator.de/tutorial/metazeichen/
https://wiki.selfhtml.org/wiki/Regul%C3%A4rer_Ausdruck

Gruß Otto

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Mave

Otto,

super, vielen Dank.

Das habe ich für's Verständnis gebraucht.

Peter aus Calw

Guten Abend zusammen,
habe folgendes Problem, mit :
define HM_Batteriefehler notify .*:[Bb]attery:.* { if ($EVENT !~ m/ok/)  { \
  { DebianMail('xx.yyy@zzz.de', 'FHEM Batteriewarnung', $NAME.': '.$EVENT)};;;; \
   Log 3, "$NAME: Batteriewarnung $EVENT";;;; \
  } \
}\

versuche ich den Device Namen an meine email Adresse zu senden, dort kommt aber nur :
FHEM Batteriewarnung
an und der Rest - Devicename und Event fehlt aber, wo kann hier der Fehler liegen ?
Kann mir jemand helfen ?
Grüße von Peter

Otto123

Hallo Peter,

Gegenvorschlag zum probieren
defmod HM_Batteriefehler notify .*:[Bb]attery:.* { if ($EVENT !~ m/ok/)  { \
  { DebianMail('xx.yyy@zzz.de', "FHEM Batteriewarnung"," $NAME : $EVENT")};; \
   Log 3, "$NAME: Batteriewarnung $EVENT";; \
  } \
}\


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Mave

Moin Otto,

drei Fragen hätte ich noch:

1) Der Ausdruck ($EVENT !~ m/ok/) prüft den Event auf das Vorhandensein von "ok" und ist True, wenn "ok" nicht vorkommt. Das ! negiert und die ~ lässt Groß- und Kleinbuchstaben zu, richtig? Was genau macht das m und die / bzw. wo kann ich dazu Informationen finden?

2) Wie kann ich den zweiten Teil des Events, also $Eventpart1 separieren? Muss ich zuvor die Variable mittels my $eventpart1 defnieren?

3) Wenn manche Devices Readings wie z.B. 0.LOWBAT haben und deren Werte 0 oder 1 sein können und andere Devices das Reading battery mit den Werten ok und nok haben, wäre es dann besser, die Abfrage im Notify zu erweitern oder die Readingwerte in den Devices auf ok und nok umzusetzen?

Vielen Dank

Otto123

Moin,
zu 1. Das ! negiert aber !~ ist die negation von =~ und bedeutet soviel wie: Suche den rechten regulären Ausdruck im linken String und wenn der nicht vorhanden ist wird der Ausdruck wahr. Das m steht für match. Die / sind so etwas wie Klammern,Begrenzer. -> http://perldoc.perl.org/perlre.html#The-Basics
zu 2. $EVTPART0 $EVTPART1 usw. Musst Du nichts definieren.
zu 3. Man könnte einfach entsprechende userreadings setzen und damit die Abfrage einfach halten. Ich habe den Fall nicht.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Mave


Peter aus Calw

Hallo Otto,
entschuldige die späte Reaktion auf Deinen Tipp, bin als Rentner noch gefordert.
Habe also nach deinem Rat mein notify angepasst, aber nach wie vor wird nur der erste Text im email angezeigt :

Dein Vorschlag :

notify .*:[Bb]attery:.* { if ($EVENT !~ m/ok/)  {
  { DebianMail('xx.yyy@t-online.de', "FHEM Batteriewarnung","$NAME : $EVENT")};;
   Log 3, "$NAME: Batteriewarnung $EVENT";;}
}


Im Mail wird nur "FHEM Batteriewarnung" angezeigt - ohne Hinweis auf Device und Event.
Meine myUtils.pm sieht so aus :
sub
DebianMail
{
my $rcpt = shift;
my $subject = shift;
my $text = shift;
my $ret = "";
my $sender = "xxx\@t-online.de";
my $konto = "xxx\@t-online.de";
my $passwrd = "yyy";
my $provider = "securesmtp.t-online.de:587";
Log 1, "sendEmail RCP: $rcpt";
Log 1, "sendEmail Subject: $subject";
Log 1, "sendEmail Text: $text";
Log 1, "sendEmail Anhang: $attach";;

$ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=yes -o message-charset=utf-8);
$ret =~ s,[\r\n]*,,g;    # remove CR from return-string
Log 1, "sendEmail returned: $ret";


ist hier evt. der Hund begraben ?
Gruß Peter

Otto123

Die Meldung sollte im Betreff und im Text erfolgen.
Und was passiert so?
notify .*:[Bb]attery:.* { if ($EVENT !~ m/ok/)  {
  { DebianMail('xx.yyy@t-online.de', "FHEM Batteriewarnung $NAME : $EVENT","")};;
   Log 3, "$NAME: Batteriewarnung $EVENT";;}
}

Und was steht im Log?
Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz