-
-
Notifications
You must be signed in to change notification settings - Fork 147
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #16 from Louisvdw/refactor-battery-object
Refactor battery object
- Loading branch information
Showing
9 changed files
with
600 additions
and
485 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
dos2unix conf/serial-starter.d etc/dbus-serialbattery/dbus-serialbattery.py etc/dbus-serialbattery/service/run etc/dbus-serialbattery/service/log/run rc.local etc/dbus-serialbattery/LICENSE etc/dbus-serialbattery/README.md | ||
tar -czvf venus-data.tar.gz --mode='a+rwX' conf/serial-starter.d etc/dbus-serialbattery/dbus-serialbattery.py etc/dbus-serialbattery/service/run etc/dbus-serialbattery/service/log/run rc.local etc/dbus-serialbattery/LICENSE etc/dbus-serialbattery/README.md | ||
dos2unix conf/serial-starter.d etc/dbus-serialbattery/dbus-serialbattery.py etc/dbus-serialbattery/service/run etc/dbus-serialbattery/service/log/run rc.local etc/dbus-serialbattery/LICENSE etc/dbus-serialbattery/README.md etc/dbus-serialbattery/start-serialbattery.sh etc/dbus-serialbattery/battery.py etc/dbus-serialbattery/dbushelper.py etc/dbus-serialbattery/lttjdb.py etc/dbus-serialbattery/utils.py | ||
tar -czvf venus-data.tar.gz --mode='a+rwX' conf/serial-starter.d etc/dbus-serialbattery/dbus-serialbattery.py etc/dbus-serialbattery/service/run etc/dbus-serialbattery/service/log/run rc.local etc/dbus-serialbattery/LICENSE etc/dbus-serialbattery/README.md etc/dbus-serialbattery/start-serialbattery.sh etc/dbus-serialbattery/battery.py etc/dbus-serialbattery/dbushelper.py etc/dbus-serialbattery/lttjdb.py etc/dbus-serialbattery/utils.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
# -*- coding: utf-8 -*- | ||
from __future__ import absolute_import, division, print_function, unicode_literals | ||
import utils | ||
|
||
# Constants - Need to dynamically get them in future | ||
# Cell min/max voltages - used with the cell count to get the min/max battery voltage | ||
MIN_CELL_VOLTAGE = 3.1 | ||
MAX_CELL_VOLTAGE = 3.45 | ||
# max battery charge/discharge current | ||
MAX_BATTERY_CURRENT = 50.0 | ||
MAX_BATTERY_DISCHARGE_CURRENT = 60.0 | ||
|
||
class Protection(object): | ||
# 2 = Alarm, 1 = Warning, 0 = Normal | ||
def __init__(self): | ||
self.voltage_high = None | ||
self.voltage_low = None | ||
self.soc_low = None | ||
self.current_over = None | ||
self.current_under = None | ||
self.cell_imbalance = None | ||
self.internal_failure = None | ||
self.temp_high_charge = None | ||
self.temp_low_charge = None | ||
self.temp_high_discharge = None | ||
self.temp_low_discharge = None | ||
|
||
|
||
class Cell: | ||
voltage = 0 | ||
balance = None | ||
|
||
def __init__(self, balance): | ||
self.balance = balance | ||
|
||
|
||
class Battery(object): | ||
|
||
def __init__(self, port, baud): | ||
self.port = port | ||
self.baud_rate = baud | ||
self.role = 'battery' | ||
self.type = 'Generic' | ||
|
||
self.hardware_version = None | ||
self.voltage = None | ||
self.current = None | ||
self.capacity_remain = None | ||
self.capacity = None | ||
self.cycles = None | ||
self.production = None | ||
self.protection = Protection() | ||
self.version = None | ||
self.soc = None | ||
self.charge_fet = None | ||
self.discharge_fet = None | ||
self.cell_count = None | ||
self.temp_censors = None | ||
self.temp1 = None | ||
self.temp2 = None | ||
self.cells = [] | ||
self.control_charging = None | ||
self.control_voltage = None | ||
self.control_current = None | ||
self.control_previous_total = None | ||
self.control_previous_max = None | ||
self.control_discharge_current = None | ||
self.control_charge_current = None | ||
self.control_allow_charge = None | ||
|
||
def test_connection(self): | ||
# Each driver must override this function to test if a connection can be made | ||
# return false when fail, true if successful | ||
return false | ||
|
||
def get_settings(self): | ||
# Each driver must override this function to read/set the battery settings | ||
# It is called once after a successful connection by DbusHelper.setup_vedbus() | ||
# Values: battery_type, version, hardware_version, min_battery_voltage, max_battery_voltage, | ||
# MAX_BATTERY_CURRENT, MAX_BATTERY_DISCHARGE_CURRENT, cell_count, capacity | ||
# return false when fail, true if successful | ||
return false | ||
|
||
def refresh_data(self): | ||
# Each driver must override this function to read battery data and populate this class | ||
# It is called each poll just before the data is published to vedbus | ||
# return false when fail, true if successful | ||
return false | ||
|
||
def to_temp(self, sensor, value): | ||
# Keep the temp value between -20 and 100 to handle sensor issues or no data. | ||
# The BMS should have already protected before those limits have been reached. | ||
if sensor == 1: | ||
self.temp1 = min(max(value, -20), 100) | ||
if sensor == 2: | ||
self.temp2 = min(max(value, -20), 100) | ||
|
||
def manage_charge_current(self): | ||
# Start with the current values | ||
charge_current = self.control_charge_current | ||
discharge_current = self.control_discharge_current | ||
|
||
# Change depending on the SOC values | ||
if self.soc > 99: | ||
self.control_allow_charge = False | ||
else: | ||
self.control_allow_charge = True | ||
# Change depending on the SOC values | ||
if 98 < self.soc <= 100: | ||
self.control_charge_current = 1 | ||
elif 95 < self.soc <= 97: | ||
self.control_charge_current = 4 | ||
elif 91 < self.soc <= 95: | ||
self.control_charge_current = MAX_BATTERY_CURRENT/2 | ||
else: | ||
self.control_charge_current = MAX_BATTERY_CURRENT | ||
|
||
# Change depending on the SOC values | ||
if self.soc <= 20: | ||
self.control_discharge_current = 5 | ||
elif 20 < self.soc <= 30: | ||
self.control_discharge_current = MAX_BATTERY_DISCHARGE_CURRENT/4 | ||
elif 30 < self.soc <= 35: | ||
self.control_discharge_current = MAX_BATTERY_DISCHARGE_CURRENT/2 | ||
else: | ||
self.control_discharge_current = MAX_BATTERY_DISCHARGE_CURRENT | ||
|
||
def get_min_cell(self): | ||
min_voltage = 9999 | ||
min_cell = None | ||
for c in range(self.cell_count): | ||
if min_voltage > self.cells[c].voltage: | ||
min_voltage = self.cells[c].voltage | ||
min_cell = c | ||
return min_cell | ||
|
||
def get_max_cell(self): | ||
max_voltage = 0 | ||
max_cell = None | ||
for c in range(self.cell_count): | ||
if max_voltage < self.cells[c].voltage: | ||
max_voltage = self.cells[c].voltage | ||
max_cell = c | ||
return max_cell | ||
|
||
def get_balancing(self): | ||
for c in range(self.cell_count): | ||
if self.cells[c].balance: | ||
return True | ||
return False |
Oops, something went wrong.