Ich lasse im VZLOGGER-Modul die Differenz eines Readings berechnen. VZLOGGER liest den Stromzähler aus und in einem Reading wird dann gespeichert, wie sich dieser Stromzähler von einem Zeitpunkt zum anderen ändert. Das Gerät Stromzaehler hat aus VZLOGGER das Reading energy. Der entsprechende Befehl lautet dann
attr Stromzaehler userReadings energy_differenz difference { int(ReadingsVal("Stromzaehler","energy",0)*10)/10 }
und er lautet so, weil ich eben nur eine Kommastelle ausgegeben haben möchte.
Mein Problem ist nun, dass aber nicht etwa nur eine Nachkommastelle ausgegeben werden, sondern intern anscheinend eine Weiterberechnung stattfindet. Denn ich lese
energy_differenz 26.3999999985099
Kann ich das abstellen? Und wie kommt es zu dieser sonderbaren Rundung? Danke für die Hilfe.
Zitat von: andies am 07 April 2017, 08:48:50
Ich lasse im VZLOGGER-Modul die Differenz eines Readings berechnen. VZLOGGER liest den Stromzähler aus und in einem Reading wird dann gespeichert, wie sich dieser Stromzähler von einem Zeitpunkt zum anderen ändert. Das Gerät Stromzaehler hat aus VZLOGGER das Reading energy. Der entsprechende Befehl lautet dann
attr Stromzaehler userReadings energy_differenz difference { int(ReadingsVal("Stromzaehler","energy",0)*10)/10 }
und er lautet so, weil ich eben nur eine Kommastelle ausgegeben haben möchte.
Mein Problem ist nun, dass aber nicht etwa nur eine Nachkommastelle ausgegeben werden, sondern intern anscheinend eine Weiterberechnung stattfindet. Denn ich lese
energy_differenz 26.3999999985099
Kann ich das abstellen? Und wie kommt es zu dieser sonderbaren Rundung? Danke für die Hilfe.
Klammerung und Rundung :-)
1. ReadingsVal
2. * 10
3. Int
4. /10
Lösung:
int ((10 * (ReadingsVal + 0.5)) / 10)
Edit: Formatierung Lösung geändert
Hi,
intern rechnet das System nicht unbedingt im 10er-System, sondern wahrscheinlich zur Basis 2. Daher funktoniert sowas wie (int(x*10)/10) in der Regel nicht.
Wenn Du eine spezielle Zahlenformatierung haben willst, dann must Du auch eine Funktion zur Zahlenformatierung verwenden. Die heißt sprintf. Also in etwa so:
{ sprintf("%.1f", ReadingsVal("Stromzaehler","energy",0)) }
Gruß,
Thorsten
Danke, probiere ich jetzt aus!
FHEM bietet auch eine interne Funktion zum Runden.
round(ReadingsVal(...),1)
liefert den Wert mit einer Nachkommastelle.