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 GitHub
parent 19d3aa71ad
commit 12ac666459
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 1 deletions

View File

@ -634,6 +634,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/modbus/validators.py

View File

@ -56,6 +56,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):
@ -174,9 +175,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

@ -194,13 +194,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()