mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 09:47:13 +00:00
Check operation state on Home Connect program sensor update (#140011)
Check operation state on program sensor update
This commit is contained in:
parent
113cd4bfcc
commit
efa98539fa
@ -386,6 +386,13 @@ class HomeConnectProgramSensor(HomeConnectSensor):
|
|||||||
|
|
||||||
def update_native_value(self) -> None:
|
def update_native_value(self) -> None:
|
||||||
"""Update the program sensor's status."""
|
"""Update the program sensor's status."""
|
||||||
|
self.program_running = (
|
||||||
|
status := self.appliance.status.get(StatusKey.BSH_COMMON_OPERATION_STATE)
|
||||||
|
) is not None and status.value in [
|
||||||
|
BSH_OPERATION_STATE_RUN,
|
||||||
|
BSH_OPERATION_STATE_PAUSE,
|
||||||
|
BSH_OPERATION_STATE_FINISHED,
|
||||||
|
]
|
||||||
event = self.appliance.events.get(cast(EventKey, self.bsh_key))
|
event = self.appliance.events.get(cast(EventKey, self.bsh_key))
|
||||||
if event:
|
if event:
|
||||||
self._update_native_value(event.value)
|
self._update_native_value(event.value)
|
||||||
|
@ -27,7 +27,7 @@ from homeassistant.components.home_connect.const import (
|
|||||||
DOMAIN,
|
DOMAIN,
|
||||||
)
|
)
|
||||||
from homeassistant.config_entries import ConfigEntryState
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
from homeassistant.const import STATE_UNAVAILABLE, Platform
|
from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN, Platform
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers import device_registry as dr, entity_registry as er
|
from homeassistant.helpers import device_registry as dr, entity_registry as er
|
||||||
|
|
||||||
@ -302,7 +302,7 @@ ENTITY_ID_STATES = {
|
|||||||
)
|
)
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
async def test_event_sensors(
|
async def test_program_sensors(
|
||||||
client: MagicMock,
|
client: MagicMock,
|
||||||
appliance_ha_id: str,
|
appliance_ha_id: str,
|
||||||
states: tuple,
|
states: tuple,
|
||||||
@ -313,7 +313,7 @@ async def test_event_sensors(
|
|||||||
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||||
setup_credentials: None,
|
setup_credentials: None,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test sequence for sensors that are only available after an event happens."""
|
"""Test sequence for sensors that expose information about a program."""
|
||||||
entity_ids = ENTITY_ID_STATES.keys()
|
entity_ids = ENTITY_ID_STATES.keys()
|
||||||
|
|
||||||
time_to_freeze = "2021-01-09 12:00:00+00:00"
|
time_to_freeze = "2021-01-09 12:00:00+00:00"
|
||||||
@ -358,6 +358,82 @@ async def test_event_sensors(
|
|||||||
assert hass.states.is_state(entity_id, state)
|
assert hass.states.is_state(entity_id, state)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("appliance_ha_id", [TEST_HC_APP], indirect=True)
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("initial_operation_state", "initial_state", "event_order", "entity_states"),
|
||||||
|
[
|
||||||
|
(
|
||||||
|
"BSH.Common.EnumType.OperationState.Ready",
|
||||||
|
STATE_UNAVAILABLE,
|
||||||
|
(EventType.STATUS, EventType.EVENT),
|
||||||
|
(STATE_UNKNOWN, "60"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"BSH.Common.EnumType.OperationState.Run",
|
||||||
|
STATE_UNKNOWN,
|
||||||
|
(EventType.EVENT, EventType.STATUS),
|
||||||
|
("60", "60"),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_program_sensor_edge_case(
|
||||||
|
initial_operation_state: str,
|
||||||
|
initial_state: str,
|
||||||
|
event_order: tuple[EventType, EventType],
|
||||||
|
entity_states: tuple[str, str],
|
||||||
|
appliance_ha_id: str,
|
||||||
|
hass: HomeAssistant,
|
||||||
|
config_entry: MockConfigEntry,
|
||||||
|
integration_setup: Callable[[MagicMock], Awaitable[bool]],
|
||||||
|
setup_credentials: None,
|
||||||
|
client: MagicMock,
|
||||||
|
) -> None:
|
||||||
|
"""Test edge case for the program related entities."""
|
||||||
|
entity_id = "sensor.dishwasher_program_progress"
|
||||||
|
client.get_status = AsyncMock(
|
||||||
|
return_value=ArrayOfStatus(
|
||||||
|
[
|
||||||
|
Status(
|
||||||
|
StatusKey.BSH_COMMON_OPERATION_STATE,
|
||||||
|
StatusKey.BSH_COMMON_OPERATION_STATE.value,
|
||||||
|
initial_operation_state,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
assert config_entry.state == ConfigEntryState.NOT_LOADED
|
||||||
|
assert await integration_setup(client)
|
||||||
|
assert config_entry.state == ConfigEntryState.LOADED
|
||||||
|
|
||||||
|
assert hass.states.is_state(entity_id, initial_state)
|
||||||
|
|
||||||
|
for event_type, state in zip(event_order, entity_states, strict=True):
|
||||||
|
await client.add_events(
|
||||||
|
[
|
||||||
|
EventMessage(
|
||||||
|
appliance_ha_id,
|
||||||
|
event_type,
|
||||||
|
ArrayOfEvents(
|
||||||
|
[
|
||||||
|
Event(
|
||||||
|
key=event_key,
|
||||||
|
raw_key=event_key.value,
|
||||||
|
timestamp=0,
|
||||||
|
level="",
|
||||||
|
handling="",
|
||||||
|
value=value,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
for event_key, value in EVENT_PROG_RUN[event_type].items()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert hass.states.is_state(entity_id, state)
|
||||||
|
|
||||||
|
|
||||||
# Program sequence for SensorDeviceClass.TIMESTAMP edge cases.
|
# Program sequence for SensorDeviceClass.TIMESTAMP edge cases.
|
||||||
PROGRAM_SEQUENCE_EDGE_CASE = [
|
PROGRAM_SEQUENCE_EDGE_CASE = [
|
||||||
EVENT_PROG_DELAYED_START,
|
EVENT_PROG_DELAYED_START,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user