[erledigt] Strom, Verbrauch berechnen

Begonnen von Salvi5, 05 Januar 2022, 05:43:20

Vorheriges Thema - Nächstes Thema

Salvi5

Moin,
ich hoffe ich bin im richtigen Forum.
Normalerweise bitte ich bei Problemen nur um einen kleinen Schubs in die richtige Richtung, aber dieses Mal bin ich wirklich zu blöd.
Ich habe meinen Stromzähler mit einem IR-Lesegerät ausgerüstet. Funktioniert Top!
Das Gerät liefert mir genau den aktuellen Zählerstand per MQTT. Dieser aktualisiert sich nicht nach einer bestimmten Zeitspanne, sondern immer nach 0,1 kW Verbrauch.
Ich habe seit gestern nachmittag aus meiner Sicht alles mögliche gesucht, getestet, probiert und zusammengefügt, ich weiß jedoch nicht, wie ich die Zeitspanne zwischen den 0,1 kW in eine Berechnung einfüge, um den aktuellen Verbrauch auszurechnen. In diesem Fall bitte ich um ein möglichst passendes Stück Code um genau das zu erreichen, denn ich bin mit meinem halbseidenen Programmierlatein am Ende.

Gruß Mike

Salvi5

#1
Nochmal Moin!
Der frische Schnee hat offenbar geholfen, ich habe das jetzt über ein DOIF gelöst:
defmod Strom_IR_Lesekopf_ESP32_DOIF_1 DOIF ([Strom_IR_Lesekopf_ESP32:"^STROM_Total_inZ1:.*$"]) \
\
(setreading Strom_IR_Lesekopf_ESP32 lastValue [Strom_IR_Lesekopf_ESP32:STROM_Total_inZ1])\
({ fhem "setreading Strom_IR_Lesekopf_ESP32 Verbrauch_Wh ".(100/(time()-ReadingsNum("Strom_IR_Lesekopf_ESP32","Timestamp",0))*3600) })\
({ fhem "setreading Strom_IR_Lesekopf_ESP32 Timestamp ".time_str2num(ReadingsTimestamp("Strom_IR_Lesekopf_ESP32", "STROM_Total_inZ1",0)) })
attr Strom_IR_Lesekopf_ESP32_DOIF_1 do always

setstate Strom_IR_Lesekopf_ESP32_DOIF_1 initialized
setstate Strom_IR_Lesekopf_ESP32_DOIF_1 2022-01-05 08:31:45 Device Strom_IR_Lesekopf_ESP32
setstate Strom_IR_Lesekopf_ESP32_DOIF_1 2022-01-05 08:31:42 cmd 0
setstate Strom_IR_Lesekopf_ESP32_DOIF_1 2022-01-05 08:31:45 e_Strom_IR_Lesekopf_ESP32_events Laufzeit: 0
setstate Strom_IR_Lesekopf_ESP32_DOIF_1 2022-01-05 08:31:42 mode enabled
setstate Strom_IR_Lesekopf_ESP32_DOIF_1 2022-01-05 08:31:42 state initialized

Ich hatte erst ein wait von einer Sekunde vor dem dritten Ausführungsteil, das habe ich jetzt mal rausgenommen, um das Ergebnis nicht zu sehr zu verfälschen. Wenns nicht funktioniert, mache ich es wieder rein.

Es funktioniert ja jetzt so weit, aber wenn hier irgend jemand eine ordentliche Lösung hätte, wäre ich trotzdem dankbar...

Gruß Mike

Beta-User

Aus der commandref zum readingFnAttribut "event-aggregator":
ZitatOne would typically use the linear method with the mean function for quantities continuously varying over time like electric power consumption, temperature or speed.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Damian

Das sieht mir unnötig kompliziert aus.

Ich würde erstmal setzen:

attr Strom_IR_Lesekopf_ESP32 oldreadings STROM_Total_inZ1

und dann definieren:

DOIF {[Strom_IR_Lesekopf_ESP32:STROM_Total_inZ1];set_State(100/::OldReadingsAge("Strom_IR_Lesekopf_ESP32","STROM_Total_inZ1",0)*3600)}

Im Status sollte der errechnete Verbrauch stehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber

Die Frage ist ja auch, wie oft muss/will man den Verbrauch in KWh loggen?

Ich logge die aktuelle Leistung W mit. Alles älter 3 Tage wird aus der DB gelöscht.

Die KWh logge ich einmal am Tag kurz vor der Geisterstunde mittels dummy.
(im Dummy ist immer der KWh Wert des Vortages drin. aktell minus Vortag = Tagesverbrauch.)

Salvi5

Zitat von: Damian am 05 Januar 2022, 10:12:44
Das sieht mir unnötig kompliziert aus.

Ich würde erstmal setzen:

attr Strom_IR_Lesekopf_ESP32 oldreadings STROM_Total_inZ1

und dann definieren:

DOIF {[Strom_IR_Lesekopf_ESP32:STROM_Total_inZ1];set_State(100/::OldReadingsAge("Strom_IR_Lesekopf_ESP32","STROM_Total_inZ1",0)*3600)}

Im Status sollte der errechnete Verbrauch stehen.


Vielen Dank, es sah mir auch zu kompliziert aus :-)

Ich probiere das heute Nachmittag...

Gruß Mike

Damian

Zitat von: Frank_Huber am 05 Januar 2022, 10:40:50
Die Frage ist ja auch, wie oft muss/will man den Verbrauch in KWh loggen?

