Add Home Connect action with recognized programs and options (#130662)

* Added recognized options to Home Connect actions

* Fix ruff

* Fix strings.json

* Fix dishwasher typo

* Improved test_bsh_key_transformations

* Add missing return types

* Added descriptions

* Remove custom options

* Fixes

* Merge the 4 services (select, start, set options for active or selected program)

And deprecate the original ones

* Delete stale snapshots

* Clean up logic after service validation

* Make deprecated actions issues fixable

And delete issue on entry unload

* Fixes and improvements

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Improvements

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Fix name and descriptions

* Add `affects_to` to strings and service.yaml

* Add missing periods at strings

* Fix

Co-authored-by: Norbert Rittel <norbert@rittel.de>

* Add tests to check if the flow removes the deprecated action issue

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Norbert Rittel <norbert@rittel.de>
This commit is contained in:
J. Diego Rodríguez Royo
2025-02-14 20:21:01 +01:00
committed by GitHub
parent d99044572a
commit 2bfe96dded
10 changed files with 2331 additions and 355 deletions

View File

@@ -11,6 +11,7 @@ from aiohomeconnect.client import Client as HomeConnectClient
from aiohomeconnect.model import (
ArrayOfEvents,
ArrayOfHomeAppliances,
ArrayOfOptions,
ArrayOfPrograms,
ArrayOfSettings,
ArrayOfStatus,
@@ -199,13 +200,13 @@ def _get_set_program_side_effect(
return set_program_side_effect
def _get_set_key_value_side_effect(
event_queue: asyncio.Queue[list[EventMessage]], parameter_key: str
def _get_set_setting_side_effect(
event_queue: asyncio.Queue[list[EventMessage]],
):
"""Set program options side effect."""
"""Set settings side effect."""
async def set_key_value_side_effect(ha_id: str, *_, **kwargs) -> None:
event_key = EventKey(kwargs[parameter_key])
async def set_settings_side_effect(ha_id: str, *_, **kwargs) -> None:
event_key = EventKey(kwargs["setting_key"])
await event_queue.put(
[
EventMessage(
@@ -227,7 +228,48 @@ def _get_set_key_value_side_effect(
]
)
return set_key_value_side_effect
return set_settings_side_effect
def _get_set_program_options_side_effect(
event_queue: asyncio.Queue[list[EventMessage]],
):
"""Set programs side effect."""
async def set_program_options_side_effect(ha_id: str, *_, **kwargs) -> None:
await event_queue.put(
[
EventMessage(
ha_id,
EventType.NOTIFY,
ArrayOfEvents(
[
Event(
key=EventKey(option.key),
raw_key=option.key.value,
timestamp=0,
level="",
handling="",
value=option.value,
)
for option in (
cast(ArrayOfOptions, kwargs["array_of_options"]).options
if "array_of_options" in kwargs
else [
Option(
kwargs["option_key"],
kwargs["value"],
unit=kwargs["unit"],
)
]
)
]
),
),
]
)
return set_program_options_side_effect
async def _get_all_programs_side_effect(ha_id: str) -> ArrayOfPrograms:
@@ -319,13 +361,19 @@ def mock_client(request: pytest.FixtureRequest) -> MagicMock:
),
)
mock.set_active_program_option = AsyncMock(
side_effect=_get_set_key_value_side_effect(event_queue, "option_key"),
side_effect=_get_set_program_options_side_effect(event_queue),
)
mock.set_active_program_options = AsyncMock(
side_effect=_get_set_program_options_side_effect(event_queue),
)
mock.set_selected_program_option = AsyncMock(
side_effect=_get_set_key_value_side_effect(event_queue, "option_key"),
side_effect=_get_set_program_options_side_effect(event_queue),
)
mock.set_selected_program_options = AsyncMock(
side_effect=_get_set_program_options_side_effect(event_queue),
)
mock.set_setting = AsyncMock(
side_effect=_get_set_key_value_side_effect(event_queue, "setting_key"),
side_effect=_get_set_setting_side_effect(event_queue),
)
mock.get_settings = AsyncMock(side_effect=_get_settings_side_effect)
mock.get_setting = AsyncMock(side_effect=_get_setting_side_effect)
@@ -363,7 +411,9 @@ def mock_client_with_exception(request: pytest.FixtureRequest) -> MagicMock:
mock.stop_program = AsyncMock(side_effect=exception)
mock.set_selected_program = AsyncMock(side_effect=exception)
mock.set_active_program_option = AsyncMock(side_effect=exception)
mock.set_active_program_options = AsyncMock(side_effect=exception)
mock.set_selected_program_option = AsyncMock(side_effect=exception)
mock.set_selected_program_options = AsyncMock(side_effect=exception)
mock.set_setting = AsyncMock(side_effect=exception)
mock.get_settings = AsyncMock(side_effect=exception)
mock.get_setting = AsyncMock(side_effect=exception)