From 708d2545e949dd16390150190c07d2f0fd98e4fa Mon Sep 17 00:00:00 2001 From: Oleg Gurevich Date: Tue, 13 Jun 2023 07:35:11 +0200 Subject: [PATCH 1/4] proposal to #659 formatted :) --- etc/dbus-serialbattery/battery.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/etc/dbus-serialbattery/battery.py b/etc/dbus-serialbattery/battery.py index 5ffabd81..16427db8 100644 --- a/etc/dbus-serialbattery/battery.py +++ b/etc/dbus-serialbattery/battery.py @@ -108,6 +108,8 @@ def init_values(self): self.min_battery_voltage = None self.allow_max_voltage = True self.max_voltage_start_time = None + self.transition_start_time = None + self.control_voltage_at_transition_start = None self.charge_mode = None self.charge_limitation = None self.discharge_limitation = None @@ -343,13 +345,25 @@ def manage_charge_voltage_linear(self) -> None: else: floatVoltage = round((utils.FLOAT_CELL_VOLTAGE * self.cell_count), 3) if self.control_voltage: - if self.control_voltage >= (floatVoltage + 0.005): - self.control_voltage -= 0.005 - else: - self.control_voltage = floatVoltage + if ( + self.charge_mode != "Float" + and self.charge_mode != "Float Transition" + ): + self.transition_start_time = time.time() + self.initial_control_voltage = self.control_voltage + self.charge_mode = "Float Transition" + elif self.charge_mode == "Float Transition": + elapsed_time = time.time() - self.transition_start_time + # Duration in seconds for smooth voltage drop from absorption to float + FLOAT_MODE_TRANSITION_DURATION = 180 + t = min(1, elapsed_time / FLOAT_MODE_TRANSITION_DURATION) + self.control_voltage = ( + 1 - t + ) * self.initial_control_voltage + t * floatVoltage + if t == 1: + self.charge_mode = "Float" else: self.control_voltage = floatVoltage - self.charge_mode = "Float" if ( self.allow_max_voltage From 0ab8bc665ce578745909d7648a0f71a1d73a0614 Mon Sep 17 00:00:00 2001 From: Oleg Gurevich Date: Tue, 13 Jun 2023 14:24:02 +0200 Subject: [PATCH 2/4] bugfix proposal to #659 --- etc/dbus-serialbattery/battery.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/etc/dbus-serialbattery/battery.py b/etc/dbus-serialbattery/battery.py index 16427db8..1f5914bf 100644 --- a/etc/dbus-serialbattery/battery.py +++ b/etc/dbus-serialbattery/battery.py @@ -345,15 +345,12 @@ def manage_charge_voltage_linear(self) -> None: else: floatVoltage = round((utils.FLOAT_CELL_VOLTAGE * self.cell_count), 3) if self.control_voltage: - if ( - self.charge_mode != "Float" - and self.charge_mode != "Float Transition" - ): - self.transition_start_time = time.time() + if not self.charge_mode.startswith("Float"): + self.transition_start_time = int(time()) self.initial_control_voltage = self.control_voltage self.charge_mode = "Float Transition" - elif self.charge_mode == "Float Transition": - elapsed_time = time.time() - self.transition_start_time + elif self.charge_mode.startswith("Float Transition"): + elapsed_time = int(time()) - self.transition_start_time # Duration in seconds for smooth voltage drop from absorption to float FLOAT_MODE_TRANSITION_DURATION = 180 t = min(1, elapsed_time / FLOAT_MODE_TRANSITION_DURATION) @@ -362,8 +359,11 @@ def manage_charge_voltage_linear(self) -> None: ) * self.initial_control_voltage + t * floatVoltage if t == 1: self.charge_mode = "Float" + else: + self.charge_mode = "Float Transition" else: self.control_voltage = floatVoltage + self.charge_mode = "Float" if ( self.allow_max_voltage From cac8bfb12e77ee82afc8d23e0c7fa7f47bf0fe4a Mon Sep 17 00:00:00 2001 From: Oleg Gurevich Date: Tue, 13 Jun 2023 14:36:28 +0200 Subject: [PATCH 3/4] refactor setting float charge_mode --- etc/dbus-serialbattery/battery.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/etc/dbus-serialbattery/battery.py b/etc/dbus-serialbattery/battery.py index 1f5914bf..d5c87e4b 100644 --- a/etc/dbus-serialbattery/battery.py +++ b/etc/dbus-serialbattery/battery.py @@ -344,11 +344,12 @@ def manage_charge_voltage_linear(self) -> None: else: floatVoltage = round((utils.FLOAT_CELL_VOLTAGE * self.cell_count), 3) + chargeMode = "Float" if self.control_voltage: if not self.charge_mode.startswith("Float"): self.transition_start_time = int(time()) self.initial_control_voltage = self.control_voltage - self.charge_mode = "Float Transition" + chargeMode = "Float Transition" elif self.charge_mode.startswith("Float Transition"): elapsed_time = int(time()) - self.transition_start_time # Duration in seconds for smooth voltage drop from absorption to float @@ -358,12 +359,12 @@ def manage_charge_voltage_linear(self) -> None: 1 - t ) * self.initial_control_voltage + t * floatVoltage if t == 1: - self.charge_mode = "Float" + chargeMode = "Float" else: - self.charge_mode = "Float Transition" + chargeMode = "Float Transition" else: self.control_voltage = floatVoltage - self.charge_mode = "Float" + self.charge_mode = chargeMode if ( self.allow_max_voltage From be2a4d5fdbc98755f4a3233a6c55fd9bd1ada2cb Mon Sep 17 00:00:00 2001 From: Oleg Gurevich Date: Fri, 16 Jun 2023 08:36:56 +0200 Subject: [PATCH 4/4] Duration of transition to float depends on number of cells --- etc/dbus-serialbattery/battery.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/etc/dbus-serialbattery/battery.py b/etc/dbus-serialbattery/battery.py index d5c87e4b..b4b4623b 100644 --- a/etc/dbus-serialbattery/battery.py +++ b/etc/dbus-serialbattery/battery.py @@ -353,7 +353,8 @@ def manage_charge_voltage_linear(self) -> None: elif self.charge_mode.startswith("Float Transition"): elapsed_time = int(time()) - self.transition_start_time # Duration in seconds for smooth voltage drop from absorption to float - FLOAT_MODE_TRANSITION_DURATION = 180 + # depending on the number of cells + FLOAT_MODE_TRANSITION_DURATION = self.cell_count * 12 t = min(1, elapsed_time / FLOAT_MODE_TRANSITION_DURATION) self.control_voltage = ( 1 - t