only allow one active call in each platform. (#52823)
parent
19d3aa71ad
commit
12ac666459
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue