only allow one active call in each platform. (#52823)

This commit is contained in:
jan iversen
2021-07-13 21:45:42 +02:00
committed by Franck Nijhof
parent 29fb5e0cb2
commit 1d67e66538
5 changed files with 26 additions and 1 deletions

View File

@@ -633,6 +633,9 @@ omit =
homeassistant/components/mitemp_bt/sensor.py
homeassistant/components/mjpeg/camera.py
homeassistant/components/mochad/*
homeassistant/components/modbus/base_platform.py
homeassistant/components/modbus/binary_sensor.py
homeassistant/components/modbus/cover.py
homeassistant/components/modbus/climate.py
homeassistant/components/modbus/modbus.py
homeassistant/components/modem_callerid/sensor.py

View File

@@ -51,6 +51,7 @@ class BasePlatform(Entity):
self._value = None
self._available = True
self._scan_interval = int(entry[CONF_SCAN_INTERVAL])
self._call_active = False
@abstractmethod
async def async_update(self, now=None):
@@ -160,9 +161,14 @@ class BaseSwitch(BasePlatform, RestoreEntity):
self.async_write_ha_state()
return
# do not allow multiple active calls to the same platform
if self._call_active:
return
self._call_active = True
result = await self._hub.async_pymodbus_call(
self._slave, self._verify_address, 1, self._verify_type
)
self._call_active = False
if result is None:
self._available = False
self.async_write_ha_state()

View File

@@ -54,9 +54,15 @@ class ModbusBinarySensor(BasePlatform, RestoreEntity, BinarySensorEntity):
async def async_update(self, now=None):
"""Update the state of the sensor."""
# do not allow multiple active calls to the same platform
if self._call_active:
return
self._call_active = True
result = await self._hub.async_pymodbus_call(
self._slave, self._address, 1, self._input_type
)
self._call_active = False
if result is None:
self._available = False
self.async_write_ha_state()

View File

@@ -185,13 +185,18 @@ class ModbusThermostat(BasePlatform, RestoreEntity, ClimateEntity):
"""Update Target & Current Temperature."""
# remark "now" is a dummy parameter to avoid problems with
# async_track_time_interval
# do not allow multiple active calls to the same platform
if self._call_active:
return
self._call_active = True
self._target_temperature = await self._async_read_register(
CALL_TYPE_REGISTER_HOLDING, self._target_temperature_register
)
self._current_temperature = await self._async_read_register(
self._input_type, self._address
)
self._call_active = False
self.async_write_ha_state()
async def _async_read_register(self, register_type, register) -> float | None:

View File

@@ -149,9 +149,14 @@ class ModbusCover(BasePlatform, CoverEntity, RestoreEntity):
"""Update the state of the cover."""
# remark "now" is a dummy parameter to avoid problems with
# async_track_time_interval
# do not allow multiple active calls to the same platform
if self._call_active:
return
self._call_active = True
result = await self._hub.async_pymodbus_call(
self._slave, self._address, 1, self._input_type
)
self._call_active = False
if result is None:
self._available = False
self.async_write_ha_state()