Compare commits

..

No commits in common. "dd53b2a89aab4b831cbf2f63555a26320daa4826" and "259c46e5587cde4cdfa417e8bf13e8325208c690" have entirely different histories.

8 changed files with 17 additions and 121 deletions

View File

@ -39,19 +39,6 @@ The reply (ExecuteSecurityCommandResponse, opcode 75) carries a single
status byte at ``payload[0]`` whose values are listed in status byte at ``payload[0]`` whose values are listed in
``enuSecurityCommnadResponse.cs`` :class:`SecurityCommandResponse` ``enuSecurityCommnadResponse.cs`` :class:`SecurityCommandResponse`
mirrors that enum. mirrors that enum.
Cross-references (HAI OmniPro II Owner's Manual):
Chapter "CONTROL" (pca-re/docs/owner_manual/05_CONTROL/) documents
the user-facing keypad keys that map to these commands
e.g. UNIT_ON/OFF + UNIT_LEVEL are what a homeowner triggers via
the "Control → 1 (Unit)" menu, SHOW_MESSAGE_WITH_BEEP is
invoked from "Control → Message → Show".
Chapter "Scene Commands" (06_Scene_Commands/) covers
COMPOSE_SCENE and the per-room scene-recall path.
Chapter "SECURITY SYSTEM OPERATION" (03_SECURITY_SYSTEM_OPERATION/)
documents what each SecurityMode byte (0-6) means at the user
level the arming menu, entry/exit-delay semantics, and which
zones each mode arms.
""" """
from __future__ import annotations from __future__ import annotations

View File

@ -29,16 +29,6 @@ References (decompiled C# source):
bit-mask classifier we mirror below bit-mask classifier we mirror below
clsText.cs:1693-1911 (GetEventText) clsText.cs:1693-1911 (GetEventText)
per-category sub-field extraction per-category sub-field extraction
Cross-references (HAI OmniPro II Installation Manual):
APPENDIX A CONTACT ID REPORTING FORMAT (p68): the Contact ID
event codes the panel transmits to a central monitoring station
for each :class:`AlarmKind`. The class names below mirror those
codes one-for-one. (pca-re/docs/manuals/installation_manual/
10_APPENDIX_A_CONTACT_ID_REPORTING_FORMAT/)
APPENDIX B DIGITAL COMMUNICATOR CODE SHEET (p69-73): the 4/2 and
3/1 reporting-format code tables. Useful when correlating a
SystemEvents word with what a central station would see. (12_)
""" """
from __future__ import annotations from __future__ import annotations

View File

@ -31,16 +31,6 @@ References:
clsOL2MsgRequestStatus.cs / clsOL2MsgStatus.cs clsOL2MsgRequestStatus.cs / clsOL2MsgStatus.cs
clsOL2MsgRequestExtendedStatus.cs / clsOL2MsgExtendedStatus.cs clsOL2MsgRequestExtendedStatus.cs / clsOL2MsgExtendedStatus.cs
clsOLMsgSystemEvents.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 from __future__ import annotations

View File

@ -490,25 +490,18 @@ class ObjectType(IntEnum):
class SecurityMode(IntEnum): class SecurityMode(IntEnum):
"""Area security mode (enuSecurityMode.cs). """Area security mode (enuSecurityMode.cs).
The first 7 values are what the user actually picks at the keypad Values 9..14 are the "arming in progress" variants the panel reports
when arming. Values 9..14 are the "arming in progress" variants the while a delayed-arm timer is running.
panel reports while a delayed-arm timer is running.
Reference: HAI OmniPro II Owner's Manual, *Security System
Operation* chapter (pca-re/docs/owner_manual/
03_SECURITY_SYSTEM_OPERATION/) the user-facing semantics of each
mode (entry/exit delays, which zones are armed, when to use which)
come from there.
""" """
OFF = 0 # disarmed; resets fire / emergency alarms, silences sirens OFF = 0
DAY = 1 # perimeter armed, interior motion NOT armed, entry delay DAY = 1
NIGHT = 2 # perimeter + non-sleeping-area motion armed, NO entry delay NIGHT = 2
AWAY = 3 # everything armed, both exit + entry delays AWAY = 3
VACATION = 4 # same as AWAY but for multi-day absences VACATION = 4
DAY_INSTANT = 5 # DAY with no entry delay (instant alarm on perimeter) DAY_INSTANT = 5
NIGHT_DELAYED = 6 # NIGHT with entry delay on entry-exit zones NIGHT_DELAYED = 6
ANY_CHANGE = 7 # programming-condition wildcard, NOT a real arming state ANY_CHANGE = 7
ARMING_DAY = 9 ARMING_DAY = 9
ARMING_NIGHT = 10 ARMING_NIGHT = 10
ARMING_AWAY = 11 ARMING_AWAY = 11
@ -518,13 +511,7 @@ class SecurityMode(IntEnum):
class HvacMode(IntEnum): class HvacMode(IntEnum):
"""Thermostat system mode (enuThermostatMode.cs). """Thermostat system mode (enuThermostatMode.cs)."""
Values 0-3 match the keypad's "Thermostat → MODE" menu one-for-one
(Owner's Manual *Scene Commands → Thermostat Control* chapter,
pca-re/docs/owner_manual/06_Scene_Commands/). ``EMERGENCY_HEAT`` (4)
is heat-pump-only and not exposed in the standard keypad menu.
"""
OFF = 0 OFF = 0
HEAT = 1 HEAT = 1
@ -534,12 +521,7 @@ class HvacMode(IntEnum):
class FanMode(IntEnum): class FanMode(IntEnum):
"""Thermostat fan mode (enuThermostatFanMode.cs). """Thermostat fan mode (enuThermostatFanMode.cs)."""
Values 0-1 match the keypad's "Thermostat → FAN" menu (Owner's
Manual *Scene Commands*, 06_Scene_Commands/). ``CYCLE`` (2) is
programmable-only and not surfaced at the keypad.
"""
AUTO = 0 AUTO = 0
ON = 1 ON = 1
@ -549,12 +531,8 @@ class FanMode(IntEnum):
class HoldMode(IntEnum): class HoldMode(IntEnum):
"""Thermostat hold mode (enuThermostatHoldMode.cs). """Thermostat hold mode (enuThermostatHoldMode.cs).
``OFF`` / ``HOLD`` are the two states surfaced at the keypad's Value 255 (``OLD_ON``) is a legacy "Hold" sentinel from older firmware
"Thermostat → HOLD" menu (Owner's Manual *Scene Commands*, that some panels still emit; treat it as equivalent to ``HOLD``.
06_Scene_Commands/). ``VACATION`` (2) is a programmable mode the
panel uses while a Vacation security mode is active. Value 255
(``OLD_ON``) is a legacy "Hold" sentinel from older firmware that
some panels still emit; treat it as equivalent to ``HOLD``.
""" """
OFF = 0 OFF = 0
@ -582,13 +560,6 @@ class ZoneType(IntEnum):
the temperature/humidity sensors and a handful of utility types. Any the temperature/humidity sensors and a handful of utility types. Any
raw byte value still round-trips through ``ZoneStatus.zone_type`` raw byte value still round-trips through ``ZoneStatus.zone_type``
it just won't have a named enum member. it just won't have a named enum member.
Reference: HAI OmniPro II Installation Manual, *Installer Setup
SETUP ZONES ZONE TYPES* table (pca-re/docs/manuals/
installation_manual/04_INSTALLER_SETUP/INSTALLER_SETUP.md, p38-39).
The byte values and short names here match the installer-setup
keypad selections one-for-one (e.g. ``PERIMETER = 1`` is the same
"PERIMETER" the installer scrolls to when setting Z1..Z176 types).
""" """
ENTRY_EXIT = 0 ENTRY_EXIT = 0
@ -686,9 +657,7 @@ class ZoneStatus:
bytes[2] status byte (current+latched+arming, see below) bytes[2] status byte (current+latched+arming, see below)
bytes[3] analog loop reading (0-255) bytes[3] analog loop reading (0-255)
Status byte bit layout (clsZone.cs:385, clsText.cs:3110, and the Status byte bit layout (clsZone.cs:385, clsText.cs:3110):
"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 bits 0-1 (mask 0x03): current condition
0=Secure, 1=NotReady, 2=Trouble, 3=Tamper 0=Secure, 1=NotReady, 2=Trouble, 3=Tamper
bits 2-3 (mask 0x0C): latched alarm status bits 2-3 (mask 0x0C): latched alarm status
@ -783,11 +752,7 @@ class UnitStatus:
bytes[3..4] remaining time in seconds (BE u16, 0 = indefinite) bytes[3..4] remaining time in seconds (BE u16, 0 = indefinite)
bytes[5..6] optional ZigBee instantaneous power (W, BE u16) bytes[5..6] optional ZigBee instantaneous power (W, BE u16)
State byte semantics (clsUnit.cs:405-533; user-visible meaning in State byte semantics (clsUnit.cs:405-533):
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 0 Off
1 On 1 On
2..13 Scene A..L (state - 63 'A'..'L' as ASCII char) 2..13 Scene A..L (state - 63 'A'..'L' as ASCII char)

View File

@ -16,22 +16,6 @@ References:
clsPcaCfg.cs keyPC01 / keyExport constants, PCA01.CFG layout clsPcaCfg.cs keyPC01 / keyExport constants, PCA01.CFG layout
clsHAC.cs:7943-8056 .pca header + body walker, Connection block clsHAC.cs:7943-8056 .pca header + body walker, Connection block
clsCapOMNI_PRO_II.cs per-model size constants used by the body walker clsCapOMNI_PRO_II.cs per-model size constants used by the body walker
Cross-references (HAI OmniPro II Installation Manual):
*INSTALLER SETUP* (pca-re/docs/manuals/installation_manual/
04_INSTALLER_SETUP/) is what populates everything we then read back
from a .pca export:
SETUP CONTROL SetupData block (panel-wide options)
SETUP ZONES Names section (zone-name entries) + Z*_TYPE
(encoded inside SetupData)
SETUP AREAS Names section (area-name entries) + per-area
delays and codes in SetupData
SETUP MISC Programs section (timed scenes, energy savers)
SETUP EXPANSION cap counters that drive how big each names
block is on the wire
APPENDIX C ZONE AND UNIT MAPPING (12_APPENDIX_C_-_ZONE_AND_UNIT_MAPPING/)
documents the address-space layout the cap constants in
_CAP_OMNI_PRO_II below derive from (176 zones, 511 units, etc.).
""" """
from __future__ import annotations from __future__ import annotations

View File

@ -21,14 +21,6 @@ Reference: clsOmniLinkConnection.cs (UDP path):
udpHandleRequestSecureSession lines 1461-1487 step 4 OnlineSecure udpHandleRequestSecureSession lines 1461-1487 step 4 OnlineSecure
udpSend lines 1514-1560 outer PacketType = OmniLinkMessage (16) udpSend lines 1514-1560 outer PacketType = OmniLinkMessage (16)
EncryptPacket lines 372-401 same crypto as TCP EncryptPacket lines 372-401 same crypto as TCP
Cross-references:
*Two non-public quirks* Owner's-Manual-style writeup of the
session-key XOR mix and per-block sequence whitening that this
handshake relies on: https://hai-omni-pro-ii.warehack.ing/explanation/quirks/
*Zone & unit numbering* explains why subsequent ``RequestUnitStatus``
calls need the long-form (BE u16) payload for unit indices > 255:
https://hai-omni-pro-ii.warehack.ing/explanation/zone-unit-numbering/
""" """
from __future__ import annotations from __future__ import annotations

View File

@ -21,18 +21,6 @@ Per-record byte counts (verified against firmware 2.12 over UDP):
AuxiliaryStatus 4 bytes per aux (relay, current, low_sp, AuxiliaryStatus 4 bytes per aux (relay, current, low_sp,
high_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: References:
clsOLMsgZoneStatus.cs / clsOLMsgRequestZoneStatus.cs clsOLMsgZoneStatus.cs / clsOLMsgRequestZoneStatus.cs
clsOLMsgUnitStatus.cs / clsOLMsgRequestUnitStatus.cs clsOLMsgUnitStatus.cs / clsOLMsgRequestUnitStatus.cs

2
uv.lock generated
View File

@ -1511,7 +1511,7 @@ wheels = [
[[package]] [[package]]
name = "omni-pca" name = "omni-pca"
version = "2026.5.11" version = "2026.5.10"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "cryptography" }, { name = "cryptography" },