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 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 - the mapping
39
- # consilidates them into unified `G90HistoryStates`. The latter enum can't be
40
- # just an union of former two, since those have conflicting values
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
- return G90AlertTypes(self._protocol_data.type)
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
- # Door open/close type, mapped against `G90AlertStates` using `state`
114
- # incoming field
115
- if self.type == G90AlertTypes.DOOR_OPEN_CLOSE:
116
- return G90HistoryStates(
117
- states_mapping[G90AlertStates(self._protocol_data.state)]
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
- # Device state change, mapped against `G90AlertStateChangeTypes` using
121
- # `event_id` incoming field
122
- if self.type == G90AlertTypes.STATE_CHANGE:
147
+ try:
148
+ # Other types are mapped against `G90AlertStateChangeTypes`
123
149
  return G90HistoryStates(
124
- states_mapping[
150
+ states_mapping_state_changes[
125
151
  G90AlertStateChangeTypes(self._protocol_data.event_id)
126
152
  ]
127
153
  )
128
-
129
- # Alarm gets mapped to its counterpart in `G90HistoryStates`
130
- if self.type == G90AlertTypes.ALARM:
131
- return G90HistoryStates.ALARM
132
-
133
- # Other types are mapped against `G90AlertStateChangeTypes`
134
- return G90HistoryStates(
135
- states_mapping[
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
- # Device state changes or open/close events are mapped against
146
- # `G90AlertSources` using `source` incoming field
147
- if self.type in [
148
- G90AlertTypes.STATE_CHANGE, G90AlertTypes.DOOR_OPEN_CLOSE
149
- ]:
150
- return G90AlertSources(self._protocol_data.source)
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.0
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=1nzx2rueRdAdv1J5nsfS-c_9a4tcM4_z5sWwCNG7tiQ,6097
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=GnCVRsQNV2x9g6KngBBvvIUnTAIyXKX2nVKF_aFA0oM,7160
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.0.dist-info/LICENSE,sha256=f884inRbeNv-O-hbwz62Ro_1J8xiHRTnJ2cCx6A0WvU,1070
24
- pyg90alarm-1.16.0.dist-info/METADATA,sha256=G_6wt8C5-9K8P8up1jqsBCW-RAq4EkP1tP9y6n-rdUc,7714
25
- pyg90alarm-1.16.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
26
- pyg90alarm-1.16.0.dist-info/top_level.txt,sha256=czHiGxYMyTk5QEDTDb0EpPiKqUMRa8zI4zx58Ii409M,11
27
- pyg90alarm-1.16.0.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.2.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5