198 lines
5.9 KiB
Python
198 lines
5.9 KiB
Python
"""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 enum import StrEnum
|
|
from typing import Any, Literal
|
|
|
|
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: str | None = None
|
|
model: str | None = None
|
|
hw_version: str | None = None
|
|
sw_version: str | None = None
|
|
|
|
|
|
class DeviceDescription(APIModel):
|
|
"""Device description for a device list request."""
|
|
|
|
id: str
|
|
name: str
|
|
description: str | None = None
|
|
room: str | None = None
|
|
type: DeviceType
|
|
capabilities: list[CapabilityDescription] | None = None
|
|
properties: list[PropertyDescription] | None = None
|
|
device_info: DeviceInfo | None = None
|
|
|
|
|
|
class DeviceState(APIModel):
|
|
"""Device state for a state query request."""
|
|
|
|
id: str
|
|
capabilities: list[CapabilityInstanceState] | None = None
|
|
properties: list[PropertyInstanceState] | None = None
|
|
error_code: ResponseCode | None = None
|
|
error_message: str | None = 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: dict[str, Any] | None = 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."""
|
|
|
|
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: CapabilityInstanceActionResultValue | None = None
|
|
action_result: 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: list[ActionResultCapability] | None = None
|
|
action_result: FailedActionResult | SuccessActionResult | None = None
|
|
|
|
|
|
class ActionResult(ResponsePayload):
|
|
"""Response for a device state change."""
|
|
|
|
devices: list[ActionResultDevice]
|