Make modbus retry fast on read errors (#99576)
* Fast retry on read errors. * Review comments.pull/100203/head
parent
198532d51d
commit
9acca1bf58
|
@ -115,7 +115,9 @@ class BasePlatform(Entity):
|
|||
def async_run(self) -> None:
|
||||
"""Remote start entity."""
|
||||
self.async_hold(update=False)
|
||||
self._cancel_call = async_call_later(self.hass, 1, self.async_update)
|
||||
self._cancel_call = async_call_later(
|
||||
self.hass, timedelta(milliseconds=100), self.async_update
|
||||
)
|
||||
if self._scan_interval > 0:
|
||||
self._cancel_timer = async_track_time_interval(
|
||||
self.hass, self.async_update, timedelta(seconds=self._scan_interval)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
"""Support for Modbus Register sensors."""
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
|
@ -19,6 +19,7 @@ from homeassistant.const import (
|
|||
)
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
from homeassistant.helpers.event import async_call_later
|
||||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||
from homeassistant.helpers.update_coordinator import (
|
||||
CoordinatorEntity,
|
||||
|
@ -106,12 +107,16 @@ class ModbusRegisterSensor(BaseStructPlatform, RestoreSensor, SensorEntity):
|
|||
"""Update the state of the sensor."""
|
||||
# remark "now" is a dummy parameter to avoid problems with
|
||||
# async_track_time_interval
|
||||
self._cancel_call = None
|
||||
raw_result = await self._hub.async_pb_call(
|
||||
self._slave, self._address, self._count, self._input_type
|
||||
)
|
||||
if raw_result is None:
|
||||
if self._lazy_errors:
|
||||
self._lazy_errors -= 1
|
||||
self._cancel_call = async_call_later(
|
||||
self.hass, timedelta(seconds=1), self.async_update
|
||||
)
|
||||
return
|
||||
self._lazy_errors = self._lazy_error_count
|
||||
self._attr_available = False
|
||||
|
|
|
@ -946,27 +946,23 @@ async def test_wrong_unpack(hass: HomeAssistant, mock_do_cycle) -> None:
|
|||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
("register_words", "do_exception", "start_expect", "end_expect"),
|
||||
("register_words", "do_exception"),
|
||||
[
|
||||
(
|
||||
[0x8000],
|
||||
True,
|
||||
"17",
|
||||
STATE_UNAVAILABLE,
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_lazy_error_sensor(
|
||||
hass: HomeAssistant, mock_do_cycle: FrozenDateTimeFactory, start_expect, end_expect
|
||||
hass: HomeAssistant, mock_do_cycle: FrozenDateTimeFactory
|
||||
) -> None:
|
||||
"""Run test for sensor."""
|
||||
hass.states.async_set(ENTITY_ID, 17)
|
||||
await hass.async_block_till_done()
|
||||
assert hass.states.get(ENTITY_ID).state == start_expect
|
||||
assert hass.states.get(ENTITY_ID).state == "17"
|
||||
await do_next_cycle(hass, mock_do_cycle, 5)
|
||||
assert hass.states.get(ENTITY_ID).state == start_expect
|
||||
await do_next_cycle(hass, mock_do_cycle, 11)
|
||||
assert hass.states.get(ENTITY_ID).state == end_expect
|
||||
assert hass.states.get(ENTITY_ID).state == STATE_UNAVAILABLE
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
|
|
Loading…
Reference in New Issue