Hauptmenü

Wert aufsummieren

Begonnen von Dracolein, 28 März 2023, 20:23:31

Vorheriges Thema - Nächstes Thema

Dracolein

Hallo zusammen,

ich möchte ein Reading erzeugen, welches (vorübergehende) Werte eines vorhadenen Readings aufsummiert und stehe etwas auf dem Schlauch wie ich das anstelle.

Die Ladestation meines eAutos ist in FHEM integriert. Ist das Ladekabel angeschlossen, werden die geladenen kWh fein als Reading in Echtzeit dargestellt. Beispielsweise sind nach 2 Stunden 20kWh geladen, nach 3 Stunden sind es schon 30kWh.
Dieser Wert wird jedoch genullt, sobald das Ladekabel vom Fahrzeug abgezogen wird.
Ich würde gern die gesamte Lademenge am Abend in FHEM ablesen können, auch wenn das Fahrzeug zwischenzeitlich bereits vom Kabel getrennt wurde. Beziehungsweise möchte ich eine Gesamtsumme des Tages erzeugen, falls es mehrere Ladevorgänge gab.

Den letzten Wert auf einem separierten Reading abspeichern, sodass er nach dem Abziehen des Kabels nicht verloren geht, bekomme ich hin. Aber das Aufsummieren mehrerer Ladevorgänge bereitet mir Schwierigkeiten, da sich meine Fähigkeiten auf die simple Addition einzelner Readings beschränken und ich irgendwie den zuvor gespeicherten Wert zwischenspeichern muss, um ihn mit dem neuen Wert zu addieren.

Könnt Ihr mir auf die Sprünge helfen? 





Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

DS_Starter

Für solche Zwecke drängt sich das Logging in eine Datenbank geradezu auf. Einmal gespeichert, kannst du deine Ladeleistungen in den unterschiedlichsten Zeiträumen nach Belieben auswerten.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

betateilchen

Zitat von: DS_Starter am 28 März 2023, 20:34:28Für solche Zwecke drängt sich das Logging in eine Datenbank geradezu auf. Einmal gespeichert, kannst du deine Ladeleistungen in den unterschiedlichsten Zeiträumen nach Belieben auswerten.

Das wäre aber eine zu einfache Lösung. Und einfache Lösungen sind erfahrungsgemäß wenig beliebt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Adimarantis

Wie wäre es mit userreadings?
Jetzt mal nur als Anregung - nicht getestet:
attr eAuto \
total { my $val=ReadingsVal($name,"counter",0); \
        my $old=OldReadingsVal($name,"counter",0); \
        my $total=ReadingsVal($name,"total",0); \
        if ($val<$old) { \
           return $total+$old; \
        } \
        return $total; \
} \
attr eAuto oldreadings counter; \
Dein "total" darf ja nur aufsummieren, wenn du das aktuelle Maximum (Kabel abgezogen) erreicht hast.
Also vergleichen wir den aktuellen Stand (ReadingsVal) mit dem vorherigen Stand (OldReadingsVal).
Wenn der neue Wert kleiner, dann gabs einen Reset und wir addieren den alten Wert auf total - sonst bleibt total erstmal unverändert.
Um Tagessummen zu bilden könntest du z.B. das Statistics Modul verwenden oder einfach per Trigger in der früh mit "setreading eAuto total 0" zurücksetzen.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

RalfRog

Weil ich es gerade schon mal woanders geschrieben habe.
Wäre es nicht easy ein aufsummierendes Userreading mit dem statistics Modul zusammen zu nutzen?

Meines ist:
    energyCum:energy.* monotonic {ReadingsVal("shelly_plug_s_df2674","energy",0)}    (oder vielleicht besser ReadingsNum)

Die statistics ist sauber.

Und ja die Datenbank zu nutzen ist eine tolle Sache.

Gruß Ralf
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

Dracolein

#5
Moin zusammen,
inzwischen blicke ich sogar wieder durch die neue Forensoftware durch  ;D

