[gelöst] Gleitende Mittelwerte berechnen klappt, loggen jedoch nicht

Begonnen von it-place, 04 November 2022, 17:33:39

Vorheriges Thema - Nächstes Thema

it-place

Hallo,

ich stehe gerade etwas auf dem Schlauch bei der Ermittlung eines Mittelwerts. Ich habe ein Logfile StromTag-2022.log, welches den Tagesverbrauch in kWh enthält, z.B.

2022-11-01_00:00:00 StromTag energy_daily: 7.10000000000036
2022-11-02_00:00:00 StromTag energy_daily: 12.8999999999996
2022-11-03_00:00:00 StromTag energy_daily: 9.60000000000036
2022-11-04_00:00:00 StromTag energy_daily: 7.5

Anhand des Wiki-Artikels https://wiki.fhem.de/wiki/Gleitende_Mittelwerte_berechnen_und_loggen habe ich aus dem Abschnitt Gleitender Mittelwert aus Log-Dateien die dortige Funktion in eine eigene Datei 99_MyUtils eingebaut und kann in Fhem jetzt z.B. manuell dem Befehl myAverage ausführen:

{myAverage("2419200", "FileLog_StromTag", "4:::")}

Dem Artikel weiter folgend, habe ich noch die Kombination von notify/trigger definiert, die offenbar auch ausgeführt wird, wenn täglich der neue Wert StromTag:energy_daily.* ins Logfile geschrieben wird.

# Mittelwert ueber 28 Tage berechnen
define StromTag_notify notify StromTag:energy_daily.* {\
  fhem('trigger StromTag energy_average: '.myAverage("2419200", "FileLog_StromTag", "4:::"));;\
}


Allerdings fehlt mir die Idee, wie ich den Mittelwert in energy_average: jetzt zu fassen kriege und in ein Logfile schreiben kann. Habe schon verschiedenes ausprobiert und komme nun nicht weiter...

Hat jemand einen Tipp für mich? ???

Danke und viele Grüße - Olli

frober

Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

it-place

Hallo und vielen Dank für die schnelle Rückmeldung!

Laut Doku müsste ich etwas in dieser Art formulieren: setreading <Gerätename> <Readingname> [<Gerätename>:<Readingname>:d]
Also in etwas:
setreading StromTag_notify energy_average [StromTag:energy_average:0]

Gehört das dann mit in die vorher definierte Zeile hier (an Stelle der Fragezeichen)?
define StromTag_notify notify StromTag:energy_daily.* {\
  fhem('trigger StromTag energy_average: '.myAverage("2419200", "FileLog_StromTag", "4:::"));;\
  ???
}



frober

Das passt so nicht...

Mit Trigger wird der Wert nicht geloggt.

Probiere es Mal so:
define StromTag_notify notify StromTag:energy_daily.* {\
  my $avg = myAverage("2419200", "FileLog_StromTag", "4:::");;\
  fhem("setreading StromTag energy_average $avg");;
}


Ungetestet...

Set magic ist die Schreibweise für Fhem, du bist aber in Perl.
War mein Fehler, hatte nicht darauf geachtet.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

rudolfkoenig

Das wird nicht funktionieren: Events fuer ein Geraet A werden nicht weitergeleitet, wenn diese in einem notify fuer das gleiche Geraet A erzeugt werden.
Das wird gemacht, um keine Endlosschleife zu produzieren.

Workarounds:
- die Events per userReadings erzeugen
- das Erzeugen mit einem FHEM-sleep entkoppeln, in etwa so: fhem("sleep 0.1; trigger/setreading ...")

frober

Danke Rudi, für die Aufklärung.
Das war mir nicht bekannt.

@it-place jetzt hast du zwei Möglichkeiten.
Mit dem userReadings kannst du das notify einsparen.
Deine Entscheidung.

Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

it-place

Hallo zusammen,
danke für Eure wertvollen Tipps und Hinweise. Ich habe es dann so gelöst, dass ich täglich um 00:01 via at-Befehl den Mittelwert über 28 Tage berechne:

define StromAvg at *00:01:00 {\
  my $avg = myAverage("2419200", "FileLog_StromTag", "4:::");;\
  fhem("setreading StromAvg energy_average $avg");;\
}


Das lässt sich dann wie gewohnt in mein Logfile schreiben... :D