userReadings berechnen

Begonnen von kb958291, 13 September 2025, 08:19:43

Vorheriges Thema - Nächstes Thema

kb958291

Hallo,

da mein Wärmezähler die aktuelle Leistung über WMBus nicht überträgt, wollte ich die Wärmeleistung als userReadings nach einer Formel berechnen und ins log speichern für eine grafische Darstellung:

HeatingPower = (5_value - 6_value) * 7_value / 3,6 * 4,1786

attr userReadings HeatingPower { ReadingsVal((("WMBUS_KAM_83029765_64_4","5_value",0)-("WMBUS_KAM_83029765_64_4","6_value",0))*("WMBUS_KAM_83029765_64_4","7_value",0)/3.6*4.1786);; }

Auszug aus dem log:
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 5_type: VIF_FLOW_TEMP
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 5_storage_no: 0
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 5_value: 38.3
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 5_unit: °C
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 5_value_type: Instantaneous value
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 6_type: VIF_RETURN_TEMP
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 6_storage_no: 0
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 6_value: 35.77
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 6_unit: °C
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 6_value_type: Instantaneous value
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 7_type: VIF_VOLUME_FLOW
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 7_storage_no: 0
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 7_value: 0.472
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 7_unit: m³/h
2025-09-13_08:11:45 WMBUS_KAM_83029765_64_4 7_value_type: Instantaneous value

Ich habe schon viele Varianten probiert, ich bekomme da nix berechnet.
Fehlermeldung:
HeatingPower Error evaluating WMBUS_KAM_83029765_64_4 userReading HeatingPower: Not enough arguments for main::ReadingsVal at (eval 4345934) line 1, near "4.1786)"

Hat jemand eine Lösung für mich?
FHEM@ASUS-PN40, HM-CFG-LAN, CUL868, CUL433, HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-LC-Bl1PBU-FM, IT1500, Elero, Tasmota

Wzut

#1
ReadingsVal nicht über alle drei Werte am Stück :
ReadingsVal((("Sondern jeweils pro Reading , d.h. statt einem brauchst halt drei.
Und noch drei  Tipps : Nimm ReadingsNum :) und für dein UserReading auch noch einen sinnvollen Trigger ala
attr userReadings HeatingPower:._value:.*und den Bandwurm WMBUS_KAM_83029765_64_4 durch $name ersetzen
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

kb958291

#2
wäre so besser:

HeatingPower:._value:.* { ReadingsVal("$name","5_value",0)-ReadingsVal("$name","6_value",0)*ReadingsVal("$name","7_value",0)/3.6*4.1786);; }

gibt aber den gleichen Fehler....
Error evaluating WMBUS_KAM_83029765_64_4 userReading HeatingPower: syntax error at (eval 4363080) line 1, near "4.1786)"
FHEM@ASUS-PN40, HM-CFG-LAN, CUL868, CUL433, HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-LC-Bl1PBU-FM, IT1500, Elero, Tasmota

Nobbynews

#3
Es sind zwei verschiedene Fehlermeldungen:
Not enough arguments for mainund jetzt
syntax error at
Die runde Klammer hinter 4.1786 ist falsch gesetzt.

Um die Differenz muss noch eine Klammer gesetzt werden gem. der obigen Formel.
Punktrechnung vor Strichrechnung....

Und dann wie @Wzut schon geschrieben hat ReadingsNum verwenden.

ZitatHeatingPower:._value:.* {sprint("%.2f",( (ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786)}

Edit
@Wzut: Danke für den Hinweis bzgl. $name. Geändert und auch hübsch gemacht.

Gisbert

#4
HeatingPower:._value:.* { (ReadingsNum("$name","5_value",0)-ReadingsNum("$name","6_value",0))*ReadingsNum("$name","7_value",0)/3.6*4.1786 }Ungetestet - aber so würde ich es als nächstes versuchen.

Sorry Nobbynews, hatte deine Ergänzung nicht gelesen.
2. Ergänzung: es war noch eine Klammer zu viel.
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Wzut

#5
und $name brauch keine Hochkommas , d.h einfach $name statt "$name"
und wenn dann das User Reading seinen Wert hat machst du diesen noch schön, denn er wird dir bestimmt nicht gefallen :)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

kb958291

ihr seid die Besten!! Vielen Dank!!

ich wäre da nie drauf gekommen, hier der nächste Versuch:

HeatingPower:._value:.* { (ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786 }

Wert: 7.92557383444445

das passt schon mal mit dem Wert. 7,9 KW Leistung, bin extra in den Keller und habe auf Schornsteinfeger geschaltet um zu testen....

Den Wert könnte man auf 4 Stellen hinter dem Komma begrenzen... (Schöner wohnen...   8)  )
FHEM@ASUS-PN40, HM-CFG-LAN, CUL868, CUL433, HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-LC-Bl1PBU-FM, IT1500, Elero, Tasmota

Gisbert

Zitat von: kb958291 am 13 September 2025, 13:15:15Den Wert könnte man auf 4 Stellen hinter dem Komma begrenzen... (Schöner wohnen...   8)  )

Das geht wie im Beitrag 3 gezeigt mit sprintf (oder den Perlfunktionen round, ceil oder floor).
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Nobbynews

3 Stellen hinter dem Komma reichen mMn völlig aus.
Aslo aus sprintf("%.2f"....  einfach ein sprintf("%.3f".... machen

kb958291

#9
hab´s jetzt so gemacht:

HeatingPower:._value:.* {sprintf"%.3f",(ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786 }

Wert: 3.394    :)

ohne Eure Hilfe hätte ich das nicht so schnell (wenn überhaupt) geschafft!
FHEM@ASUS-PN40, HM-CFG-LAN, CUL868, CUL433, HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-LC-Bl1PBU-FM, IT1500, Elero, Tasmota

Nobbynews

Zitat von: kb958291 am 13 September 2025, 13:48:33{sprintf"%.4f",
Und das liefert keinen Syntax-Error??
Wunder.
Müsste eigentlich lauten
sprintf("%.4f",(

kb958291

#11
hat keinen Fehler gemeldet.

HeatingPower:._value:.* {sprintf("%.3f",((ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786) }

hier gibts Fehler: Error evaluating WMBUS_KAM_83029765_64_4 userReading HeatingPower: syntax error at (eval 4461152) line 1, at EOF

geht tatsächlich nur ohne die Klammer in sprintf"%.3f",:
HeatingPower:._value:.* {sprintf"%.3f",(ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786 }
FHEM@ASUS-PN40, HM-CFG-LAN, CUL868, CUL433, HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-LC-Bl1PBU-FM, IT1500, Elero, Tasmota

Nobbynews

ZitatHeatingPower:._value:.* {sprintf("%.3f",((ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786)) }
Da fehlt noch eine runde Klammer am Ende.

kb958291

Vielen Dank, das funktioniert jetzt auch mit Klammern (da kann man aber auch durcheinander kommen 8) ):

HeatingPower:._value:.* {sprintf("%.3f",((ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786)) }

FHEM@ASUS-PN40, HM-CFG-LAN, CUL868, CUL433, HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-LC-Bl1PBU-FM, IT1500, Elero, Tasmota

TomLee

Hallo,

immer noch nicht ganz richtig.

Die äußeren Klammern sind überflüssig:

Zitat{sprintf("%.3f",((ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786)) }