FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: holle75 am 30 Juni 2017, 13:36:11

Titel: DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 13:36:11
Hello ihr, ich möchte eine Mail bei überschreiten einer Schwelle einer der WindReadings in Proplanta erhalten, in der die jeweiligen Tage/Zeiten aufgeführt sind.

Mein Ansatz:

define MAIL_Windwarnung_DOIF DOIF ([#"WetterProplanta":.*wind.*: $_ > 10] != 0) ({DebianMail('xxx@xxx.com,yyy@yyy.com','FHEM Windwarnung','Tage: '.foreach (AggrDoIf('@','WetterProplanta','.*wind.*','"$_ > 10"')).' kmh\neventuell Sturm', '')}) DOELSEIF ([#"WetterProplanta":.*wind.*: $_ > 10] == 0)
attr MAIL_Windwarnung_DOIF group System


will noch nicht so recht. Ich finde in der commandref nur Beispiele um DEVICES zu aggregieren. Wie aggregiere ich für EIN Device mehrere Readings? Hoffe mal, dass ich wenigstens die Begrifflichkeiten richtig habe :D

ein Durchlauf Proplanta generiert an Wind Readings Beispielhaft:


fc0_wind00 14.4
fc0_wind03 14.5
fc0_wind06 18
fc0_wind09 7
fc0_wind12 10.7
fc0_wind15 10.7
fc0_wind18 10.7
fc0_wind21 10.7
fc1_wind00 14.4
fc1_wind03 14.5
fc1_wind06 18
fc1_wind09 7
fc1_wind12 10.7
fc1_wind15 10.7
fc1_wind18 10.7
fc1_wind21 10.7



jemand einen Hinweis?

Danke euch

H.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: Per am 30 Juni 2017, 14:05:58
Mir würden drei "Lösungen" einfallen:
1. mittels Alias-Device
2. eine myUtils-Funktion
3. Damian anbetteln, das umzuschreiben
(3. nur, wenn du auch getestet hast, ob es nicht schon jetzt geht ;))
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 14:32:10
Hey Per!

myUtils mag ich nicht besonders (vielleicht wegen fehlender Perl-Kenntnisse?) ;)
Damian anbetteln wäre der letzte Schritt ;)
Wäre mit Alias Devices bei 8 Readings pro Tag bei 8 Tagen nicht ein bißchen mit Kanonen auf Spatzen ...... ? 64 AliasDevices ist die Mail nicht wert :D

...
Zitat von: Per am 30 Juni 2017, 14:05:58
(3. nur, wenn du auch getestet hast, ob es nicht schon jetzt geht ;))

Hast du denn eine Idee wie es jetzt schon gehen könnte?
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: mumpitzstuff am 30 Juni 2017, 17:42:39
Probier mal https://wiki.fhem.de/wiki/Event-aggregator (https://wiki.fhem.de/wiki/Event-aggregator). Ich hoffe ich habe richtig verstanden was du meinst...

Laut Command Ref soll man READING als regulären Ausdruck übergeben können.

1.) Userreading anlegen
2.) Eventaggregator auf das Userreading und Werte in einer bestimmten Zeit aggregieren.

Ich hoffe das geht... Ach ja, wenn du mit event-aggregator rumspielen solltest, dann solltest du bei Änderungen erst den event aggregator komplett löschen und neu anlegen mit deinen Änderungen. Einfach nur modifizieren kann zu Problemen führen.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 18:04:15
Hallo mumpitz, interessant .... und komplex.

Beim schnellen Überfliegen der commandref meinst du also ich sollte alle .*wind.* Readings (das sind 64) über den eventaggregator mit dem MAX Wert von diesen in ein Userreading packen? und dann diesen Wert als Trigger für die Mail nutzen?

Das würde nur leider die Idee mit den verschiedenen Tagen und dem zugehörigen Wind-Wert in der Mail zunichte machen, denke ich?
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: mumpitzstuff am 30 Juni 2017, 18:16:47
Also wenn ich richtig verstanden habe, hast du ein device mit mehreren wind readings und willst diese zu einem zusammen fassen mittels Mittelwert, median oder was auch immer?

