Differenz von zwei Tagen berechnen

Begonnen von gerd54, 07 Januar 2023, 11:21:52

Vorheriges Thema - Nächstes Thema

gerd54

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


betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gerd54

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

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gerd54

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gerd54

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

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gerd54


2023-01-07 12:02:12   Haus_total_in   13275.13

betateilchen

#9
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gerd54

toll Betateilchen,

das werde ich nachher mal umsetzen. Bis hierher erstmal danke.
;elde mich wenns klappt, wenn nicht dann auch. :-)

vg
Gerd

gerd54

muss ich die 99_myUtils.pm ändern oder reicht es den Eintrag im Device unter DEF reinzukopieren?

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

gerd54

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

betateilchen

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.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!