From 6c284fa1f6db7eaf7fada83f1017e02691d43b74 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Thu, 11 Dec 2025 10:32:53 +0100 Subject: [PATCH] add homekit_aid and load it --- apps/api/main.py | 67 +++++++++++++++++++++++++++++------- config/devices.yaml | 82 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+), 13 deletions(-) diff --git a/apps/api/main.py b/apps/api/main.py index d658004..3f49cd3 100644 --- a/apps/api/main.py +++ b/apps/api/main.py @@ -51,6 +51,9 @@ logger = logging.getLogger(__name__) # Will be populated from Redis pub/sub messages device_states: dict[str, dict[str, Any]] = {} +# Devices configuration cache (loaded once at startup) +devices_cache: list[dict[str, Any]] = [] + # Background task reference background_task: asyncio.Task | None = None @@ -117,15 +120,6 @@ async def get_device_layout(device_id: str): } raise HTTPException(status_code=404, detail="Device layout not found") -@app.on_event("startup") -async def startup_event(): - """Include routers after app is initialized to avoid circular imports.""" - from apps.api.routes.groups_scenes import router as groups_scenes_router - from apps.api.routes.rooms import router as rooms_router - - app.include_router(groups_scenes_router, prefix="") - app.include_router(rooms_router, prefix="") - @app.get("/health") async def health() -> dict[str, str]: @@ -190,7 +184,22 @@ async def redis_state_listener(): @app.on_event("startup") async def startup_event(): """Start background tasks on application startup.""" - global background_task + global background_task, devices_cache + + # Include routers + from apps.api.routes.groups_scenes import router as groups_scenes_router + from apps.api.routes.rooms import router as rooms_router + + app.include_router(groups_scenes_router, prefix="") + app.include_router(rooms_router, prefix="") + + # Load and validate devices configuration + try: + devices_cache = load_devices_from_file() + except Exception as e: + logger.error(f"Failed to load devices configuration: {e}") + raise # Fatal error - application will not start + background_task = asyncio.create_task(redis_state_listener()) logger.info("Started background Redis state listener") @@ -238,32 +247,62 @@ class DeviceInfo(BaseModel): device_id: str type: str name: str + homekit_aid: int features: dict[str, Any] = {} # Configuration helpers -def load_devices() -> list[dict[str, Any]]: - """Load devices from configuration file. +def load_devices_from_file() -> list[dict[str, Any]]: + """Load devices from configuration file and validate. Returns: list: List of device configurations + + Raises: + FileNotFoundError: If devices.yaml doesn't exist + KeyError: If any device is missing required homekit_aid field + ValueError: If devices.yaml is invalid or contains duplicate homekit_aid values """ config_path = Path(__file__).parent.parent.parent / "config" / "devices.yaml" if not config_path.exists(): - return [] + raise FileNotFoundError(f"devices.yaml not found at {config_path}") with open(config_path, "r") as f: config = yaml.safe_load(f) + if not config or "devices" not in config: + raise ValueError("devices.yaml must contain 'devices' key") + # Normalize device entries: accept both 'id' and 'device_id', use 'device_id' internally devices = config.get("devices", []) for device in devices: device["device_id"] = device.pop("device_id", device.pop("id", None)) + + # Validate required homekit_aid field + if "homekit_aid" not in device: + raise KeyError(f"Device {device.get('device_id', 'unknown')} is missing required 'homekit_aid' field") + + # Validate unique homekit_aid values + aids = [d["homekit_aid"] for d in devices] + if len(aids) != len(set(aids)): + duplicates = [aid for aid in aids if aids.count(aid) > 1] + raise ValueError(f"Duplicate homekit_aid values found: {set(duplicates)}") + + logger.info(f"Loaded {len(devices)} devices with unique homekit_aid values (range: {min(aids)}-{max(aids)})") return devices +def load_devices() -> list[dict[str, Any]]: + """Get devices from in-memory cache. + + Returns: + list: List of device configurations (loaded at startup) + """ + return devices_cache + + def get_mqtt_settings() -> tuple[str, int]: """Get MQTT broker settings from environment. @@ -391,6 +430,7 @@ async def get_device(device_id: str) -> DeviceInfo: device_id=device["device_id"], type=device["type"], name=device.get("name", device["device_id"]), + homekit_aid=device["homekit_aid"], features=device.get("features", {}) ) @@ -409,6 +449,7 @@ async def get_devices() -> list[DeviceInfo]: device_id=device["device_id"], type=device["type"], name=device.get("name", device["device_id"]), + homekit_aid=device["homekit_aid"], features=device.get("features", {}) ) for device in devices diff --git a/config/devices.yaml b/config/devices.yaml index 4bfc5db..8016fcf 100644 --- a/config/devices.yaml +++ b/config/devices.yaml @@ -1,6 +1,7 @@ version: 1 devices: - device_id: lampe_semeniere_wohnzimmer + homekit_aid: 2 name: Semeniere type: relay cap_version: "relay@1.0.0" @@ -16,6 +17,7 @@ devices: model: "AC10691" vendor: "OSRAM" - device_id: stehlampe_esszimmer_spiegel + homekit_aid: 3 name: Stehlampe Spiegel type: light cap_version: "light@1.2.0" @@ -27,6 +29,7 @@ devices: state: "zigbee2mqtt/0x001788010d06ea09" set: "zigbee2mqtt/0x001788010d06ea09/set" - device_id: stehlampe_esszimmer_schrank + homekit_aid: 4 name: Stehlampe Schrank type: light cap_version: "light@1.2.0" @@ -38,6 +41,7 @@ devices: state: "zigbee2mqtt/0x001788010d09176c" set: "zigbee2mqtt/0x001788010d09176c/set" - device_id: grosse_lampe_wohnzimmer + homekit_aid: 5 name: grosse Lampe type: relay cap_version: "relay@1.0.0" @@ -53,6 +57,7 @@ devices: model: "AC10691" vendor: "OSRAM" - device_id: lampe_naehtischchen_wohnzimmer + homekit_aid: 6 name: Nähtischchen type: relay cap_version: "relay@1.0.0" @@ -68,6 +73,7 @@ devices: model: "HG06337" vendor: "Lidl" - device_id: kleine_lampe_links_esszimmer + homekit_aid: 7 name: kleine Lampe type: relay cap_version: "relay@1.0.0" @@ -83,6 +89,7 @@ devices: model: "AC10691" vendor: "OSRAM" - device_id: leselampe_esszimmer + homekit_aid: 8 name: Leselampe type: light cap_version: "light@1.2.0" @@ -99,6 +106,7 @@ devices: model: "LED1842G3" vendor: "IKEA" - device_id: medusalampe_schlafzimmer + homekit_aid: 9 name: Medusa-Lampe type: relay cap_version: "relay@1.0.0" @@ -114,6 +122,7 @@ devices: model: "AC10691" vendor: "OSRAM" - device_id: sportlicht_am_fernseher_studierzimmer + homekit_aid: 10 type: light name: am Fernseher cap_version: "light@1.2.0" @@ -131,6 +140,7 @@ devices: model: "LED1733G7" vendor: "IKEA" - device_id: deckenlampe_schlafzimmer + homekit_aid: 11 name: Deckenlampe type: light cap_version: "light@1.2.0" @@ -147,6 +157,7 @@ devices: model: "8718699688882" vendor: "Philips" - device_id: bettlicht_wolfgang + homekit_aid: 12 name: Bettlicht Wolfgang type: light cap_version: "light@1.2.0" @@ -163,6 +174,7 @@ devices: model: "9290020399" vendor: "Philips" - device_id: bettlicht_patty + homekit_aid: 13 name: Bettlicht Patty type: light cap_version: "light@1.2.0" @@ -179,6 +191,7 @@ devices: model: "9290020399" vendor: "Philips" - device_id: schranklicht_hinten_patty + homekit_aid: 14 name: Schranklicht hinten type: light cap_version: "light@1.2.0" @@ -195,6 +208,7 @@ devices: model: "8718699673147" vendor: "Philips" - device_id: schranklicht_vorne_patty + homekit_aid: 15 name: Schranklicht vorne type: relay cap_version: "relay@1.0.0" @@ -210,6 +224,7 @@ devices: model: "AC10691" vendor: "OSRAM" - device_id: leselampe_patty + homekit_aid: 16 name: Leselampe type: light cap_version: "light@1.2.0" @@ -226,6 +241,7 @@ devices: model: "8718699673147" vendor: "Philips" - device_id: deckenlampe_esszimmer + homekit_aid: 17 name: Deckenlampe type: light cap_version: "light@1.2.0" @@ -242,6 +258,7 @@ devices: model: "929002241201" vendor: "Philips" - device_id: deckenlampe_flur_oben + homekit_aid: 18 name: Deckenlampe oben type: light cap_version: "light@1.2.0" @@ -259,6 +276,7 @@ devices: model: "929003099001" vendor: "Philips" - device_id: kueche_deckenlampe + homekit_aid: 19 name: Deckenlampe type: light cap_version: "light@1.2.0" @@ -275,6 +293,7 @@ devices: model: "929002469202" vendor: "Philips" - device_id: sportlicht_tisch + homekit_aid: 20 name: am Tisch type: light cap_version: "light@1.2.0" @@ -291,6 +310,7 @@ devices: model: "4058075729063" vendor: "LEDVANCE" - device_id: sportlicht_regal + homekit_aid: 21 name: am Regal type: light cap_version: "light@1.2.0" @@ -307,6 +327,7 @@ devices: model: "4058075729063" vendor: "LEDVANCE" - device_id: licht_flur_oben_am_spiegel + homekit_aid: 22 name: Spiegel type: light cap_version: "light@1.2.0" @@ -324,6 +345,7 @@ devices: model: "LED1732G11" vendor: "IKEA" - device_id: experimentlabtest + homekit_aid: 23 name: Test Lampe type: light cap_version: "light@1.2.0" @@ -340,6 +362,7 @@ devices: model: "4058075208421" vendor: "LEDVANCE" - device_id: thermostat_wolfgang + homekit_aid: 24 name: Heizung type: thermostat cap_version: "thermostat@1.0.0" @@ -359,6 +382,7 @@ devices: model: "GS361A-H04" vendor: "Siterwell" - device_id: thermostat_kueche + homekit_aid: 25 name: Heizung type: thermostat cap_version: "thermostat@1.0.0" @@ -378,6 +402,7 @@ devices: model: "GS361A-H04" vendor: "Siterwell" - device_id: thermostat_schlafzimmer + homekit_aid: 26 name: Heizung type: thermostat cap_version: "thermostat@1.0.0" @@ -397,6 +422,7 @@ devices: peer_id: "42" channel: "1" - device_id: thermostat_esszimmer + homekit_aid: 27 name: Heizung type: thermostat cap_version: "thermostat@1.0.0" @@ -416,6 +442,7 @@ devices: peer_id: "45" channel: "1" - device_id: thermostat_wohnzimmer + homekit_aid: 28 name: Heizung type: thermostat cap_version: "thermostat@1.0.0" @@ -435,6 +462,7 @@ devices: peer_id: "46" channel: "1" - device_id: thermostat_patty + homekit_aid: 29 name: Heizung type: thermostat cap_version: "thermostat@1.0.0" @@ -454,6 +482,7 @@ devices: peer_id: "39" channel: "1" - device_id: thermostat_bad_oben + homekit_aid: 30 name: Heizung type: thermostat cap_version: "thermostat@1.0.0" @@ -473,6 +502,7 @@ devices: peer_id: "41" channel: "1" - device_id: thermostat_bad_unten + homekit_aid: 31 name: Heizung type: thermostat cap_version: "thermostat@1.0.0" @@ -492,6 +522,7 @@ devices: peer_id: "48" channel: "1" - device_id: sterne_wohnzimmer + homekit_aid: 32 name: Sterne type: relay cap_version: "relay@1.0.0" @@ -507,6 +538,7 @@ devices: model: "AC10691" vendor: "OSRAM" - device_id: kontakt_schlafzimmer_strasse + homekit_aid: 33 name: Fenster type: contact cap_version: contact_sensor@1.0.0 @@ -515,6 +547,7 @@ devices: state: homegear/instance1/plain/52/1/STATE features: {} - device_id: kontakt_esszimmer_strasse_rechts + homekit_aid: 34 type: contact name: Fenster rechts cap_version: contact_sensor@1.0.0 @@ -523,6 +556,7 @@ devices: state: homegear/instance1/plain/26/1/STATE features: {} - device_id: kontakt_esszimmer_strasse_links + homekit_aid: 35 name: Fenster links type: contact cap_version: contact_sensor@1.0.0 @@ -531,6 +565,7 @@ devices: state: homegear/instance1/plain/27/1/STATE features: {} - device_id: kontakt_wohnzimmer_garten_rechts + homekit_aid: 36 name: Fenster rechts type: contact cap_version: contact_sensor@1.0.0 @@ -539,6 +574,7 @@ devices: state: homegear/instance1/plain/28/1/STATE features: {} - device_id: kontakt_wohnzimmer_garten_links + homekit_aid: 37 name: Fenster links type: contact cap_version: contact_sensor@1.0.0 @@ -547,6 +583,7 @@ devices: state: homegear/instance1/plain/29/1/STATE features: {} - device_id: kontakt_kueche_garten_fenster + homekit_aid: 38 name: Fenster Garten type: contact cap_version: contact_sensor@1.0.0 @@ -555,6 +592,7 @@ devices: state: zigbee2mqtt/0x00158d008b332785 features: {} - device_id: kontakt_kueche_garten_tuer + homekit_aid: 39 type: contact name: Terrassentür cap_version: contact_sensor@1.0.0 @@ -563,6 +601,7 @@ devices: state: zigbee2mqtt/0x00158d008b332788 features: {} - device_id: kontakt_kueche_strasse_rechts + homekit_aid: 40 name: Fenster Straße rechts type: contact cap_version: contact_sensor@1.0.0 @@ -571,6 +610,7 @@ devices: state: zigbee2mqtt/0x00158d008b151803 features: {} - device_id: kontakt_kueche_strasse_links + homekit_aid: 41 name: Fenster Straße links type: contact cap_version: contact_sensor@1.0.0 @@ -579,6 +619,7 @@ devices: state: zigbee2mqtt/0x00158d008b331d0b features: {} - device_id: kontakt_patty_garten_rechts + homekit_aid: 42 type: contact name: Fenster Garten rechts cap_version: contact_sensor@1.0.0 @@ -587,6 +628,8 @@ devices: state: homegear/instance1/plain/18/1/STATE features: {} - device_id: kontakt_patty_garten_links + homekit_aid: 43 + homekit_aid: 43 type: contact name: Fenster Garten links cap_version: contact_sensor@1.0.0 @@ -595,6 +638,7 @@ devices: state: homegear/instance1/plain/22/1/STATE features: {} - device_id: kontakt_patty_strasse + homekit_aid: 44 type: contact name: Fenster Straße cap_version: contact_sensor@1.0.0 @@ -603,6 +647,7 @@ devices: state: zigbee2mqtt/0x00158d000af457cf features: {} - device_id: kontakt_wolfgang_garten + homekit_aid: 45 type: contact name: Fenster cap_version: contact_sensor@1.0.0 @@ -611,6 +656,7 @@ devices: state: zigbee2mqtt/0x00158d008b3328da features: {} - device_id: kontakt_bad_oben_strasse + homekit_aid: 46 type: contact name: Fenster cap_version: contact_sensor@1.0.0 @@ -619,6 +665,7 @@ devices: state: zigbee2mqtt/0x00158d008b333aec features: {} - device_id: kontakt_bad_unten_strasse + homekit_aid: 47 type: contact name: Fenster cap_version: contact_sensor@1.0.0 @@ -627,6 +674,7 @@ devices: state: homegear/instance1/plain/44/1/STATE features: {} - device_id: sensor_schlafzimmer + homekit_aid: 48 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -635,6 +683,7 @@ devices: state: zigbee2mqtt/0x00158d00043292dc features: {} - device_id: sensor_wohnzimmer + homekit_aid: 49 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -643,6 +692,7 @@ devices: state: zigbee2mqtt/0x00158d0008975707 features: {} - device_id: sensor_kueche + homekit_aid: 50 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -651,6 +701,7 @@ devices: state: zigbee2mqtt/0x00158d00083299bb features: {} - device_id: sensor_arbeitszimmer_patty + homekit_aid: 51 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -659,6 +710,7 @@ devices: state: zigbee2mqtt/0x00158d0003f052b7 features: {} - device_id: sensor_arbeitszimmer_wolfgang + homekit_aid: 52 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -667,6 +719,7 @@ devices: state: zigbee2mqtt/0x00158d000543fb99 features: {} - device_id: sensor_bad_oben + homekit_aid: 53 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -675,6 +728,7 @@ devices: state: zigbee2mqtt/0x00158d00093e8987 features: {} - device_id: sensor_bad_unten + homekit_aid: 54 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -683,6 +737,7 @@ devices: state: zigbee2mqtt/0x00158d00093e662a features: {} - device_id: sensor_flur + homekit_aid: 55 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -691,6 +746,7 @@ devices: state: zigbee2mqtt/0x00158d000836ccc6 features: {} - device_id: sensor_waschkueche + homekit_aid: 56 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -699,6 +755,7 @@ devices: state: zigbee2mqtt/0x00158d000449f3bc features: {} - device_id: sensor_sportzimmer + homekit_aid: 57 type: temp_humidity_sensor name: Thermometer cap_version: temp_humidity_sensor@1.0.0 @@ -707,6 +764,7 @@ devices: state: zigbee2mqtt/0x00158d0009421422 features: {} - device_id: licht_spuele_kueche + homekit_aid: 58 name: Spüle type: relay cap_version: "relay@1.0.0" @@ -717,6 +775,7 @@ devices: set: "shellies/shellyplug-s-DED4E4/relay/0/command" state: "shellies/shellyplug-s-DED4E4/relay/0" - device_id: putzlicht_kueche + homekit_aid: 59 name: Putzlicht type: light cap_version: "light@1.2.0" @@ -728,6 +787,7 @@ devices: state: "zigbee2mqtt/0xa4c138563834406c" set: "zigbee2mqtt/0xa4c138563834406c/set" - device_id: licht_schrank_esszimmer + homekit_aid: 60 name: Schrank type: relay cap_version: "relay@1.0.0" @@ -738,6 +798,7 @@ devices: set: "shellies/schrankesszimmer/relay/0/command" state: "shellies/schrankesszimmer/relay/0" - device_id: licht_regal_wohnzimmer + homekit_aid: 61 type: relay name: Regal cap_version: "relay@1.0.0" @@ -748,6 +809,7 @@ devices: set: "shellies/wohnzimmer-regal/relay/0/command" state: "shellies/wohnzimmer-regal/relay/0" - device_id: licht_terasse + homekit_aid: 62 name: Terrasse type: relay cap_version: "relay@1.0.0" @@ -758,6 +820,7 @@ devices: set: "shellies/lichtterasse/relay/0/command" state: "shellies/lichtterasse/relay/0" - device_id: kugellampe_patty + homekit_aid: 63 name: Kugellampe Patty type: light cap_version: "light@1.2.0" @@ -769,6 +832,7 @@ devices: state: "zigbee2mqtt/0xbc33acfffe21f547" set: "zigbee2mqtt/0xbc33acfffe21f547/set" - device_id: kueche_fensterbank_licht + homekit_aid: 64 name: Fensterbank Küche type: light cap_version: "light@1.2.0" @@ -780,6 +844,7 @@ devices: state: "zigbee2mqtt/0xf0d1b8000017515d" set: "zigbee2mqtt/0xf0d1b8000017515d/set" - device_id: licht_kommode_schlafzimmer + homekit_aid: 65 name: Kommode Schlafzimmer type: relay cap_version: "relay@1.0.0" @@ -790,6 +855,7 @@ devices: set: "cmnd/tasmota/04/POWER" state: "stat/tasmota/04/POWER" - device_id: licht_fensterbank_esszimmer + homekit_aid: 66 name: Fensterbank Esszimmer type: relay cap_version: "relay@1.0.0" @@ -800,6 +866,7 @@ devices: set: "cmnd/tasmota/02/POWER" state: "stat/tasmota/02/POWER" - device_id: licht_schreibtisch_patty + homekit_aid: 67 name: Schreibtisch Patty type: relay cap_version: "relay@1.0.0" @@ -810,6 +877,7 @@ devices: set: "cmnd/tasmota/03/POWER" state: "stat/tasmota/03/POWER" - device_id: kugeln_regal_flur + homekit_aid: 68 name: Kugeln Regal Flur type: relay cap_version: "relay@1.0.0" @@ -820,6 +888,7 @@ devices: set: "cmnd/tasmota/01/POWER" state: "stat/tasmota/01/POWER" - device_id: schrank_flur_haustuer + homekit_aid: 69 name: Schrank Flur Haustür type: relay cap_version: "relay@1.0.0" @@ -830,6 +899,7 @@ devices: set: "cmnd/tasmota/05/POWER" state: "stat/tasmota/05/POWER" - device_id: gartenlicht_vorne + homekit_aid: 70 name: Gartenlicht vorne type: relay cap_version: "relay@1.0.0" @@ -841,6 +911,7 @@ devices: state: "stat/tasmota/06/POWER" - device_id: power_relay_caroutlet + homekit_aid: 71 name: Car Outlet type: relay cap_version: "relay@1.0.0" @@ -851,6 +922,7 @@ devices: set: "IoT/Car/Control" state: "IoT/Car/Control/State" - device_id: powermeter_caroutlet + homekit_aid: 72 name: Car Outlet type: three_phase_powermeter cap_version: "three_phase_powermeter@1.0.0" @@ -858,6 +930,7 @@ devices: topics: state: "IoT/Car/Values" - device_id: sensor_caroutlet + homekit_aid: 73 name: Car Outlet type: contact cap_version: contact_sensor@1.0.0 @@ -866,6 +939,7 @@ devices: state: IoT/Car/Feedback/State - device_id: schranklicht_flur_vor_kueche + homekit_aid: 74 name: Schranklicht Flur vor Küche type: light cap_version: "relay@1.0.0" @@ -876,6 +950,7 @@ devices: state: "zigbee2mqtt/0xf0d1b80000155a1f" set: "zigbee2mqtt/0xf0d1b80000155a1f/set" - device_id: deckenlampe_wohnzimmer + homekit_aid: 75 name: Deckenlampe Wohnzimmer type: light cap_version: "relay@1.0.0" @@ -889,6 +964,7 @@ devices: - device_id: keller_flur_licht + homekit_aid: 76 name: Keller Flur Licht type: relay cap_version: "relay@1.0.0" @@ -899,6 +975,7 @@ devices: set: "pulsegen/command/10/21" state: "pulsegen/status/10" - device_id: waschkueche_licht + homekit_aid: 77 name: Waschküche Licht type: relay cap_version: "relay@1.0.0" @@ -909,6 +986,7 @@ devices: set: "pulsegen/command/8/22" state: "pulsegen/status/8" - device_id: werkstatt_licht + homekit_aid: 78 name: Werkstatt Licht type: relay cap_version: "relay@1.0.0" @@ -919,6 +997,7 @@ devices: set: "pulsegen/command/7/19" state: "pulsegen/status/7" - device_id: sportzimmer_licht + homekit_aid: 79 name: Sportzimmer Licht type: relay cap_version: "relay@1.0.0" @@ -929,6 +1008,7 @@ devices: set: "pulsegen/command/9/20" state: "pulsegen/status/9" - device_id: deckenlampe_patty + homekit_aid: 80 name: Deckenlampe Patty type: relay cap_version: "relay@1.0.0" @@ -939,6 +1019,7 @@ devices: set: "pulsegen/command/4/16" state: "pulsegen/status/4" - device_id: regallampe_esszimmer + homekit_aid: 81 name: Regallampe Esszimmer type: relay cap_version: "relay@1.0.0" @@ -950,6 +1031,7 @@ devices: state: "IoT/WifiRelay1/State" - device_id: herdlicht + homekit_aid: 82 name: Herdlicht type: light cap_version: "relay@1.0.0"