Hauptmenü

Nur Prozent im Log

Begonnen von msfox, 15 März 2025, 16:45:22

Vorheriges Thema - Nächstes Thema

msfox

Ich habe in FHEM eine openDTU für meine Balkonkraftwerk eingebunden.
Daraus würde ich nun einige Readings loggen. Allerdings nicht immer alle und alle paar Sekunden. Sondern zu mit unterschiedlichen LogZeiten.
OpenDTU läuft per MQTT
Um nur alle 30sec Daten zu bekommen folgende Ergänzung beim Device
attr MQTT2_OpenDTU_7182440 event-min-interval .*:30
Das Logfile dazu wie folgt:
define OpenDTU FileLog ./log/openDTU-%Y-%m.log dy_OpenDTU_0_power:.*|dy_OpenDTU_0_power:state:.*|dy_OpenDTU_0_yieldday|dy_OpenDTU_0_yieldhour
setuuid OpenDTU 67cdd905-f33f-9839-ec81-c9a7f9dcdec63b05
attr OpenDTU addStateEvent 1
attr OpenDTU alias logOpenDTU
attr OpenDTU room Strom
Für die Leistung folgendes Dummy-Device und Notify
define dy_OpenDTU_0_power dummy
setuuid dy_OpenDTU_0_power 67d02db0-f33f-9839-3725-53c86feabf8a8010
attr dy_OpenDTU_0_power alias Leistung (Ausgang)
attr dy_OpenDTU_0_power room Strom
attr dy_OpenDTU_0_power userReadings state { ReadingsVal("MQTT2_OpenDTU_7182440","114484554919_0_power",0) }
define n_OpenDTU_0_power notify MQTT2_OpenDTU_7182440:114484554919_0_power:.* { fhem "set dy_OpenDTU_0_power %" }
setuuid n_OpenDTU_0_power 67d02e2c-f33f-9839-5888-e5864c77bd72abed
attr n_OpenDTU_0_power alias Leistung (Ausgang)
attr n_OpenDTU_0_power room Strom

Im Log kommt dann folgendes an:
2025-03-15_16:38:57 dy_OpenDTU_0_power %
2025-03-15_16:38:57 dy_OpenDTU_0_power state: 225.0
2025-03-15_16:39:27 dy_OpenDTU_0_power %
2025-03-15_16:39:27 dy_OpenDTU_0_power state: 256.9
2025-03-15_16:40:12 dy_OpenDTU_0_power %
2025-03-15_16:40:12 dy_OpenDTU_0_power state: 297.9
Woher kommen die "%"?
Ja, das Notify hat als RegEx ein "%" am Ende. Aber wenn ich das weg lasse, steht nix im state des Dummy.
Dann habe ich noch ein Device.
define dy_OpenDTU_0_yieldhour dummy
setuuid dy_OpenDTU_0_yieldhour 67d03029-f33f-9839-168c-de48d8f6697e766b
attr dy_OpenDTU_0_yieldhour alias Stundenertrag
attr dy_OpenDTU_0_yieldhour event-min-interval .*:3600
attr dy_OpenDTU_0_yieldhour room Strom
attr dy_OpenDTU_0_yieldhour userReadings state difference { ReadingsVal("MQTT2_OpenDTU_7182440","114484554919_0_yieldday",0) }\

define n_OpenDTU_0_yieldhour notify MQTT2_OpenDTU_7182440:114484554919_0_yieldday:.* { fhem "set dy_OpenDTU_0_yieldhour %" }
setuuid n_OpenDTU_0_yieldhour 67d031a1-f33f-9839-2573-60e2ac9ed9164df9
attr n_OpenDTU_0_yieldhour alias Stundenertrag
attr n_OpenDTU_0_yieldhour room Strom
Durch die Angabe von "event-min-interval .*:3600" wird im Log nur
25-03-15_16:01:53 dy_OpenDTU_0_power %
2025-03-15_16:01:53 dy_OpenDTU_0_power state: 240.7
[b]2025-03-15_16:01:53 dy_OpenDTU_0_yieldhour %[/b]
2025-03-15_16:02:26 dy_OpenDTU_0_power %
geschrieben. Lasse ich das event-min-interval weg, kommt wie bei "power" eine Zeile "%" und in der anderen der Wert.
Ich will aber nur den Wert.

Was hab ich falsch gemacht?



fz55

#1
Ersetze in den set-Befehlen das %-Zeichen durch $EVTPART1. Mit event-min-interval erreichst du nicht das, was du willst. Stelle in den OpenDTU-MQTT-Einstellungen den Veröffentlichungsintervall auf 30 Sekunden.

msfox

