dev/screenshot.py — end-to-end automated demo:
* onboards HA via /api/onboarding (user creation + auth_code flow)
* subsequent runs log in via /auth/login_flow with saved credentials
* adds the omni_pca config entry via /api/config/config_entries/flow
* uses HA's template REST endpoint to discover the panel device_id
* launches a headless chromium via playwright with prefetched auth tokens
* captures 6 deep-linked screenshots:
01-overview.png — Lovelace
02-integrations-list.png — HAI/Leviton sitting next to HA's built-ins
03-omni-pca-config.png — '1 device · 38 entities', custom integration
04-panel-device.png — Omni Pro II device page with full controls
05-entities-omni.png — config_entry filtered entities table
06-developer-states.png — alarm_control_panel.omni_pro_ii_main with
raw_mode_name=OFF, code_arm_required=true,
etc. proving real entity state from mock
dev/docker-compose.yml — mock-panel command rewritten:
* Mounts only src/ and run_mock_panel.py (read-only) instead of the full
project so uv doesn't try to recreate the host's .venv on a RO mount
* Installs cryptography via uv pip install --system
* PYTHONPATH set to /tmp/mock/src so omni_pca imports work without a
package install
dev/artifacts/screenshots/2026-05-10/ — six PNGs from the run.
.gitignore — adds dist/ for build artifacts.
Confirmed end-to-end: HA discovered the integration via mDNS hint
(showed up in the onboarding wizard's compatible-devices step), the
config flow connected to the mock over host.docker.internal:14369,
materialized 38 entities across 8 platforms (alarm_control_panel,
binary_sensor, button, climate, event, light, sensor, switch), and
displayed everything in the device + entity registries with friendly
names and attributes intact. The integration name hash is 38 entities
because the mock seeds 5 zones (binary + bypass) + 4 units + 2 areas +
2 thermostats + 3 buttons + 3 system-level binary sensors + 2 system
sensors + 6 thermostat sensors + 1 event entity = 38 (matches HA UI).
49 lines
1.5 KiB
YAML
49 lines
1.5 KiB
YAML
# Local dev stack: real Home Assistant talking to a MockPanel running on
|
|
# the host. Lets you click around the UI and grab screenshots without a
|
|
# physical Omni controller.
|
|
#
|
|
# make dev-up # start
|
|
# make dev-logs # tail HA logs
|
|
# make dev-down # stop and clean
|
|
#
|
|
# Once running, open http://localhost:8123 and:
|
|
# 1. Onboard with any name / location.
|
|
# 2. Settings -> Devices & Services -> Add Integration ->
|
|
# "HAI/Leviton Omni Panel".
|
|
# 3. Use:
|
|
# host host.docker.internal
|
|
# port 14369
|
|
# controller_key 000102030405060708090a0b0c0d0e0f
|
|
# (matches scripts/run_mock_panel.py defaults)
|
|
|
|
services:
|
|
mock-panel:
|
|
image: ghcr.io/astral-sh/uv:python3.14-bookworm-slim
|
|
working_dir: /tmp/mock
|
|
volumes:
|
|
- ../src:/tmp/mock/src:ro
|
|
- ./run_mock_panel.py:/tmp/mock/run_mock_panel.py:ro
|
|
environment:
|
|
PYTHONPATH: /tmp/mock/src
|
|
command:
|
|
- sh
|
|
- -c
|
|
- "uv pip install --system --quiet cryptography && python /tmp/mock/run_mock_panel.py --host 0.0.0.0 --port 14369"
|
|
ports:
|
|
- "14369:14369"
|
|
|
|
homeassistant:
|
|
image: ghcr.io/home-assistant/home-assistant:2026.5
|
|
container_name: omni-pca-dev-ha
|
|
depends_on:
|
|
- mock-panel
|
|
volumes:
|
|
- ./ha-config:/config
|
|
- ../custom_components/omni_pca:/config/custom_components/omni_pca:ro
|
|
ports:
|
|
- "8123:8123"
|
|
extra_hosts:
|
|
- "host.docker.internal:host-gateway"
|
|
environment:
|
|
- TZ=America/Boise
|