DOIF "Aggregierte Readings" / Windwarnung Proplanta per Mail

Begonnen von holle75, 30 Juni 2017, 13:36:11

Vorheriges Thema - Nächstes Thema

holle75

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.

Per

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 ;))

holle75

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?

mumpitzstuff

Probier mal 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.

holle75

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?

mumpitzstuff

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.

holle75

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.


mumpitzstuff

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.

holle75


mumpitzstuff

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?

holle75


holle75

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

mumpitzstuff

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.

holle75

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.

mumpitzstuff

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?