FHEM Forum

FHEM => Automatisierung => Thema gestartet von: kb958291 am 13 September 2025, 08:19:43

Titel: userReadings berechnen
Beitrag von: kb958291 am 13 September 2025, 08:19:43
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?
Titel: Aw: userReadings berechnen
Beitrag von: Wzut am 13 September 2025, 08:45:02
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
Titel: Aw: userReadings berechnen
Beitrag von: kb958291 am 13 September 2025, 09:10:07
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)"
Titel: Aw: userReadings berechnen
Beitrag von: Nobbynews am 13 September 2025, 09:18:56
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.
Titel: Aw: userReadings berechnen
Beitrag von: Gisbert am 13 September 2025, 09:43:53
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.
Titel: Aw: userReadings berechnen
Beitrag von: Wzut am 13 September 2025, 09:54:58
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 :)
Titel: Aw: userReadings berechnen
Beitrag von: kb958291 am 13 September 2025, 13:15:15
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)  )
Titel: Aw: userReadings berechnen
Beitrag von: Gisbert am 13 September 2025, 13:19:55
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).
Titel: Aw: userReadings berechnen
Beitrag von: Nobbynews am 13 September 2025, 13:29:41
3 Stellen hinter dem Komma reichen mMn völlig aus.
Aslo aus sprintf("%.2f"....  einfach ein sprintf("%.3f".... machen
Titel: Aw: userReadings berechnen
Beitrag von: kb958291 am 13 September 2025, 13:48:33
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!
Titel: Aw: userReadings berechnen
Beitrag von: Nobbynews am 13 September 2025, 13:53:44
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",(
Titel: Aw: userReadings berechnen
Beitrag von: kb958291 am 13 September 2025, 13:58:56
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 }
Titel: Aw: userReadings berechnen
Beitrag von: Nobbynews am 13 September 2025, 15:52:03
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.
Titel: Aw: userReadings berechnen
Beitrag von: kb958291 am 13 September 2025, 16:40:57
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)) }

Titel: Aw: userReadings berechnen
Beitrag von: TomLee am 13 September 2025, 17:46:08
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)) }
Titel: Aw: userReadings berechnen
Beitrag von: kb958291 am 13 September 2025, 20:02:31
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)

Titel: Aw: userReadings berechnen
Beitrag von: Wzut am 14 September 2025, 16:38:43
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:.*
Titel: Aw: userReadings berechnen
Beitrag von: betateilchen am 14 September 2025, 18:29:31
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.
Titel: Aw: userReadings berechnen
Beitrag von: kb958291 am 14 September 2025, 18:45:33
ich lerne mit ganz kleinen Schritten.... vielen Dank!

betateilchen vom KVA-Forum WMF?