Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions custom_components/victron/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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),
}
Expand Down
4 changes: 2 additions & 2 deletions custom_components/victron/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 10 additions & 5 deletions custom_components/victron/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down Expand Up @@ -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."""

Expand Down Expand Up @@ -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
Expand All @@ -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)))
Expand Down