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
6 changes: 3 additions & 3 deletions homeassistant/components/modbus/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@
MODBUS_DOMAIN as DOMAIN,
PLATFORMS,
)
from .modbus import modbus_setup
from .modbus import async_modbus_setup

_LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -348,8 +348,8 @@ def control_scan_interval(config: dict) -> dict:
)


def setup(hass, config):
async def async_setup(hass, config):
"""Set up Modbus component."""
return modbus_setup(
return await async_modbus_setup(
hass, config, SERVICE_WRITE_REGISTER_SCHEMA, SERVICE_WRITE_COIL_SCHEMA
)
19 changes: 11 additions & 8 deletions homeassistant/components/modbus/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
MODBUS_DOMAIN,
)

PARALLEL_UPDATES = 1
_LOGGER = logging.getLogger(__name__)


Expand Down Expand Up @@ -114,9 +115,7 @@ def __init__(self, hub, hass, entry):

async def async_added_to_hass(self):
"""Handle entity which will be added."""
async_track_time_interval(
self._hass, lambda arg: self.update(), self._scan_interval
)
async_track_time_interval(self._hass, self.async_update, self._scan_interval)

@property
def name(self):
Expand Down Expand Up @@ -148,17 +147,21 @@ def available(self) -> bool:
"""Return True if entity is available."""
return self._available

def update(self):
async def async_update(self, now=None):
"""Update the state of the sensor."""
# remark "now" is a dummy parameter to avoid problems with
# async_track_time_interval
if self._input_type == CALL_TYPE_COIL:
result = self._hub.read_coils(self._slave, self._address, 1)
result = await self._hub.async_read_coils(self._slave, self._address, 1)
else:
result = self._hub.read_discrete_inputs(self._slave, self._address, 1)
result = await self._hub.async_read_discrete_inputs(
self._slave, self._address, 1
)
if result is None:
self._available = False
self.schedule_update_ha_state()
self.async_write_ha_state()
return

self._value = result.bits[0] & 1
self._available = True
self.schedule_update_ha_state()
self.async_write_ha_state()
31 changes: 17 additions & 14 deletions homeassistant/components/modbus/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
)
from .modbus import ModbusHub

PARALLEL_UPDATES = 1
_LOGGER = logging.getLogger(__name__)