Zitat von: DS_Starter am 28 März 2023, 20:34:28Für solche Zwecke drängt sich das Logging in eine Datenbank geradezu auf. Einmal gespeichert, kannst du deine Ladeleistungen in den unterschiedlichsten Zeiträumen nach Belieben auswerten.
Vom Grundsatz her hast Du völlig recht. Mein geplanter Usecase innerhalb FHEM ist jedoch letztlich "nur" die Darstellung auf meinem FTUI-Touchdisplay in der Tageszusammenfassung, dessen PV-Werte nach einigen Tagen gelöscht werden (weil ich die Daten eigentlich nicht langfristig benötige, da die SMA-App ausreicht)
Weiterhin habe ich immer noch keine Datenbank installiert und logge alle meine Messwerte nach wie vor als FileLog.
Drum war die ursprünglich Intention dieses Threads eine kleine, simple Lösungssuche und....

Zitat von: Adimarantis am 28 März 2023, 21:49:43Wie wäre es mit userreadings?
Jetzt mal nur als Anregung - nicht getestet:
attr eAuto \
total { my $val=ReadingsVal($name,"counter",0); \
        my $old=OldReadingsVal($name,"counter",0); \
        my $total=ReadingsVal($name,"total",0); \
        if ($val<$old) { \
           return $total+$old; \
        } \
        return $total; \
} \
attr eAuto oldreadings counter; \
Dein "total" darf ja nur aufsummieren, wenn du das aktuelle Maximum (Kabel abgezogen) erreicht hast.
Also vergleichen wir den aktuellen Stand (ReadingsVal) mit dem vorherigen Stand (OldReadingsVal).
Wenn der neue Wert kleiner, dann gabs einen Reset und wir addieren den alten Wert auf total - sonst bleibt total erstmal unverändert.
Um Tagessummen zu bilden könntest du z.B. das Statistics Modul verwenden oder einfach per Trigger in der früh mit "setreading eAuto total 0" zurücksetzen.
...diese Idee finde ich super. Erstens habe ich wieder ein paar Zeilen Beispielcode zum persönlichen Lernen, zweitens beschränkt sich die Funktionalität auf das vorhandene Device und benötigt keinerlei "Drumherum"  :)
Vielen Dank bis hierher, ich versuche mich reinzuarbeiten und melde mich bei Rückfragen erneut hier.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Adimarantis

Sehe gerade noch einen Fehler.
Muss am Anfang natürlich "attr eAuto userreadings ...." heissen (habs userreadings unterschlagen).
Die Lösung von RalfRog sollte aber eigentlich auch machen was du möchtest - und viel einfacher.
Das "monotonic" addiert nur auf wenn der Wert steigt. Wenn der Wert auf 0 springt addiert er dann wieder die neuen Werte auf.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Dracolein

Rückmeldung am Nachmittag:

die Idee von Adimarantis hat auf Anhieb nicht so ganz funktioniert und ich bin zu Vorschlag 2 von RalfRog gewechselt, was auf Anhieb klappt.
attr userReadings Energie_Ladevorgang_kW_total2 monotonic {ReadingsVal("EVCharger22","Energie_Ladevorgang_kW",0)}
Auf dem neuen Reading "Energie_Ladevorgang_kW_total2" wird mit jedem Event auf "Energie_Ladevorgang_kW" dessen Wert aufaddiert. Ziehe ich den Stecker ab, nullt sich "Energie_Ladevorgang_kW" wie gewohnt, aber die gebildete Summe verbleibt.
Ich werde nun mit einem "at"-Device um 23:59 das Reading automatisiert auf Null setzen lassen.

Eventuell lagere ich die Funktion in ein DOIF aus, um später noch mit einer zusätzlichen Bedingung (Addieren nur wenn Lademodus=PV-Überschuss) zu arbeiten.

Vielen Dank für die Hilfe bis hierher.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

RalfRog

Wenn es ein Problem mit zuviel Nachkommastellen nimm statt
=> ReadingsVal("EVCharger22","Energie_Ladevorgang_kW",0) ein
=> ReadingsNum("EVCharger22","Energie_Ladevorgang_kW",0,n)
   n = Runden auf die Anzahl Nachkommastellen.
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder