custom_components/omni_pca/ — drop-in HA integration: - manifest.json (HA 2026.x, iot_class=local_push, requires omni-pca lib) - config_flow.py — host/port/controller_key with auth + reauth steps, parse_controller_key() extracted as pure testable function - coordinator.py — OmniDataUpdateCoordinator with long-lived OmniClient, unsolicited push wiring, ConfigEntryAuthFailed on bad key, reconnect on err - binary_sensor.py — one entity per named zone, zone_type -> device_class map (OPENING/MOTION/SMOKE/etc), is_on derived from ZoneProperties.status - const.py, strings.json, translations/en.json, README.md - hacs.json at root for HACS distribution tests: 97 pass + 2 skip (HA harness not installed; importorskip in test_ha_imports.py). 12 cases for parse_controller_key validation. Ruff clean across src/ tests/ custom_components/. Status of HA component itself NOT validated against a running HA — needs that next.
27 lines
703 B
Python
27 lines
703 B
Python
"""Constants for the HAI/Leviton Omni Panel integration."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from datetime import timedelta
|
|
from typing import Final
|
|
|
|
DOMAIN: Final = "omni_pca"
|
|
|
|
DEFAULT_PORT: Final = 4369
|
|
DEFAULT_TIMEOUT: Final = 5.0
|
|
|
|
CONF_CONTROLLER_KEY: Final = "controller_key"
|
|
|
|
MANUFACTURER: Final = "HAI / Leviton"
|
|
|
|
# Polling interval. Most state arrives via unsolicited push messages, so
|
|
# this is just a safety net that keeps `last_update_success` honest if the
|
|
# panel goes quiet.
|
|
SCAN_INTERVAL: Final = timedelta(seconds=30)
|
|
|
|
# Length, in characters, of a hex-encoded 16-byte controller key.
|
|
CONTROLLER_KEY_HEX_LEN: Final = 32
|
|
|
|
LOGGER: Final = logging.getLogger(__package__)
|