pyg90alarm 1.16.0__py3-none-any.whl → 1.16.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyg90alarm/const.py +7 -0
- pyg90alarm/history.py +66 -34
- {pyg90alarm-1.16.0.dist-info → pyg90alarm-1.16.1.dist-info}/METADATA +4 -4
- {pyg90alarm-1.16.0.dist-info → pyg90alarm-1.16.1.dist-info}/RECORD +7 -7
- {pyg90alarm-1.16.0.dist-info → pyg90alarm-1.16.1.dist-info}/WHEEL +1 -1
- {pyg90alarm-1.16.0.dist-info → pyg90alarm-1.16.1.dist-info}/LICENSE +0 -0
- {pyg90alarm-1.16.0.dist-info → pyg90alarm-1.16.1.dist-info}/top_level.txt +0 -0
pyg90alarm/const.py
CHANGED
|
@@ -166,7 +166,10 @@ class G90NotificationTypes(IntEnum):
|
|
|
166
166
|
Defines types of notifications sent by the alarm panel.
|
|
167
167
|
"""
|
|
168
168
|
ARM_DISARM = 1
|
|
169
|
+
SENSOR_ADDED = 4
|
|
169
170
|
SENSOR_ACTIVITY = 5
|
|
171
|
+
DOOR_OPEN_WHEN_ARMING = 6
|
|
172
|
+
FIRMWARE_UPDATING = 8
|
|
170
173
|
|
|
171
174
|
|
|
172
175
|
class G90ArmDisarmTypes(IntEnum):
|
|
@@ -195,7 +198,10 @@ class G90AlertSources(IntEnum):
|
|
|
195
198
|
"""
|
|
196
199
|
DEVICE = 0
|
|
197
200
|
SENSOR = 1
|
|
201
|
+
REMOTE = 10
|
|
202
|
+
RFID = 11
|
|
198
203
|
DOORBELL = 12
|
|
204
|
+
FINGERPRINT = 15
|
|
199
205
|
|
|
200
206
|
|
|
201
207
|
class G90AlertStates(IntEnum):
|
|
@@ -204,6 +210,7 @@ class G90AlertStates(IntEnum):
|
|
|
204
210
|
"""
|
|
205
211
|
DOOR_CLOSE = 0
|
|
206
212
|
DOOR_OPEN = 1
|
|
213
|
+
SOS = 2
|
|
207
214
|
TAMPER = 3
|
|
208
215
|
LOW_BATTERY = 4
|
|
209
216
|
|
pyg90alarm/history.py
CHANGED
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
"""
|
|
22
22
|
History protocol entity.
|
|
23
23
|
"""
|
|
24
|
+
import logging
|
|
25
|
+
|
|
24
26
|
from typing import Any, Optional, Dict
|
|
25
27
|
from dataclasses import dataclass
|
|
26
28
|
from datetime import datetime, timezone
|
|
@@ -33,12 +35,13 @@ from .const import (
|
|
|
33
35
|
)
|
|
34
36
|
from .device_notifications import G90DeviceAlert
|
|
35
37
|
|
|
38
|
+
_LOGGER = logging.getLogger(__name__)
|
|
39
|
+
|
|
36
40
|
|
|
37
41
|
# The state of the incoming history entries are mixed of `G90AlertStates` and
|
|
38
|
-
# `G90AlertStateChangeTypes`, depending on entry type -
|
|
39
|
-
#
|
|
40
|
-
|
|
41
|
-
states_mapping = {
|
|
42
|
+
# `G90AlertStateChangeTypes`, depending on entry type - hence two separate
|
|
43
|
+
# dictionaries, since enums used for keys have conflicting values
|
|
44
|
+
states_mapping_alerts = {
|
|
42
45
|
G90AlertStates.DOOR_CLOSE:
|
|
43
46
|
G90HistoryStates.DOOR_CLOSE,
|
|
44
47
|
G90AlertStates.DOOR_OPEN:
|
|
@@ -47,6 +50,9 @@ states_mapping = {
|
|
|
47
50
|
G90HistoryStates.TAMPER,
|
|
48
51
|
G90AlertStates.LOW_BATTERY:
|
|
49
52
|
G90HistoryStates.LOW_BATTERY,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
states_mapping_state_changes = {
|
|
50
56
|
G90AlertStateChangeTypes.AC_POWER_FAILURE:
|
|
51
57
|
G90HistoryStates.AC_POWER_FAILURE,
|
|
52
58
|
G90AlertStateChangeTypes.AC_POWER_RECOVER:
|
|
@@ -87,6 +93,7 @@ class G90History:
|
|
|
87
93
|
Represents a history entry from the alarm panel.
|
|
88
94
|
"""
|
|
89
95
|
def __init__(self, *args: Any, **kwargs: Any):
|
|
96
|
+
self._raw_data = args
|
|
90
97
|
self._protocol_data = ProtocolData(*args, **kwargs)
|
|
91
98
|
|
|
92
99
|
@property
|
|
@@ -99,55 +106,79 @@ class G90History:
|
|
|
99
106
|
)
|
|
100
107
|
|
|
101
108
|
@property
|
|
102
|
-
def type(self) -> G90AlertTypes:
|
|
109
|
+
def type(self) -> Optional[G90AlertTypes]:
|
|
103
110
|
"""
|
|
104
111
|
Type of the history entry.
|
|
105
112
|
"""
|
|
106
|
-
|
|
113
|
+
try:
|
|
114
|
+
return G90AlertTypes(self._protocol_data.type)
|
|
115
|
+
except ValueError:
|
|
116
|
+
_LOGGER.warning(
|
|
117
|
+
"Can't interpret '%s' as alert type (decoded protocol"
|
|
118
|
+
" data '%s', raw data '%s')",
|
|
119
|
+
self._protocol_data.type, self._protocol_data, self._raw_data
|
|
120
|
+
)
|
|
121
|
+
return None
|
|
107
122
|
|
|
108
123
|
@property
|
|
109
|
-
def state(self) -> G90HistoryStates:
|
|
124
|
+
def state(self) -> Optional[G90HistoryStates]:
|
|
110
125
|
"""
|
|
111
126
|
State for the history entry.
|
|
112
127
|
"""
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
128
|
+
try:
|
|
129
|
+
# Door open/close or alert types, mapped against `G90AlertStates`
|
|
130
|
+
# using `state` incoming field
|
|
131
|
+
if self.type in [
|
|
132
|
+
G90AlertTypes.DOOR_OPEN_CLOSE, G90AlertTypes.ALARM
|
|
133
|
+
]:
|
|
134
|
+
return G90HistoryStates(
|
|
135
|
+
states_mapping_alerts[
|
|
136
|
+
G90AlertStates(self._protocol_data.state)
|
|
137
|
+
]
|
|
138
|
+
)
|
|
139
|
+
except ValueError:
|
|
140
|
+
_LOGGER.warning(
|
|
141
|
+
"Can't interpret '%s' as alert state (decoded protocol"
|
|
142
|
+
" data '%s', raw data '%s')",
|
|
143
|
+
self._protocol_data.state, self._protocol_data, self._raw_data
|
|
118
144
|
)
|
|
145
|
+
return None
|
|
119
146
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if self.type == G90AlertTypes.STATE_CHANGE:
|
|
147
|
+
try:
|
|
148
|
+
# Other types are mapped against `G90AlertStateChangeTypes`
|
|
123
149
|
return G90HistoryStates(
|
|
124
|
-
|
|
150
|
+
states_mapping_state_changes[
|
|
125
151
|
G90AlertStateChangeTypes(self._protocol_data.event_id)
|
|
126
152
|
]
|
|
127
153
|
)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
G90AlertStateChangeTypes(self._protocol_data.event_id)
|
|
137
|
-
]
|
|
138
|
-
)
|
|
154
|
+
except ValueError:
|
|
155
|
+
_LOGGER.warning(
|
|
156
|
+
"Can't interpret '%s' as state change (decoded protocol"
|
|
157
|
+
" data '%s', raw data '%s')",
|
|
158
|
+
self._protocol_data.event_id, self._protocol_data,
|
|
159
|
+
self._raw_data
|
|
160
|
+
)
|
|
161
|
+
return None
|
|
139
162
|
|
|
140
163
|
@property
|
|
141
|
-
def source(self) -> G90AlertSources:
|
|
164
|
+
def source(self) -> Optional[G90AlertSources]:
|
|
142
165
|
"""
|
|
143
166
|
Source of the history entry.
|
|
144
167
|
"""
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
168
|
+
try:
|
|
169
|
+
# Device state changes or open/close events are mapped against
|
|
170
|
+
# `G90AlertSources` using `source` incoming field
|
|
171
|
+
if self.type in [
|
|
172
|
+
G90AlertTypes.STATE_CHANGE, G90AlertTypes.DOOR_OPEN_CLOSE
|
|
173
|
+
]:
|
|
174
|
+
return G90AlertSources(self._protocol_data.source)
|
|
175
|
+
except ValueError:
|
|
176
|
+
_LOGGER.warning(
|
|
177
|
+
"Can't interpret '%s' as alert source (decoded protocol"
|
|
178
|
+
" data '%s', raw data '%s')",
|
|
179
|
+
self._protocol_data.source, self._protocol_data, self._raw_data
|
|
180
|
+
)
|
|
181
|
+
return None
|
|
151
182
|
|
|
152
183
|
# Alarm will have `SENSOR` as the source, since that is likely what
|
|
153
184
|
# triggered it
|
|
@@ -182,6 +213,7 @@ class G90History:
|
|
|
182
213
|
Returns the history entry represented as device alert structure,
|
|
183
214
|
suitable for :meth:`G90DeviceNotifications._handle_alert`.
|
|
184
215
|
"""
|
|
216
|
+
|
|
185
217
|
return G90DeviceAlert(
|
|
186
218
|
type=self._protocol_data.type,
|
|
187
219
|
event_id=self._protocol_data.event_id,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pyg90alarm
|
|
3
|
-
Version: 1.16.
|
|
3
|
+
Version: 1.16.1
|
|
4
4
|
Summary: G90 Alarm system protocol
|
|
5
5
|
Home-page: https://github.com/hostcc/pyg90alarm
|
|
6
6
|
Author: Ilia Sotnikov
|
|
@@ -27,12 +27,12 @@ Description-Content-Type: text/x-rst
|
|
|
27
27
|
License-File: LICENSE
|
|
28
28
|
Provides-Extra: dev
|
|
29
29
|
Requires-Dist: check-manifest; extra == "dev"
|
|
30
|
-
Provides-Extra: docs
|
|
31
|
-
Requires-Dist: sphinx; extra == "docs"
|
|
32
|
-
Requires-Dist: sphinx-rtd-theme; extra == "docs"
|
|
33
30
|
Provides-Extra: test
|
|
34
31
|
Requires-Dist: coverage; extra == "test"
|
|
35
32
|
Requires-Dist: asynctest; extra == "test"
|
|
33
|
+
Provides-Extra: docs
|
|
34
|
+
Requires-Dist: sphinx; extra == "docs"
|
|
35
|
+
Requires-Dist: sphinx-rtd-theme; extra == "docs"
|
|
36
36
|
|
|
37
37
|
.. image:: https://github.com/hostcc/pyg90alarm/actions/workflows/main.yml/badge.svg?branch=master
|
|
38
38
|
:target: https://github.com/hostcc/pyg90alarm/tree/master
|
|
@@ -3,11 +3,11 @@ pyg90alarm/alarm.py,sha256=VssyGxYXb-r-fb8TdN2NfLaIPr1Zq8ogdGUV521bjsQ,32414
|
|
|
3
3
|
pyg90alarm/base_cmd.py,sha256=Bz7yoZ0RpkcjWARya664DKAPo3goD6BeaKtuW-hA804,9902
|
|
4
4
|
pyg90alarm/callback.py,sha256=3JsD_JChmZD24OyjaCP-PxxuBDBX7myGYhkM4RN7bk4,3742
|
|
5
5
|
pyg90alarm/config.py,sha256=2YtIgdT7clQXmYvkdn_fhIdS05CY8E1Yc90R8_tAmRI,1961
|
|
6
|
-
pyg90alarm/const.py,sha256=
|
|
6
|
+
pyg90alarm/const.py,sha256=uq4-vQvbhCkddQKO8C38tQzkjHm-l-TacxNlLdhQZyg,6237
|
|
7
7
|
pyg90alarm/device_notifications.py,sha256=QFs4FiaPkSKoQ_geU3Pngj9iPMHMHwi9Mjpzs8asDrM,13382
|
|
8
8
|
pyg90alarm/discovery.py,sha256=fwyBHDCKGej06OwhpbVCHYTRU9WWkeYysAFgv3FiwqI,3575
|
|
9
9
|
pyg90alarm/exceptions.py,sha256=eiOcRe7D18EIPyPFDNU9DdFgbnkwPmkiLl8lGPOhBNw,1475
|
|
10
|
-
pyg90alarm/history.py,sha256=
|
|
10
|
+
pyg90alarm/history.py,sha256=M70BCl7ykX3FFPY1htZofreYWUCviePRB2CIKVgL-ZI,8188
|
|
11
11
|
pyg90alarm/host_info.py,sha256=4lFIaFEpYd3EvgNrDJmKijTrzX9i29nFISLLlXGnkmE,2759
|
|
12
12
|
pyg90alarm/host_status.py,sha256=4XhuilBzB8XsXkpeWj3PAVpmDPcTnBBOYunO21Flabo,1862
|
|
13
13
|
pyg90alarm/paginated_cmd.py,sha256=vJ8slMS7aNLpkAxnIe25EHstusYy1bYTl1j306ps-MQ,4439
|
|
@@ -20,8 +20,8 @@ pyg90alarm/definitions/sensors.py,sha256=rKOu21ZpI44xk6aMh_vBjniFqnsNTc1CKwAvnv4
|
|
|
20
20
|
pyg90alarm/entities/__init__.py,sha256=hHb6AOiC4Tz--rOWiiICMdLaZDs1Tf_xpWk_HeS_gO4,66
|
|
21
21
|
pyg90alarm/entities/device.py,sha256=f_LHvKCAqTEebZ4mrRh3CpPUI7o-OvpvOfyTRCbftJs,2818
|
|
22
22
|
pyg90alarm/entities/sensor.py,sha256=4r8ouAYTZB8ih8I4ncWdQOaifYsRxaC-ukY9jvnrRvk,16139
|
|
23
|
-
pyg90alarm-1.16.
|
|
24
|
-
pyg90alarm-1.16.
|
|
25
|
-
pyg90alarm-1.16.
|
|
26
|
-
pyg90alarm-1.16.
|
|
27
|
-
pyg90alarm-1.16.
|
|
23
|
+
pyg90alarm-1.16.1.dist-info/LICENSE,sha256=f884inRbeNv-O-hbwz62Ro_1J8xiHRTnJ2cCx6A0WvU,1070
|
|
24
|
+
pyg90alarm-1.16.1.dist-info/METADATA,sha256=iOhBwSXDDvBDAGAWHJvwygQBm2GiWUQ5sfzNzwx4x_g,7714
|
|
25
|
+
pyg90alarm-1.16.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
26
|
+
pyg90alarm-1.16.1.dist-info/top_level.txt,sha256=czHiGxYMyTk5QEDTDb0EpPiKqUMRa8zI4zx58Ii409M,11
|
|
27
|
+
pyg90alarm-1.16.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|