mehrere UserReadings: Trigger je Event?

Begonnen von maddhin, 23 September 2017, 13:35:48

Vorheriges Thema - Nächstes Thema

maddhin

Hi,

ich habe folgendes userReading definiert:

attr sz.pms userReadings PM1.av {movingAverage("sz.pms","PM1",900)}, PM25.av {movingAverage("sz.pms","PM25",900)}, PM10.av {movingAverage("sz.pms","PM10",900)}

Ich bekomme von MQTT readings (eins je nach PM1/PM25/PM10) und möchte die Durchschnitte berechnen und entsprechend in einem Plot darstellen.

Das von mir definierte UR wird jetzt aber bei jedem Event im Log getriggert. Da ich je nach PM eine MQTT message habe, wird die Berechnung bei jeder Nachricht getriggert - das füllt das Log schnell und erscheint mir Ressourcen zu verschwenden. Ich möchte, dass der Durchschnitt nur für das jeweilige reading berechnet und ins Log geschrieben wird. Wie kann ich das in der Definition abbilden?

Zusatzfrage: im Wiki unter gleitende Mittelwerte (https://wiki.fhem.de/wiki/Gleitende_Mittelwerte_berechnen_und_loggen), wird auch empfohlen, dass über eine eigene Log-Datei zu machen - das finde ich aber umständlich, wenn das mit URs geht.

Oder gibt es noch eine andere gute Methode Mittelwerte zu berechnen und anzuzeigen?

Danke!

amenomade

Zitat von: CommandREF<reading>[:<trigger>] [<modifier>] { <perl code> }
Diese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird. Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

maddhin

ja, das mit dem Trigger habe ich auch gelesen und es mit PM1.av:PM1 und PM1.av:PM1.* probiert, was aber nur dazu führt, dass dass die Berechnung nie getriggert wird.

Wie übersetze ich "wenn ein neuer Wert für PM1 is Log geschrieben wird" in einen Trigger?

Ich habe hier schon lange gesucht, aber keine Lösung gefunden. Es gibt ja auch event-on-update-reading etc aber ich habe Schwierigkeiten da überall durchzublicken. Daher auch die Frage, wie man das Problem insgesamt am besten umsetzt :)

amenomade

Wie sehen die entspr. Events im Eventmonitor aus?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

maddhin

Danke, Amenomade!

Mein Log sieht so aus:

2017-09-23_18:40:46 sz.pms transmission-state: incoming publish received
2017-09-23_18:40:46 sz.pms PM1: 42
2017-09-23_18:40:46 sz.pms transmission-state: incoming publish received
2017-09-23_18:40:46 sz.pms PM25: 62
2017-09-23_18:40:46 sz.pms transmission-state: incoming publish received
2017-09-23_18:40:46 sz.pms PM10: 64

amenomade

Dann sollte attr sz.pms userReadings PM1.av:PM1:.* {...}gehen. Es sei denn, Du hast die Events irgendwie anders verhindert (z.B. event-on-change-reading o.ä)

Aber auch:attr sz.pms userReadings PM1.av:PM1.* {...} hätte funktionieren müssen. Um sicher zu stellen, ob es funktioniert oder nicht, solltest Du ein debug oder Log3 Output am Anfang deiner Funktion programmieren.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

maddhin

ah, jetzt, ja!!! Der Doppelpunkt hat gefehlt! Jetzt funktioniert es!

Lieben Dank!

icy01

#7
Hallo,

ich hänge mich hier mal dran, da ich offensichtlich auch ein Problem mit den Triggern und/oder dem Aufruf der moving_average Funktion habe.

