FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Mave am 26 März 2018, 09:54:34

Titel: Batteriewarnungen abfangen
Beitrag von: Mave am 26 März 2018, 09:54:34
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
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: thgorjup am 26 März 2018, 10:00:17
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";; \
  } \
}


Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Mave am 26 März 2018, 10:10:39
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?
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: thgorjup am 26 März 2018, 10:40:03
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.
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: helmut am 26 März 2018, 10:51:11
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
   
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Mave am 26 März 2018, 11:00:16
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.
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Otto123 am 26 März 2018, 11:56:02
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

Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Mave am 26 März 2018, 12:35:04
Otto,

super, vielen Dank.

Das habe ich für's Verständnis gebraucht.
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Peter aus Calw am 26 März 2018, 20:33:39
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
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Otto123 am 26 März 2018, 23:18:03
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
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Mave am 27 März 2018, 09:15:57
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
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Otto123 am 27 März 2018, 12:07:59
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
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Mave am 27 März 2018, 13:05:38
Vielen Dank.
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Peter aus Calw am 28 März 2018, 23:10:19
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
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Otto123 am 28 März 2018, 23:28:02
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
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Peter aus Calw am 28 März 2018, 23:53:53
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
Titel: Antw:Batteriewarnungen abfangen
Beitrag von: Otto123 am 29 März 2018, 00:01:48
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