only allow one active call in each platform. (#52823)
This commit is contained in:
parent
19d3aa71ad
commit
12ac666459
5 changed files with 26 additions and 1 deletions
|
@ -634,6 +634,9 @@ omit =
|
||||||
homeassistant/components/mitemp_bt/sensor.py
|
homeassistant/components/mitemp_bt/sensor.py
|
||||||
homeassistant/components/mjpeg/camera.py
|
homeassistant/components/mjpeg/camera.py
|
||||||
homeassistant/components/mochad/*
|
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/climate.py
|
||||||
homeassistant/components/modbus/modbus.py
|
homeassistant/components/modbus/modbus.py
|
||||||
homeassistant/components/modbus/validators.py
|
homeassistant/components/modbus/validators.py
|
||||||
|
|
|
@ -56,6 +56,7 @@ class BasePlatform(Entity):
|
||||||
self._value = None
|
self._value = None
|
||||||
self._available = True
|
self._available = True
|
||||||
self._scan_interval = int(entry[CONF_SCAN_INTERVAL])
|
self._scan_interval = int(entry[CONF_SCAN_INTERVAL])
|
||||||
|
self._call_active = False
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def async_update(self, now=None):
|
async def async_update(self, now=None):
|
||||||
|
@ -174,9 +175,14 @@ class BaseSwitch(BasePlatform, RestoreEntity):
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
return
|
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(
|
result = await self._hub.async_pymodbus_call(
|
||||||
self._slave, self._verify_address, 1, self._verify_type
|
self._slave, self._verify_address, 1, self._verify_type
|
||||||
)
|
)
|
||||||
|
self._call_active = False
|
||||||
if result is None:
|
if result is None:
|
||||||
self._available = False
|
self._available = False
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
|
|
@ -54,9 +54,15 @@ class ModbusBinarySensor(BasePlatform, RestoreEntity, BinarySensorEntity):
|
||||||
|
|
||||||
async def async_update(self, now=None):
|
async def async_update(self, now=None):
|
||||||
"""Update the state of the sensor."""
|
"""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(
|
result = await self._hub.async_pymodbus_call(
|
||||||
self._slave, self._address, 1, self._input_type
|
self._slave, self._address, 1, self._input_type
|
||||||
)
|
)
|
||||||
|
self._call_active = False
|
||||||
if result is None:
|
if result is None:
|
||||||
self._available = False
|
self._available = False
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
|
|
@ -194,13 +194,18 @@ class ModbusThermostat(BasePlatform, RestoreEntity, ClimateEntity):
|
||||||
"""Update Target & Current Temperature."""
|
"""Update Target & Current Temperature."""
|
||||||
# remark "now" is a dummy parameter to avoid problems with
|
# remark "now" is a dummy parameter to avoid problems with
|
||||||
# async_track_time_interval
|
# 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(
|
self._target_temperature = await self._async_read_register(
|
||||||
CALL_TYPE_REGISTER_HOLDING, self._target_temperature_register
|
CALL_TYPE_REGISTER_HOLDING, self._target_temperature_register
|
||||||
)
|
)
|
||||||
self._current_temperature = await self._async_read_register(
|
self._current_temperature = await self._async_read_register(
|
||||||
self._input_type, self._address
|
self._input_type, self._address
|
||||||
)
|
)
|
||||||
|
self._call_active = False
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
|
||||||
async def _async_read_register(self, register_type, register) -> float | None:
|
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."""
|
"""Update the state of the cover."""
|
||||||
# remark "now" is a dummy parameter to avoid problems with
|
# remark "now" is a dummy parameter to avoid problems with
|
||||||
# async_track_time_interval
|
# 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(
|
result = await self._hub.async_pymodbus_call(
|
||||||
self._slave, self._address, 1, self._input_type
|
self._slave, self._address, 1, self._input_type
|
||||||
)
|
)
|
||||||
|
self._call_active = False
|
||||||
if result is None:
|
if result is None:
|
||||||
self._available = False
|
self._available = False
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue