Skip to content

Commit 785caae

Browse files
committed
begin attempting async switchover due to library performance improvement
1 parent d0289a9 commit 785caae

File tree

4 files changed

+28
-24
lines changed

4 files changed

+28
-24
lines changed

custom_components/victron/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> b
3535
config_entry.data[SCAN_REGISTERS],
3636
config_entry.options[CONF_INTERVAL],
3737
)
38+
39+
await coordinator.api.connect()
3840
# try:
3941
# await coordinator.async_config_entry_first_refresh()
4042
# except ConfigEntryNotReady:

custom_components/victron/config_flow.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str,
7070
hub = VictronHub(data[CONF_HOST], data[CONF_PORT])
7171

7272
try:
73-
hub.connect()
73+
await hub.connect()
7474
_LOGGER.debug("connection was succesfull")
7575
discovered_devices = await scan_connected_devices(hub=hub)
7676
_LOGGER.debug("successfully discovered devices")
@@ -81,7 +81,7 @@ async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str,
8181

8282
async def scan_connected_devices(hub: VictronHub) -> list:
8383
"""Scan for connected devices."""
84-
return hub.determine_present_devices()
84+
return await hub.determine_present_devices()
8585

8686

8787
class VictronFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):

custom_components/victron/coordinator.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ def __init__(
5555
hass, _LOGGER, name=DOMAIN, update_interval=timedelta(seconds=interval)
5656
)
5757
self.api = VictronHub(host, port)
58-
self.api.connect()
5958
self.decodeInfo = decodeInfo
6059
self.interval = interval
6160

@@ -194,9 +193,7 @@ async def fetch_registers(self, unit, registerData):
194193
"""Fetch the registers."""
195194
try:
196195
# run api_update in async job
197-
return await self.hass.async_add_executor_job(
198-
self.api_update, unit, registerData
199-
)
196+
return await self.api_update(unit, registerData)
200197

201198
except HomeAssistantError as e:
202199
raise UpdateFailed("Fetching registers failed") from e
@@ -210,10 +207,10 @@ def api_write(self, unit, address, value):
210207
# recycle connection
211208
return self.api.write_register(unit=unit, address=address, value=value)
212209

213-
def api_update(self, unit, registerInfo):
210+
async def api_update(self, unit, registerInfo):
214211
"""Update the api."""
215212
# recycle connection
216-
return self.api.read_holding_registers(
213+
return await self.api.read_holding_registers(
217214
unit=unit,
218215
address=self.api.get_first_register_id(registerInfo),
219216
count=self.api.calculate_register_count(registerInfo),

custom_components/victron/hub.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import logging
55
import threading
66

7-
from pymodbus.client import ModbusTcpClient
7+
from pymodbus.client import AsyncModbusTcpClient
88

99
from .const import (
1010
INT32,
@@ -27,49 +27,54 @@ def __init__(self, host: str, port: int) -> None:
2727
self.host = host
2828
self.port = port
2929
# Fail more quickly and only retry once before executing retry logic
30-
self._client = ModbusTcpClient(
31-
host=self.host, port=self.port, timeout=10, retries=1
30+
self._client = AsyncModbusTcpClient(
31+
host=self.host, port=self.port, timeout=30, retries=10
3232
)
3333
self._lock = threading.Lock()
3434

3535
def is_still_connected(self):
3636
"""Check if the connection is still open."""
3737
return self._client.is_socket_open()
3838

39-
def connect(self):
39+
async def connect(self):
4040
"""Connect to the Modbus TCP server."""
41-
return self._client.connect()
41+
return await self._client.connect()
4242

43-
def disconnect(self):
43+
async def disconnect(self):
4444
"""Disconnect from the Modbus TCP server."""
4545
if self._client.is_socket_open():
4646
return self._client.close()
4747
return None
4848

49-
def write_register(self, unit, address, value):
49+
async def write_register(self, unit, address, value):
5050
"""Write a register."""
5151
try:
5252
slave = int(unit)
53-
if not unit:
53+
if not (0 <= slave <= 254):
5454
_LOGGER.error(
5555
"Unit for this device (%s) isn't set correctly. Cannot write (%s) to register (%s). Ensure that the config was migrated to latest state by forcing a rescan",
56-
unit,
56+
slave,
5757
value,
5858
address,
5959
)
6060
return
61-
self._client.write_register(address=address, value=value, slave=slave)
61+
await self._client.write_register(address=address, value=value, slave=slave)
6262
except BrokenPipeError:
6363
self.__handle_broken_pipe_error()
6464

65-
def read_holding_registers(self, unit, address, count):
65+
async def read_holding_registers(self, unit, address, count):
6666
"""Read holding registers."""
6767
try:
68-
if not unit:
68+
slave = int(unit)
69+
if not (0 <= slave <= 254):
70+
_LOGGER.error(
71+
"Unit for this device (%s) isn't set correctly. Cannot read register (%s). Ensure that the config was migrated to latest state by forcing a rescan",
72+
slave,
73+
address,
74+
)
6975
return None
7076

71-
slave = int(unit)
72-
return self._client.read_holding_registers(
77+
return await self._client.read_holding_registers(
7378
address=address, count=count, slave=slave
7479
)
7580
except BrokenPipeError:
@@ -111,7 +116,7 @@ def get_first_register_id(self, registerInfoDict: OrderedDict):
111116
first_register = next(iter(registerInfoDict))
112117
return registerInfoDict[first_register].register
113118

114-
def determine_present_devices(self):
119+
async def determine_present_devices(self):
115120
"""Determine which devices are present."""
116121
valid_devices = {}
117122

@@ -124,7 +129,7 @@ def determine_present_devices(self):
124129

125130
address = self.get_first_register_id(register_definition)
126131
count = self.calculate_register_count(register_definition)
127-
result = self.read_holding_registers(unit, address, count)
132+
result = await self.read_holding_registers(unit, address, count)
128133
if result is None:
129134
_LOGGER.debug(
130135
"result is error for unit: %s address: %s count: %s and result: %s",

0 commit comments

Comments
 (0)