Skip to content

Commit

Permalink
Merge pull request #109 from mvn23/fix-linter-errors
Browse files Browse the repository at this point in the history
Fix type annotations and linter errors
  • Loading branch information
wimb0 authored Feb 11, 2025
2 parents cf73cf8 + 1140911 commit ee65ed8
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 16 deletions.
34 changes: 20 additions & 14 deletions custom_components/saj_modbus/hub.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
from homeassistant.components.number import DOMAIN as NUMBER_DOMAIN
from pymodbus.client import ModbusTcpClient
from pymodbus.constants import Endian
from pymodbus.exceptions import ConnectionException
from pymodbus.exceptions import ConnectionException, ModbusException
from pymodbus.pdu import ModbusPDU
from .payload import BinaryPayloadDecoder

from .const import (
Expand Down Expand Up @@ -63,21 +64,21 @@ def close(self) -> None:
"""Disconnect client."""
with self._lock:
self._client.close()

def _read_holding_registers(self, unit, address, count):
"""Read holding registers."""
with self._lock:
return self._client.read_holding_registers(
address=address, count=count, slave=unit
)

def _write_registers(self, unit: int, address: int, values: list[int] | int):
def _write_registers(self, unit: int, address: int, values: list[int]) -> ModbusPDU:
"""Write registers."""
with self._lock:
return self._client.write_registers(
address=address, values=values, slave=unit
)

async def _async_update_data(self) -> dict:
realtime_data = {}
try:
Expand Down Expand Up @@ -304,25 +305,30 @@ def translate_fault_code_to_messages(

return messages

def limiter_is_disabled(self):
def limiter_is_disabled(self) -> bool:
"""Return True if the limiter entity is disabled, False otherwise."""
ent_reg = entity_registry.async_get(self.hass)
limiter_entity_id = ent_reg.async_get_entity_id(NUMBER_DOMAIN, DOMAIN, f"{self.name}_limitpower")
if limiter_entity_id is None:
limiter_entity_id = ent_reg.async_get_entity_id(
NUMBER_DOMAIN, DOMAIN, f"{self.name}_limitpower"
)
if (
limiter_entity_id is None
or (ent_reg_entry := ent_reg.async_get(limiter_entity_id)) is None
):
return True
return ent_reg.async_get(limiter_entity_id).disabled
return ent_reg_entry.disabled

def set_limitpower(self, value: int):
def set_limitpower(self, value: float) -> None:
"""Limit the power output of the inverter."""
if self.limiter_is_disabled():
return
response = self._write_registers(unit=1, address=0x801F, values=[int(value*10)])
response = self._write_registers(unit=1, address=0x801F, values=[int(value * 10)])
if response.isError():
return
self.data["limitpower"] = value
self.hass.add_job(self.async_update_listeners)

def set_date_and_time(self, date_time: datetime = None):
def set_date_and_time(self, date_time: datetime | None = None) -> None:
"""Set the time and date on the inverter."""
if date_time is None:
date_time = datetime.now()
Expand All @@ -331,14 +337,14 @@ def set_date_and_time(self, date_time: datetime = None):
date_time.year,
(date_time.month << 8) + date_time.day,
(date_time.hour << 8) + date_time.minute,
(date_time.second << 8)
(date_time.second << 8),
]

response = self._write_registers(unit=1, address=0x8020, values=values)
if response.isError():
raise response
raise ModbusException("Error setting date and time")

def set_value(self, key: str, value: int):
def set_value(self, key: str, value: float) -> None:
"""Set value matching key."""
if key == "limitpower":
self.set_limitpower(value)
7 changes: 5 additions & 2 deletions custom_components/saj_modbus/number.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Number entity for SAJ Modbus integration."""

from __future__ import annotations

import logging
Expand Down Expand Up @@ -46,6 +47,8 @@ async def async_setup_entry(hass, entry, async_add_entities):
class SajNumber(CoordinatorEntity, NumberEntity):
"""Representation of an SAJ Modbus number."""

coordinator: SAJModbusHub

def __init__(
self,
platform_name: str,
Expand All @@ -63,14 +66,14 @@ def __init__(

@property
def available(self) -> bool:
"""Return entity availability."""
return self.native_value is not None

@property
def native_value(self) -> Optional[int]:
def native_value(self) -> float | None:
"""Return the state of the number entity."""
return self.coordinator.data.get(self.entity_description.key, None)

def set_native_value(self, value: float) -> None:
"""Update the current value."""
self.coordinator.set_value(self.entity_description.key, value)

0 comments on commit ee65ed8

Please sign in to comment.