Integralfunktion bei UserReadings

Begonnen von simonberry, 19 August 2014, 16:29:39

Vorheriges Thema - Nächstes Thema

buennerbernd

Mir ist aufgefallen, dass userReadings, bei jeder Änderung im Device aktualisiert werden.
Dadurch halten sich meine Befürchtungen wegen Verfälschungen durch zu lange Intervalle nun in Grenzen.
Modulentwickler von KLF200 und KLF200Node

Ajuba

Ich versuche nach obiger Erklärung die Funktion "intergral" bei UserReadings zur Berechnung der Gesamtenergie meiner Wärmepumpe einzusetzen habe aber starke Abweichungen zu der händischen Berechnung. Siehe Screenshot des Excel.

Zitat von: simonberry am 19 August 2014, 20:26:48

attr Fernwaerme userReadings Energie integral {ReadingsVal("Fernwaerme","Leistung",0)/3600}


Ich wende es auf ein UserReding eines MQQT Devices an. myElEnergy ist die unterste Zeile des codes.

defmod WP MQTT2_DEVICE ESPAltherma_dev
attr WP DbLogInclude myThPowerBW,myElPowerBW,myThEnergyBW,myElEnergyBW,myElPowerBUH1,myElEnergy,Raumheizbetrieb,2-Wege-Ventil_ON-Heizen/OFF-Kuehlen,3-Wege-Ventil_ON-DHW/OFF-Raum,Abtauung,Aktuelle_Betriebsart,Alarmausgabe,Aussentemperatur_R1T,Betrieb/Stoerung,BSH,Drehzahl_Verdichter_U/Sek,Durchflussmenge_l/min,Heizstab_Stufe-1,Heizstab_Stufe-2,Hochleistungs-DHW-Betrieb,INV_Primaerstrom_A,Raumtemperatur_R1T,Notbetrieb_aktiviert/nicht_aktiviert,R1T-Wasser_Vorlauftemperatur_nach_Plattenwaermetauscher,R2T-Wasser_Vorlauftemperatur_nach_Heizstab,R4T-Wasser_Ruecklauftemperatur_vor_Plattenwaermetauscher,R5T-Brauchwassertemperatur_im_Speicher,Raumheizbetrieb,Raumheizung_Betriebsleistung,Schallreduzierter_Betrieb,Sollwert_Brauchwasser,Sollwert_Heizungsvorlauf,Spannung_N-Phase_V,Stoercode,System_AUS,Umwaelzpumpenbetrieb,Ventilator_1_Stufe,Ventilator_2_Stufe,Waermetauscher_Mitteltemperatur,Wasserdruck,myCOP,myElPower,myThPower
attr WP IODev myBroker
attr WP event-on-change-reading myThPowerBW,myBW,myElPowerBW,myThEnergyBW,myElEnergyBW,myElPowerBUH1,myElEnergy,Raumheizbetrieb,2-Wege-Ventil_ON-Heizen/OFF-Kuehlen,3-Wege-Ventil_ON-DHW/OFF-Raum,Abtauung,Aktuelle_Betriebsart,Alarmausgabe,Aussentemperatur_R1T,Betrieb/Stoerung,BSH,Durchflussmenge_l/min,Heizstab_Stufe-1,Heizstab_Stufe-2,Hochleistungs-DHW-Betrieb,INV_Primaerstrom_A,Raumtemperatur_R1T,Notbetrieb_aktiviert/nicht_aktiviert,R1T-Wasser_Vorlauftemperatur_nach_Plattenwaermetauscher,R2T-Wasser_Vorlauftemperatur_nach_Heizstab,R4T-Wasser_Ruecklauftemperatur_vor_Plattenwaermetauscher,R5T-Brauchwassertemperatur_im_Speicher,Raumheizbetrieb,Raumheizung_Betriebsleistung,Schallreduzierter_Betrieb,Sollwert_Brauchwasser,Sollwert_Heizungsvorlauf,Spannung_N-Phase_V,Stoercode,System_AUS,Umwaelzpumpenbetrieb,Ventilator_1_Stufe,Ventilator_2_Stufe,Waermetauscher_Mitteltemperatur,Wasserdruck,myCOP,myElPower,myThPower
attr WP event-on-update-reading Drehzahl_Verdichter_U/Sek
attr WP eventMap /Fan Only:Fan_Only
attr WP readingList ESPAltherma_dev:homeassistant/sensor/espAltherma/config:.* { json2nameValue($EVENT) }\
ESPAltherma_dev:espaltherma/LWT:.* LWT\
ESPAltherma_dev:homeassistant/switch/espAltherma/config:.* { json2nameValue($EVENT) }\
ESPAltherma_dev:espaltherma/log:.* log\
ESPAltherma_dev:espaltherma/ATTR:.* { json2nameValue($EVENT) }
attr WP room MQTT2_DEVICE,WP
attr WP userReadings myAbtauung {((ReadingsVal ("WP","Abtauung",0))) eq "ON" ? (1) : (0)},\
myBW {((ReadingsVal ("WP","3-Wege-Ventil_ON-DHW/OFF-Raum",0))) eq "ON" ? (1) : (0)},\
myElPower {(((ReadingsVal ("WP","INV_Primaerstrom_A",0))*230)+(ReadingsVal ("WP","myElPowerBUH1",0))+(ReadingsVal ("WP","myElPowerBUH2",0))) ;;;;},\
myElPowerBUH1 {((ReadingsVal ("WP","Heizstab_Stufe-1",0))) eq "ON" ? (3000) : (0)},\
myElPowerBUH2 {((ReadingsVal ("WP","Heizstab_Stufe-2",0))) eq "ON" ? (6000) : (0)},\
myElPowerBW {(ReadingsVal ("WP","myElPower",0))*(ReadingsVal ("WP","myBW",0)) ;;;;},\
myThPowerBW {((ReadingsVal ("WP","R5T-Brauchwassertemperatur_im_Speicher",0) - ReadingsVal ("myBWStart","state",0))*230*1.1639)*(ReadingsVal ("WP","myBW",0)) ;;;;},\
myThPower {((ReadingsVal ("WP","R1T-Wasser_Vorlauftemperatur_nach_Plattenwaermetauscher",0) - ReadingsVal ("WP","R4T-Wasser_Ruecklauftemperatur_vor_Plattenwaermetauscher",0))*ReadingsVal ("WP","Durchflussmenge_l/min",0)*60*1.1639);;;;},\
myCOP {((ReadingsVal ("WP","myThPower",0))/(ReadingsVal ("WP","myElPower",0))) > 0 ? ((ReadingsVal ("WP","myThPower",0))/(ReadingsVal ("WP","myElPower",0)+0.1)) : (0)},\
myThEnergyBW integral {ReadingsVal ("WP","myBW",0) * ((ReadingsVal ("WP","R5T-Brauchwassertemperatur_im_Speicher",0) - ReadingsVal ("myBWStart","state",0))*230*1.1639/3600/1000) ;;;;},\
myElEnergyBW integral {ReadingsVal ("WP","myElPowerBW",0)/3600/1000},\
myElEnergy integral {ReadingsVal("WP","myElPower",0)/3600/1000}\


