diff --git a/src/omni_pca/mock_panel.py b/src/omni_pca/mock_panel.py index 491bd0f..ea5968d 100644 --- a/src/omni_pca/mock_panel.py +++ b/src/omni_pca/mock_panel.py @@ -31,6 +31,16 @@ References: clsOL2MsgRequestStatus.cs / clsOL2MsgStatus.cs clsOL2MsgRequestExtendedStatus.cs / clsOL2MsgExtendedStatus.cs clsOLMsgSystemEvents.cs + +Cross-references (HAI OmniPro II Installation Manual): + *INSTALLER SETUP* (pca-re/docs/manuals/installation_manual/ + 04_INSTALLER_SETUP/) is the human-side counterpart to the data + this mock serves: the panel's response to a RequestProperties / + RequestStatus would on real hardware reflect whatever an installer + typed into SETUP CONTROL / SETUP ZONES / SETUP AREAS / SETUP + TEMPERATURES / SETUP MISC for that object. The mock just makes up + plausible bytes; production fixtures should pre-seed the + ``MockPanel`` state to match a known SETUP configuration. """ from __future__ import annotations diff --git a/src/omni_pca/models.py b/src/omni_pca/models.py index 0ba1b4d..46abee9 100644 --- a/src/omni_pca/models.py +++ b/src/omni_pca/models.py @@ -686,7 +686,9 @@ class ZoneStatus: bytes[2] status byte (current+latched+arming, see below) bytes[3] analog loop reading (0-255) - Status byte bit layout (clsZone.cs:385, clsText.cs:3110): + Status byte bit layout (clsZone.cs:385, clsText.cs:3110, and the + "View Zone Status" keypad screen in the Owner's Manual *CONTROL* + chapter, pca-re/docs/owner_manual/05_CONTROL/): bits 0-1 (mask 0x03): current condition 0=Secure, 1=NotReady, 2=Trouble, 3=Tamper bits 2-3 (mask 0x0C): latched alarm status @@ -781,7 +783,11 @@ class UnitStatus: bytes[3..4] remaining time in seconds (BE u16, 0 = indefinite) bytes[5..6] optional ZigBee instantaneous power (W, BE u16) - State byte semantics (clsUnit.cs:405-533): + State byte semantics (clsUnit.cs:405-533; user-visible meaning in + the Owner's Manual *CONTROL → Light/Appliance Control* chapter, + pca-re/docs/owner_manual/05_CONTROL/, which documents the keypad + "All On" / "All Off" / "Scene" / "Bright/Dim" actions that put a + unit into each of these states): 0 Off 1 On 2..13 Scene A..L (state - 63 → 'A'..'L' as ASCII char) diff --git a/src/omni_pca/v1/messages.py b/src/omni_pca/v1/messages.py index 49ed236..951a26a 100644 --- a/src/omni_pca/v1/messages.py +++ b/src/omni_pca/v1/messages.py @@ -21,6 +21,18 @@ Per-record byte counts (verified against firmware 2.12 over UDP): AuxiliaryStatus 4 bytes per aux (relay, current, low_sp, high_sp) +Cross-references (HAI OmniPro II Installation Manual): + *INSTALLER SETUP → SETUP ZONES* (pca-re/docs/manuals/ + installation_manual/04_INSTALLER_SETUP/) — the zone-type and + zone-options bits that determine what each ``ZoneStatus.raw_status`` + byte's high nibble means come from this chapter. + *INSTALLER SETUP → SETUP TEMPERATURES* — same chapter, thermostat + enable/disable + thermostat type that drives whether + ``parse_v1_thermostat_status`` records are populated at all. + *APPENDIX C — ZONE AND UNIT MAPPING* (12_…) — what each record's + synthesized index *means* on the hardware side (e.g. unit 257+ + = expansion-enclosure outputs, 393+ = panel flags). + References: clsOLMsgZoneStatus.cs / clsOLMsgRequestZoneStatus.cs clsOLMsgUnitStatus.cs / clsOLMsgRequestUnitStatus.cs diff --git a/uv.lock b/uv.lock index db53f8e..ce45bf2 100644 --- a/uv.lock +++ b/uv.lock @@ -1511,7 +1511,7 @@ wheels = [ [[package]] name = "omni-pca" -version = "2026.5.10" +version = "2026.5.11" source = { editable = "." } dependencies = [ { name = "cryptography" },