Adds an OMNI_PCA_FIXTURE escape hatch so the mock can serve real panel data instead of the synthetic five-zone state. With this in place the dev stack is wire-indistinguishable from the source panel for everything the HA integration touches: 330 programs, 16 zones, 44 units, 2 thermostats etc. from our test fixture. - run_mock_panel.py: --pca / OMNI_PCA_FIXTURE accepts a path; the decryption key is auto-derived from a sibling PCA01.CFG when one exists (the common PC Access export layout), with --pca-key / OMNI_PCA_FIXTURE_KEY as override. Falls back to KEY_EXPORT for vanilla unsigned exports. - docker-compose.yml: mount /home/kdm/home-auto/HAI as /fixtures read-only and surface OMNI_PCA_FIXTURE so dev/.env can drive it. - dev/README.md: new section documenting fixture loading. - dev/screenshot_overview.py: quick playwright helper for capturing the side-panel landing page with whatever fixture is loaded. - dev/artifacts/screenshots/2026-05-17/real-pca-overview.png: snapshot of the Omni Programs side panel against the real .pca fixture (330 programs).
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
Load real .pca data into the mock
By default the mock serves a small synthetic state (five zones, four
units, …). Point OMNI_PCA_FIXTURE at a real .pca file to make the
mock indistinguishable on the wire from the source panel:
# dev/.env (gitignored)
OMNI_PCA_FIXTURE=/fixtures/path/to/Account.pca
The host directory /home/kdm/home-auto/HAI is mounted at /fixtures
inside the mock-panel container (see docker-compose.yml); adjust the
mount if your .pca lives elsewhere.
The decryption key is auto-derived from a sibling PCA01.CFG if one
exists (this is how PC Access exports usually ship). To override:
OMNI_PCA_FIXTURE_KEY=0xC1A280B2 # or --pca-key on the command line
MockState.from_pca populates zones, units, areas, thermostats,
buttons, programs, model byte, and firmware version from the file —
everything the HA integration reads at discovery time.
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.