Hallo liebe Gemeinde,
suche jetzt schon seit langer Zeit an einer Lösung für mein Problem:
habe mehrere Sensoren an meiner RPi Box, Temperaturen, Luftfeuchte (OWX, Max-Heizthermostate, LaCross, Tasmota) usw.
Läuft alles halbwegs gut auch die HourCounter für Gas und Wasser (gesteuert über GPIOs. Hier sind auch Auswertungen auf zeitlichen Rückblick möglich, z.B. Logs der letzen Tage und Wochen und auch ein Jahresrückblich. Damit kann ich meine Werte gut vergleichen.
Alles für Energiekostensenkkung.
bei der Auswertung meines Tasmota Stromzählers habe ich aber Schwierigkeiten, der erzeugt zwar Gesamtverbrauch und aktuellen Tagesverbrauch, aber mir gelingt es nicht einen Differenzwert pro Tag auszugeben.
Ich möchte Abends um 23:59 einen Wert in ein Log schreiben, das funktioniert, Wie aber kriege ich die Differenz zum Vortag oder mehrere Vortage hin? Ich möchte also einen Plot erstellen, der mir die Tagesverbräuche aus einem Log anbietet. Entweder aus einem FHEM Log oder NodeRed.
Jemand einen Rat
VG Gerd
Wenn Du doch eh schon jeden Tag um 23:59 Uhr "aktiv" bist, um den Wert ins Log zu schreiben, kannst Du doch im gleichen Aufwasch gleich die Differenz zum Vortag feststellen und auch ins Log schreiben?
Beispiel zur Verdeutlichung, was um 23:59 passieren könnte:
- Tageswert(1) ermitteln
- den ermittelten Wert(1) ins Log schreiben
- den Wert(2) des Vortags aus dem reading tagesverbrauch des device lesen
- den ermittelten Wert(1) per "setreading <device> tagesverbrauch <ermittelterWert> ins device schreiben
- die Differenz(3) zum Vortag ermitteln Wert(1) - Wert(2)
- den ermittelten Wert(3) als Differenz mit addLog ins Log schreiben
Dann kannst Du die Tagesdifferenzen genau so plotten wie jeden anderen Wert aus dem Log auch.
hallo Betateilchen,
so hört sich das prime an, nur, wie setze ich das praktisch um. ich hab da ein paar Lücken beim HowTo.
vg Gerd
ok, fangen wir mal mit der einfachsten Frage an...
Zitat von: gerd54 am 07 Januar 2023, 11:21:52
Ich möchte Abends um 23:59 einen Wert in ein Log schreiben, das funktioniert
Wie machst Du das?
Zweite Frage: FileLog oder DbLog?
Hallo Betateilchen,
ich habe ein weiteres LogFile erzeugt und da mit:
disabledForIntervals 00:00-23:59 23:59-00:00
die letzte Minute geloggt.
vg Gerd
auweia... einen umständlicheren Weg hast Du wohl nicht gefunden? 8)
Welches device willst Du loggen? Bitte mal ein list von dem device, das den Verbrauchswert enthält.
ist aber lang :-(
Internals:
CID DVES_56FA8D
DEF DVES_56FA8D
FUUID 63147b27-f33f-04c2-56d5-5533ddaba77d6df2
IODev m2s
LASTInputDev m2s
MSGCNT 19863
NAME MQTT2_DVES_56FA8D
NR 81
STATE 420.0 W
TYPE MQTT2_DEVICE
eventCount 19863
m2s_CONN m2s_192.168.0.157_62116
m2s_MSGCNT 19863
m2s_TIME 2023-01-07 12:02:12
READINGS:
2023-01-07 12:02:12 Haus_Power_curr 420.0
2022-11-22 16:13:59 Haus_Power_curr_avg_day 547.0
2022-11-22 16:13:59 Haus_Power_curr_avg_month 547.0
2022-11-22 16:13:59 Haus_Power_curr_cum_day 31966433
2022-11-22 16:13:59 Haus_Power_curr_cum_month 1071704033
2022-11-22 16:13:44 Haus_Power_curr_max_day 559.0
2022-11-22 16:13:44 Haus_Power_curr_max_month 559.0
2022-11-22 16:12:59 Haus_Power_curr_min_day 547.0
2022-11-22 16:12:59 Haus_Power_curr_min_month 547.0
2023-01-07 12:02:12 Haus_total_in 13275.13
2022-09-18 22:26:22 Heap 21
2022-12-24 16:45:26 IODev m2s
2022-09-18 17:36:08 LWT Online
2022-09-18 22:26:22 LoadAvg 19
2022-09-18 22:26:22 MqttCount 7
2022-09-18 17:36:08 POWER
2022-09-18 22:26:22 POWER1 on
2022-09-18 22:26:22 Sleep 50
2022-09-18 22:26:22 SleepMode Dynamic
2023-01-07 12:02:12 Time 2023-01-07T12:02:12
2022-09-18 22:26:22 Uptime 2T11:25:34
2022-09-18 22:26:22 UptimeSec 213934
2022-09-18 22:26:22 Wifi_AP 1
2022-09-18 22:26:22 Wifi_BSSId EC:A9:40:6C:51:14
2022-09-18 22:26:22 Wifi_Channel 11
2022-09-18 22:26:22 Wifi_Downtime 0T00:00:26
2022-09-18 22:26:22 Wifi_LinkCount 6
2022-09-18 22:26:22 Wifi_Mode 11n
2022-09-18 22:26:22 Wifi_RSSI 100
2022-09-18 22:26:22 Wifi_SSId BambusRouter
2022-09-18 22:26:22 Wifi_Signal -47
2022-09-04 15:04:24 attrTemplateVersion 20210523
2022-09-18 17:36:09 btn_1 0
2022-09-18 17:36:09 btn_2 0
2022-09-18 17:36:09 btn_3 0
2022-09-18 17:36:09 btn_4 0
2022-09-18 17:36:09 btn_5 0
2022-09-18 17:36:09 btn_6 0
2022-09-18 17:36:09 btn_7 0
2022-09-18 17:36:09 btn_8 0
2022-09-18 17:36:09 dn Tasmota
2022-09-18 17:36:09 fn_1 Tasmota
2022-09-18 17:36:09 ft %prefix%/%topic%/
2022-09-18 17:36:09 hn tasmota-6797
2022-09-18 17:36:09 if 0
2022-09-18 17:36:09 ip 192.168.0.157
2022-09-18 17:36:09 lk 0
2022-09-18 17:36:09 lt_st 0
2022-09-18 17:36:09 mac C8C9A356FA8D
2022-09-18 17:36:09 md Sonoff Basic
2022-09-18 17:36:09 ofln Offline
2022-09-18 17:36:09 onln Online
2022-09-18 17:36:09 rl_1 1
2022-09-18 17:36:09 rl_2 0
2022-09-18 17:36:09 rl_3 0
2022-09-18 17:36:09 rl_4 0
2022-09-18 17:36:09 rl_5 0
2022-09-18 17:36:09 rl_6 0
2022-09-18 17:36:09 rl_7 0
2022-09-18 17:36:09 rl_8 0
2022-09-18 17:36:09 sho_1 0
2022-09-18 17:36:09 sho_2 0
2022-09-18 17:36:09 sho_3 0
2022-09-18 17:36:09 sho_4 0
2022-09-18 17:36:09 sn_Haus__Power_curr 270.0
2022-09-18 17:36:09 sn_Haus__total_in 11993.39
2022-09-18 17:36:09 sn_Time 2022-09-18T16:36:08
2022-09-18 17:36:09 so_11 0
2022-09-18 17:36:09 so_114 0
2022-09-18 17:36:09 so_117 0
2022-09-18 17:36:09 so_13 0
2022-09-18 17:36:09 so_17 0
2022-09-18 17:36:09 so_20 0
2022-09-18 17:36:09 so_30 0
2022-09-18 17:36:09 so_4 0
2022-09-18 17:36:09 so_68 0
2022-09-18 17:36:09 so_73 0
2022-09-18 17:36:09 so_82 0
2022-09-18 17:36:09 state_1 off
2022-09-18 17:36:09 state_2 on
2022-09-18 17:36:09 state_3 toggle
2022-09-18 17:36:09 state_4 hold
2022-12-24 16:46:26 subscriptions cmnd/DVES_56FA8D_fb/# cmnd/tasmota/# cmnd/tasmotas/#
2022-09-18 17:36:09 sw 11.1.0
2022-09-18 17:36:09 swc_1 -1
2022-09-18 17:36:09 swc_2 -1
2022-09-18 17:36:09 swc_3 -1
2022-09-18 17:36:09 swc_4 -1
2022-09-18 17:36:09 swc_5 -1
2022-09-18 17:36:09 swc_6 -1
2022-09-18 17:36:09 swc_7 -1
2022-09-18 17:36:09 swc_8 -1
2022-09-18 17:36:09 t tasmota
2022-09-18 17:36:09 tp_1 cmnd
2022-09-18 17:36:09 tp_2 stat
2022-09-18 17:36:09 tp_3 tele
2022-09-18 17:36:09 ty 0
2022-09-18 17:36:09 ver 1
Attributes:
alias Strom-mom
event-on-change-reading Haus_Power_curr, Haus_total_in
event-on-update-reading Haus_total_in
readingList DVES_56FA8D:tele/tasmota/SENSOR:.* { json2nameValue($EVENT) }
room Gas,MQTT2_DEVICE
stateFormat Haus_Power_curr W
Bitte nächstes Mal code-Tags für sowas verwenden, dann ist das besser lesbar.
Welches ist das gewünschte reading, dessen Wert Du um 23:59 Uhr brauchst?
2023-01-07 12:02:12 Haus_total_in 13275.13
Zitat von: gerd54 am 07 Januar 2023, 11:40:28
wie setze ich das praktisch um. ich hab da ein paar Lücken beim HowTo.
In der 99_myUtils.pm folgende Funktion anlegen:
sub tagesverbrauch {
my $aktuell = ReadingsNum('MQTT2_DVES_56FA8D','Haus_total_in',-1);
my $gestern = ReadingsNum('MQTT2_DVES_56FA8D','verbrauch_gestern',-1);
my $diff = $aktuell - $gestern;
fhem("setreading MQTT2_DVES_56FA8D verbrauch_gestern $aktuell");
fhem("setreading MQTT2_DVES_56FA8D verbrauch_diff $diff");
}
Damit werden die Werte in das "normale" Logfile geschrieben, Du musst allerdings daran denken, die beiden readings "verbrauch_.*" in das verdammte event-on-update aufzunehmen.
Dann definierst Du ein at, das die Funktion aufruft
define at_tagesverbrauch at *23:59:30 {tagesverbrauch}
Und das wars auch schon.
Du kannst dann den Wert "verbrauch_diff" ganz normal in einem plot verwenden und darstellen.
toll Betateilchen,
das werde ich nachher mal umsetzen. Bis hierher erstmal danke.
;elde mich wenns klappt, wenn nicht dann auch. :-)
vg
Gerd
muss ich die 99_myUtils.pm ändern oder reicht es den Eintrag im Device unter DEF reinzukopieren?
Zitat von: gerd54 am 07 Januar 2023, 12:42:48
muss ich die 99_myUtils.pm ändern oder
Diese Frage verstehe ich nicht.
Was ist daran:
Zitat von: betateilchen am 07 Januar 2023, 12:29:23
In der 99_myUtils.pm folgende Funktion anlegen:
unverständlich?
ich dachte, ich könne entweder den Code in der PM_Util anlegen ODER im DEF des Device, also alternativ.
noch mal danke für deine Mühe
vg Gerd
Prinzipiell könntest Du den Code auch in das DEF des at-devices schreiben.
Aber ich lagere solche Codeblöcke gerne in die 99_myUtils.pm aus (und ich empfehle das Vorgehen dringend!) weil es dort besser zu pflegen und einfacher zu lesen ist als im DEF eines devices. Und es erleichtert vor allem die Nachvollziehbarkeit und die Verständlichkeit, was in dem Code eigentlich passiert.
Bei den 5 Zeilen hier in diesem Fall ist das nicht ganz so dramatisch, aber es gibt tatsächlich Leute, die mehrere Dutzend/Hundert Zeilen Code in ein DEF schreiben, was ich für völlig unsinnig halte.
also ich hab jetzt mal die 99_myUtils.pm angelegt
und den siebenzeiler reinkopiert.
das at_tagesverbrauch ebenso angelegt und das attr event_on_update_reading eingepflegt (verbrauch_.*).
In welches "normale" Logfile werden die Daten geschrieben? Braucht es da noch ein anzulegendes Logfile?
Du siehst, ich arbeite zwar schon lange mit FHEM aber in der Tiefe bin ich absolut nicht drin. :-(
vg
Gerd
Zitat von: gerd54 am 07 Januar 2023, 14:44:41
In welches "normale" Logfile werden die Daten geschrieben?
Sorry, ich kenne Deine FHEM Installation nicht und ich kann auch nicht hellsehen.
Deshalb kann ich Deine Frage nicht beantworten.
Aber diese Aussage von Dir:
Zitat von: gerd54
ich habe ein weiteres LogFile erzeugt
deutet darauf hin, dass es mindestens zwei Logfiles in Deinem System geben sollte.
In jedem Logfile, in dem das device MQTT2_DVES_56FA8D mit allen seinen readings gelogged wird, sollten das neue reading auch auftauchen.
Zitat von: gerd54 am 07 Januar 2023, 14:44:41
ich arbeite zwar schon lange mit FHEM aber in der Tiefe bin ich absolut nicht drin. :-(
Logfiles haben m.E. nicht mit "in der Tiefe" von FHEM zu tun, sondern gehören zu den basics.
Hallo Betateilchen,
habs jetzt ausprobiert und tut.
Besten Dank nochmal, hab ne Menge dazugelernt.
vg und schönes Wochenende
Gerd
Hallo Betateilchen,
habe den 5 Teiler in die 99_myUtil angelegt und das at_tagesverbrauch erzeugt.
Die Berechnung erfolgt auch und 23:59 werden die Tageswerte in den Readings des Device angezeigt
siehe Screenshot
aber nur angezeigt, ins Log werden die nicht geschrieben, ergo habe ich auch keine Möglichkeit Plots zu erzeugen.
Kannst du hier noch mal helfen, was habe ich vergessen?
vg Gerd
Wie sieht denn die Definition Deines Logfiles aus?
Entweder, irgendwas mit den verfluchten event-on-irgendwas Attributen passt nicht oder Dein Logfile ist nicht so definiert, dass diese "neuen" readings mit aufgezeichnet werden.
siehe Screenshoot
Die Definition macht jetzt nicht so arg viel Sinn, aber unabhängig davon sollte sie trotzdem funktionieren.
Hast Du mal in das Logfile reingeschaut, ob da die Werte wirklich nicht drinstehen?
Ansonsten schmeiß mal diese event-on-bla Attribute bei dem device raus.
setreading erzeugt events - also sollte das grundsätzlich auch gelogged werden.
Hi Betateilchen,
habe die Logs mal durchforstet, leider nix drin.
Habe auch festgestellt das die beiden Readings (Haus_Power_curr: und Haus_total_in) im Browser automatisch aktualisiert werden, nur die beiden neuen nicht. Die werden erst nach einem Browserfenster refresh aktualisiert, aber selbst dann, kein Eintrag im Log.
Kann vielleicht der Eintrag in der 99_myUtils erweitert werden und den Eintrag diff in ein, ev. neues Log schreiben?
Oder ein kleines Script welches auf OS Ebene eine Berechnung des Differenzwertes vornimmt und in ein neues Log schreibt?
vg Gerd
Zitat von: gerd54 am 12 Januar 2023, 12:00:00
Habe auch festgestellt das die beiden Readings (Haus_Power_curr: und Haus_total_in) im Browser automatisch aktualisiert werden, nur die beiden neuen nicht. Die werden erst nach einem Browserfenster refresh aktualisiert, aber selbst dann, kein Eintrag im Log.
Das hier gemacht:
Zitat von: betateilchen am 12 Januar 2023, 11:21:04
Ansonsten schmeiß mal diese event-on-bla Attribute bei dem device raus.
Eventmonitor öffnen und schauen kann auch helfen: keine Events keine Einträge im Log...
Laut deinem ScreenShot hast du event-on-change-reading auf eben genau diese beiden Readings gesetzt: Haus_Power_curr: und Haus_total_in
Bedeutet für alle anderen Readings (ausgenommen die bei event-on-update EDIT: da bin ich grad ein wenig verwirrt...) keine Events ergo keine Einträge im Log...
Gruß, Joachim
Hallo Joachim,
hatte auch auf verbrauch_diff den event_on_update gesetzt, brachte aber auch kein event im Monitor und auch kein Logeintrag
Vielleicht muss ich andere wege gehen?
vg Gerd
Zitat von: gerd54 am 12 Januar 2023, 13:25:27
Hallo Joachim,
hatte auch auf verbrauch_diff den event_on_update gesetzt, brachte aber auch kein event im Monitor und auch kein Logeintrag
Vielleicht muss ich andere wege gehen?
vg Gerd
Lösche doch einfach mal ALLE event-on- Attribute und schau dann im Eventmonitor und dann (vors. es gab Events) im Log.
Danach (wenn das geht) kannst du ja wieder einschränken...
Gruß, Joachim
Zitat von: gerd54 am 12 Januar 2023, 13:25:27
Vielleicht muss ich andere wege gehen?
Nein, musst Du nicht. Wie oft noch?
Öffne zwei Browser-Fenster (oder Tabs)
Im ersten startest Du den EventMonitor.
Im zweiten gibst Du in die FHEM Befehlszeile ein:
setreading MQTT2_DVES_56FA8D verbrauch_diff 1234
Dann schaust Du im ersten Fenster nach, ob der event dort auftaucht.
Und lösche das sinnfreie userReading MQTT2_DVES_56FA8D in Deinem FileLog device!
Probier's doch mal ohne die Leerzeichen bei den event-on-xx Attributen.
It's a Comma-seperated list....
so,
setreading MQTT2_DVES_56FA8D verbrauch_diff 1234
sorry,
setreading MQTT2_DVES_56FA8D verbrauch_diff 1234
erzeugt keinen event eintrag im eventmonitor
der sinnfreie Eintrag ist raus
vg Gerd
noch als nachtrag,
im event monitor kommt nix, aber in den Readings des Devices hab ich den Eintrag "1234" drin..?
vg Gerd
Zitat von: gerd54 am 12 Januar 2023, 14:49:06
setreading MQTT2_DVES_56FA8D verbrauch_diff 1234
erzeugt keinen event eintrag im eventmonitor
Hast Du endlich mal die event-on-xxx Attribute gelöscht, bevor Du testest?
Zitat von: gerd54 am 12 Januar 2023, 14:51:39
im event monitor kommt nix, aber in den Readings des Devices hab ich den Eintrag "1234" drin..?
naja, das Setzen des readings war ja nie das Problem.
Das Problem ist, dass das Setzen offenbar kein event auslöst.
Und durch das fehlende event kann logischerweise auch kein Logeintrag entstehen.
Ich meinte die Attribute event-on-change-reading und event-on-update-reading aus dein ersten Screenshot. Da sind Leerzeichen drin, die nicht da hingehören.
Hättest du statt dem Screenshot ein list gepostet hätte ich es direkt da rauskopiert, um den Fehler zu zeigen.
Und der Vollständigkeit halber: diese Attribute sind als "Filter" anzusehen. Nur was da eingetragen ist wird "durchgelassen" und erzeugt Events und somit Logeinträge.
Hi,
also hab jetzt alle event_on.... gelöscht und siehe da jetzt geht es ...:-)
2023-01-12 15:51:41 verbrauch_diff 1235
2023-01-11 23:59:00 verbrauch_gestern 13325.59
Attributes:
readingList DVES_56FA8D:tele/tasmota/SENSOR:.* { json2nameValue($EVENT) }
room Gas,MQTT2_DEVICE
stateFormat Haus_Power_curr W
Jetzt ist kein event_on .... eingetragen, trotzdem gehts :-(
dann brauchts doch keine eb´vent_on ....?
vg
Gerd
Lass sie einfach weg, solange Du nicht vollständig verstanden hast, was Du damit anrichtest...
In meinen FHEM Installationen mit 300-400 devices gibt es kein einziges solches Attribut und alles funktioniert, wie ich das möchte.
moin zusammen,
möchte mich nochmal bei allen bedanken die mir geholfen habe.
nachdem
1. löschen der leerzeichen in den kommaseparierten einträgen.
2. löschen der event_on... Einträge
konnte dann das lang ersehnte reading "verbrauch_diff" auch im Log erscheinen.
Nun fehlten aber "Haus_Power_curr" im Log :-(
Da hatte ein nicht beendeter TAIL Prozess noch die Finger drauf, sodass nix ins log geschrieben wurde.
Hab jetzt ein bischen aufgeräumt, überschüssige Logs und Plots entfernt und für jeden gewünschten Wert ein einzelnes Log angelegt.
bis demnächst :-)
Gerd
Zitat von: gerd54 am 14 Januar 2023, 12:47:47
für jeden gewünschten Wert ein einzelnes Log angelegt.
Das ist unnötig und belastet Dein System durch die permanent geöffneten Dateien.
Konfiguriere EIN logfile und alle devices korrekt, dann wird auch alles aufgezeichnet, so wie Du es möchtest.
--
moin zusammen,
mein tagesverbrauch geht nicht mehr, Versuche die 99_myUtils zu editieren, beim speichern gibt es aber immer die Medlung
ERROR:
Bad name after verbrauch_gestern' at ./FHEM/99_myUtils.pm line 21, line 97848.
hat da einer eine idee zu.
meine 99_myurils hat sich nicht geändert.
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub tagesverbrauch {
my $aktuell = ReadingsNum('MQTT2_DVES_56FA8D','Haus_total_in',-1);
my $gestern = ReadingsNum'MQTT2_DVES_56FA8D','verbrauch_gestern',-1);
my $diff = $aktuell - $gestern;
fhem("setreading MQTT2_DVES_56FA8D verbrauch_gestern $aktuell");
fhem("setreading MQTT2_DVES_56FA8D verbrauch_diff $diff");
}
1;
danke schon mal
Gerd
bei ReadingsNum'MQTT2_DVES_56FA8D','verbrauch_gestern',-1); fehlt die öffnende klammer. Richtig ist: ReadingsNum('MQTT2_DVES_56FA8D','verbrauch_gestern',-1);
boah, super danke
:-)