Falls ja, könnte man versuchen alle Events des devices über alle wind readings in einem Zeitraum von z.b. 5 min zusammen zu rechnen und in einem separaten reading zu speichern.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 18:28:24
Jup, genau das möchte ich .... im Prinzip.

Im Detail geht es mir darum zu überprüfen ob eines dieser 64 Wind- Readings über einem bestimmten Schwellwert (im Beispiel 10 km/h) liegt
- das soll den Versand einer Mail triggern
- in der Mail sollte mindestens dieses triggernde Reading mit Tag und Uhrzeit angegeben werden.

"Kompromiss" wäre mit deiner Idee alle Readings soz. zusammenzufassen, den MAX Wert (als Userreading) als Trigger für die Mail zu nehmen und dann alle Wind Readings in die Mail zu packen. Muß man eben ein bißchen suchen.

Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: mumpitzstuff am 30 Juni 2017, 18:48:54
so ich hab's jetzt Grad mal probieren wollen, geht aber leider nicht. Das Ding aggregiert nur pro reading, könnte also nur dazu dienen Ausreisser pro reading zu filtern. Ansonsten mach dir ein Userreading und stricks dir mit perl zusammen, das sollte auch gehen.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 18:55:56
... aber danke für den Versuch!
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: mumpitzstuff am 30 Juni 2017, 19:13:21
test {for (my $i=0;$i<=3;$i++) {if (ReadingsVal("WETTER","fc".$i."_high_c",0)>100) {return "windig"} };; return "normal" }

Das Userreading test geht durch fc0_high_c bis fc3_high_c und schaut ob eins davon über einem Wert ist und gibt dann windig aus, ansonsten normal.

Kannst du das für dich anpassen und ausprobieren?
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 19:23:45
gib mir ein paar Minuten
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 19:32:50
wie müßte das aussehen, wenn es von fc0 bis fc6 mit den unschönen Bezeichnungen (su) gehen soll?

fc0_wind00 14.4
fc0_wind03 14.5
fc0_wind06 18
fc0_wind09 7
fc0_wind12 10.7
fc0_wind15 10.7
fc0_wind18 10.7
fc0_wind21 10.7
fc1_wind00 14.4
fc1_wind03 14.5
fc1_wind06 18
fc1_wind09 7
fc1_wind12 10.7
fc1_wind15 10.7
fc1_wind18 10.7
fc1_wind21 10.7

usw
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: mumpitzstuff am 30 Juni 2017, 20:40:13
test {for (my $i=0;$i<=6;$i++) {for (my $n=0;$n<=7;$n+=3) {if (ReadingsVal("WetterProplanta","fc".$i."_wind".sprintf("%02d",$n),0)>10) {return "windig"} } };; return "normal" }

Probier mal das aus. Ist aber nur runter geschrieben und sind eventuell Fehler drin.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 21:03:49
nice. Funktioniert ....

hast du noch eine Idee wie man den/die "Übeltäter" filtert und in die Mail packen könnte? Das ist perl und mit perl stehe ich noch ganz am Anfang. Alleine das Verstehen von diesen Klammern und zig Semikolon macht mich schon wuschig.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: mumpitzstuff am 30 Juni 2017, 21:26:18
test {for (my $i=0;$i<=6;$i++) {for (my $n=0;$n<=7;$n+=3) {if (ReadingsVal("WetterProplanta","fc".$i."_wind".sprintf("%02d",$n),0)>10) {return "windig (fc".$i."_wind".sprintf("%02d",$n);;} } };; return "normal";; }

Vielleicht so?
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 30 Juni 2017, 21:40:42
so gibt er mir nur das erste WindReading auf den die Schwelle zutrifft .... da ist bestimmt was mit den Klammern .... sags ja :D

Hab jetzt das Userreading mal WindWertMail genannt und das gibt er mir

