# Rooms, and what is in them One vocabulary for rooms across the whole project, and one answer to "what hardware is in this room". Written because three separate features now need it — the floorplan presence view, the Pebble app, and anything room-scoped like the workshop assistant — and each of them was about to invent its own. ## The room id is an HA `area_id`, everywhere `living_room`, `kitchen`, `workshop`. Lowercase, digits, underscores; Home Assistant slugifies area names into exactly that shape. That one string is the join key for every part of this project that cares where something is: | Where it appears | As what | |---|---| | Home Assistant | the device's **area** | | `CoreSystemConfig.json` | `room` on each kiosk and audio endpoint | | Each host's agent config | `_ROOM`, baked in at build time | | MQTT discovery | `suggested_area` on the device object | | `identity` | `floorplan_rooms.ha_area_id` — the drawn polygon's tie to reality | | `identity`'s `/presence` | the `room` field, read off `AREA_ATTRIBUTE` of a trusted entity | Nothing translates between these. A room named `Living Room` in one file and `living_room` in another is two rooms as far as every join above is concerned, which is why `tools/validate-config.py` rejects anything that is not already an area_id rather than helpfully slugifying it — helpfully slugifying it is how you end up with two. ## How a device learns which room it is in ``` CoreSystemConfig.json tools/config-export.py the ISO builder kiosks[].room ────────────> CORE_KIOSK_ROOM ───────────> _ROOM in the agent's config file │ HA files the device in that area <───────────┘ (suggested_area, on first discovery) ``` Declared once, in the same file that already knows every other fact about that device. Nobody drags devices into areas in the HA UI, and nobody types a room name twice. **The one real limitation: `suggested_area` is a suggestion, and it is only honoured when HA first discovers the device.** Move a panel to another room, rebuild its image, and HA keeps it in the old area — the suggestion is not reapplied. Moving a device means moving it in HA too, once. This is a property of HA's discovery, not something this project can paper over, and it is why the field is named *suggested*. An empty `room` is allowed and is a **warning, not an error**: a household that hasn't settled its room names must still be able to build an image. What it loses is automatic area assignment, which is a nuisance to fix by hand — not a broken device. ## What is not covered by this - **Zigbee devices, cameras, and anything not built by `tools/`.** Their room lives in HA only, set when they are paired or added. That is fine — HA is the registry; this file is about the devices this repo builds images for, which otherwise had no way to say where they were. - **Where a *person* is.** That is `identity`'s `/presence`, and it is a different problem with a different reliability story — see `docs/pebble-presence-watchface.md`'s closing section. - **Where an *item* is.** `pantry-vision` locations for food (`docs/fridge-item-location.md`); nothing tracks tools or parts yet (`docs/workshop-assistant.md`). ## Adding a room 1. Create the area in Home Assistant (or let a device's `suggested_area` create it). 2. Use its area_id as `room` on every kiosk/audio endpoint that lives there. 3. Draw it on the floorplan in `identity`'s admin panel and set its `ha_area_id` to the same string. The room editor offers a pick-list from `GET /floorplan/areas` — every area HA is currently reporting — so this step is choosing from a list rather than retyping an id. Step 3 is optional and independent: presence works without a drawn plan, and a drawn plan is useful before presence is wired up. They only need each other for the views that show people *on* the plan.