Compare commits

..

No commits in common. "8abf087c3e254e5ba48a39f4784e5764a50c9d06" and "f60143b4776b15b0a586edbbea4eb092f3e198c4" have entirely different histories.

2 changed files with 31 additions and 80 deletions

View File

@ -47,7 +47,7 @@ Notify entities for Xiaomi Home.
""" """
from __future__ import annotations from __future__ import annotations
import logging import logging
from typing import Any, Optional from typing import Optional
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -83,7 +83,6 @@ async def async_setup_entry(
class Notify(MIoTActionEntity, NotifyEntity): class Notify(MIoTActionEntity, NotifyEntity):
"""Notify entities for Xiaomi Home.""" """Notify entities for Xiaomi Home."""
# pylint: disable=unused-argument
def __init__(self, miot_device: MIoTDevice, spec: MIoTSpecAction) -> None: def __init__(self, miot_device: MIoTDevice, spec: MIoTSpecAction) -> None:
"""Initialize the Notify.""" """Initialize the Notify."""
@ -98,58 +97,37 @@ class Notify(MIoTActionEntity, NotifyEntity):
self, message: str, title: Optional[str] = None self, message: str, title: Optional[str] = None
) -> None: ) -> None:
"""Send a message.""" """Send a message."""
del title
if not message: if not message:
_LOGGER.error( _LOGGER.error(
'action exec failed, %s(%s), empty action params', 'action exec failed, %s(%s), empty action params',
self.name, self.entity_id) self.name, self.entity_id)
return return
in_list: Any = None
try: try:
# YAML will convert yes, no, on, off, true, false to the bool type, in_list: list = yaml.parse_yaml(message)
# and if it is a string, quotation marks need to be added.
in_list = yaml.parse_yaml(content=message)
except HomeAssistantError: except HomeAssistantError:
_LOGGER.error( _LOGGER.error(
'action exec failed, %s(%s), invalid action params format, %s', 'action exec failed, %s(%s), invalid action params format, %s',
self.name, self.entity_id, message) self.name, self.entity_id, message)
return return
if len(self.spec.in_) == 1 and not isinstance(in_list, list):
if isinstance(in_list, str):
in_list = [in_list] in_list = [in_list]
if not isinstance(in_list, list) or len(in_list) != len(self.spec.in_): if not isinstance(in_list, list) or len(in_list) != len(self.spec.in_):
_LOGGER.error( _LOGGER.error(
'action exec failed, %s(%s), invalid action params, %s', 'action exec failed, %s(%s), invalid action params, %s',
self.name, self.entity_id, message) self.name, self.entity_id, message)
return return
in_value: list[dict] = [] in_value: list[dict] = []
for index, prop in enumerate(self.spec.in_): for index, prop in enumerate(self.spec.in_):
if prop.format_ == 'str': if type(in_list[index]).__name__ != prop.format_:
if isinstance(in_list[index], (bool, int, float, str)):
in_value.append(
{'piid': prop.iid, 'value': str(in_list[index])})
continue
elif prop.format_ == 'bool':
if isinstance(in_list[index], (bool, int)):
# yes, no, on, off, true, false and other bool types
# will also be parsed as 0 and 1 of int.
in_value.append(
{'piid': prop.iid, 'value': bool(in_list[index])})
continue
elif prop.format_ == 'float':
if isinstance(in_list[index], (int, float)):
in_value.append(
{'piid': prop.iid, 'value': in_list[index]})
continue
elif prop.format_ == 'int':
if isinstance(in_list[index], int):
in_value.append(
{'piid': prop.iid, 'value': in_list[index]})
continue
# Invalid params type, raise error.
_LOGGER.error( _LOGGER.error(
'action exec failed, %s(%s), invalid params item, ' 'action exec failed, %s(%s), invalid params item, '
'which item(%s) in the list must be %s, %s type was %s, %s', 'which item(%s) in the list must be %s, %s',
self.name, self.entity_id, prop.description_trans, self.name, self.entity_id, prop.description_trans,
prop.format_, in_list[index], type( prop.format_, message)
in_list[index]).__name__, message)
return return
await self.action_async(in_list=in_value) in_value.append({'piid': prop.iid, 'value': in_list[index]})
return await self.action_async(in_list=in_value)

View File

@ -46,15 +46,14 @@ off Xiaomi or its affiliates' products.
Text entities for Xiaomi Home. Text entities for Xiaomi Home.
""" """
from __future__ import annotations from __future__ import annotations
import json
import logging import logging
from typing import Any, Optional from typing import Optional
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.components.text import TextEntity from homeassistant.components.text import TextEntity
from homeassistant.util import yaml
from homeassistant.exceptions import HomeAssistantError
from .miot.const import DOMAIN from .miot.const import DOMAIN
from .miot.miot_spec import MIoTSpecAction, MIoTSpecProperty from .miot.miot_spec import MIoTSpecAction, MIoTSpecProperty
@ -120,18 +119,16 @@ class ActionText(MIoTActionEntity, TextEntity):
async def async_set_value(self, value: str) -> None: async def async_set_value(self, value: str) -> None:
if not value: if not value:
return return
in_list: Any = None in_list: list = None
try: try:
in_list = yaml.parse_yaml(content=value) in_list = json.loads(value)
except HomeAssistantError as e: except json.JSONDecodeError as e:
_LOGGER.error( _LOGGER.error(
'action exec failed, %s(%s), invalid action params format, %s', 'action exec failed, %s(%s), invalid action params format, %s',
self.name, self.entity_id, value) self.name, self.entity_id, value)
raise ValueError( raise ValueError(
f'action exec failed, {self.name}({self.entity_id}), ' f'action exec failed, {self.name}({self.entity_id}), '
f'invalid action params format, {value}') from e f'invalid action params format, {value}') from e
if len(self.spec.in_) == 1 and not isinstance(in_list, list):
in_list = [in_list]
if not isinstance(in_list, list) or len(in_list) != len(self.spec.in_): if not isinstance(in_list, list) or len(in_list) != len(self.spec.in_):
_LOGGER.error( _LOGGER.error(
'action exec failed, %s(%s), invalid action params, %s', 'action exec failed, %s(%s), invalid action params, %s',
@ -141,40 +138,16 @@ class ActionText(MIoTActionEntity, TextEntity):
f'invalid action params, {value}') f'invalid action params, {value}')
in_value: list[dict] = [] in_value: list[dict] = []
for index, prop in enumerate(self.spec.in_): for index, prop in enumerate(self.spec.in_):
if prop.format_ == 'str': if type(in_list[index]).__name__ != prop.format_:
if isinstance(in_list[index], (bool, int, float, str)): logging.error(
in_value.append( 'action exec failed, %s(%s), invalid params item, which '
{'piid': prop.iid, 'value': str(in_list[index])}) 'item(%s) in the list must be %s, %s', self.name,
continue self.entity_id, prop.description_trans, prop.format_, value)
elif prop.format_ == 'bool':
if isinstance(in_list[index], (bool, int)):
# yes, no, on, off, true, false and other bool types
# will also be parsed as 0 and 1 of int.
in_value.append(
{'piid': prop.iid, 'value': bool(in_list[index])})
continue
elif prop.format_ == 'float':
if isinstance(in_list[index], (int, float)):
in_value.append(
{'piid': prop.iid, 'value': in_list[index]})
continue
elif prop.format_ == 'int':
if isinstance(in_list[index], int):
in_value.append(
{'piid': prop.iid, 'value': in_list[index]})
continue
# Invalid params type, raise error.
_LOGGER.error(
'action exec failed, %s(%s), invalid params item, '
'which item(%s) in the list must be %s, %s type was %s, %s',
self.name, self.entity_id, prop.description_trans,
prop.format_, in_list[index], type(
in_list[index]).__name__, value)
raise ValueError( raise ValueError(
f'action exec failed, {self.name}({self.entity_id}), ' f'action exec failed, {self.name}({self.entity_id}), '
f'invalid params item, which item({prop.description_trans})' f'invalid params item, which item({prop.description_trans})'
f'in the list must be {prop.format_}, {in_list[index]} type ' f' in the list must be {prop.format_}, {value}')
f'was {type(in_list[index]).__name__}, {value}') in_value.append({'piid': prop.iid, 'value': in_list[index]})
self._attr_native_value = value self._attr_native_value = value
if await self.action_async(in_list=in_value): if await self.action_async(in_list=in_value):