Das Ergebnis der Fhem Integral Berechnung weicht vollkommen von meiner händischen Excel Berechnung und vom Smartmeter ab.
Die Fhem Integral Berechnung liefert viel kleinere Werte.

Die Zeitabstände der Readings sind unterschiedlich aber das sollte ja nichts ausmachen.
myElEnergy ist auch als event-on-change-reading gesetzt und die Timestamps passen auch zusammen.
Die Division durch 3600 und durch 1000 ist um von Wattsekunden auf kWh zu kommen.

Wo könnte der Fehler liegen?
FHEM auf RPi3, Homematic CCU3 mit Cuxd und CUL 868 für FS20, Siemens S7 über CP343-1,
DbLog zu MySQL auf NAS QNAP TS-253D,
Yeelight

simonberry

Hallo Ajuba,

leider verstehe ich Dein Excel Tabelle nicht ganz. Welche Seite ist die von FHEM ermittelte Energie, und welche hast Du mit Excel berechnet, und wie hast Du die Energie in Excel berechnet?

viele Grüße
Simonberry

NUC5i3RYK#DBLOG; MYSQL; LIRC; MPD; HM-CFG-HM-USB-2: HM-divers; MQTT2; Signalduino; Shelly; Sonoff; dash_dhcp; FS20; IT; FroniusWR; Somfy RTS; NFS-Server
Rpi B#: nfsmount; ser2net CUL868; CUL433; GPIO4:DS18B20; WEMOS-D1-MINI#JVC-via-IR;

