ThinkingHome.Alice
ThinkingHome.Alice.Mapping
AliceMapper Class
Перевод нейтральной модели устройств (ThinkingHome.DeviceModel) в DTO Алисы и обратно. Модель Алисы плоская, поэтому каждый нейтральный endpoint → отдельное устройство с составным id (AliceDeviceId). Здесь живёт вся специфика формата Яндекса; ядро о ней не знает. Пока покрыты OnOff, range (яркость, положение, температура), цвет (color_setting), режимы (mode: fan_speed, thermostat), тумблеры (toggle: oscillation) и свойства-сенсоры (properties: float temperature/humidity/battery_level/illumination/pressure/co2_level/water_meter, event motion/open/water_leak) — свойства read-only, идут в отдельную ветку properties у Алисы.
Маппинг ограничен замкнутым словарём преобразований (все — детерминированные, чистые функции): • 1:1 relabel — OnOff → on_off • value-transform — Brightness (int) → range (0–100) • type ↔ instance — Color{Rgb,Temperature}State ↔ color_setting {rgb, temperature_k} • derivation (1:N) — Open → range:open + производное on_off (открыто = положение > 0) • suppression (1:0) — свойство ядра, невыразимое в словаре Алисы, осознанно не отдаётся (AirQuality). Допустим только для свойств; устройство не исчезает никогда: тип без соответствия у Алисы мапится в devices.types.other. Правила: (1) ядро — гранулярность Matter; (2) любой маппинг выражается этим словарём; (3) если не выражается — это дефект ядра, чинится там, а не escape-hatch'ем в маппере.
public static class AliceMapperInheritance System.Object → AliceMapper
Methods
AliceMapper.ToActionResult(CommandOutcome) Method
Общий результат операции: нейтральный CommandOutcome → action_result Алисы.
public static ThinkingHome.Alice.Model.ActionResult.ActionResult ToActionResult(ThinkingHome.DeviceModel.CommandOutcome outcome);Parameters
outcome CommandOutcome
Returns
AliceMapper.ToCallbackState(string, IReadOnlyList<StateChange>, long) Method
Report: пачка изменений за окно → один callback-запрос Notification API (user_id = hostId). Дедуп по слоту кэша (устройство, endpoint, instance) — последнее значение побеждает (то же правило, что у кэша хоста, включая осознанно общий слот цвета); затем группировка по (устройство, endpoint) и чистый реюз query-ветки: разъезд по capabilities/properties и derivation работают как в query.
public static ThinkingHome.Alice.Model.Callback.CallbackStateRequest ToCallbackState(string userId, System.Collections.Generic.IReadOnlyList<ThinkingHome.DeviceModel.State.StateChange> changes, long ts);Parameters
userId System.String
changes System.Collections.Generic.IReadOnlyList<StateChange>
ts System.Int64
Returns
AliceMapper.ToCapabilityActionResult(CapabilityActionParamsBase, CommandOutcome) Method
Action: результат нейтральной команды → результат способности Алисы.
public static ThinkingHome.Alice.Model.Capabilities.CapabilityActionResultBase ToCapabilityActionResult(ThinkingHome.Alice.Model.Capabilities.CapabilityActionParamsBase action, ThinkingHome.DeviceModel.CommandOutcome outcome);Parameters
action CapabilityActionParamsBase
outcome CommandOutcome
Returns
AliceMapper.ToCommand(CapabilityActionParamsBase, int) Method
Action: параметры способности Алисы + endpoint → нейтральная команда.
public static ThinkingHome.DeviceModel.Commands.DeviceCommand ToCommand(ThinkingHome.Alice.Model.Capabilities.CapabilityActionParamsBase action, int endpointId);Parameters
action CapabilityActionParamsBase
endpointId System.Int32
Returns
AliceMapper.ToDevices(DeviceDescriptor) Method
Discovery: нейтральный дескриптор → по одному Device Алисы на каждый endpoint.
public static System.Collections.Generic.IEnumerable<ThinkingHome.Alice.Model.Device> ToDevices(ThinkingHome.DeviceModel.DeviceDescriptor descriptor);Parameters
descriptor DeviceDescriptor
Returns
System.Collections.Generic.IEnumerable<Device>
AliceMapper.ToDeviceState(AliceDeviceId, DeviceSnapshot) Method
Query: весь снимок устройства + id → DeviceState (только значения нужного endpoint'а); значения способностей и свойств разъезжаются по своим веткам по типу значения.
public static ThinkingHome.Alice.Model.DeviceState ToDeviceState(ThinkingHome.Alice.Mapping.AliceDeviceId id, ThinkingHome.DeviceModel.State.DeviceSnapshot snapshot);Parameters
snapshot DeviceSnapshot