Ich habe einen Wettersensor, der folgendermaßen definiert ist:
define Wetterstation EnOcean 018606ED
attr Wetterstation IODev EnOcean
attr Wetterstation eep A5-13-01
attr Wetterstation event-min-interval .*:120
attr Wetterstation group Wetterdaten
attr Wetterstation manufID 00D
attr Wetterstation room EnOcean,WS
attr Wetterstation subType environmentApp
attr Wetterstation teachMethod 4BS
attr Wetterstation userReadings sunEastAv:sunEast:.* {movingAverage("Wetterstation","sunEast",1800)},\
                                sunWestAv:sunWest:.* {movingAverage("Wetterstation","sunWest",1800)},\
                                sunSouthAv:sunSouth:.* {movingAverage("Wetterstation","sunSouth",1800)}


Diese Readings werden erzeugt:

2017-11-16 11:35:53 EnOcean Wetterstation hemisphere: north
2017-11-16 11:35:53 EnOcean Wetterstation sunWest: 7648
2017-11-16 11:35:53 EnOcean Wetterstation sunSouth: 12942
2017-11-16 11:35:53 EnOcean Wetterstation sunEast: 6471
2017-11-16 11:35:53 EnOcean Wetterstation sunEastAv: 7909.000
2017-11-16 11:35:53 EnOcean Wetterstation sunWestAv: 7765.200
2017-11-16 11:35:53 EnOcean Wetterstation sunSouthAv: 7754.545
2017-11-16 11:35:53 EnOcean Wetterstation brightness: 999
2017-11-16 11:35:53 EnOcean Wetterstation dayNight: day
2017-11-16 11:35:53 EnOcean Wetterstation isRaining: no
2017-11-16 11:35:53 EnOcean Wetterstation temperature: 2.8
2017-11-16 11:35:53 EnOcean Wetterstation windSpeed: 0.0
2017-11-16 11:35:53 EnOcean Wetterstation T: 2.8 B: 999 W: 0.0 IR: no


Die moving_average Funktion erzeugt diese Ausgaben, bei denen man sieht, dass die Werte nicht richtig zugeordnet werden und manche Werte auch doppelt in dem Array drin stehen
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 4706 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 10000 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 6471 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 11765 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 7648 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 12942 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation sunEast moving average] calculated over 9 values is 7909.000
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 4706 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 10000 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 6471 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 11765 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 7648 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 12942 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 6471 Time = 2017-11-16 11:35:53
2017.11.16 11:35:53 3 : [Wetterstation sunWest moving average] calculated over 10 values is 7765.200
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 4706 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 10000 Time = 2017-11-16 11:15:51
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 6471 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 11765 Time = 2017-11-16 11:20:43
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 5883 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 7648 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 12942 Time = 2017-11-16 11:25:52
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 6471 Time = 2017-11-16 11:35:53
2017.11.16 11:35:53 3 : [Wetterstation moving average] Value = 7648 Time = 2017-11-16 11:35:53
2017.11.16 11:35:53 3 : [Wetterstation sunSouth moving average] calculated over 11 values is 7754.545


Ich versuche schon mehrere Tage, das in den Griff zu bekommen und habe mir auch schon einiges durchgelesen, komme aber nicht auf eine funktionierende Lösung.

Kann mir jemand da auf die Sprünge helfen?

Vielen Dank schon mal und Grüße
Harald

maddhin

hm, ist glaube, das ist der falsche Thread für die Frage.

Bei mir ging es ja darum, dass der movingAverage nur berechnet werden soll, wenn sich das entsprechende Reading ändert und nicht, wenn sich irgendein Reading des device ändert. Das ist im Grunde unabhängig davon welche Funktion dann ausgeführt wird.

Dein Problem ist, dass der movingAverage falsch berechnet wird?

Soweit ich das beurteilen kann, muss der Fehler dann in der Funktion liegen. Etwas geändert? ggf. copy & paste Problem? Geht es mit anderen Readings? Am besten einen neuen Thread eröffnen.

icy01

Danke für Deine Antwort und ja, die Funktion war wohl fehlerhaft.

Ich benutze nun die Version aus diesem Beitrag klick und es funktioniert wie es soll...