HomeKit - A room sync solution

I have a (pretty clunky) solution to keeping HomeKit accessories organised:

It’s a macOS app, and a script:

The main functionality works like so…

  1. Fetch at all of your accessories in HomeKit
  2. For the accessories that are from Home Assistant:
    a. Look up the Room/Area
    b. Note when Home Assistant and HomeKit rooms conflict
  3. Saves a plan that resolves the accessory room conflicts by selecting the room from Home Assistant

Example:

$ scripts/manage_homekit_rooms.py

Wrote plan CSV: artifacts/homekit-plan-20260312-223133.csv
Accessories scanned: 201
Planned moves: 8
Dry run only. Re-run with --apply to move accessories.

...

$ ./manage_homekit_rooms.py --apply-plan artifacts/homekit-plan-20260312-223133.csv
Loaded plan CSV: artifacts/homekit-plan-20260312-223133.csv
Rows in plan: 99
Planned moves: 8
Moves applied: 8
Wrote snapshot CSV: artifacts/homekit-snapshot-20260312-223725.csv

Some other features:

  • Edit the CSV before applying (might be handy for bulk changes)
  • Save and restore snapshots (e.g. don’t check Home Assistant)

I notice another project for managing HomeKit:

This is much simpler than having to build and run your own macOS app - it uses Shortcuts and AppleScript. I’ll investigate swapping that out.

Oh, and yes, it’s all vibe coded. I don’t know Swift.

Oh that's awesome — wish I'd seen this before some of the work I did! I ended up going down a similar path and built something that tackles it from a slightly different angle, happy to share.

The problem I kept running into: HA and HomeKit drift apart over time — different room names, different friendly names, and after any device swap or migration you don't always know which HomeKit UUID maps to which HA entity. When names don't match (or you have a rack of similar lights), there's no reliable way to correlate them without guessing.

What I built: ha-homekit-bridge-connect — a Textual TUI that lets you physically actuate a device once and automatically correlates the HA state change with the HomeKit accessory that responded. You don't have to trust that names align, you just touch the switch and it figures out the UUID. Confirmed matches persist, and then it applies room assignments and renames in gated dry-run-first steps — nothing writes until you explicitly confirm.

It goes through a HomeKit MCP proxy rather than native macOS APIs, so it runs on Linux. Still rough around the edges but the core matching works well.