This commit is contained in:
Victor Alexandrovich Tsyrenschikov
2026-03-30 20:25:42 +05:00
parent 139f9f1bd2
commit 373ed28445
2449 changed files with 53602 additions and 0 deletions

View File

@@ -0,0 +1,199 @@
"""Schema for an user device.
https://yandex.ru/dev/dialogs/smart-home/doc/reference/get-devices.html
https://yandex.ru/dev/dialogs/smart-home/doc/reference/post-devices-query.html
https://yandex.ru/dev/dialogs/smart-home/doc/reference/post-action.html
"""
from __future__ import annotations
from enum import StrEnum
from typing import Any, List, Literal, Optional, Union
from pydantic import BaseModel, ConfigDict, Field
from .base import APIModel
from .capability import (
CapabilityDescription,
CapabilityInstance,
CapabilityInstanceAction,
CapabilityInstanceActionResultValue,
CapabilityInstanceState,
CapabilityType,
)
from .property import PropertyDescription, PropertyInstanceState
from .response import ResponseCode, ResponsePayload
class DeviceType(StrEnum):
"""User device type.
https://yandex.ru/dev/dialogs/smart-home/doc/concepts/device-types.html
"""
LIGHT = "devices.types.light"
LIGHT_STRIP = "devices.types.light.strip"
LIGHT_CEILING = "devices.types.light.ceiling"
LIGHT_LAMP = "devices.types.light.lamp"
LIGHT_GARLAND = "devices.types.light.garland"
SOCKET = "devices.types.socket"
SWITCH = "devices.types.switch"
SWITCH_RELAY = "devices.types.switch.relay"
THERMOSTAT = "devices.types.thermostat"
THERMOSTAT_AC = "devices.types.thermostat.ac"
MEDIA_DEVICE = "devices.types.media_device"
MEDIA_DEVICE_TV = "devices.types.media_device.tv"
MEDIA_DEVICE_TV_BOX = "devices.types.media_device.tv_box"
MEDIA_DEVICE_RECIEVER = "devices.types.media_device.receiver"
CAMERA = "devices.types.camera"
COOKING = "devices.types.cooking"
COFFEE_MAKER = "devices.types.cooking.coffee_maker"
KETTLE = "devices.types.cooking.kettle"
MULTICOOKER = "devices.types.cooking.multicooker"
OPENABLE = "devices.types.openable"
OPENABLE_CURTAIN = "devices.types.openable.curtain"
OPENABLE_VALVE = "devices.types.openable.valve"
HUMIDIFIER = "devices.types.humidifier"
PURIFIER = "devices.types.purifier"
VACUUM_CLEANER = "devices.types.vacuum_cleaner"
WASHING_MACHINE = "devices.types.washing_machine"
DISHWASHER = "devices.types.dishwasher"
IRON = "devices.types.iron"
SENSOR = "devices.types.sensor"
SENSOR_MOTION = "devices.types.sensor.motion"
SENSOR_VIBRATION = "devices.types.sensor.vibration"
SENSOR_ILLUMINATION = "devices.types.sensor.illumination"
SENSOR_OPEN = "devices.types.sensor.open"
SENSOR_CLIMATE = "devices.types.sensor.climate"
SENSOR_WATER_LEAK = "devices.types.sensor.water_leak"
SENSOR_BUTTON = "devices.types.sensor.button"
SENSOR_GAS = "devices.types.sensor.gas"
SENSOR_SMOKE = "devices.types.sensor.smoke"
SMART_METER = "devices.types.smart_meter"
SMART_METER_COLD_WATER = "devices.types.smart_meter.cold_water"
SMART_METER_ELECTRICITY = "devices.types.smart_meter.electricity"
SMART_METER_GAS = "devices.types.smart_meter.gas"
SMART_METER_HEAT = "devices.types.smart_meter.heat"
SMART_METER_HOT_WATER = "devices.types.smart_meter.hot_water"
PET_DRINKING_FOUNTAIN = "devices.types.pet_drinking_fountain"
PET_FEEDER = "devices.types.pet_feeder"
VENTILATION = "devices.types.ventilation"
VENTILATION_FAN = "devices.types.ventilation.fan"
OTHER = "devices.types.other"
class DeviceInfo(APIModel):
"""Extended device info."""
manufacturer: Optional[str] = Field(default=None)
model: Optional[str] = Field(default=None)
hw_version: Optional[str] = Field(default=None)
sw_version: Optional[str] = Field(default=None)
class DeviceDescription(APIModel):
"""Device description for a device list request."""
id: str
name: str
description: Optional[str] = None
room: Optional[str] = None
type: DeviceType
capabilities: Optional[List[CapabilityDescription]] = None
properties: Optional[List[PropertyDescription]] = None
device_info: Optional[DeviceInfo] = None
class DeviceState(APIModel):
"""Device state for a state query request."""
id: str
capabilities: Optional[List[CapabilityInstanceState]] = None
properties: Optional[List[PropertyInstanceState]] = None
error_code: Optional[ResponseCode] = None
error_message: Optional[str] = None
class DeviceList(ResponsePayload):
"""Response payload for a device list request."""
user_id: str
devices: List[DeviceDescription]
class DeviceStates(ResponsePayload):
"""Response payload for a state query request."""
devices: List[DeviceState]
class StatesRequestDevice(APIModel):
"""Device for a state query request."""
id: str
custom_data: Optional[dict[str, Any]] = None
class StatesRequest(APIModel):
"""Request body for a state query request."""
devices: List[StatesRequestDevice]
class ActionRequestDevice(APIModel):
"""Device for a state change request."""
id: str
capabilities: List[CapabilityInstanceAction]
class ActionRequestPayload(APIModel):
"""Request payload for state change request."""
action_id: Optional[str] = Field(default=None) # ← добавлено для совместимости с Яндексом
devices: List[ActionRequestDevice]
class ActionRequest(APIModel):
"""Request body for a state change request."""
payload: ActionRequestPayload
class SuccessActionResult(APIModel):
"""Success device action result."""
status: Literal["DONE"] = "DONE"
class FailedActionResult(APIModel):
"""Failed device action result."""
status: Literal["ERROR"] = "ERROR"
error_code: ResponseCode
class ActionResultCapabilityState(APIModel):
"""Result of capability instance state change."""
instance: CapabilityInstance
value: Optional[CapabilityInstanceActionResultValue] = None
action_result: Union[SuccessActionResult, FailedActionResult]
class ActionResultCapability(APIModel):
"""Result of capability state change."""
type: CapabilityType
state: ActionResultCapabilityState
class ActionResultDevice(APIModel):
"""Device for a state change response."""
id: str
capabilities: Optional[List[ActionResultCapability]] = None
action_result: Optional[Union[FailedActionResult, SuccessActionResult]] = None
class ActionResult(ResponsePayload):
"""Response for a device state change."""
devices: List[ActionResultDevice]