Ich logge die aktuelle Leistung W mit. Alles älter 3 Tage wird aus der DB gelöscht.

Die KWh logge ich einmal am Tag kurz vor der Geisterstunde mittels dummy.
(im Dummy ist immer der KWh Wert des Vortages drin. aktell minus Vortag = Tagesverbrauch.)

Mir reicht der aktuelle Verbrauch im 5 Minuten-Takt, genauso bei der Stromerzeugung, beides mit einer einfache Übersicht der letzten Tage ohne Log.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber

Zitat von: Damian am 05 Januar 2022, 11:20:59
Mir reicht der aktuelle Verbrauch im 5 Minuten-Takt, genauso bei der Stromerzeugung, beides mit einer einfache Übersicht der letzten Tage ohne Log.
das schaut schon super aus. macht in dem Umfang aber auch nur mit PV Sinn. ;-)

Und bis ich das mit DOIF hinbekomme müsste ich erstmal bei Dir für paar Monate ins Studium gehen. *lach*
mir reicht ein Verbrauchswert pro Tag/Woche/Monat.
aber Danke trotzdem für das DOIF Modul! das nutze ich sehr gerne (im Classic Mode)

Damian

Zitat von: Frank_Huber am 05 Januar 2022, 13:27:19
das schaut schon super aus. macht in dem Umfang aber auch nur mit PV Sinn. ;-)

Und bis ich das mit DOIF hinbekomme müsste ich erstmal bei Dir für paar Monate ins Studium gehen. *lach*
mir reicht ein Verbrauchswert pro Tag/Woche/Monat.
aber Danke trotzdem für das DOIF Modul! das nutze ich sehr gerne (im Classic Mode)

Wenn man bereits die entsprechenden Daten hat, dann sind das lediglich zwei Definitionszeilen. Der Stromverbrauch ist auch ohne PV-Anlage, oder vielleicht gerade dann, interessant. :) Besonderes Perlwissen für die Darstellung ist nicht erforderlich.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

sash.sc

Benutze doch das Statistic Modul.


Gruß Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Salvi5

Moin.
Nur um den Thread abzuschließen:
Ich habe es nicht zuverlässig hinbekommen, den Zählerstand in den Verbrauch umzurechnen, bin aber im Laufe der Suche auf den ElectricityCalculator gestoßen. Der tut nach diversen Verständnisschwierigkeiten meinerseits nun genau das was ich wollte, und sogar noch ein bisschen mehr.
Vielen Dank für alle Vorschläge!

Gruß Mike

stera

Hallo,

wenn ich das richtig lese, benutzt du ein ESP mit Tasmota? Dann lass es doch in dem Script gleich berechnen. Schickst du es nicht per MQTT?

Innerhalb von Fhem kannst du dann ja noch das Statistik-Modul laufen lassen, wenn dein Zähler das nicht schon selbst erledigt.

Gruß,
Stefan

Damian

#12
Hier ein Beispiel, wie man den aktuellen Tagesverbrauch für mehrere Zähler errechnen kann:

defmod di_zaehler DOIF DEF TPL_stat ({ [00:01];;\
  set_Reading("$2_zaehler",[?$1:$2]);;\
  set_Reading("$2_tagesverbrauch",get_Reading("$2_heute",0),1);;\
  set_Reading("$2_heute",0,1);;\
}\
\
{set_Reading ("$2_heute",int(([$1:$2]-get_Reading("$2_zaehler"))*1000)/1000,1);;}\
\
reset_$2 {\
set_Reading ("$2_zaehler",[?$1:$2]);;\
set_Reading ("$2_heute",0);;\
set_Reading ("$2_tagesverbrauch",0);;\
}\
\
)\
## Syntax TPL_stat (<Device>,<Reading>)\
TPL_stat (Stromzaehler,total_c)\
TPL_stat (Stromzaehler,total_f)\
TPL_stat (CUL_WZ,total)

Die zu errechnenden Zähler werden einfach jeweils mit TPL_stat (<Zähler_Device>,<Reading>) eingefügt, der erste Teil der Definition bleibt gleich. Hier im Beispiel für drei Zähler.

Im Reading "<Zaehler_Reading>_heute" befindet sich der aktuelle Verbrauch von heute des Zählers, im Reading "<Zaehler_Reading>_tagesverbrauch" der jeweilige Tagesverbrauch des Zählers.

Das Konzept lässt sich für Monats- oder Jahresverbrauch mit paar Zeilen erweitern. Die fertigen Module zu dem Thema haben mir nicht zugesagt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

juergen012

Hallo, ich möchte gerne dem Stromverbrauch meiner TS011F_din_smart_relay protokollieren. Nachdem ich mit dem Statistics-Modul und mit dem  Average-Modul nicht so richtig "warm" wurde, bin ich bei meiner Suche auf diesen Thread gestoßen. Leider gelingt mir nicht den Code von Damian in mein Fhem einzufügen. Wenn ich ihn so wie auf der Website ein RAW eingebe wird mir angezeigt, dass der Code übernommen wurde. Er ist aber nicht vorhanden. Wenn ich die backlashes entferne, wird mir "di_zaehler DOIF: DEF TPL: no right bracket: ({ [00:01];" angezeigt.
Kann mir jemand helfen? Was mache ich falsch??
Beste Grüße
Jürgen K.
Fhem unter Proxmox

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF