"""Home Assistant MQTT Discovery payloads. Создаём per-instance entities: select.cuda_grid__layout — выбор активного layout sensor.cuda_grid__state — текущий layout (для UI) binary_sensor.cuda_grid_controller_online — availability См. https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery """ from __future__ import annotations import json from typing import Any from .config import HaDiscoveryCfg, InstanceCfg from .layouts import PREDEFINED_LAYOUTS def _device_dict(ha: HaDiscoveryCfg) -> dict[str, Any]: return { "identifiers": [ha.device_identifier], "name": ha.device_name, "manufacturer": "gx/vf-cuda-grid", "model": "cuda-grid-controller", "sw_version": "0.1.0", } def availability_topic(prefix_base: str = "cuda_grid") -> str: """Где controller публикует online/offline (LWT).""" return f"{prefix_base}/state/online" def discovery_payloads(ha: HaDiscoveryCfg, instances: list[InstanceCfg]) -> list[tuple[str, str]]: """Список (discovery_topic, payload_json) для publish при startup.""" out: list[tuple[str, str]] = [] avail = availability_topic() # Per-instance entities for inst in instances: # select.layout select_topic = f"{ha.prefix}/select/cuda_grid_{inst.name}/layout/config" select_payload = { "name": f"Layout ({inst.name})", "unique_id": f"cuda_grid_{inst.name}_layout_select", "command_topic": f"cuda_grid/cmd/{inst.name}/layout/set", "state_topic": f"cuda_grid/state/{inst.name}/layout", "options": PREDEFINED_LAYOUTS, "availability_topic": avail, "payload_available": "online", "payload_not_available": "offline", "device": _device_dict(ha), } out.append((select_topic, json.dumps(select_payload))) # sensor.current_layout (text — duplicate state, удобно для automations) sensor_topic = f"{ha.prefix}/sensor/cuda_grid_{inst.name}/current_layout/config" sensor_payload = { "name": f"Current layout ({inst.name})", "unique_id": f"cuda_grid_{inst.name}_layout_sensor", "state_topic": f"cuda_grid/state/{inst.name}/layout", "availability_topic": avail, "payload_available": "online", "payload_not_available": "offline", "device": _device_dict(ha), "icon": "mdi:view-grid", } out.append((sensor_topic, json.dumps(sensor_payload))) # Глобальный availability binary_sensor online_topic = f"{ha.prefix}/binary_sensor/cuda_grid_controller/online/config" online_payload = { "name": "CUDA Grid Controller online", "unique_id": "cuda_grid_controller_online", "state_topic": avail, "payload_on": "online", "payload_off": "offline", "device_class": "connectivity", "device": _device_dict(ha), } out.append((online_topic, json.dumps(online_payload))) return out