From 0c744ac64ade1a33cca577d6206185b0c3d06f6a Mon Sep 17 00:00:00 2001 From: Christoph Pech Date: Wed, 15 Feb 2023 12:42:20 +0100 Subject: [PATCH] Added custom steps to const and support for float numbers --- custom_components/victron/const.py | 9 +++++---- custom_components/victron/coordinator.py | 4 ++-- custom_components/victron/number.py | 15 ++++++++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/custom_components/victron/const.py b/custom_components/victron/const.py index d26962f..ef83bad 100644 --- a/custom_components/victron/const.py +++ b/custom_components/victron/const.py @@ -93,11 +93,12 @@ def __init__(self, optionsEnum: Enum) -> None: class RegisterInfo(): - def __init__(self, register, dataType, unit="", scale=1, entityType: EntityType = ReadEntityType()) -> None: + def __init__(self, register, dataType, unit="", scale=1, entityType: EntityType = ReadEntityType(), step=0) -> None: self.register = register self.dataType = dataType self.unit = unit self.scale = scale + self.step = step #Only used for writeable entities self.entityType = entityType @@ -596,13 +597,13 @@ class charger_mode(Enum): "settings_ess_maxchargepercentage": RegisterInfo(register=2701, dataType=UINT16, unit=PERCENTAGE, entityType=SliderWriteType()), "settings_ess_maxdischargepercentage": RegisterInfo(register=2702, dataType=UINT16, unit=PERCENTAGE, entityType=SliderWriteType()), "settings_ess_acpowersetpoint2": RegisterInfo(2703, INT16, UnitOfPower.WATT, 0.01, SliderWriteType("AC", True)), # NOTE: Duplicate register exposed by victron - "settings_ess_maxdischargepower": RegisterInfo(2704, UINT16, UnitOfPower.WATT, 0.1, SliderWriteType("DC", False)), + "settings_ess_maxdischargepower": RegisterInfo(2704, UINT16, UnitOfPower.WATT, 0.1, SliderWriteType("DC", False), 50), "settings_ess_maxchargecurrent": RegisterInfo(register=2705, dataType=INT16, unit=ELECTRIC_CURRENT_AMPERE, entityType=SliderWriteType("DC", True)), "settings_ess_maxfeedinpower": RegisterInfo(2706, INT16, UnitOfPower.WATT, 0.01, SliderWriteType("AC", True)), "settings_ess_overvoltagefeedin": RegisterInfo(register=2707, dataType=INT16, entityType=SwitchWriteType()), "settings_ess_preventfeedback": RegisterInfo(register=2708, dataType=INT16, entityType=SwitchWriteType()), "settings_ess_feedinpowerlimit": RegisterInfo(register=2709, dataType=INT16, entityType=BoolReadEntityType()), - "settings_systemsetup_maxchargevoltage": RegisterInfo(2710, UINT16, ELECTRIC_POTENTIAL_VOLT, 10, SliderWriteType("DC", False)) + "settings_systemsetup_maxchargevoltage": RegisterInfo(2710, UINT16, ELECTRIC_POTENTIAL_VOLT, 10, SliderWriteType("DC", False), 0.1) } gps_registers = { @@ -637,7 +638,7 @@ class ess_mode(Enum): settings_ess_registers = { "settings_ess_batterylife_state": RegisterInfo(register=2900, dataType=UINT16, entityType=SelectWriteType(ess_batterylife_state)), - "settings_ess_batterylife_minimumsoc": RegisterInfo(2901, UINT16, PERCENTAGE, 10, SliderWriteType()), + "settings_ess_batterylife_minimumsoc": RegisterInfo(2901, UINT16, PERCENTAGE, 10, SliderWriteType(), 5), "settings_ess_mode": RegisterInfo(register=2902, dataType=UINT16, entityType=SelectWriteType(ess_mode)), "settings_ess_batterylife_soclimit": RegisterInfo(2903, UINT16, PERCENTAGE, 10), } diff --git a/custom_components/victron/coordinator.py b/custom_components/victron/coordinator.py index 77dbeed..97d31f6 100644 --- a/custom_components/victron/coordinator.py +++ b/custom_components/victron/coordinator.py @@ -118,9 +118,9 @@ def encode_scaling(self, value, unit, scale): return value else: if unit == "" and scale == 1: - return round(value) + return int(round(value)) else: - return value * scale + return int(value * scale) def get_data(self): return self.data diff --git a/custom_components/victron/number.py b/custom_components/victron/number.py index 25f784a..74bb1d9 100644 --- a/custom_components/victron/number.py +++ b/custom_components/victron/number.py @@ -75,7 +75,8 @@ async def async_setup_entry( native_max_value=determine_max_value(registerInfo.unit, config_entry.options, registerInfo.entityType.powerType), entity_category=EntityCategory.CONFIG, address=registerInfo.register, - scale = registerInfo.scale + scale = registerInfo.scale, + step = registerInfo.step )) entities = [] @@ -143,11 +144,13 @@ class VictronNumberMixin: """A class that describes number entities.""" scale: int +class VictronNumberStep: + step: float = 0 + @dataclass -class VictronEntityDescription(NumberEntityDescription, VictronWriteBaseEntityDescription, VictronNumberMixin): +class VictronEntityDescription(NumberEntityDescription, VictronWriteBaseEntityDescription, VictronNumberMixin, VictronNumberStep): """Describes victron number entity.""" - class VictronNumber(NumberEntity): """Victron number.""" @@ -184,12 +187,12 @@ async def async_set_native_value(self, value: float) -> None: #TODO convert float to int again with scale respected if value < 0: value = UINT16_MAX + value - self.coordinator.write_register(unit=self.description.slave, address=self.description.address, value=self.coordinator.encode_scaling(int(value), self.description.native_unit_of_measurement, self.description.scale)) + self.coordinator.write_register(unit=self.description.slave, address=self.description.address, value=self.coordinator.encode_scaling(value, self.description.native_unit_of_measurement, self.description.scale)) await self.coordinator.async_update_local_entry(self.data_key, int(value)) @property - def native_value(self) -> int: + def native_value(self) -> float: """Return the state of the entity.""" value = self.description.value_fn(data=self.coordinator.processed_data(), slave=self.description.slave, key=self.description.key) if value > round(UINT16_MAX/2): #Half of the UINT16 is reserved for positive and half for negative values @@ -198,6 +201,8 @@ def native_value(self) -> int: @property def native_step(self) -> float | None: + if self.description.step > 0: + return self.description.step max = self.native_max_value min = self.native_min_value gap = len(list(range(int(min), int(max), 1)))