Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make things configurable #412

Merged
merged 15 commits into from
Jan 14, 2023
4 changes: 2 additions & 2 deletions etc/dbus-serialbattery/battery.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from typing import Union, Tuple
from typing import Union, Tuple, List

from utils import logger
import utils
Expand Down Expand Up @@ -76,7 +76,7 @@ def __init__(self, port, baud, address):
self.temp_sensors = None
self.temp1 = None
self.temp2 = None
self.cells = []
self.cells: List[Cell] = []
self.control_charging = None
self.control_voltage = None
self.allow_max_voltage = True
Expand Down
17 changes: 12 additions & 5 deletions etc/dbus-serialbattery/dbus-serialbattery.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
# from ve_utils import exit_on_error

from dbushelper import DbusHelper
from utils import DRIVER_VERSION, DRIVER_SUBVERSION, logger
from utils import logger
import utils
from battery import Battery
from lltjbd import LltJbd
from daly import Daly
Expand All @@ -28,7 +29,7 @@
from ecs import Ecs
from lifepower import Lifepower

battery_types = [
supported_bms_types = [
{"bms": LltJbd, "baud": 9600},
{"bms": Ant, "baud": 19200},
{"bms": Daly, "baud": 9600, "address": b"\x40"},
Expand All @@ -40,7 +41,11 @@
{"bms": Renogy, "baud": 9600, "address": b"\xF7"},
{"bms": Ecs, "baud": 19200},
]

expected_bms_types = [
battery_type
for battery_type in supported_bms_types
if battery_type["bms"].__name__ == utils.BMS_TYPE or utils.BMS_TYPE == ""
]

logger.info("Starting dbus-serialbattery")

Expand All @@ -60,7 +65,7 @@ def get_battery(_port) -> Union[Battery, None]:
count = 3
while count > 0:
# create a new battery object that can read the battery and run connection test
for test in battery_types:
for test in expected_bms_types:
logger.info("Testing " + test["bms"].__name__)
batteryClass = test["bms"]
baud = test["baud"]
Expand All @@ -86,7 +91,9 @@ def get_port() -> str:
logger.info("No Port needed")
return "/dev/tty/USB9"

logger.info("dbus-serialbattery v" + str(DRIVER_VERSION) + DRIVER_SUBVERSION)
logger.info(
"dbus-serialbattery v" + str(utils.DRIVER_VERSION) + utils.DRIVER_SUBVERSION
)

port = get_port()
battery: Battery = get_battery(port)
Expand Down
138 changes: 138 additions & 0 deletions etc/dbus-serialbattery/default_config.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
[DEFAULT]
LINEAR_LIMITATION_ENABLE = False

; battery Current limits
MAX_BATTERY_CHARGE_CURRENT = 70.0
MAX_BATTERY_DISCHARGE_CURRENT = 90.0

; -------- Cell Voltage limitation ---------
; Description:
; Maximal charge / discharge current will be in-/decreased depending on min- and max-cell-voltages
; Example: 18cells * 3.55V/cell = 63.9V max charge voltage. 18 * 2.7V = 48,6V min discharge voltage
; ... but the (dis)charge current will be (in-/)decreased, if even ONE SINGLE BATTERY CELL reaches the limits

; Charge current control management referring to cell-voltage enable (True/False).
CCCM_CV_ENABLE = True
; Discharge current control management referring to cell-voltage enable (True/False).
DCCM_CV_ENABLE = True

; Set Steps to reduce battery current. The current will be changed linear between those steps
CELL_VOLTAGES_WHILE_CHARGING = 3.55,3.50,3.45,3.30
MAX_CHARGE_CURRENT_CV_FRACTION = 0,0.05,0.5,1

CELL_VOLTAGES_WHILE_DISCHARGING = 2.70,2.80,2.90,3.10
MAX_DISCHARGE_CURRENT_CV_FRACTION = 0,0.1,0.5,1

; -------- Temperature limitation ---------
; Description:
; Maximal charge / discharge current will be in-/decreased depending on temperature
; Example: The temperature limit will be monitored to control the currents. If there are two temperature senors,
; then the worst case will be calculated and the more secure lower current will be set.
; Charge current control management referring to temperature enable (True/False).
CCCM_T_ENABLE = True
; Charge current control management referring to temperature enable (True/False).
DCCM_T_ENABLE = True

; Set Steps to reduce battery current. The current will be changed linear between those steps
TEMPERATURE_LIMITS_WHILE_CHARGING = 0,2,5,10,15,20,35,40,55
MAX_CHARGE_CURRENT_T_FRACTION = 0,0.1,0.2,0.4,0.8,1,1,0.4,0

TEMPERATURE_LIMITS_WHILE_DISCHARGING = -20,0,5,10,15,45,55
MAX_DISCHARGE_CURRENT_T_FRACTION = 0,.2,.3,.4,1,1,0

; if the cell voltage reaches 3.55V, then reduce current battery-voltage by 0.01V
; if the cell voltage goes over 3.6V, then the maximum penalty will not be exceeded
; there will be a sum of all penalties for each cell, which exceeds the limits
PENALTY_AT_CELL_VOLTAGE = 3.45,3.55,3.6
; this voltage will be subtracted
PENALTY_BATTERY_VOLTAGE = 0.01,1.0,2.0


; -------- SOC limitation ---------
; Description:
; Maximal charge / discharge current will be increased / decreased depending on State of Charge, see CC_SOC_LIMIT1 etc.
; The State of Charge (SoC) charge / discharge current will be in-/decreased depending on SOC.
; Example: 16cells * 3.45V/cell = 55,2V max charge voltage. 16*2.9V = 46,4V min discharge voltage
; Cell min/max voltages - used with the cell count to get the min/max battery voltage
MIN_CELL_VOLTAGE = 2.9
MAX_CELL_VOLTAGE = 3.45
FLOAT_CELL_VOLTAGE = 3.35
MAX_VOLTAGE_TIME_SEC = 900
SOC_LEVEL_TO_RESET_VOLTAGE_LIMIT = 90

; Charge current control management enable (True/False).
CCCM_SOC_ENABLE = True
; Discharge current control management enable (True/False).
DCCM_SOC_ENABLE = True

; charge current soc limits
CC_SOC_LIMIT1 = 98
CC_SOC_LIMIT2 = 95
CC_SOC_LIMIT3 = 91

; charge current limits
CC_CURRENT_LIMIT1_FRACTION = 0.1
CC_CURRENT_LIMIT2_FRACTION = 0.3
CC_CURRENT_LIMIT3_FRACTION = 0.5

; discharge current soc limits
DC_SOC_LIMIT1 = 10
DC_SOC_LIMIT2 = 20
DC_SOC_LIMIT3 = 30

; discharge current limits
DC_CURRENT_LIMIT1_FRACTION = 0.1
DC_CURRENT_LIMIT2_FRACTION = 0.3
DC_CURRENT_LIMIT3_FRACTION = 0.5

; Charge voltage control management enable (True/False).
CVCM_ENABLE = False

; Simulate Midpoint graph (True/False).
MIDPOINT_ENABLE = False

; soc low levels
SOC_LOW_WARNING = 20
SOC_LOW_ALARM = 10

; Daly settings
; Battery capacity (amps) if the BMS does not support reading it
BATTERY_CAPACITY = 50
; Invert Battery Current. Default non-inverted. Set to -1 to invert
INVERT_CURRENT_MEASUREMENT = 1

; TIME TO SOC settings [Valid values 0-100, but I don't recommend more that 20 intervals]
; Set of SoC percentages to report on dbus. The more you specify the more it will impact system performance.
; TIME_TO_SOC_POINTS = [100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0]
; Every 5% SoC
; TIME_TO_SOC_POINTS = [100, 95, 90, 85, 75, 50, 25, 20, 10, 0]
; No data set to disable
TIME_TO_SOC_POINTS =
; Specify TimeToSoc value type: [Valid values 1,2,3]
; TIME_TO_SOC_VALUE_TYPE = 1 ; Seconds
; TIME_TO_SOC_VALUE_TYPE = 2 ; Time string HH:MN:SC
; Both Seconds and time str "<seconds> [days, HR:MN:SC]"
TIME_TO_SOC_VALUE_TYPE = 3
; Specify how many loop cycles between each TimeToSoc updates
TIME_TO_SOC_LOOP_CYCLES = 5
; Include TimeToSoC points when moving away from the SoC point. [Valid values True,False]
; These will be as negative time. Disabling this improves performance slightly.
TIME_TO_SOC_INC_FROM = False


; Select the format of cell data presented on dbus. [Valid values 0,1,2,3]
; 0 Do not publish all the cells (only the min/max cell data as used by the default GX)
; 1 Format: /Voltages/Cell; (also available for display on Remote Console)
; 2 Format: /Cell/#/Volts
; 3 Both formats 1 and 2
BATTERY_CELL_DATA_FORMAT = 1

; Settings for ESC GreenMeter and Lipro devices
GREENMETER_ADDRESS = 1
LIPRO_START_ADDRESS = 2
LIPRO_END_ADDRESS = 4
LIPRO_CELL_COUNT = 15

PUBLISH_CONFIG_VALUES = 1

BMS_TYPE =
Loading