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
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";; \
} \
}
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?
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.
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
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.
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
Otto,
super, vielen Dank.
Das habe ich für's Verständnis gebraucht.
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
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
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
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
Vielen Dank.
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
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
Hallo Otto,
habe gerade noch mal ei trigger device battery: low gemacht und im Log steht :
2018.03.28 23:34:58 1: FHEMWEB SSL/HTTPS error: SSL connect accept failed because of handshake problems
2018.03.28 23:34:58 1: FHEMWEB SSL/HTTPS error: SSL connect accept failed because of handshake problems
mit diesem Kommando :
{DebianMail("xx.yyy\@t-online.de","Subject","Text","")}
wird der "text" beim Öffnen der Email in T-online Emailcenter angezeigt,
- aber nicht in Wndow10 Mail ???
Gruß Peter
Irgendwie verstehe ich das nicht.
Dein trigger wird nur einen Fehler werfen
Der log Eintrag hat nichts mit dem notify zu tun
Der Email Test sagt das Dein Windows Mail falsch konfiguriert ist?!
Gute Nacht
Otto