python
This commit is contained in:
84
custom_components/yandex_station/conversation.py
Normal file
84
custom_components/yandex_station/conversation.py
Normal file
@@ -0,0 +1,84 @@
|
||||
import logging
|
||||
|
||||
from homeassistant.components.conversation import (
|
||||
ConversationEntity,
|
||||
ConversationEntityFeature,
|
||||
ConversationInput,
|
||||
ConversationResult,
|
||||
)
|
||||
from homeassistant.helpers.entity import DeviceInfo
|
||||
from homeassistant.helpers.intent import IntentResponse, IntentResponseErrorCode
|
||||
from homeassistant.util import ulid
|
||||
|
||||
from .core.const import DOMAIN
|
||||
from .core.yandex_quasar import YandexQuasar
|
||||
from .core.yandex_station import YandexStation
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def async_setup_entry(hass, entry, async_add_entities):
|
||||
quasar: YandexQuasar = hass.data[DOMAIN][entry.unique_id]
|
||||
async_add_entities(
|
||||
[YandexConversation(quasar, speaker) for speaker in quasar.speakers], False
|
||||
)
|
||||
|
||||
|
||||
class YandexConversation(ConversationEntity):
|
||||
_attr_entity_registry_enabled_default = False
|
||||
_attr_supported_features = ConversationEntityFeature.CONTROL
|
||||
|
||||
def __init__(self, quasar: YandexQuasar, device: dict) -> None:
|
||||
self.quasar = quasar
|
||||
self.device = device
|
||||
|
||||
self._attr_name = device["name"] + " Алиса"
|
||||
self._attr_unique_id = device["quasar_info"]["device_id"] + "_conversation"
|
||||
|
||||
self._attr_device_info = DeviceInfo(
|
||||
identifiers={(DOMAIN, device["quasar_info"]["device_id"])},
|
||||
name=self.device["name"],
|
||||
)
|
||||
|
||||
@property
|
||||
def supported_languages(self) -> list[str]:
|
||||
return ["ru"]
|
||||
|
||||
async def async_process(self, user_input: ConversationInput) -> ConversationResult:
|
||||
response = IntentResponse(language=user_input.language)
|
||||
|
||||
if user_input.conversation_id is None:
|
||||
conversation_id = ulid.ulid_now()
|
||||
else:
|
||||
try:
|
||||
ulid.ulid_to_bytes(user_input.conversation_id)
|
||||
conversation_id = ulid.ulid_now()
|
||||
except ValueError:
|
||||
conversation_id = user_input.conversation_id
|
||||
|
||||
entity: YandexStation = self.device.get("entity")
|
||||
if entity and entity.glagol:
|
||||
card = await entity.glagol.send(
|
||||
{"command": "sendText", "text": user_input.text}
|
||||
)
|
||||
if card:
|
||||
if text := card.get("text"):
|
||||
response.async_set_speech(text)
|
||||
elif error := card.get("error"):
|
||||
response.async_set_error(
|
||||
IntentResponseErrorCode.FAILED_TO_HANDLE, error
|
||||
)
|
||||
else:
|
||||
response.async_set_error(
|
||||
IntentResponseErrorCode.NO_INTENT_MATCH, "Нет текстового ответа"
|
||||
)
|
||||
else:
|
||||
response.async_set_error(
|
||||
IntentResponseErrorCode.FAILED_TO_HANDLE, "Неизвестная ошибка"
|
||||
)
|
||||
else:
|
||||
response.async_set_error(
|
||||
IntentResponseErrorCode.UNKNOWN, "Алиса недоступна"
|
||||
)
|
||||
|
||||
return ConversationResult(response=response, conversation_id=conversation_id)
|
||||
Reference in New Issue
Block a user