WindWertMail       windig (fc0_wind00
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: mumpitzstuff am 01 Juli 2017, 00:43:59
Ja, das ist genau das was das Dong macht. Es durchsucht alle deine Wind Readings und sobald eins gefunden wurde das über der Schwelle liegt, dann wird die Suche abgebrochen und der entsprechende Name des Readings ausgegeben. Das noch weiter zu verfeinern erfordert noch mehr Code und es wird komplizierter. Ich war der Meinung, das du genau das haben wolltest. Letztendlich ist es ja auch egal ob windig ausgegeben wird, weil nur einer es meldet oder weil 10 es melden.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 01 Juli 2017, 09:43:09
So weißt du dann aber nicht, wann es windig wird:) .... nur wann es das nächste mal windig wird

Andererseits reicht das als Warnung ja auch schon aus.

Wo kommt die Klammer am Anfang her?
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 01 Juli 2017, 19:45:12
Habs jetzt so gelöst:

fhem.cfg:

attr WetterProplanta userReadings WindWertMail {for (my $i=0;;$i<=6;;$i++) {for (my $n=0;;$n<=21;;$n+=3) {if (ReadingsVal("WetterProplanta","fc".$i."_wind".sprintf("%02d",$n),0)>40) {return "Windwarnung > 40km/h in ".$i." Tagen um ".sprintf("%02d",$n)." Uhr";;;;} } };;;; return "normal";;;; }

define MAIL_Windwarnung_DOIF DOIF ([WetterProplanta:WindWertMail] ne "normal") ({DebianMail('xxx@xxx.com','FHEM Windwarnung','ReadingsVal("WetterProplanta", "WindWertMail", "0")', '')}) DOELSEIF ([WetterProplanta:WindWertMail] eq "normal")
attr MAIL_Windwarnung_DOIF group System


vielen Dank mumpitz!

Aber den Wert des Readings würde ich auch noch gerne in WindWertMail  packen. Glaube, ich habe jetzt 100 Versionen durch. Immer Syntax Error. Perl nervt.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: Damian am 01 Juli 2017, 20:00:18
Ich werde zukünftig die Readingangabe um Regex erweitern, dann kann man solche Sachen eleganter lösen.

z. B.

[@"^my_device":"^my_readings":$_ > 10]

Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 01 Juli 2017, 20:51:50
Prima Damian.

Aber bis dahin, falls es jemanden interessiert hier noch das Dong (mumpitz) mit Windstärke im Reading für die Mail. Puh ... und nach dem Zinober freu ich mich auf Damians Erweiterung.

fhem.cfg

attr WetterProplanta userReadings WindWertMail \
{for (my $i=0;;$i<=6;;$i++) \
{for (my $n=0;;$n<=21;;$n+=3) \
{if (ReadingsVal("WetterProplanta","fc".$i."_wind".sprintf("%02d",$n),0)>40) \
{return "Windwarnung > 40km/h in ".$i." Tagen um ".sprintf("%02d",$n)." Uhr.\nWindstaerke: ".ReadingsVal("WetterProplanta","fc".$i."_wind".sprintf("%02d",$n),"");;;;} \
} \
};;;; return "normal";;;; \
}

define MAIL_Windwarnung_DOIF DOIF ([WetterProplanta:WindWertMail] ne "normal") ({DebianMail('xxx@xxx.com','FHEM Windwarnung',' '. ReadingsVal("WetterProplanta", "WindWertMail", "0").' ', '')}) DOELSEIF ([WetterProplanta:WindWertMail] eq "normal")
attr MAIL_Windwarnung_DOIF group System
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: mumpitzstuff am 02 Juli 2017, 23:12:04
Ahhh i waren die Tage. Da hätte deine Spezifikation etwas genauer sein müssen.  ;D Aber du hast es ja jetzt selbst hinbekommen. Sehr schön.
Titel: Antw:DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail
Beitrag von: holle75 am 02 Juli 2017, 23:34:22
... selbst hinbekommen ist eine freundliche Übertreibung für -> dein KnowHow genommen und solange rumprobiert, bis der Rest auch noch irgendwie funktioniert :D

Danke dir!