From 0cd5872fb667c47ae4e1d39c42bf3750e8b614f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Odd=20Str=C3=A5b=C3=B8?= <oddstr13@openshell.no>
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)