FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Dracolein am 28 März 2023, 20:23:31

Titel: Wert aufsummieren
Beitrag von: Dracolein am 28 März 2023, 20:23:31
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? 





Titel: Aw: Wert aufsummieren
Beitrag von: DS_Starter am 28 März 2023, 20:34:28
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.
Titel: Aw: Wert aufsummieren
Beitrag von: betateilchen am 28 März 2023, 20:36:06
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.
Titel: Aw: Wert aufsummieren
Beitrag von: Adimarantis am 28 März 2023, 21:49:43
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.
Titel: Aw: Wert aufsummieren
Beitrag von: RalfRog am 28 März 2023, 23:53:35
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
Titel: Aw: Wert aufsummieren
Beitrag von: Dracolein am 29 März 2023, 07:24:41
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.
Titel: Aw: Wert aufsummieren
Beitrag von: Adimarantis am 29 März 2023, 09:11:01
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.
Titel: Aw: Wert aufsummieren
Beitrag von: Dracolein am 29 März 2023, 17:08:47
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.
Titel: Aw: Wert aufsummieren
Beitrag von: RalfRog am 29 März 2023, 17:34:32
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.