Skip to content
Merged
73 changes: 73 additions & 0 deletions OWNd/message/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,43 @@
OWNDryContactCommand,
OWNDryContactEvent,
)
from .door_entry import (
BROADCAST_WHERE,
END_ALL_CALLS,
KIND_AUTOSWITCH,
KIND_EXTERNAL_INTERCOM,
KIND_FLOOR,
KIND_INTERNAL_INTERCOM,
KIND_PAGER,
KIND_PE1,
KIND_PE2,
KIND_PE3,
KIND_PE4,
MESSAGE_TYPE_AMPLIFIER_MUTE,
MESSAGE_TYPE_CALL,
MESSAGE_TYPE_CAMERA,
MESSAGE_TYPE_LOCK,
MESSAGE_TYPE_PTZ,
MESSAGE_TYPE_SESSION,
MESSAGE_TYPE_STAIRCASE_LIGHT,
MESSAGE_TYPE_TELELOOP,
MESSAGE_TYPE_VCT_INIT,
MMTYPE_AUDIO,
MMTYPE_AUDIO_VIDEO,
MMTYPE_VIDEO,
OWNDoorEntryCommand,
OWNDoorEntryEvent,
OWNIntercomCommand,
OWNIntercomEvent,
OWNLockCommand,
OWNLockEvent,
PTZ_ACTION_PRESS,
PTZ_ACTION_RELEASE,
PTZ_MOVE_DOWN,
PTZ_MOVE_LEFT,
PTZ_MOVE_RIGHT,
PTZ_MOVE_UP,
)
from .energy import (
MESSAGE_TYPE_ACTIVE_POWER,
MESSAGE_TYPE_CURRENT_DAY_CONSUMPTION,
Expand Down Expand Up @@ -179,6 +216,42 @@
# Burglar Alarm (WHO 5)
"OWNAlarmEvent",
"OWNAlarmCommand",
# Door Entry & Lock / Intercom (WHO 6 & 8)
"OWNDoorEntryEvent",
"OWNDoorEntryCommand",
"OWNLockEvent",
"OWNLockCommand",
"OWNIntercomEvent",
"OWNIntercomCommand",
"KIND_PE1",
"KIND_PE2",
"KIND_PE3",
"KIND_PE4",
"KIND_AUTOSWITCH",
"KIND_INTERNAL_INTERCOM",
"KIND_EXTERNAL_INTERCOM",
"KIND_FLOOR",
"KIND_PAGER",
"MMTYPE_AUDIO",
"MMTYPE_VIDEO",
"MMTYPE_AUDIO_VIDEO",
"END_ALL_CALLS",
"BROADCAST_WHERE",
"PTZ_MOVE_UP",
"PTZ_MOVE_DOWN",
"PTZ_MOVE_LEFT",
"PTZ_MOVE_RIGHT",
"PTZ_ACTION_PRESS",
"PTZ_ACTION_RELEASE",
"MESSAGE_TYPE_LOCK",
"MESSAGE_TYPE_STAIRCASE_LIGHT",
"MESSAGE_TYPE_CAMERA",
"MESSAGE_TYPE_PTZ",
"MESSAGE_TYPE_CALL",
"MESSAGE_TYPE_SESSION",
"MESSAGE_TYPE_AMPLIFIER_MUTE",
"MESSAGE_TYPE_TELELOOP",
"MESSAGE_TYPE_VCT_INIT",
# Gateway (WHO 13)
"_validate_gateway_clock_values",
"_gateway_timezone",
Expand Down
20 changes: 19 additions & 1 deletion OWNd/message/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"alarm",
"automation",
"cen",
"door_entry",
"energy",
"gateway",
"heating",
Expand Down Expand Up @@ -66,6 +67,13 @@ class OWNMessage:
_ALARM_EMPTY_WHERE = re.compile(
r"^\*5\*(?P<what>\d+)(?P<what_param>(?:#\d+)*)\*##$"
) # *5*WHAT*##
# WHO 6: camera OFF published form has no WHERE field (*6*9##), but field
# units may also emit a single trailing star delimiter (*6*9*##).
# The double-star form (*6*9**##) has WHERE="*" and is matched by _STATUS.
# Only WHAT 9 may omit WHERE; any other short WHO 6 frame is not valid.
_DOOR_ENTRY_SHORT = re.compile(
r"^\*6\*(?P<what>9)\*?##$"
) # *6*9##, *6*9*##
_STATUS_REQUEST = re.compile(
r"^\*#(?P<who>\d+)(?:\*(?P<where>#?\d+)(?P<where_param>(?:#\d+)*))?##$"
) # *#WHO*WHERE## or *#WHO##
Expand Down Expand Up @@ -128,6 +136,15 @@ def __init__(self, data: str) -> None:
# not turn this spelling into a device.
self._where = ""

elif match := self._DOOR_ENTRY_SHORT.match(self._raw):
self._is_valid_message = True
self._match = match
self._family = "EVENT"
self._message_type = "STATUS"
self._who = 6
self._what = int(match.group("what"))
self._where = ""

elif match := self._STATUS_REQUEST.match(self._raw):
self._is_valid_message = True
self._match = match
Expand Down Expand Up @@ -186,6 +203,7 @@ def parse(cls, data: str) -> OWNMessage | None:
if (
cls._STATUS.match(data)
or cls._ALARM_EMPTY_WHERE.match(data)
or cls._DOOR_ENTRY_SHORT.match(data)
or cls._DIMENSION_REQUEST_REPLY.match(data)
):
return OWNEvent.parse(data)
Expand Down Expand Up @@ -390,7 +408,7 @@ def parse(cls, data: str) -> OWNCommand | None:
return parser(data)
if _who in (0, 3, 14, 22, 24) or _who > 1000:
return cls(data)
if _who in (6, 7, 9):
if _who in (7, 9):
return (
OWNStatusRequest(data)
if cls._STATUS_REQUEST.match(data)
Expand Down
Loading
Loading