Email versenden durch Notify bei Überschreitung eines Reading values

Begonnen von herry, 13 September 2016, 12:02:51

Vorheriges Thema - Nächstes Thema

herry

Hallo

ich versuche eine Warn-Email zu versenden wenn mein Wasserverbrauch über einen Grenzwert von 1000 Liter am Tag steigt. Der Emailversand aus FHEM funktioniert, allerdings habe ich Probleme das ganze Eventgesteuert über ein Notify zu versenden.

Der Wasserverbrauch steht hier im Device"Wasserverbrauch" in dem Reading "countsPerDay". Wobei  1 countsPerDay = 1 Liter entspricht.

define Wasserverbrauch HourCounter GPIOWasserzaehler:on GPIOWasserzaehler:off
attr Wasserverbrauch event-on-change-reading .*
attr Wasserverbrauch group Energieverbrauch
attr Wasserverbrauch stateFormat {sprintf("%i",ReadingsVal("Wasserverbrauch","countsPerDay",0))." Liter"}


Ich habe versucht das ganze wie folgt erfolglos zu machen:


define Email3 notify Wasserverbrauch: countsPerDay {\
if (ReadingsVal("Wasserverbrauch","countsPerDay",0)>1000) { DebianMail('MeineMail@gmx.de','Notify Test','Wasserwarnung Test');;;;;;;;\}}\




Eine weiter Frage wäre noch wie ich festlegen kann dass die Email wirklich nur einmal bei der Überschreitung von 1000 gesendet wird und nicht bei jedem weiteren countsPerDay Tick das Postfach vollstopft. GGf durch eine solche if Bedingung: (("Wasserverbrauch","countsPerDay",0)>1000) & ("Wasserverbrauch","countsPerDay",0)<1001))


Vielen Dank Im Voraus

Herry




DeeSPe

Ich würde das über ein userreading lösen und entsprechendem notify.

Schau mal hier, ist ein anderer Anwendungsfall, aber in Deinem Fall würde ich Dir das als ähnliche Lösung empfehlen.

Das userreading kannst Du ja statt tempAlarm dann z.B. waterAlarm nennen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

herry

Hallo Dan,

vielen dank für die Hilfe.

Leider klappt es noch nicht richtig.

1. In der 99_Myutil.pm habe ich folgende Funktion hinzugefügt:

######## Userreading für Wasseralarm ############
sub wasserAlarm(;$)
{
  my ($name) = @_;
  $name = "Wasserverbrauch" if (!$name);
  my $temp = ReadingsNum($name,"countsPerDay",50);
  my $val = "noAlarm";
  $val = "Alarm" if ($temp >= 100);
  return $val;
}
1;


2.
Das Device ,,Wasserverbrauch" hat das Attribut userreading  zugewiesen bekommen.

define Wasserverbrauch HourCounter GPIOWasserzaehler:on GPIOWasserzaehler:off
attr Wasserverbrauch event-on-change-reading .*
attr Wasserverbrauch group Energieverbrauch
attr Wasserverbrauch stateFormat {sprintf("%i",ReadingsVal("Wasserverbrauch","countsPerDay",0))." Liter"}
attr Wasserverbrauch userReadings wasserAlarm:countsPerDay.* {wasserAlarm($NAME)}


Das UserReading wir dann auch im Gerät angezeigt, verursacht aber noch die folgende Fehlermeldung:
ZitatwasserAlarm   Error evaluating Wasserverbrauch userReading wasserAlarm: Global symbol "$NAME" requires explicit package name at (eval 148057) line 1, <GEN7881> line 7.


3.Das Notify welches den Emailversand auslösen soll wurde wie folgt implementiert:

define Email3 notify Wasserverbrauch:wasserAlarm:Alarm.*  {\
DebianMail('MeineEmail@gmx.de','Notify Test','Der Stromberbrauch beträgt');;;;;;;;\}\



Was mache ich falsch?


Danke nochmals

Herry


DeeSPe

Lass mal das $NAME weg, vielleicht täusche ich mich und das gibt es gar nicht bei userreadings.
Also:
attr Wasserverbrauch userReadings wasserAlarm:countsPerDay.* {wasserAlarm()}
Falls nichts übergeben wird, so wird ja in der Funktion dann "Wasserverbrauch" als $name genommen.

