Skip to content

Commit

Permalink
refactor: Moved Date/Time formats into constants
Browse files Browse the repository at this point in the history
  • Loading branch information
davidrapan committed Oct 6, 2024
1 parent 8560dbe commit adce259
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 12 deletions.
1 change: 1 addition & 0 deletions custom_components/solarman/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,4 @@ def is_on(self) -> bool | None:
def update(self):
self.set_state(self.coordinator.inverter.state)
self._attr_extra_state_attributes["updated"] = self.coordinator.inverter.state_updated.strftime("%m/%d/%Y, %H:%M:%S")
# Maybe set the timestamp using HA's datetime format???
5 changes: 4 additions & 1 deletion custom_components/solarman/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import asyncio
import aiofiles

from datetime import datetime
from datetime import datetime, time

from .const import *

Expand Down Expand Up @@ -90,3 +90,6 @@ def get_battery_cycles(charge, capacity, voltage):

def get_dt_as_list_int(dt: datetime, long):
return [(dt.year - 2000 << 8) + dt.month, (dt.day << 8) + dt.hour, (dt.minute << 8) + dt.second] if not long else [dt.year - 2000, dt.month, dt.day, dt.hour, dt.minute, dt.second]

def get_t_as_list_int(t: time, long):
return [t.hour * 100 + t.minute,] if not long else [t.hour, t.minute]
5 changes: 4 additions & 1 deletion custom_components/solarman/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

DISCOVERY_PORT = 48899
DISCOVERY_TIMEOUT = 1.0
DISCOVERY_MESSAGE = "WIFIKIT-214028-READ".encode()
DISCOVERY_MESSAGE = ["WIFIKIT-214028-READ".encode(), "HF-A11ASSISTHREAD".encode()]
DISCOVERY_RECV_MESSAGE_SIZE = 1024

COMPONENTS_DIRECTORY = "custom_components"
Expand Down Expand Up @@ -104,3 +104,6 @@
SERVICE_READ_INPUT_REGISTERS = "read_input_registers"
SERVICE_WRITE_HOLDING_REGISTER = "write_holding_register"
SERVICE_WRITE_MULTIPLE_HOLDING_REGISTERS = "write_multiple_holding_registers"

DATETIME_FORMAT = "%y/%m/%d %H:%M:%S"
TIME_FORMAT = "%H:%M"
6 changes: 3 additions & 3 deletions custom_components/solarman/datetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ def native_value(self) -> datetime | None:
"""Return the value reported by the datetime."""
if not self._attr_native_value:
return None
return datetime.strptime(self._attr_native_value, '%y/%m/%d %H:%M:%S').replace(tzinfo = ZoneInfo(self.coordinator.hass.config.time_zone))
return datetime.strptime(self._attr_native_value, DATETIME_FORMAT).replace(tzinfo = ZoneInfo(self.coordinator.hass.config.time_zone))

async def async_set_value(self, value: datetime) -> None:
"""Change the date/time."""
if await self.coordinator.inverter.call(CODE.WRITE_MULTIPLE_HOLDING_REGISTERS, self.register, get_dt_as_list_int(value.astimezone(ZoneInfo(self.coordinator.hass.config.time_zone)), self._multiple_registers), ACTION_ATTEMPTS_MAX) > 0:
self.set_state(value)
if await self.coordinator.inverter.call(CODE.WRITE_MULTIPLE_HOLDING_REGISTERS, self.register, get_dt_as_list_int(value, self._multiple_registers), ACTION_ATTEMPTS_MAX) > 0:
self.set_state(value.strftime(DATETIME_FORMAT))
self.async_write_ha_state()
2 changes: 1 addition & 1 deletion custom_components/solarman/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ async def _discover(self, ips = IP_BROADCAST, wait = False, source = IP_ANY) ->
sock.bind((source, PORT_ANY))

for ip in ensure_list(ips):
await loop.sock_sendto(sock, DISCOVERY_MESSAGE, (ip, DISCOVERY_PORT))
await loop.sock_sendto(sock, DISCOVERY_MESSAGE[0], (ip, DISCOVERY_PORT))

while True:
try:
Expand Down
2 changes: 1 addition & 1 deletion custom_components/solarman/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@ def try_parse_datetime(self, rawData, definition, start, length):

try:
if not "platform" in definition:
value = datetime.strptime(value, '%y/%m/%d %H:%M:%S')
value = datetime.strptime(value, DATETIME_FORMAT)
self.set_state(key, value)
except Exception as e:
_LOGGER.debug(f"ParameterParser.try_parse_datetime: start: {start}, length: {length}, rawData: {rawData}, definition: {definition} [{format_exception(e)}]")
Expand Down
9 changes: 4 additions & 5 deletions custom_components/solarman/time.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,11 @@ def native_value(self) -> time | None:
if not self._attr_native_value:
return None
if isinstance(self._attr_native_value, list) and len(self._attr_native_value) > 1:
return datetime.strptime(f"{self._attr_native_value[0]}:{self._attr_native_value[1]}", "%H:%M").time()
return datetime.strptime(self._attr_native_value, "%H:%M").time()
return datetime.strptime(f"{self._attr_native_value[0]}:{self._attr_native_value[1]}", TIME_FORMAT).time()
return datetime.strptime(self._attr_native_value, TIME_FORMAT).time()

async def async_set_value(self, value: time) -> None:
"""Change the time."""
list_int = [int(value.strftime("%H%M")),] if not self._multiple_registers else [int(value.strftime("%H")), int(value.strftime("%M"))]
if await self.coordinator.inverter.call(CODE.WRITE_MULTIPLE_HOLDING_REGISTERS, self.register, list_int, ACTION_ATTEMPTS_MAX) > 0:
self.set_state(value.strftime("%H:%M"))
if await self.coordinator.inverter.call(CODE.WRITE_MULTIPLE_HOLDING_REGISTERS, self.register, get_t_as_list_int(value, self._multiple_registers), ACTION_ATTEMPTS_MAX) > 0:
self.set_state(value.strftime(TIME_FORMAT))
self.async_write_ha_state()

0 comments on commit adce259

Please sign in to comment.