Compare commits
3 Commits
259c46e558
...
dd53b2a89a
| Author | SHA1 | Date | |
|---|---|---|---|
| dd53b2a89a | |||
| 24eecceff9 | |||
| 0d6465dad0 |
@ -39,6 +39,19 @@ 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
|
||||||
|
|||||||
@ -29,6 +29,16 @@ 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
|
||||||
|
|||||||
@ -31,6 +31,16 @@ 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
|
||||||
|
|||||||
@ -490,18 +490,25 @@ class ObjectType(IntEnum):
|
|||||||
class SecurityMode(IntEnum):
|
class SecurityMode(IntEnum):
|
||||||
"""Area security mode (enuSecurityMode.cs).
|
"""Area security mode (enuSecurityMode.cs).
|
||||||
|
|
||||||
Values 9..14 are the "arming in progress" variants the panel reports
|
The first 7 values are what the user actually picks at the keypad
|
||||||
while a delayed-arm timer is running.
|
when arming. Values 9..14 are the "arming in progress" variants the
|
||||||
|
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
|
OFF = 0 # disarmed; resets fire / emergency alarms, silences sirens
|
||||||
DAY = 1
|
DAY = 1 # perimeter armed, interior motion NOT armed, entry delay
|
||||||
NIGHT = 2
|
NIGHT = 2 # perimeter + non-sleeping-area motion armed, NO entry delay
|
||||||
AWAY = 3
|
AWAY = 3 # everything armed, both exit + entry delays
|
||||||
VACATION = 4
|
VACATION = 4 # same as AWAY but for multi-day absences
|
||||||
DAY_INSTANT = 5
|
DAY_INSTANT = 5 # DAY with no entry delay (instant alarm on perimeter)
|
||||||
NIGHT_DELAYED = 6
|
NIGHT_DELAYED = 6 # NIGHT with entry delay on entry-exit zones
|
||||||
ANY_CHANGE = 7
|
ANY_CHANGE = 7 # programming-condition wildcard, NOT a real arming state
|
||||||
ARMING_DAY = 9
|
ARMING_DAY = 9
|
||||||
ARMING_NIGHT = 10
|
ARMING_NIGHT = 10
|
||||||
ARMING_AWAY = 11
|
ARMING_AWAY = 11
|
||||||
@ -511,7 +518,13 @@ 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
|
||||||
@ -521,7 +534,12 @@ 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
|
||||||
@ -531,8 +549,12 @@ class FanMode(IntEnum):
|
|||||||
class HoldMode(IntEnum):
|
class HoldMode(IntEnum):
|
||||||
"""Thermostat hold mode (enuThermostatHoldMode.cs).
|
"""Thermostat hold mode (enuThermostatHoldMode.cs).
|
||||||
|
|
||||||
Value 255 (``OLD_ON``) is a legacy "Hold" sentinel from older firmware
|
``OFF`` / ``HOLD`` are the two states surfaced at the keypad's
|
||||||
that some panels still emit; treat it as equivalent to ``HOLD``.
|
"Thermostat → HOLD" menu (Owner's Manual *Scene Commands*,
|
||||||
|
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
|
||||||
@ -560,6 +582,13 @@ 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
|
||||||
@ -657,7 +686,9 @@ 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):
|
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
|
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
|
||||||
@ -752,7 +783,11 @@ 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):
|
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
|
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)
|
||||||
|
|||||||
@ -16,6 +16,22 @@ 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
|
||||||
|
|||||||
@ -21,6 +21,14 @@ 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
|
||||||
|
|||||||
@ -21,6 +21,18 @@ 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
2
uv.lock
generated
@ -1511,7 +1511,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "omni-pca"
|
name = "omni-pca"
|
||||||
version = "2026.5.10"
|
version = "2026.5.11"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "cryptography" },
|
{ name = "cryptography" },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user