Skip to content

Commit d15c8e1

Browse files
author
sfstar
authored
Merge pull request #50 from ChristophPech/main
Added custom steps to const and support for float numbers
2 parents 3ef70f3 + 0c744ac commit d15c8e1

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

custom_components/victron/const.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,12 @@ def __init__(self, optionsEnum: Enum) -> None:
9393

9494

9595
class RegisterInfo():
96-
def __init__(self, register, dataType, unit="", scale=1, entityType: EntityType = ReadEntityType()) -> None:
96+
def __init__(self, register, dataType, unit="", scale=1, entityType: EntityType = ReadEntityType(), step=0) -> None:
9797
self.register = register
9898
self.dataType = dataType
9999
self.unit = unit
100100
self.scale = scale
101+
self.step = step
101102
#Only used for writeable entities
102103
self.entityType = entityType
103104

@@ -596,13 +597,13 @@ class charger_mode(Enum):
596597
"settings_ess_maxchargepercentage": RegisterInfo(register=2701, dataType=UINT16, unit=PERCENTAGE, entityType=SliderWriteType()),
597598
"settings_ess_maxdischargepercentage": RegisterInfo(register=2702, dataType=UINT16, unit=PERCENTAGE, entityType=SliderWriteType()),
598599
"settings_ess_acpowersetpoint2": RegisterInfo(2703, INT16, UnitOfPower.WATT, 0.01, SliderWriteType("AC", True)), # NOTE: Duplicate register exposed by victron
599-
"settings_ess_maxdischargepower": RegisterInfo(2704, UINT16, UnitOfPower.WATT, 0.1, SliderWriteType("DC", False)),
600+
"settings_ess_maxdischargepower": RegisterInfo(2704, UINT16, UnitOfPower.WATT, 0.1, SliderWriteType("DC", False), 50),
600601
"settings_ess_maxchargecurrent": RegisterInfo(register=2705, dataType=INT16, unit=ELECTRIC_CURRENT_AMPERE, entityType=SliderWriteType("DC", True)),
601602
"settings_ess_maxfeedinpower": RegisterInfo(2706, INT16, UnitOfPower.WATT, 0.01, SliderWriteType("AC", True)),
602603
"settings_ess_overvoltagefeedin": RegisterInfo(register=2707, dataType=INT16, entityType=SwitchWriteType()),
603604
"settings_ess_preventfeedback": RegisterInfo(register=2708, dataType=INT16, entityType=SwitchWriteType()),
604605
"settings_ess_feedinpowerlimit": RegisterInfo(register=2709, dataType=INT16, entityType=BoolReadEntityType()),
605-
"settings_systemsetup_maxchargevoltage": RegisterInfo(2710, UINT16, ELECTRIC_POTENTIAL_VOLT, 10, SliderWriteType("DC", False))
606+
"settings_systemsetup_maxchargevoltage": RegisterInfo(2710, UINT16, ELECTRIC_POTENTIAL_VOLT, 10, SliderWriteType("DC", False), 0.1)
606607
}
607608

608609
gps_registers = {
@@ -637,7 +638,7 @@ class ess_mode(Enum):
637638

638639
settings_ess_registers = {
639640
"settings_ess_batterylife_state": RegisterInfo(register=2900, dataType=UINT16, entityType=SelectWriteType(ess_batterylife_state)),
640-
"settings_ess_batterylife_minimumsoc": RegisterInfo(2901, UINT16, PERCENTAGE, 10, SliderWriteType()),
641+
"settings_ess_batterylife_minimumsoc": RegisterInfo(2901, UINT16, PERCENTAGE, 10, SliderWriteType(), 5),
641642
"settings_ess_mode": RegisterInfo(register=2902, dataType=UINT16, entityType=SelectWriteType(ess_mode)),
642643
"settings_ess_batterylife_soclimit": RegisterInfo(2903, UINT16, PERCENTAGE, 10),
643644
}

custom_components/victron/coordinator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ def encode_scaling(self, value, unit, scale):
118118
return value
119119
else:
120120
if unit == "" and scale == 1:
121-
return round(value)
121+
return int(round(value))
122122
else:
123-
return value * scale
123+
return int(value * scale)
124124

125125
def get_data(self):
126126
return self.data

custom_components/victron/number.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ async def async_setup_entry(
7575
native_max_value=determine_max_value(registerInfo.unit, config_entry.options, registerInfo.entityType.powerType),
7676
entity_category=EntityCategory.CONFIG,
7777
address=registerInfo.register,
78-
scale = registerInfo.scale
78+
scale = registerInfo.scale,
79+
step = registerInfo.step
7980
))
8081

8182
entities = []
@@ -143,11 +144,13 @@ class VictronNumberMixin:
143144
"""A class that describes number entities."""
144145
scale: int
145146

147+
class VictronNumberStep:
148+
step: float = 0
149+
146150
@dataclass
147-
class VictronEntityDescription(NumberEntityDescription, VictronWriteBaseEntityDescription, VictronNumberMixin):
151+
class VictronEntityDescription(NumberEntityDescription, VictronWriteBaseEntityDescription, VictronNumberMixin, VictronNumberStep):
148152
"""Describes victron number entity."""
149153

150-
151154
class VictronNumber(NumberEntity):
152155
"""Victron number."""
153156

@@ -184,12 +187,12 @@ async def async_set_native_value(self, value: float) -> None:
184187
#TODO convert float to int again with scale respected
185188
if value < 0:
186189
value = UINT16_MAX + value
187-
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))
190+
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))
188191
await self.coordinator.async_update_local_entry(self.data_key, int(value))
189192

190193

191194
@property
192-
def native_value(self) -> int:
195+
def native_value(self) -> float:
193196
"""Return the state of the entity."""
194197
value = self.description.value_fn(data=self.coordinator.processed_data(), slave=self.description.slave, key=self.description.key)
195198
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:
198201

199202
@property
200203
def native_step(self) -> float | None:
204+
if self.description.step > 0:
205+
return self.description.step
201206
max = self.native_max_value
202207
min = self.native_min_value
203208
gap = len(list(range(int(min), int(max), 1)))

0 commit comments

Comments
 (0)