Wenn Du aus dem notify einen 1-Zeiler machst, dann kannst Du Dir auch die ganzen Semikolon sparen, die hier eh zu viele sind.
define Email3 notify Wasserverbrauch:wasserAlarm:Alarm.* {DebianMail('MeineEmail@gmx.de','Notify Test','Der Wasserverbrauch beträgt '.ReadingsNum($NAME,"countsPerDay",10))}

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Hab auch wieder was dazu gelernt!!!
$NAME ist bei userReadings einfach $name. $NAME heißt die Variable bei notify(s).

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

herry

Hallo Dan,

irgendwie klappt das mit dem verflixten notify immer noch nicht.

define Email4 notify Wasserverbrauch:wasserAlarm:Alarm.* {DebianMail('MeineEmail@gmx.de','Notify Test Wassermarsch','Der Wasserverbrauch beträgt 1000L')}

Das userreading "WasserAlarm" ist angelegt und ändert auch brav seinen Status von "noAlarm" auf "Alarm" bei Überschreitung des Schwellwertes dennoch wird kein Notify ausgelöst und die Email nicht versandt.  Der reine Emailversandt {DebianMail('MeineEmail@gmx.de','Notify Test Wassermarsch','Der Wasserverbrauch beträgt 1000L')} funktioniert wenn ich ihn in der FHEM Kommandozeile ausführe. Auch der Test als zeitgetriggerter Versand mittel "at" funktioniert. Was mach ich bei meinem Notify nur falsch?

DeeSPe

Zitat von: herry am 16 September 2016, 15:37:20
Hallo Dan,

irgendwie klappt das mit dem verflixten notify immer noch nicht.

define Email4 notify Wasserverbrauch:wasserAlarm:Alarm.* {DebianMail('MeineEmail@gmx.de','Notify Test Wassermarsch','Der Wasserverbrauch beträgt 1000L')}

Das userreading "WasserAlarm" ist angelegt und ändert auch brav seinen Status von "noAlarm" auf "Alarm" bei Überschreitung des Schwellwertes dennoch wird kein Notify ausgelöst und die Email nicht versandt.  Der reine Emailversandt {DebianMail('MeineEmail@gmx.de','Notify Test Wassermarsch','Der Wasserverbrauch beträgt 1000L')} funktioniert wenn ich ihn in der FHEM Kommandozeile ausführe. Auch der Test als zeitgetriggerter Versand mittel "at" funktioniert. Was mach ich bei meinem Notify nur falsch?

Hast Du eventuell am Device Wasserverbrauch die Events durch event-on-change-reading oder event-on-update-reading eingeschränkt?
Dann musst Du natürlich beim Attribut event-on-change-reading zusätzlich wasserAlarm mit aufnehmen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

herry

Ja Wasserverbrauch hat das Attribut "event-on-change-reading" aber ich dachte dass der Zusatz (.*) bedeutet dass alle Reading berücksichtigt werden. Also auch das  userReadings wasserAlarm.


define Wasserverbrauch HourCounter GPIOWasserzaehler:on GPIOWasserzaehler:off
attr Wasserverbrauch event-on-change-reading Wasserverbrauch.*
attr Wasserverbrauch group Energieverbrauch
attr Wasserverbrauch stateFormat {sprintf("%i",ReadingsVal("Wasserverbrauch","countsPerDay",0))." Liter"}
attr Wasserverbrauch userReadings wasserAlarm:countsPerDay.* {wasserAlarm()}


Soll ich das userreading wie folgt hinzufügen?
attr Wasserverbrauch event-on-change-reading Wasserverbrauch.*,wasserAlarm

DeeSPe

Attribute sind Device-spezifisch!
Somit ist es nicht nötig in einem Attribut noch einmal den Device Namen zu nennen.
Und event-on-change-reading sagt ja auch dass es reading(s) als Eingabe erwartet.

Folgerichtig wäre also:
attr Wasserverbrauch event-on-change-reading .*

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

herry

Hallo

ich war ein paar Tage außer Haus und konnte mich erste jetzt meinem Problem wieder widmen.

Also ich bekomme es nun hin, dass mein Userreading wasserAlarm des Devices Wasserverbrauch seinen Status von "noAlarm" zu "Alarm" wechselt. ( Device mit Userreading habe ich als Screenshot nochmal angehängt)

Über ein notify mit der REGEXP Wasserverbrauch:wasserAlarm.* wird auch ein Event bei jedem Wechsel von wasserAlarm ausgelöst und die Email verschickt.

Nun soll das Event aber ausschließlich ausgelöst werden, wenn wasserAlarm = "Alarm" ist und nicht auch beim Rücksetzen von "Alarm" auf "noAlarm"

Der bisherige Vorschlag das so zu lösen:
define MeineEmail notify Wasserverbrauch:wasserAlarm:Alarm.* {DebianMail .....................}

