Skip to content

Commit 5a7aa5e

Browse files
committed
Optimize coordinator
1 parent cad1b5e commit 5a7aa5e

File tree

1 file changed

+46
-47
lines changed

1 file changed

+46
-47
lines changed

custom_components/solvis_control/coordinator.py

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
77

8-
from pymodbus import ModbusException
98
import pymodbus.client as ModbusClient
109
from pymodbus.exceptions import ConnectionException, ModbusException
1110
from pymodbus.payload import BinaryPayloadDecoder, Endian
@@ -16,89 +15,89 @@
1615

1716

1817
class SolvisModbusCoordinator(DataUpdateCoordinator):
19-
"""My custom coordinator."""
18+
"""Coordinates data updates from a Solvis device via Modbus."""
2019

2120
def __init__(
2221
self,
2322
hass,
24-
conf_host,
25-
conf_port,
26-
conf_option_1: bool,
27-
conf_option_2: bool,
28-
conf_option_3: bool,
29-
conf_option_4: bool,
23+
host: str,
24+
port: int,
25+
option_hkr2: bool,
26+
option_hkr3: bool,
27+
option_solar: bool,
28+
option_heatpump: bool,
3029
):
31-
"""Initialize my coordinator."""
30+
"""Initializes the Solvis Modbus data coordinator."""
3231
super().__init__(
3332
hass,
3433
_LOGGER,
35-
# Name of the data. For logging purposes.
3634
name=DOMAIN,
37-
# Polling interval. Will only be polled if there are subscribers.
3835
update_interval=timedelta(seconds=30),
3936
)
40-
self.hass = hass
41-
self.CONF_OPTION_4 = conf_option_4
42-
self.CONF_OPTION_3 = conf_option_3
43-
self.CONF_OPTION_2 = conf_option_2
44-
self.CONF_OPTION_1 = conf_option_1
45-
self.logger.debug("Creating client")
46-
self.modbus = ModbusClient.AsyncModbusTcpClient(host=conf_host, port=conf_port)
37+
self.host = host
38+
self.port = port
39+
self.option_hkr2 = option_hkr2
40+
self.option_hkr3 = option_hkr3
41+
self.option_solar = option_solar
42+
self.option_heatpump = option_heatpump
4743

48-
async def _async_update_data(self):
49-
"""Fetch data from API endpoint.
44+
_LOGGER.debug("Creating Modbus client")
45+
self.modbus = ModbusClient.AsyncModbusTcpClient(host=host, port=port)
5046

51-
This is the place to pre-process the data to lookup tables
52-
so entities can quickly look up their data.
53-
"""
54-
self.logger.debug("Polling data")
47+
async def _async_update_data(self):
48+
"""Fetches and processes data from the Solvis device."""
5549

56-
parsed_data: dict = {}
57-
entity_registry = self.hass.data["entity_registry"]
50+
_LOGGER.debug("Polling data")
51+
parsed_data = {}
5852

5953
try:
6054
await self.modbus.connect()
61-
except ConnectionException:
62-
self.logger.warning("Couldn't connect to device")
63-
if self.modbus.connected:
55+
_LOGGER.debug(
56+
"Connected to Modbus for Solvis"
57+
) # Moved here for better context
58+
6459
for register in REGISTERS:
65-
if not self.CONF_OPTION_1 and register.conf_option == 1:
60+
if not self.option_hkr2 and register.conf_option == 1:
6661
continue
67-
if not self.CONF_OPTION_2 and register.conf_option == 2:
62+
if not self.option_hkr3 and register.conf_option == 2:
6863
continue
69-
if not self.CONF_OPTION_3 and register.conf_option == 3:
64+
if not self.option_solar and register.conf_option == 3:
7065
continue
71-
if not self.CONF_OPTION_4 and register.conf_option == 4:
66+
if not self.option_heatpump and register.conf_option == 4:
7267
continue
7368

7469
entity_id = f"{DOMAIN}.{register.name}"
75-
entity_entry = entity_registry.async_get(entity_id)
70+
entity_entry = self.hass.data["entity_registry"].async_get(entity_id)
7671
if entity_entry and entity_entry.disabled:
77-
self.logger.debug(f"Skipping disabled entity: {entity_id}")
72+
_LOGGER.debug(f"Skipping disabled entity: {entity_id}")
7873
continue
7974

80-
self.logger.debug("Connected to Modbus for Solvis")
8175
try:
8276
if register.register == 1:
8377
result = await self.modbus.read_input_registers(
8478
register.address, 1, 1
8579
)
86-
elif register.register == 2:
80+
else:
8781
result = await self.modbus.read_holding_registers(
8882
register.address, 1, 1
8983
)
90-
except ModbusException as error:
91-
self.logger.error(error)
92-
else:
93-
d = BinaryPayloadDecoder.fromRegisters(
84+
85+
decoder = BinaryPayloadDecoder.fromRegisters(
9486
result.registers, byteorder=Endian.BIG
9587
)
96-
parsed_data[register.name] = round(
97-
d.decode_16bit_int() * register.multiplier, 2
88+
value = round(decoder.decode_16bit_int() * register.multiplier, 2)
89+
parsed_data[register.name] = (
90+
abs(value) if register.absolute_value else value
9891
)
99-
if register.absolute_value:
100-
parsed_data[register.name] = abs(parsed_data[register.name])
101-
self.modbus.close()
10292

103-
# Pass data back to sensors
93+
except ModbusException as error:
94+
_LOGGER.error(
95+
f"Modbus error reading register {register.name}: {error}"
96+
)
97+
98+
except ConnectionException:
99+
_LOGGER.warning("Couldn't connect to Solvis device")
100+
finally:
101+
self.modbus.close()
102+
104103
return parsed_data

0 commit comments

Comments
 (0)