Expand Down Expand Up @@ -132,9 +133,7 @@ def __init__(

async def async_added_to_hass(self):
"""Handle entity which will be added."""
async_track_time_interval(
self.hass, lambda arg: self.update(), self._scan_interval
)
async_track_time_interval(self.hass, self.async_update, self._scan_interval)

@property
def should_poll(self):
Expand All @@ -160,7 +159,7 @@ def hvac_modes(self):
"""Return the possible HVAC modes."""
return [HVAC_MODE_AUTO]

def set_hvac_mode(self, hvac_mode: str) -> None:
async def async_set_hvac_mode(self, hvac_mode: str) -> None:
"""Set new target hvac mode."""
# Home Assistant expects this method.
# We'll keep it here to avoid getting exceptions.
Expand Down Expand Up @@ -200,7 +199,7 @@ def target_temperature_step(self):
"""Return the supported step of target temperature."""
return self._temp_step

def set_temperature(self, **kwargs):
async def async_set_temperature(self, **kwargs):
"""Set new target temperature."""
if ATTR_TEMPERATURE not in kwargs:
return
Expand All @@ -209,35 +208,39 @@ def set_temperature(self, **kwargs):
)
byte_string = struct.pack(self._structure, target_temperature)
register_value = struct.unpack(">h", byte_string[0:2])[0]
self._available = self._hub.write_registers(
self._available = await self._hub.async_write_registers(
self._slave,
self._target_temperature_register,
register_value,
)
self.update()
self.async_update()

@property
def available(self) -> bool:
"""Return True if entity is available."""
return self._available

def update(self):
async def async_update(self, now=None):
"""Update Target & Current Temperature."""
self._target_temperature = self._read_register(
# remark "now" is a dummy parameter to avoid problems with
# async_track_time_interval
self._target_temperature = await self._async_read_register(
CALL_TYPE_REGISTER_HOLDING, self._target_temperature_register
)
self._current_temperature = self._read_register(
self._current_temperature = await self._async_read_register(
self._current_temperature_register_type, self._current_temperature_register
)

self.schedule_update_ha_state()
self.async_write_ha_state()

def _read_register(self, register_type, register) -> float | None:
async def _async_read_register(self, register_type, register) -> float | None:
"""Read register using the Modbus hub slave."""
if register_type == CALL_TYPE_REGISTER_INPUT:
result = self._hub.read_input_registers(self._slave, register, self._count)
result = await self._hub.async_read_input_registers(
self._slave, register, self._count
)
else:
result = self._hub.read_holding_registers(
result = await self._hub.async_read_holding_registers(
self._slave, register, self._count
)
if result is None:
Expand Down
53 changes: 29 additions & 24 deletions homeassistant/components/modbus/cover.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
)
from .modbus import ModbusHub

PARALLEL_UPDATES = 1
_LOGGER = logging.getLogger(__name__)


Expand Down Expand Up @@ -106,9 +107,7 @@ async def async_added_to_hass(self):
if state:
self._value = state.state

async_track_time_interval(
self.hass, lambda arg: self.update(), self._scan_interval
)
async_track_time_interval(self.hass, self.async_update, self._scan_interval)

@property
def device_class(self) -> str | None:
Expand Down Expand Up @@ -154,41 +153,43 @@ def should_poll(self):
# Handle polling directly in this entity
return False

def open_cover(self, **kwargs: Any) -> None:
async def async_open_cover(self, **kwargs: Any) -> None:
"""Open cover."""
if self._coil is not None:
self._write_coil(True)
await self._async_write_coil(True)
else:
self._write_register(self._state_open)
await self._async_write_register(self._state_open)

self.update()
self.async_update()

def close_cover(self, **kwargs: Any) -> None:
async def async_close_cover(self, **kwargs: Any) -> None:
"""Close cover."""
if self._coil is not None:
self._write_coil(False)
await self._async_write_coil(False)
else:
self._write_register(self._state_closed)
await self._async_write_register(self._state_closed)

self.update()
self.async_update()

def update(self):
async def async_update(self, now=None):
"""Update the state of the cover."""
# remark "now" is a dummy parameter to avoid problems with
# async_track_time_interval
if self._coil is not None and self._status_register is None:
self._value = self._read_coil()
self._value = await self._async_read_coil()
else:
self._value = self._read_status_register()
self._value = await self._async_read_status_register()

self.schedule_update_ha_state()
self.async_write_ha_state()

def _read_status_register(self) -> int | None:
async def _async_read_status_register(self) -> int | None:
"""Read status register using the Modbus hub slave."""
if self._status_register_type == CALL_TYPE_REGISTER_INPUT:
result = self._hub.read_input_registers(
result = await self._hub.async_read_input_registers(
self._slave, self._status_register, 1
)
else:
result = self._hub.read_holding_registers(
result = await self._hub.async_read_holding_registers(
self._slave, self._status_register, 1
)
if result is None:
Expand All @@ -200,20 +201,24 @@ def _read_status_register(self) -> int | None:

return value

def _write_register(self, value):
async def _async_write_register(self, value):
"""Write holding register using the Modbus hub slave."""
self._available = self._hub.write_register(self._slave, self._register, value)
self._available = await self._hub.async_write_register(
self._slave, self._register, value
)

def _read_coil(self) -> bool | None:
async def _async_read_coil(self) -> bool | None:
"""Read coil using the Modbus hub slave."""
result = self._hub.read_coils(self._slave, self._coil, 1)
result = await self._hub.async_read_coils(self._slave, self._coil, 1)
if result is None:
self._available = False
return None

value = bool(result.bits[0] & 1)
return value

def _write_coil(self, value):
async def _async_write_coil(self, value):
"""Write coil using the Modbus hub slave."""
self._available = self._hub.write_coil(self._slave, self._coil, value)
self._available = await self._hub.async_write_coil(
self._slave, self._coil, value
)
Loading