Ajuba

#18
Ich habe das Problem gelöst durch Entfernen von UserReading Definition und Löschen des UserReadings.
Nach Neueingabe zählt integral korrekt.
FHEM auf RPi3, Homematic CCU3 mit Cuxd und CUL 868 für FS20, Siemens S7 über CP343-1,
DbLog zu MySQL auf NAS QNAP TS-253D,
Yeelight

Reisbaua

Hallo zusammen. Ich habe auch ein Problem mit der integral Funktion.
Mein Use Case ist ganz einfach: Ich habe einen Zeitabschnitt über Stunden hinweg, wo meine WP 400W benötigt. Wenn ich das Userreading mit integral nutze um die kWh zu berechnen kommt ein zu kleinerer Wert heraus, nämlich ca 0,386kWh. Wenn ein 400W Verbraucher allerdings konstant eine Stunde läuft, müsste es 0,4kWh ergeben.

User Reading: WPheizen_kWh integral { ReadingsVal ("ModbusWP","EnergieverbrauchHeizen",0)/3600.0/1000.0 ; }
EnergieverbrauchHeizen: hat 400 als Wert

Und so sieht das DbLog dazu aus (davor und danach war noch ganz lang 400W):

2023-02-06 17:11:38 ModbusWP MODBUSATTR WPheizen_kWh: 189.414374342061 WPheizen_kWh 189.414374342061
2023-02-06 17:06:39 ModbusWP MODBUSATTR EnergieverbrauchHeizen: 400 EnergieverbrauchHeizen 400
2023-02-06 17:01:38 ModbusWP MODBUSATTR WPheizen_kWh: 189.349986331798 WPheizen_kWh 189.349986331798
2023-02-06 16:55:39 ModbusWP MODBUSATTR EnergieverbrauchHeizen: 400 EnergieverbrauchHeizen 400
2023-02-06 16:51:38 ModbusWP MODBUSATTR WPheizen_kWh: 189.285617735694 WPheizen_kWh 189.285617735694
2023-02-06 16:45:39 ModbusWP MODBUSATTR EnergieverbrauchHeizen: 400 EnergieverbrauchHeizen 400
2023-02-06 16:41:38 ModbusWP MODBUSATTR WPheizen_kWh: 189.221216923519 WPheizen_kWh 189.221216923519
2023-02-06 16:35:39 ModbusWP MODBUSATTR EnergieverbrauchHeizen: 400 EnergieverbrauchHeizen 400
2023-02-06 16:31:38 ModbusWP MODBUSATTR WPheizen_kWh: 189.156850880958 WPheizen_kWh 189.156850880958
2023-02-06 16:25:39 ModbusWP MODBUSATTR EnergieverbrauchHeizen: 400 EnergieverbrauchHeizen 400
2023-02-06 16:21:38 ModbusWP MODBUSATTR WPheizen_kWh: 189.092470236345 WPheizen_kWh 189.092470236345
2023-02-06 16:15:39 ModbusWP MODBUSATTR EnergieverbrauchHeizen: 400 EnergieverbrauchHeizen 400
2023-02-06 16:11:38 ModbusWP MODBUSATTR WPheizen_kWh: 189.028077016185 WPheizen_kWh 189.028077016185
2023-02-06 16:04:39 ModbusWP MODBUSATTR EnergieverbrauchHeizen: 400 EnergieverbrauchHeizen 400
2023-02-06 16:01:38 ModbusWP MODBUSATTR WPheizen_kWh: 188.963702454001 WPheizen_kWh 188.963702454001
2023-02-06 15:54:39 ModbusWP MODBUSATTR EnergieverbrauchHeizen: 400 EnergieverbrauchHeizen 400
2023-02-06 15:51:38 ModbusWP MODBUSATTR WPheizen_kWh: 188.896078621405 WPheizen_kWh 188.896078621405

