Replace the brittle bind-mount-over-site-packages trick with a proper ``pip install --no-deps /opt/omni-pca-src`` in the HA container's entrypoint. This gives HA a real ``omni_pca-2026.5.10.dist-info`` so the manifest's requirement check passes, plus the v1 subpackage that's not in the published wheel yet (omni-pca==2026.5.10 isn't on PyPI). Before: ``--force-recreate`` broke the dev stack because the bind mount overlaid the package contents but left no dist-info, and HA's uv-based installer can't fetch omni-pca from PyPI. After: container recreate just works. ``docker compose restart homeassistant`` re-installs from the latest local source on every start, so HA + library are always in sync with the working tree. Header comments updated to mention the real-panel (UDP/v1) config-flow fields alongside the existing mock-panel ones.
Dev stack
Local Home Assistant + MockPanel for clicking around the integration without a real Omni controller. Useful for screenshots, manual smoke tests, and seeing what the entity layout looks like.
Quick start
cd dev/
make dev-up # docker compose up -d
# wait ~30s for HA to boot
open http://localhost:8123
First time: HA onboarding wizard (any name / location works). Then:
- Settings → Devices & Services → Add Integration
- Search for HAI/Leviton Omni Panel
- Fill in:
- host:
host.docker.internal - port:
14369 - controller key:
000102030405060708090a0b0c0d0e0f
- host:
- Submit. Within a few seconds you should see the Omni Pro II device with ~25 entities (binary sensors, lights, alarm panel, climate, sensors, buttons, switches, the events entity).
What the mock simulates
Five named zones, four units, two areas, two thermostats, three button
macros. User codes 1234 (master, code index 1) and 5678 (code index 2).
Arming the alarm with code 1234 will succeed and the
alarm_control_panel entity transitions through ARMING → ARMED_AWAY in
real time via the panel's push-event simulation. Wrong code → HA error
toast, panel stays disarmed.
Other targets
make dev-logs # tail HA + mock logs
make dev-mock # run only the mock on the host (no docker)
make dev-down # stop the stack
make dev-reset # wipe HA config and start fresh
Notes
- The HA container mounts
../custom_components/omni_pca/read-only, so edits to the integration need a restart (docker compose restart homeassistant) to take effect. - The mock panel binds
0.0.0.0:14369inside the container. If you prefer to talk to it from the host directly (e.g. withomni-pcaCLI), usemake dev-mockto run it natively.