funktioniert leider nicht.

Sprich auf Wasserverbrauch:wasserAlarm:Alarm.* oder Wasserverbrauch:wasserAlarm:noAlarm.* oder Wasserverbrauch:wasserAlarm:Alarm  wird nicht reagiert.

Muss man hier doch mit einer IF Abfrage arbeiten damit auf "Alarm" reagiert werden kann?

Vielen Dank nochmal im Voraus.







DeeSPe

Zitat von: herry am 22 September 2016, 11:37:41
Hallo

ich war ein paar Tage außer Haus und konnte mich erste jetzt meinem Problem wieder widmen.

Also ich bekomme es nun hin, dass mein Userreading wasserAlarm des Devices Wasserverbrauch seinen Status von "noAlarm" zu "Alarm" wechselt. ( Device mit Userreading habe ich als Screenshot nochmal angehängt)

Über ein notify mit der REGEXP Wasserverbrauch:wasserAlarm.* wird auch ein Event bei jedem Wechsel von wasserAlarm ausgelöst und die Email verschickt.

Nun soll das Event aber ausschließlich ausgelöst werden, wenn wasserAlarm = "Alarm" ist und nicht auch beim Rücksetzen von "Alarm" auf "noAlarm"

Der bisherige Vorschlag das so zu lösen:
define MeineEmail notify Wasserverbrauch:wasserAlarm:Alarm.* {DebianMail .....................}

funktioniert leider nicht.

Sprich auf Wasserverbrauch:wasserAlarm:Alarm.* oder Wasserverbrauch:wasserAlarm:noAlarm.* oder Wasserverbrauch:wasserAlarm:Alarm  wird nicht reagiert.

Muss man hier doch mit einer IF Abfrage arbeiten damit auf "Alarm" reagiert werden kann?

Vielen Dank nochmal im Voraus.

Das kann eigentlich nicht sein, denn das notify wird ja ausschließlich durch Wasserverbrauch:wasserAlarm:Alarm.* getriggert.
Hast Du eventuell noch ein anderes notify laufen auf Wasserverbrauch:wasserAlarm:noAlarm.* ?
Oder eventuell ein anderes notify dessen Regex nicht eng genug gefasst wurde?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

herry

Bei mir funktioniert es nur mit dem Workaround über ein IF

Wasserverbrauch:wasserAlarm.* {if (wasserAlarm() eq "Alarm" ) { { DebianMail('MeineEmail@gmx.de','Mein Text');; } }}

Warum dieser Ansatz nicht geht wird wohl ein Rätsel bleiben.

define MeineEmail notify Wasserverbrauch:wasserAlarm:Alarm.* {DebianMail .....................}

Trotzdem vielen Dank.

DeeSPe

Zitat von: herry am 22 September 2016, 14:09:58
Bei mir funktioniert es nur mit dem Workaround über ein IF

Wasserverbrauch:wasserAlarm.* {if (wasserAlarm() eq "Alarm" ) { { DebianMail('MeineEmail@gmx.de','Mein Text');; } }}

Warum dieser Ansatz nicht geht wird wohl ein Rätsel bleiben.

define MeineEmail notify Wasserverbrauch:wasserAlarm:Alarm.* {DebianMail .....................}

Trotzdem vielen Dank.

Wie gesagt, die zweite Option sollte genau so funktionieren, denn das notify kann bei diesem Regex überhaupt nicht bei noAlarm auslösen.

Die Version die bei Dir zu funktionieren scheint kannst Du aber noch weiter vereinfachen:
Wasserverbrauch:wasserAlarm.* {DebianMail('MeineEmail@gmx.de','Mein Text') if ($EVTPART1 eq "Alarm")}

Das mache ich genau so wenn ich mehrere Werte eines Readings mit ein und dem selben notify erschlagen will. Erweitern könntest Du genau dieses notify auch noch um eine Mail bei noAlarm, dann aber das if wieder nach vorne:
Wasserverbrauch:wasserAlarm.* {if ($EVTPART1 eq "Alarm" ) {DebianMail('MeineEmail@gmx.de','Alarm: Mein Text')} else {DebianMail('MeineEmail@gmx.de','noAlarm: Mein Text')}}

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Hans Franz

Hallo
Die RegEx matcht, glaube ich, wegen des zweiten Doppelpunktes nicht.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

DeeSPe

Er matcht ja, aber angeblich nicht nur auf "Alarm" sondern auch auf "noAlarm" was eigentlich nicht möglich ist...

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe