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?
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
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)"
Es sind zwei verschiedene Fehlermeldungen:
Not enough arguments for main
und 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.
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.
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 :)
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) )
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).
3 Stellen hinter dem Komma reichen mMn völlig aus.
Aslo aus sprintf("%.2f".... einfach ein sprintf("%.3f".... machen
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!
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",(
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 }
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.
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)) }
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)) }
so, jetzt aber dann gaanz richtig eingebaut:
HeatingPower:._value:.* {sprintf("%.3f",(ReadingsNum($name,"5_value",0)-ReadingsNum($name,"6_value",0))*ReadingsNum($name,"7_value",0)/3.6*4.1786) }
...und funktioniert!
Wäre froh, wenn ich das mal verstehen würde... O:-)
Trotzdem vielen Dank an Alle!! 8)
Zitat von: kb958291 am 13 September 2025, 20:02:31Wäre froh, wenn ich das mal verstehen würde... O:-)
na dann kann man ja mal ganz vorne anfangen zu erklären :
HeatingPower:._value:.*
HeatingPower : dein neues Reading , war dir aber eh schon klar :)
._value = Trigger wann das Reading neu berechnet werden soll -> hier wenn sich ein Reading mit _value im Namen ändert. Der Punkt steht für eine beliebige Zahl . Man könnte auch eingrenzen auf die drei benutzten 5_value, 6_value & 7_value dann wäre die Syntax :
HeatingPower:(5|6|7)_value:.*
Zitat von: Wzut am 14 September 2025, 16:38:43Der Punkt steht für eine beliebige Zahl
Nicht ganz richtig. Der Punkt steht für ein (fast) beliebiges Zeichen, nicht nur für numerische Zeichen.
ich lerne mit ganz kleinen Schritten.... vielen Dank!
betateilchen vom KVA-Forum WMF?