Perl-Frage zu int() (Anwendung zum Beispiel bei VZLOGGER, aber auch anderswo)

Begonnen von andies, 07 April 2017, 08:48:50

Vorheriges Thema - Nächstes Thema

andies

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.
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Wuppi68

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
FHEM unter Proxmox als VM

Thorsten Pferdekaemper

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
FUIP

andies

FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

betateilchen

FHEM bietet auch eine interne Funktion zum Runden.

round(ReadingsVal(...),1)

liefert den Wert mit einer Nachkommastelle.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!