#2
Zitat von: fz55 am 15 März 2025, 17:27:33Ersetze in den set-Befehlen das %-Zeichen durch $EVTPART1.
Hab ich gemacht. Kein Prozent mehr im Log.
Jetzt erscheint der Eintrag für die Leistung aber doppelt im Log:
2025-03-16_11:06:07 dy_OpenDTU_0_power state: 766.3
2025-03-16_11:06:07 dy_OpenDTU_0_power state: 766.3
2025-03-16_11:06:42 dy_OpenDTU_0_power state: 768.1
2025-03-16_11:06:42 dy_OpenDTU_0_power state: 768.1
2025-03-16_11:07:12 dy_OpenDTU_0_power state: 769.4
2025-03-16_11:07:12 dy_OpenDTU_0_power state: 769.4
Das Log hab ich wie folgt angepasst.
define OpenDTU FileLog ./log/openDTU-%Y-%m.log dy_OpenDTU_0_power|dy_OpenDTU_0_yieldday|dy_OpenDTU_0_yieldhour
setuuid OpenDTU 67cdd905-f33f-9839-ec81-c9a7f9dcdec63b05
attr OpenDTU addStateEvent 1
attr OpenDTU alias logOpenDTU
attr OpenDTU room Strom
Zum Test hatte ich dort dy_OpenDTU_0_power:.*|dy_OpenDTU_0_power:state:.* drin. Das habe ich raus genommen.
Zitat von: fz55 am 15 März 2025, 17:27:33Mit event-min-interval erreichst du nicht das, was du willst. Stelle in den OpenDTU-MQTT-Einstellungen den Veröffentlichungsintervall auf 30 Sekunden.
Das steht in den OpenDTU-MQTT-Einstellungen auf 5s. Die 30s in FHEM waren nur ein Test von mir innerhalb von FHEM. Ich plane eine Nulleinspeisung. Vermutlich werden die 30s dann in den MQTT-Einstellungen zu hoch sein. Trotzdem will ich aber in FHEM nicht aller 5s einen LogEintrag haben. Bzw. bei der Berechnung der "Wh" eben einmal pro Stunde einen Wert loggen.

Edit:
andere Werte werden nur 1x geloggt:
2025-03-16_11:11:07 dy_OpenDTU_0_power state: 785.8
2025-03-16_11:11:37 dy_OpenDTU_0_power state: 789.9
2025-03-16_11:11:37 dy_OpenDTU_0_power state: 789.9
2025-03-16_11:11:37 dy_OpenDTU_0_yieldday state: 1602
2025-03-16_11:11:37 dy_OpenDTU_0_yieldhour 1602
2025-03-16_11:12:12 dy_OpenDTU_0_power state: 791.1
2025-03-16_11:12:12 dy_OpenDTU_0_power state: 791.1
2025-03-16_11:12:47 dy_OpenDTU_0_power state: 794.9
2025-03-16_11:12:47 dy_OpenDTU_0_power state: 794.9

fz55

#3
Das kommt daher, dass du sowohl mit den set-Befehlen als auch mit den Userreadings immer das Reading state erzeugst/setzt.

Beim event-min-interval hast du recht, da war ich auf dem Holzweg. Allerdings hast du keinen Einfluss darauf, wann das Reading erzeugt wird. Hast du dir schon mal das statistics-Modul angeschaut?

define stats_OpenDTU statistics MQTT2_OpenDTU_7182440
attr stats_OpenDTU deltaReadings 114484554919_0_yieldtotal
attr stats_OpenDTU durationPeriodHour 1

Zur vollen Stunde wird das Reading stat114484554919_0_yieldtotal_last erzeugt, welches du in das FileLog aufnehmen solltest.
Kann sein, dass nicht alles 100%ig passt - alles ungetestet.


msfox

Das Statistik-Modul habe ich einmal eingebunden. Das Wiki dazu ist ja recht kurz gehalten.
Im Log landen jetzt folgenden Daten.
2025-03-18_13:58:08 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 792 Day: -1387 Month: -1387 Year: -1387 (since: 2025-03-18 )
2025-03-18_13:58:13 dy_OpenDTU_0_power state: 815.9
2025-03-18_13:58:13 dy_OpenDTU_0_power state: 815.9
2025-03-18_13:58:38 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 798 Day: -1381 Month: -1381 Year: -1381 (since: 2025-03-18 )
2025-03-18_13:58:48 dy_OpenDTU_0_power state: 816.0
2025-03-18_13:58:48 dy_OpenDTU_0_power state: 816.0
2025-03-18_13:59:08 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 805 Day: -1374 Month: -1374 Year: -1374 (since: 2025-03-18 )
2025-03-18_13:59:23 dy_OpenDTU_0_power state: 815.9
2025-03-18_13:59:23 dy_OpenDTU_0_power state: 815.9
2025-03-18_13:59:38 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 812 Day: -1367 Month: -1367 Year: -1367 (since: 2025-03-18 )
2025-03-18_13:59:58 dy_OpenDTU_0_power state: 816.0
2025-03-18_13:59:58 dy_OpenDTU_0_power state: 816.0
2025-03-18_14:00:08 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 2 Day: -1361 Month: -1361 Year: -1361 (since: 2025-03-18 )
2025-03-18_14:00:33 dy_OpenDTU_0_power state: 815.9
2025-03-18_14:00:33 dy_OpenDTU_0_power state: 815.9
2025-03-18_14:00:38 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 10 Day: -1353 Month: -1353 Year: -1353 (since: 2025-03-18 )
2025-03-18_14:01:08 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 16 Day: -1347 Month: -1347 Year: -1347 (since: 2025-03-18 )
2025-03-18_14:01:08 dy_OpenDTU_0_power state: 815.9
2025-03-18_14:01:08 dy_OpenDTU_0_power state: 815.9
2025-03-18_14:01:38 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 23 Day: -1340 Month: -1340 Year: -1340 (since: 2025-03-18 )
2025-03-18_14:01:38 dy_OpenDTU_0_power state: 815.9
2025-03-18_14:01:38 dy_OpenDTU_0_power state: 815.9
D.h. einmal pro Stunde beginnt die Zählung neu. Ich hätte aber gern, dass mit 1x pro Stunde die Wh geloggt.
In dem Fall genau nur diese Zeile:
2025-03-18_13:59:38 MQTT2_OpenDTU_7182440 stat114484554919_0_yieldday: Hour: 812 Day: -1367 Month: -1367 Year: -1367 (since: 2025-03-18 )
--
Dann hätte ich gern, dass mir dieser Wert in einen Dummy geschrieben wird.
Dazu folgender Versuch:

define dy_OpenDTU_0_yieldhour dummy
setuuid dy_OpenDTU_0_yieldhour 67d03029-f33f-9839-168c-de48d8f6697e766b
attr dy_OpenDTU_0_yieldhour alias Stundenertrag
attr dy_OpenDTU_0_yieldhour room Strom
attr dy_OpenDTU_0_yieldhour userReadings state { ReadingsVal("MQTT2_OpenDTU_7182440","stat114484554919_0_yieldday",0) }\
define n_OpenDTU_0_yieldhour notify MQTT2_OpenDTU_7182440:stat114484554919_0_yieldday:.* { fhem "set dy_OpenDTU_0_yieldday $EVTPART1" }
setuuid n_OpenDTU_0_yieldhour 67d031a1-f33f-9839-2573-60e2ac9ed9164df9
attr n_OpenDTU_0_yieldhour alias Stundenertrag
attr n_OpenDTU_0_yieldhour room Strom
Im Dummy kommt aber nichts an. Das Notify wird aber getriggert. Vermutlich würde auch der gesamte String im Dummy ankommen.
Hour: 812 Day: -1367 Month: -1367 Year: -1367 (since: 2025-03-18 )
Gebraucht wird aber nur "812".

fz55

Wenn du unbedingt den Weg über ein Dummy-Device gehen willst, hätte ich diesen Vorschlag:

defmod dy_OpenDTU dummy
attr dy_OpenDTU room Strom
attr dy_OpenDTU readingList Yieldtotal
attr dy_OpenDTU userReadings Stundenertrag:Yieldtotal:.* difference { ReadingsNum("dy_OpenDTU", "Yieldtotal" ,0) }

defmod at_OpenDTU at +*01:00:00 { \
    my $total = ReadingsNum("MQTT2_OpenDTU_7182440", "stat114484554919_0_yieldtotal", 0);; \
    fhem "set dy_OpenDTU Yieldtotal $total";; \
}
attr at_OpenDTU alignTime 00:59:55

In jeder 59. Minute einer Stunde wird Yieldtotal in dy_OpenDTU gesetzt und damit die Berechnung des Stundenertrags getriggert. Ich verwende Yieldtotal, weil dieser Wert nicht täglich zurückgesetzt wird.

msfox

#6
Aber dann ohne das Statistik-Modul?
Zitat von: fz55 am 18 März 2025, 16:48:28Ich verwende Yieldtotal, weil dieser Wert nicht täglich zurückgesetzt wird.
Ja, aber der hat diesen Punkt als Tausendertrenner, was dazu führt, dass FHEM dies als Komma interpretiert. Man könnte jetzt mal 1000 rechnen, wäre aber unsauber.

fz55

Ja - ohne statistics-Modul.

Der Punkt bei yieldtotal ist kein Tausendertrenner! Die Einheit von yieldtotal ist kWh und die von yieldhour Wh.

msfox

@fz55 Danke erst mal. Inzwischen läuft es soweit. Ich habe in der Zwischenzeit auch noch meine SmartMeter via OBIS in betrieb genommen. Die Verbräuche werden jetzt angezeigt, geloggt und lassen sich grafisch darstellen. Letzte Hürde war kWh und Wh. Irgendwo musste man dann doch mal 1000 rechnen, damit es sinnvole Werte sind. Mein SmartMeter hat im Standard auch kWh angezeigt. Konfiguriert man es aber via "Lampe" im Zählerschrank so, dass es permanent den Verbrauch, Leistung und Einspeisung anzeigt, sind es Wh. Naja und beim openDTU muss man auch aufpassen, woher die Werte kommen :).
--
Next Step:
- Tageslog
- Monatslog

Prof. Dr. Peter Henning

Ich würde vorschlagen, doch einmal die CommandRef zum Statistics-Modul richtig zu lesen.

LG

pah