mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Solve modbus binary slave problem (#82338)
* Solve modbus binary slave problem.
This commit is contained in:
parent
e1a0f8314e
commit
8ed4ce64c3
@ -60,7 +60,7 @@ class ModbusBinarySensor(BasePlatform, RestoreEntity, BinarySensorEntity):
|
|||||||
"""Initialize the Modbus binary sensor."""
|
"""Initialize the Modbus binary sensor."""
|
||||||
self._count = slave_count + 1
|
self._count = slave_count + 1
|
||||||
self._coordinator: DataUpdateCoordinator[Any] | None = None
|
self._coordinator: DataUpdateCoordinator[Any] | None = None
|
||||||
self._result = None
|
self._result: list = []
|
||||||
super().__init__(hub, entry)
|
super().__init__(hub, entry)
|
||||||
|
|
||||||
async def async_setup_slaves(
|
async def async_setup_slaves(
|
||||||
@ -106,15 +106,15 @@ class ModbusBinarySensor(BasePlatform, RestoreEntity, BinarySensorEntity):
|
|||||||
return
|
return
|
||||||
self._lazy_errors = self._lazy_error_count
|
self._lazy_errors = self._lazy_error_count
|
||||||
self._attr_available = False
|
self._attr_available = False
|
||||||
self._result = None
|
self._result = []
|
||||||
else:
|
else:
|
||||||
self._lazy_errors = self._lazy_error_count
|
self._lazy_errors = self._lazy_error_count
|
||||||
self._attr_available = True
|
self._attr_available = True
|
||||||
self._result = result
|
|
||||||
if self._input_type in (CALL_TYPE_COIL, CALL_TYPE_DISCRETE):
|
if self._input_type in (CALL_TYPE_COIL, CALL_TYPE_DISCRETE):
|
||||||
self._attr_is_on = bool(result.bits[0] & 1)
|
self._result = result.bits
|
||||||
else:
|
else:
|
||||||
self._attr_is_on = bool(result.registers[0] & 1)
|
self._result = result.registers
|
||||||
|
self._attr_is_on = bool(self._result[0] & 1)
|
||||||
|
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
if self._coordinator:
|
if self._coordinator:
|
||||||
@ -132,8 +132,7 @@ class SlaveSensor(CoordinatorEntity, RestoreEntity, BinarySensorEntity):
|
|||||||
self._attr_name = f"{entry[CONF_NAME]} {idx}"
|
self._attr_name = f"{entry[CONF_NAME]} {idx}"
|
||||||
self._attr_device_class = entry.get(CONF_DEVICE_CLASS)
|
self._attr_device_class = entry.get(CONF_DEVICE_CLASS)
|
||||||
self._attr_available = False
|
self._attr_available = False
|
||||||
self._result_inx = int(idx / 8)
|
self._result_inx = idx
|
||||||
self._result_bit = 2 ** (idx % 8)
|
|
||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
|
|
||||||
async def async_added_to_hass(self) -> None:
|
async def async_added_to_hass(self) -> None:
|
||||||
@ -148,5 +147,5 @@ class SlaveSensor(CoordinatorEntity, RestoreEntity, BinarySensorEntity):
|
|||||||
"""Handle updated data from the coordinator."""
|
"""Handle updated data from the coordinator."""
|
||||||
result = self.coordinator.data
|
result = self.coordinator.data
|
||||||
if result:
|
if result:
|
||||||
self._attr_is_on = result.bits[self._result_inx] & self._result_bit
|
self._attr_is_on = bool(result[self._result_inx] & 1)
|
||||||
super()._handle_coordinator_update()
|
super()._handle_coordinator_update()
|
||||||
|
@ -117,35 +117,50 @@ async def test_config_binary_sensor(hass, mock_modbus):
|
|||||||
"register_words,do_exception,expected",
|
"register_words,do_exception,expected",
|
||||||
[
|
[
|
||||||
(
|
(
|
||||||
[0xFF],
|
[True] * 8,
|
||||||
False,
|
False,
|
||||||
STATE_ON,
|
STATE_ON,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
[0x01],
|
[False] * 8,
|
||||||
|
False,
|
||||||
|
STATE_OFF,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
[False] + [True] * 7,
|
||||||
|
False,
|
||||||
|
STATE_OFF,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
[True] + [False] * 7,
|
||||||
False,
|
False,
|
||||||
STATE_ON,
|
STATE_ON,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
[0x00],
|
[False] * 8,
|
||||||
False,
|
|
||||||
STATE_OFF,
|
|
||||||
),
|
|
||||||
(
|
|
||||||
[0x80],
|
|
||||||
False,
|
|
||||||
STATE_OFF,
|
|
||||||
),
|
|
||||||
(
|
|
||||||
[0xFE],
|
|
||||||
False,
|
|
||||||
STATE_OFF,
|
|
||||||
),
|
|
||||||
(
|
|
||||||
[0x00],
|
|
||||||
True,
|
True,
|
||||||
STATE_UNAVAILABLE,
|
STATE_UNAVAILABLE,
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
[1] * 8,
|
||||||
|
False,
|
||||||
|
STATE_ON,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
[2] * 8,
|
||||||
|
False,
|
||||||
|
STATE_OFF,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
[4] + [1] * 7,
|
||||||
|
False,
|
||||||
|
STATE_OFF,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
[1] + [8] * 7,
|
||||||
|
False,
|
||||||
|
STATE_ON,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def test_all_binary_sensor(hass, expected, mock_do_cycle):
|
async def test_all_binary_sensor(hass, expected, mock_do_cycle):
|
||||||
@ -173,7 +188,7 @@ async def test_all_binary_sensor(hass, expected, mock_do_cycle):
|
|||||||
"register_words,do_exception,start_expect,end_expect",
|
"register_words,do_exception,start_expect,end_expect",
|
||||||
[
|
[
|
||||||
(
|
(
|
||||||
[0x00],
|
[False * 16],
|
||||||
True,
|
True,
|
||||||
STATE_UNKNOWN,
|
STATE_UNKNOWN,
|
||||||
STATE_UNAVAILABLE,
|
STATE_UNAVAILABLE,
|
||||||
@ -289,6 +304,34 @@ async def test_config_slave_binary_sensor(hass, mock_modbus):
|
|||||||
{
|
{
|
||||||
CONF_NAME: TEST_ENTITY_NAME,
|
CONF_NAME: TEST_ENTITY_NAME,
|
||||||
CONF_ADDRESS: 51,
|
CONF_ADDRESS: 51,
|
||||||
|
CONF_INPUT_TYPE: CALL_TYPE_COIL,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CONF_BINARY_SENSORS: [
|
||||||
|
{
|
||||||
|
CONF_NAME: TEST_ENTITY_NAME,
|
||||||
|
CONF_ADDRESS: 51,
|
||||||
|
CONF_INPUT_TYPE: CALL_TYPE_DISCRETE,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CONF_BINARY_SENSORS: [
|
||||||
|
{
|
||||||
|
CONF_NAME: TEST_ENTITY_NAME,
|
||||||
|
CONF_ADDRESS: 51,
|
||||||
|
CONF_INPUT_TYPE: CALL_TYPE_REGISTER_HOLDING,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CONF_BINARY_SENSORS: [
|
||||||
|
{
|
||||||
|
CONF_NAME: TEST_ENTITY_NAME,
|
||||||
|
CONF_ADDRESS: 51,
|
||||||
|
CONF_INPUT_TYPE: CALL_TYPE_REGISTER_INPUT,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -299,106 +342,33 @@ async def test_config_slave_binary_sensor(hass, mock_modbus):
|
|||||||
[
|
[
|
||||||
(
|
(
|
||||||
{CONF_SLAVE_COUNT: 1},
|
{CONF_SLAVE_COUNT: 1},
|
||||||
[0x01],
|
[False] * 8,
|
||||||
STATE_ON,
|
STATE_OFF,
|
||||||
[
|
[STATE_OFF],
|
||||||
STATE_OFF,
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{CONF_SLAVE_COUNT: 1},
|
{CONF_SLAVE_COUNT: 1},
|
||||||
[0x02],
|
[True] + [False] * 7,
|
||||||
STATE_OFF,
|
STATE_ON,
|
||||||
[
|
[STATE_OFF],
|
||||||
STATE_ON,
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{CONF_SLAVE_COUNT: 1},
|
{CONF_SLAVE_COUNT: 1},
|
||||||
[0x04],
|
[False, True] + [False] * 6,
|
||||||
STATE_OFF,
|
STATE_OFF,
|
||||||
[
|
[STATE_ON],
|
||||||
STATE_OFF,
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{CONF_SLAVE_COUNT: 7},
|
{CONF_SLAVE_COUNT: 7},
|
||||||
[0x01],
|
[True, False] * 4,
|
||||||
STATE_ON,
|
STATE_ON,
|
||||||
[
|
[STATE_OFF, STATE_ON] * 3 + [STATE_OFF],
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{CONF_SLAVE_COUNT: 7},
|
{CONF_SLAVE_COUNT: 31},
|
||||||
[0x82],
|
[True, False] * 16,
|
||||||
STATE_OFF,
|
|
||||||
[
|
|
||||||
STATE_ON,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_ON,
|
|
||||||
],
|
|
||||||
),
|
|
||||||
(
|
|
||||||
{CONF_SLAVE_COUNT: 10},
|
|
||||||
[0x01, 0x00],
|
|
||||||
STATE_ON,
|
STATE_ON,
|
||||||
[
|
[STATE_OFF, STATE_ON] * 15 + [STATE_OFF],
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
],
|
|
||||||
),
|
|
||||||
(
|
|
||||||
{CONF_SLAVE_COUNT: 10},
|
|
||||||
[0x01, 0x01],
|
|
||||||
STATE_ON,
|
|
||||||
[
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_ON,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
],
|
|
||||||
),
|
|
||||||
(
|
|
||||||
{CONF_SLAVE_COUNT: 10},
|
|
||||||
[0x81, 0x01],
|
|
||||||
STATE_ON,
|
|
||||||
[
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_ON,
|
|
||||||
STATE_ON,
|
|
||||||
STATE_OFF,
|
|
||||||
STATE_OFF,
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user