Fix Home Connect actions keys (#137027)

* Fix actions

* Use coerce

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
J. Diego Rodríguez Royo 2025-02-01 10:47:27 +01:00 committed by GitHub
parent 012f7112d7
commit 285a0a6c81
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 24 deletions

View File

@ -6,7 +6,7 @@ import logging
from typing import Any, cast from typing import Any, cast
from aiohomeconnect.client import Client as HomeConnectClient from aiohomeconnect.client import Client as HomeConnectClient
from aiohomeconnect.model import CommandKey, Option, OptionKey from aiohomeconnect.model import CommandKey, Option, OptionKey, ProgramKey, SettingKey
from aiohomeconnect.model.error import HomeConnectError from aiohomeconnect.model.error import HomeConnectError
import voluptuous as vol import voluptuous as vol
@ -50,7 +50,10 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
SERVICE_SETTING_SCHEMA = vol.Schema( SERVICE_SETTING_SCHEMA = vol.Schema(
{ {
vol.Required(ATTR_DEVICE_ID): str, vol.Required(ATTR_DEVICE_ID): str,
vol.Required(ATTR_KEY): str, vol.Required(ATTR_KEY): vol.All(
vol.Coerce(SettingKey),
vol.NotIn([SettingKey.UNKNOWN]),
),
vol.Required(ATTR_VALUE): vol.Any(str, int, bool), vol.Required(ATTR_VALUE): vol.Any(str, int, bool),
} }
) )
@ -58,7 +61,10 @@ SERVICE_SETTING_SCHEMA = vol.Schema(
SERVICE_OPTION_SCHEMA = vol.Schema( SERVICE_OPTION_SCHEMA = vol.Schema(
{ {
vol.Required(ATTR_DEVICE_ID): str, vol.Required(ATTR_DEVICE_ID): str,
vol.Required(ATTR_KEY): str, vol.Required(ATTR_KEY): vol.All(
vol.Coerce(OptionKey),
vol.NotIn([OptionKey.UNKNOWN]),
),
vol.Required(ATTR_VALUE): vol.Any(str, int, bool), vol.Required(ATTR_VALUE): vol.Any(str, int, bool),
vol.Optional(ATTR_UNIT): str, vol.Optional(ATTR_UNIT): str,
} }
@ -67,14 +73,23 @@ SERVICE_OPTION_SCHEMA = vol.Schema(
SERVICE_PROGRAM_SCHEMA = vol.Any( SERVICE_PROGRAM_SCHEMA = vol.Any(
{ {
vol.Required(ATTR_DEVICE_ID): str, vol.Required(ATTR_DEVICE_ID): str,
vol.Required(ATTR_PROGRAM): str, vol.Required(ATTR_PROGRAM): vol.All(
vol.Required(ATTR_KEY): str, vol.Coerce(ProgramKey),
vol.NotIn([ProgramKey.UNKNOWN]),
),
vol.Required(ATTR_KEY): vol.All(
vol.Coerce(OptionKey),
vol.NotIn([OptionKey.UNKNOWN]),
),
vol.Required(ATTR_VALUE): vol.Any(int, str), vol.Required(ATTR_VALUE): vol.Any(int, str),
vol.Optional(ATTR_UNIT): str, vol.Optional(ATTR_UNIT): str,
}, },
{ {
vol.Required(ATTR_DEVICE_ID): str, vol.Required(ATTR_DEVICE_ID): str,
vol.Required(ATTR_PROGRAM): str, vol.Required(ATTR_PROGRAM): vol.All(
vol.Coerce(ProgramKey),
vol.NotIn([ProgramKey.UNKNOWN]),
),
}, },
) )
@ -141,7 +156,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
options = ( options = (
[ [
Option( Option(
OptionKey(option_key), option_key,
call.data[ATTR_VALUE], call.data[ATTR_VALUE],
unit=call.data.get(ATTR_UNIT), unit=call.data.get(ATTR_UNIT),
) )
@ -178,14 +193,14 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
if active: if active:
await client.set_active_program_option( await client.set_active_program_option(
ha_id, ha_id,
option_key=OptionKey(option_key), option_key=option_key,
value=value, value=value,
unit=unit, unit=unit,
) )
else: else:
await client.set_selected_program_option( await client.set_selected_program_option(
ha_id, ha_id,
option_key=OptionKey(option_key), option_key=option_key,
value=value, value=value,
unit=unit, unit=unit,
) )

View File

@ -5,7 +5,7 @@ from typing import Any
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from aiohomeconnect.const import OAUTH2_TOKEN from aiohomeconnect.const import OAUTH2_TOKEN
from aiohomeconnect.model import SettingKey, StatusKey from aiohomeconnect.model import OptionKey, ProgramKey, SettingKey, StatusKey
from aiohomeconnect.model.error import HomeConnectError from aiohomeconnect.model.error import HomeConnectError
import pytest import pytest
import requests_mock import requests_mock
@ -41,9 +41,9 @@ SERVICE_KV_CALL_PARAMS = [
"service": "set_option_active", "service": "set_option_active",
"service_data": { "service_data": {
"device_id": "DEVICE_ID", "device_id": "DEVICE_ID",
"key": "", "key": OptionKey.BSH_COMMON_FINISH_IN_RELATIVE.value,
"value": "", "value": 43200,
"unit": "", "unit": "seconds",
}, },
"blocking": True, "blocking": True,
}, },
@ -52,8 +52,8 @@ SERVICE_KV_CALL_PARAMS = [
"service": "set_option_selected", "service": "set_option_selected",
"service_data": { "service_data": {
"device_id": "DEVICE_ID", "device_id": "DEVICE_ID",
"key": "", "key": OptionKey.LAUNDRY_CARE_WASHER_TEMPERATURE.value,
"value": "", "value": "LaundryCare.Washer.EnumType.Temperature.GC40",
}, },
"blocking": True, "blocking": True,
}, },
@ -62,8 +62,8 @@ SERVICE_KV_CALL_PARAMS = [
"service": "change_setting", "service": "change_setting",
"service_data": { "service_data": {
"device_id": "DEVICE_ID", "device_id": "DEVICE_ID",
"key": "", "key": SettingKey.BSH_COMMON_CHILD_LOCK.value,
"value": "", "value": True,
}, },
"blocking": True, "blocking": True,
}, },
@ -95,9 +95,9 @@ SERVICE_PROGRAM_CALL_PARAMS = [
"service": "select_program", "service": "select_program",
"service_data": { "service_data": {
"device_id": "DEVICE_ID", "device_id": "DEVICE_ID",
"program": "", "program": ProgramKey.LAUNDRY_CARE_WASHER_COTTON.value,
"key": "", "key": OptionKey.LAUNDRY_CARE_WASHER_TEMPERATURE.value,
"value": "", "value": "LaundryCare.Washer.EnumType.Temperature.GC40",
}, },
"blocking": True, "blocking": True,
}, },
@ -106,10 +106,10 @@ SERVICE_PROGRAM_CALL_PARAMS = [
"service": "start_program", "service": "start_program",
"service_data": { "service_data": {
"device_id": "DEVICE_ID", "device_id": "DEVICE_ID",
"program": "", "program": ProgramKey.LAUNDRY_CARE_WASHER_COTTON.value,
"key": "", "key": OptionKey.BSH_COMMON_FINISH_IN_RELATIVE.value,
"value": "", "value": 43200,
"unit": "C", "unit": "seconds",
}, },
"blocking": True, "blocking": True,
}, },