From 0cd5872fb667c47ae4e1d39c42bf3750e8b614f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Str=C3=A5b=C3=B8?= Date: Sat, 20 Nov 2021 10:11:32 +0100 Subject: [PATCH] Avoid float calculation artifacts --- solar_ble.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/solar_ble.py b/solar_ble.py index a0cf72b..3064867 100755 --- a/solar_ble.py +++ b/solar_ble.py @@ -5,6 +5,7 @@ import datetime import struct import sys import time +from decimal import Decimal from io import RawIOBase from typing import Callable, Collection, Optional, cast @@ -403,15 +404,18 @@ if __name__ == "__main__": if per_voltages(now): data = try_read_parse(dev, 0x0100, 11, parse_battery_state) if data: - data[DataName.CALCULATED_BATTERY_POWER] = data.get( - DataName.BATTERY_VOLTAGE, 0 - ) * data.get(DataName.BATTERY_CURRENT) - data[DataName.CALCULATED_PANEL_POWER] = data.get( - DataName.PANEL_VOLTAGE, 0 - ) * data.get(DataName.PANEL_CURRENT) - data[DataName.CALCULATED_LOAD_POWER] = data.get( - DataName.LOAD_VOLTAGE, 0 - ) * data.get(DataName.LOAD_CURRENT) + data[DataName.CALCULATED_BATTERY_POWER] = float( + Decimal(data.get(DataName.BATTERY_VOLTAGE, 0)) + * Decimal(data.get(DataName.BATTERY_CURRENT, 0)) + ) + data[DataName.CALCULATED_PANEL_POWER] = float( + Decimal(data.get(DataName.PANEL_VOLTAGE, 0)) + * Decimal(data.get(DataName.PANEL_CURRENT, 0)) + ) + data[DataName.CALCULATED_LOAD_POWER] = float( + Decimal(data.get(DataName.LOAD_VOLTAGE, 0)) + * Decimal(data.get(DataName.LOAD_CURRENT, 0)) + ) log(data) for consumer in consumers: consumer.write(data)