Die Differenz zwischen den Werten um 16:01 und 17:01 ist ca 0,386kWh

Und so die FileLogs:

2023-02-06_15:54:39 ModbusWP EnergieverbrauchHeizen: 400
2023-02-06_16:04:39 ModbusWP EnergieverbrauchHeizen: 400
2023-02-06_16:15:39 ModbusWP EnergieverbrauchHeizen: 400
2023-02-06_16:25:39 ModbusWP EnergieverbrauchHeizen: 400
2023-02-06_16:35:39 ModbusWP EnergieverbrauchHeizen: 400
2023-02-06_16:45:39 ModbusWP EnergieverbrauchHeizen: 400
2023-02-06_16:55:39 ModbusWP EnergieverbrauchHeizen: 400
2023-02-06_17:06:39 ModbusWP EnergieverbrauchHeizen: 400
2023-02-06_17:16:40 ModbusWP EnergieverbrauchHeizen: 400

2023-02-06_15:51:38 ModbusWP WPheizen_kWh: 188.896078621405
2023-02-06_16:01:38 ModbusWP WPheizen_kWh: 188.963702454001
2023-02-06_16:11:38 ModbusWP WPheizen_kWh: 189.028077016185
2023-02-06_16:21:38 ModbusWP WPheizen_kWh: 189.092470236345
2023-02-06_16:31:38 ModbusWP WPheizen_kWh: 189.156850880958
2023-02-06_16:41:38 ModbusWP WPheizen_kWh: 189.221216923519
2023-02-06_16:51:38 ModbusWP WPheizen_kWh: 189.285617735694
2023-02-06_17:01:38 ModbusWP WPheizen_kWh: 189.349986331798
2023-02-06_17:11:38 ModbusWP WPheizen_kWh: 189.414374342061


Irgendwelche Ideen was hier falsch läuft?
Danke!

buennerbernd

Ich tippe auf aufsummierte Rundungsfehler.
Wie viele Werte kommen denn wirklich auf ModbusWP:EnergieverbrauchHeizen rein? Das ist doch nicht wirklich nur alle 10 min. einer?
Entsprechend oft wird beim Umrechnen von Sekunden auf Stunden gerundet. Vielleicht wird zufälligerweise immer abgerundet.
Modulentwickler von KLF200 und KLF200Node

Reisbaua

Könnte sein. Modbus kriegt alle 1min Daten, das Logfile und DbLog wird wie in meinem Post ersichtlich nicht so oft updated.
Aber auch wenn ich jetzt abrunden würde, sagen wir mal 400/3600/1000 ergibt dann 0,0001
Und nehmen wir an ich berechne alle Minuten diesen gerundeten Wert: 0,0001*60 für eine Minute, und das 60 Mal um die kWh zu bekommen, käme ich auf 0,0001*3600=0,36


  • 0,0001111*3600=0,39996
  • 0,00011*3600=0,396
  • 0,0001*3600=0,360

Egal an welche Stelle ich runde, und wie ich es drehe, auf den erhaltenen (falschen!) Wert von 0,386 komme ich nicht.

Vielleicht ist das auch egal, und ich kann irgendwie selbst den Wert (korrekt) berechnen? Eigentlich müsste ja die Delta Zeit zwischen jetzt und vorigem Energiewert * vorigem Energiewert auch das Ergebnis liefern, oder?
kWh = SekundenDelta * EnergiePrevious
Dann seh ich zB: 60s sind vergangen, der alte Wert war 400W, der neue jetzt 800W => 60s*400W=24000Ws=24kWs=0,0066666kWh in dieser einen Minute...

buennerbernd

Ich denke, du bekommst als Reading konstant 400W

Den Verbrauch in Watt * Sekunde bekommst du, in dem du bei jedem neuen Wert in Watt

(alter Wert in Watt + neuer Wert) Watt / 2 * (neuer Zeitstempel - alter Zeitstempel) rechnest
und diese Werte kontinuierlich aufsummierst.


Jetzt, wo ich so darüber nachdenke, wäre es vermutlich genauer, das komplette Integral in Watt Sekunden zu berechnen und das jeweilige Endergebnis als ein neues UserReading in kWh umzurechnen. Dann wäre die Fehlerquelle durch aufsummiertes Runden beseitigt, da nur noch einmal am Ende gerundet wird.
Modulentwickler von KLF200 und KLF200Node

Reisbaua

Ja, mit den Ws und Runden hast du recht, das probier ich einfach mal.
Das mit WattAlt + WattNeu / 2 kann ich nur bedingt unterschreiben, weil es darauf ankommt wie sich das Gerät verhält.

Beispiel A:
Ich bekomme bei JEDEM WECHSEL der Momentanenergie ein Reading Update.
Minute 0: 400W
Minute 23: 800W

Ab Minute 23 gelten also 800W. Davor war durchgehend 400W.
Jetzt wäre es bei mir falsch 800+400/2=600W für die ersten 23 Minuten anzunehmen.

Beispiel B:
Ich bekomme alle 10 Minuten einen Wert, der Wert kann sich innerhalb der 10 Minutenfenster beliebig oft ändern.
Dann wäre tatsächlich die beste Näherung einen Durchschnitt im letzten 10 Minuten Fenster zu berechnen mit (Alt+Neu)/2.

In meinem WP Beispiel hab ich all diese Unwägsamkeiten ausgeschaltet, weil ich einen Bereich gewählt habe der durchgehend den selben Momentwert hatte. Aber ich habe halt nicht die erwarteten 0,4kWh ablesen können. Das ist mein Problem hier.

buennerbernd

#24
Dann darfst du nicht den Durchschnitt zwischen altem und neuem Wert nehmen, sondern nur den alten Wert, denn der hat ja das gesamte letzte Intervall gegolten.

Mein Tipp: den alten Wert in einem UserReading merken.

WPheizen_Ws:EnergieverbrauchHeizen.* integral { ReadingsVal ("ModbusWP","EnergieverbrauchHeizenOld",0); },
WPheizen_kWh:EnergieverbrauchHeizen.* { ReadingsVal ("ModbusWP","WPheizen_Ws",0)/3600000.0 ; },
EnergieverbrauchHeizenOld:EnergieverbrauchHeizen.* { ReadingsVal ("ModbusWP","EnergieverbrauchHeizen",0); }

Alle 3 UserReadings triggern nur, wenn sich EnergieverbrauchHeizen ändert.
Als Wert wird EnergieverbrauchHeizenOld herangezogen, welcher erst nach der Integralberechnung aktualisiert wird.
Modulentwickler von KLF200 und KLF200Node

Reisbaua


buennerbernd

PS: Habe noch ein Komma zwischen die UserReadings gesetzt.

Viel Erfolg! Mich würde interessieren, ob du so endlich auf 400kWh kommst.
Modulentwickler von KLF200 und KLF200Node

Reisbaua

ja ich gebe Bescheid, dafür muss es aber jetzt eine zeitlang laufen.
danke schon mal.
und die Kommas sind mir natürlich aufgefallen :-)

Reisbaua

ja, mit Ws sind die Werte tatsächlich korrekt, nämlich 399,96333kWh bei 400W Momentanleistung!
Danke nochmals.

Reisbaua

und stimmen übrigens auch sehr gut mit den Werten überein, die an der WP direkt abgelesen werden können!