pypck 0.8.3__tar.gz → 0.8.4__tar.gz
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.
- {pypck-0.8.3/pypck.egg-info → pypck-0.8.4}/PKG-INFO +2 -2
- pypck-0.8.4/VERSION +1 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck/connection.py +15 -5
- {pypck-0.8.3 → pypck-0.8.4}/pypck/inputs.py +11 -1
- {pypck-0.8.3 → pypck-0.8.4}/pypck/pck_commands.py +1 -1
- {pypck-0.8.3 → pypck-0.8.4/pypck.egg-info}/PKG-INFO +2 -2
- pypck-0.8.4/tests/test_messages.py +329 -0
- pypck-0.8.3/VERSION +0 -1
- pypck-0.8.3/tests/test_messages.py +0 -257
- {pypck-0.8.3 → pypck-0.8.4}/LICENSE +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/README.md +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck/__init__.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck/helpers.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck/lcn_addr.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck/lcn_defs.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck/module.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck/request_handlers.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck/timeout_retry.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck.egg-info/SOURCES.txt +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck.egg-info/dependency_links.txt +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck.egg-info/not-zip-safe +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pypck.egg-info/top_level.txt +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/pyproject.toml +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/setup.cfg +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/tests/test_commands.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/tests/test_connection.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/tests/test_dyn_text.py +0 -0
- {pypck-0.8.3 → pypck-0.8.4}/tests/test_vars.py +0 -0
pypck-0.8.4/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.8.4
|
|
@@ -164,12 +164,22 @@ class PchkConnectionManager:
|
|
|
164
164
|
break
|
|
165
165
|
|
|
166
166
|
try:
|
|
167
|
-
message = data.decode().split(PckGenerator.TERMINATION)[0]
|
|
167
|
+
message = data.decode("utf-8").split(PckGenerator.TERMINATION)[0]
|
|
168
168
|
except UnicodeDecodeError as err:
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
169
|
+
try:
|
|
170
|
+
message = data.decode("cp1250").split(PckGenerator.TERMINATION)[
|
|
171
|
+
0
|
|
172
|
+
]
|
|
173
|
+
_LOGGER.warning(
|
|
174
|
+
"Incorrect PCK encoding detected, possibly caused by LinHK: %s - PCK recovered using cp1250",
|
|
175
|
+
err,
|
|
176
|
+
)
|
|
177
|
+
except UnicodeDecodeError as err2:
|
|
178
|
+
_LOGGER.warning(
|
|
179
|
+
"PCK decoding error: %s - skipping received PCK message",
|
|
180
|
+
err2,
|
|
181
|
+
)
|
|
182
|
+
continue
|
|
173
183
|
await self.process_message(message)
|
|
174
184
|
except asyncio.CancelledError:
|
|
175
185
|
pass
|
|
@@ -392,7 +392,17 @@ class ModSn(ModInput):
|
|
|
392
392
|
if matcher:
|
|
393
393
|
addr = LcnAddr(int(matcher.group("seg_id")), int(matcher.group("mod_id")))
|
|
394
394
|
hardware_serial = int(matcher.group("hardware_serial"), 16)
|
|
395
|
-
|
|
395
|
+
try:
|
|
396
|
+
manu = int(matcher.group("manu"), 16)
|
|
397
|
+
except (
|
|
398
|
+
ValueError
|
|
399
|
+
): # unconventional manufacturer code (e.g., due to LinHK VM)
|
|
400
|
+
manu = 0xFF
|
|
401
|
+
_LOGGER.debug(
|
|
402
|
+
"Unconventional manufacturer code: %s. Defaulting to 0x%02X",
|
|
403
|
+
matcher.group("manu"),
|
|
404
|
+
manu,
|
|
405
|
+
)
|
|
396
406
|
software_serial = int(matcher.group("software_serial"), 16)
|
|
397
407
|
try:
|
|
398
408
|
hardware_type = lcn_defs.HardwareType(
|
|
@@ -60,7 +60,7 @@ class PckParser:
|
|
|
60
60
|
# Pattern to parse serial number and firmware date responses.
|
|
61
61
|
PATTERN_SN = re.compile(
|
|
62
62
|
r"=M(?P<seg_id>\d{3})(?P<mod_id>\d{3})\.SN(?P<hardware_serial>[0-9|A-F]{10})"
|
|
63
|
-
r"(?P<manu
|
|
63
|
+
r"(?P<manu>.{2})FW(?P<software_serial>[0-9|A-F]{6})"
|
|
64
64
|
r"HW(?P<hardware_type>\d+)"
|
|
65
65
|
)
|
|
66
66
|
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"""Tests for input message parsing for bus messages."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from pypck.inputs import (
|
|
6
|
+
InputParser,
|
|
7
|
+
ModAck,
|
|
8
|
+
ModNameComment,
|
|
9
|
+
ModSendCommandHost,
|
|
10
|
+
ModSendKeysHost,
|
|
11
|
+
ModSk,
|
|
12
|
+
ModSn,
|
|
13
|
+
ModStatusAccessControl,
|
|
14
|
+
ModStatusBinSensors,
|
|
15
|
+
ModStatusGroups,
|
|
16
|
+
ModStatusKeyLocks,
|
|
17
|
+
ModStatusLedsAndLogicOps,
|
|
18
|
+
ModStatusOutput,
|
|
19
|
+
ModStatusOutputNative,
|
|
20
|
+
ModStatusRelays,
|
|
21
|
+
ModStatusSceneOutputs,
|
|
22
|
+
ModStatusVar,
|
|
23
|
+
)
|
|
24
|
+
from pypck.lcn_addr import LcnAddr
|
|
25
|
+
from pypck.lcn_defs import (
|
|
26
|
+
AccessControlPeriphery,
|
|
27
|
+
BatteryStatus,
|
|
28
|
+
HardwareType,
|
|
29
|
+
KeyAction,
|
|
30
|
+
LedStatus,
|
|
31
|
+
LogicOpStatus,
|
|
32
|
+
OutputPort,
|
|
33
|
+
SendKeyCommand,
|
|
34
|
+
Var,
|
|
35
|
+
VarValue,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
MESSAGES = {
|
|
39
|
+
# Ack
|
|
40
|
+
"-M000010!": [(ModAck, -1)],
|
|
41
|
+
"-M000010005": [(ModAck, 5)],
|
|
42
|
+
# SK
|
|
43
|
+
"=M000010.SK007": [(ModSk, 7)],
|
|
44
|
+
# SN
|
|
45
|
+
"=M000010.SN1AB20A123401FW190B11HW015": [
|
|
46
|
+
(
|
|
47
|
+
ModSn,
|
|
48
|
+
0x1AB20A1234,
|
|
49
|
+
0x1,
|
|
50
|
+
0x190B11,
|
|
51
|
+
HardwareType.SH_PLUS,
|
|
52
|
+
)
|
|
53
|
+
],
|
|
54
|
+
"=M000010.SN1234567890AFFW190011HW011": [
|
|
55
|
+
(
|
|
56
|
+
ModSn,
|
|
57
|
+
0x1234567890,
|
|
58
|
+
0xAF,
|
|
59
|
+
0x190011,
|
|
60
|
+
HardwareType.UPP,
|
|
61
|
+
)
|
|
62
|
+
],
|
|
63
|
+
"=M000010.SN1234567890vMFW190011HW011": [
|
|
64
|
+
(
|
|
65
|
+
ModSn,
|
|
66
|
+
0x1234567890,
|
|
67
|
+
0xFF,
|
|
68
|
+
0x190011,
|
|
69
|
+
HardwareType.UPP,
|
|
70
|
+
)
|
|
71
|
+
],
|
|
72
|
+
# Name
|
|
73
|
+
"=M000010.N1EG HWR Hau": [(ModNameComment, "N", 0, "EG HWR Hau")],
|
|
74
|
+
"=M000010.N2EG HWR Hau": [(ModNameComment, "N", 1, "EG HWR Hau")],
|
|
75
|
+
# Comment
|
|
76
|
+
"=M000010.K1EG HWR Hau": [(ModNameComment, "K", 0, "EG HWR Hau")],
|
|
77
|
+
"=M000010.K2EG HWR Hau": [(ModNameComment, "K", 1, "EG HWR Hau")],
|
|
78
|
+
"=M000010.K3EG HWR Hau": [(ModNameComment, "K", 2, "EG HWR Hau")],
|
|
79
|
+
# Oem
|
|
80
|
+
"=M000010.O1EG HWR Hau": [(ModNameComment, "O", 0, "EG HWR Hau")],
|
|
81
|
+
"=M000010.O2EG HWR Hau": [(ModNameComment, "O", 1, "EG HWR Hau")],
|
|
82
|
+
"=M000010.O3EG HWR Hau": [(ModNameComment, "O", 2, "EG HWR Hau")],
|
|
83
|
+
"=M000010.O4EG HWR Hau": [(ModNameComment, "O", 3, "EG HWR Hau")],
|
|
84
|
+
# Groups
|
|
85
|
+
"=M000010.GP012005040": [
|
|
86
|
+
(
|
|
87
|
+
ModStatusGroups,
|
|
88
|
+
False,
|
|
89
|
+
12,
|
|
90
|
+
[LcnAddr(0, 5, True), LcnAddr(0, 40, True)],
|
|
91
|
+
)
|
|
92
|
+
],
|
|
93
|
+
"=M000010.GD008005040": [
|
|
94
|
+
(
|
|
95
|
+
ModStatusGroups,
|
|
96
|
+
True,
|
|
97
|
+
8,
|
|
98
|
+
[LcnAddr(0, 5, True), LcnAddr(0, 40, True)],
|
|
99
|
+
)
|
|
100
|
+
],
|
|
101
|
+
"=M000010.GD010005040030020010100200150099201": [
|
|
102
|
+
(
|
|
103
|
+
ModStatusGroups,
|
|
104
|
+
True,
|
|
105
|
+
10,
|
|
106
|
+
[
|
|
107
|
+
LcnAddr(0, 5, True),
|
|
108
|
+
LcnAddr(0, 40, True),
|
|
109
|
+
LcnAddr(0, 30, True),
|
|
110
|
+
LcnAddr(0, 20, True),
|
|
111
|
+
LcnAddr(0, 10, True),
|
|
112
|
+
LcnAddr(0, 100, True),
|
|
113
|
+
LcnAddr(0, 200, True),
|
|
114
|
+
LcnAddr(0, 150, True),
|
|
115
|
+
LcnAddr(0, 99, True),
|
|
116
|
+
LcnAddr(0, 201, True),
|
|
117
|
+
],
|
|
118
|
+
)
|
|
119
|
+
],
|
|
120
|
+
# Status Output
|
|
121
|
+
":M000010A1050": [(ModStatusOutput, OutputPort.OUTPUT1.value, 50.0)],
|
|
122
|
+
# Status Output Native
|
|
123
|
+
":M000010O1050": [(ModStatusOutputNative, OutputPort.OUTPUT1.value, 50)],
|
|
124
|
+
# Status Relays
|
|
125
|
+
":M000010Rx204": [
|
|
126
|
+
(
|
|
127
|
+
ModStatusRelays,
|
|
128
|
+
[False, False, True, True, False, False, True, True],
|
|
129
|
+
)
|
|
130
|
+
],
|
|
131
|
+
# Status BinSensors
|
|
132
|
+
":M000010Bx204": [
|
|
133
|
+
(
|
|
134
|
+
ModStatusBinSensors,
|
|
135
|
+
[False, False, True, True, False, False, True, True],
|
|
136
|
+
)
|
|
137
|
+
],
|
|
138
|
+
# Status Var
|
|
139
|
+
"%M000010.A00301200": [(ModStatusVar, Var.VAR3, VarValue(1200))],
|
|
140
|
+
"%M000010.01200": [(ModStatusVar, Var.UNKNOWN, VarValue(1200))],
|
|
141
|
+
"%M000010.S101200": [(ModStatusVar, Var.R1VARSETPOINT, VarValue(1200))],
|
|
142
|
+
"%M000010.T1100050": [(ModStatusVar, Var.THRS1, VarValue(50))],
|
|
143
|
+
"%M000010.T3400050": [(ModStatusVar, Var.THRS3_4, VarValue(50))],
|
|
144
|
+
"=M000010.S1111112222233333444445555512345": [
|
|
145
|
+
(ModStatusVar, Var.THRS1, VarValue(11111)),
|
|
146
|
+
(ModStatusVar, Var.THRS2, VarValue(22222)),
|
|
147
|
+
(ModStatusVar, Var.THRS3, VarValue(33333)),
|
|
148
|
+
(ModStatusVar, Var.THRS4, VarValue(44444)),
|
|
149
|
+
(ModStatusVar, Var.THRS5, VarValue(55555)),
|
|
150
|
+
],
|
|
151
|
+
# Status Leds and LogicOps
|
|
152
|
+
"=M000010.TLAEBFAAAAAAAANTVN": [
|
|
153
|
+
(
|
|
154
|
+
ModStatusLedsAndLogicOps,
|
|
155
|
+
[
|
|
156
|
+
LedStatus.OFF,
|
|
157
|
+
LedStatus.ON,
|
|
158
|
+
LedStatus.BLINK,
|
|
159
|
+
LedStatus.FLICKER,
|
|
160
|
+
LedStatus.OFF,
|
|
161
|
+
LedStatus.OFF,
|
|
162
|
+
LedStatus.OFF,
|
|
163
|
+
LedStatus.OFF,
|
|
164
|
+
LedStatus.OFF,
|
|
165
|
+
LedStatus.OFF,
|
|
166
|
+
LedStatus.OFF,
|
|
167
|
+
LedStatus.OFF,
|
|
168
|
+
],
|
|
169
|
+
[
|
|
170
|
+
LogicOpStatus.NONE,
|
|
171
|
+
LogicOpStatus.SOME,
|
|
172
|
+
LogicOpStatus.ALL,
|
|
173
|
+
LogicOpStatus.NONE,
|
|
174
|
+
],
|
|
175
|
+
)
|
|
176
|
+
],
|
|
177
|
+
# Status Key Locks
|
|
178
|
+
"=M000010.TX255000063204": [
|
|
179
|
+
(
|
|
180
|
+
ModStatusKeyLocks,
|
|
181
|
+
[
|
|
182
|
+
[True, True, True, True, True, True, True, True],
|
|
183
|
+
[False, False, False, False, False, False, False, False],
|
|
184
|
+
[True, True, True, True, True, True, False, False],
|
|
185
|
+
[False, False, True, True, False, False, True, True],
|
|
186
|
+
],
|
|
187
|
+
)
|
|
188
|
+
],
|
|
189
|
+
# Status Access Control
|
|
190
|
+
"=M000010.ZI026043060013002": [
|
|
191
|
+
(
|
|
192
|
+
ModStatusAccessControl,
|
|
193
|
+
AccessControlPeriphery.TRANSMITTER,
|
|
194
|
+
"1a2b3c",
|
|
195
|
+
1,
|
|
196
|
+
2,
|
|
197
|
+
KeyAction.MAKE,
|
|
198
|
+
BatteryStatus.FULL,
|
|
199
|
+
)
|
|
200
|
+
],
|
|
201
|
+
"=M000010.ZI026043060013011": [
|
|
202
|
+
(
|
|
203
|
+
ModStatusAccessControl,
|
|
204
|
+
AccessControlPeriphery.TRANSMITTER,
|
|
205
|
+
"1a2b3c",
|
|
206
|
+
1,
|
|
207
|
+
2,
|
|
208
|
+
KeyAction.HIT,
|
|
209
|
+
BatteryStatus.WEAK,
|
|
210
|
+
)
|
|
211
|
+
],
|
|
212
|
+
"=M000010.ZT026043060": [
|
|
213
|
+
(
|
|
214
|
+
ModStatusAccessControl,
|
|
215
|
+
AccessControlPeriphery.TRANSPONDER,
|
|
216
|
+
"1a2b3c",
|
|
217
|
+
)
|
|
218
|
+
],
|
|
219
|
+
"=M000010.ZF026043060": [
|
|
220
|
+
(
|
|
221
|
+
ModStatusAccessControl,
|
|
222
|
+
AccessControlPeriphery.FINGERPRINT,
|
|
223
|
+
"1a2b3c",
|
|
224
|
+
)
|
|
225
|
+
],
|
|
226
|
+
"=M000010.ZC026043060": [
|
|
227
|
+
(
|
|
228
|
+
ModStatusAccessControl,
|
|
229
|
+
AccessControlPeriphery.CODELOCK,
|
|
230
|
+
"1a2b3c",
|
|
231
|
+
)
|
|
232
|
+
],
|
|
233
|
+
# Status scene outputs
|
|
234
|
+
"=M000010.SZ003025150075100140000033200": [
|
|
235
|
+
(
|
|
236
|
+
ModStatusSceneOutputs,
|
|
237
|
+
3,
|
|
238
|
+
[25, 75, 140, 33],
|
|
239
|
+
[150, 100, 0, 200],
|
|
240
|
+
)
|
|
241
|
+
],
|
|
242
|
+
# SKH
|
|
243
|
+
"+M004000010.SKH000001": [(ModSendCommandHost, (0, 1))],
|
|
244
|
+
"+M004000010.SKH000001002003004005": [
|
|
245
|
+
(
|
|
246
|
+
ModSendCommandHost,
|
|
247
|
+
tuple(i for i in range(6)),
|
|
248
|
+
)
|
|
249
|
+
],
|
|
250
|
+
"+M004000010.SKH000001002003004005006007008009010011012013": [
|
|
251
|
+
(
|
|
252
|
+
ModSendCommandHost,
|
|
253
|
+
tuple(i for i in range(14)),
|
|
254
|
+
)
|
|
255
|
+
],
|
|
256
|
+
# SKH with partially invalid data
|
|
257
|
+
"+M004000010.SKH000001002": [(ModSendCommandHost, (0, 1))],
|
|
258
|
+
"+M004000010.SKH000001002003": [(ModSendCommandHost, (0, 1))],
|
|
259
|
+
"+M004000010.SKH000001002003004005006": [
|
|
260
|
+
(
|
|
261
|
+
ModSendCommandHost,
|
|
262
|
+
tuple(i for i in range(6)),
|
|
263
|
+
)
|
|
264
|
+
],
|
|
265
|
+
# SKH (new header)
|
|
266
|
+
"$M000010.SKH000001": [(ModSendCommandHost, (0, 1))],
|
|
267
|
+
"$M000010.SKH000001002003004005": [
|
|
268
|
+
(
|
|
269
|
+
ModSendCommandHost,
|
|
270
|
+
tuple(i for i in range(6)),
|
|
271
|
+
)
|
|
272
|
+
],
|
|
273
|
+
"$M000010.SKH000001002003004005006007008009010011012013": [
|
|
274
|
+
(
|
|
275
|
+
ModSendCommandHost,
|
|
276
|
+
tuple(i for i in range(14)),
|
|
277
|
+
)
|
|
278
|
+
],
|
|
279
|
+
# SKH (new header) with partially invalid data
|
|
280
|
+
"$M000010.SKH000001002": [(ModSendCommandHost, (0, 1))],
|
|
281
|
+
"$M000010.SKH000001002003": [(ModSendCommandHost, (0, 1))],
|
|
282
|
+
"$M000010.SKH000001002003004005006": [
|
|
283
|
+
(
|
|
284
|
+
ModSendCommandHost,
|
|
285
|
+
tuple(i for i in range(6)),
|
|
286
|
+
)
|
|
287
|
+
],
|
|
288
|
+
# STH
|
|
289
|
+
"+M004000010.STH000000": [
|
|
290
|
+
(
|
|
291
|
+
ModSendKeysHost,
|
|
292
|
+
[SendKeyCommand.DONTSEND] * 3,
|
|
293
|
+
[False] * 8,
|
|
294
|
+
)
|
|
295
|
+
],
|
|
296
|
+
"+M004000010.STH057078": [
|
|
297
|
+
(
|
|
298
|
+
ModSendKeysHost,
|
|
299
|
+
[SendKeyCommand.HIT, SendKeyCommand.MAKE, SendKeyCommand.BREAK],
|
|
300
|
+
[False, True, True, True, False, False, True, False],
|
|
301
|
+
)
|
|
302
|
+
],
|
|
303
|
+
# STH
|
|
304
|
+
"$M000010.STH000000": [
|
|
305
|
+
(
|
|
306
|
+
ModSendKeysHost,
|
|
307
|
+
[SendKeyCommand.DONTSEND] * 3,
|
|
308
|
+
[False] * 8,
|
|
309
|
+
)
|
|
310
|
+
],
|
|
311
|
+
"$M000010.STH057078": [
|
|
312
|
+
(
|
|
313
|
+
ModSendKeysHost,
|
|
314
|
+
[SendKeyCommand.HIT, SendKeyCommand.MAKE, SendKeyCommand.BREAK],
|
|
315
|
+
[False, True, True, True, False, False, True, False],
|
|
316
|
+
)
|
|
317
|
+
],
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
@pytest.mark.parametrize("message, expected", MESSAGES.items())
|
|
322
|
+
def test_message_parsing_mod_inputs(message, expected):
|
|
323
|
+
"""Test if InputMod parses message correctly."""
|
|
324
|
+
inputs = InputParser.parse(message)
|
|
325
|
+
assert len(inputs) == len(expected)
|
|
326
|
+
for idx, inp in enumerate(inputs):
|
|
327
|
+
exp = (expected[idx][0])(LcnAddr(0, 10, False), *expected[idx][1:])
|
|
328
|
+
assert type(inp) is type(exp) # pylint: disable=unidiomatic-typecheck
|
|
329
|
+
assert vars(inp) == vars(exp)
|
pypck-0.8.3/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.8.3
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
"""Tests for input message parsing for bus messages."""
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
from pypck.inputs import (
|
|
6
|
-
InputParser,
|
|
7
|
-
ModAck,
|
|
8
|
-
ModNameComment,
|
|
9
|
-
ModSendCommandHost,
|
|
10
|
-
ModSendKeysHost,
|
|
11
|
-
ModSk,
|
|
12
|
-
ModSn,
|
|
13
|
-
ModStatusAccessControl,
|
|
14
|
-
ModStatusBinSensors,
|
|
15
|
-
ModStatusGroups,
|
|
16
|
-
ModStatusKeyLocks,
|
|
17
|
-
ModStatusLedsAndLogicOps,
|
|
18
|
-
ModStatusOutput,
|
|
19
|
-
ModStatusOutputNative,
|
|
20
|
-
ModStatusRelays,
|
|
21
|
-
ModStatusSceneOutputs,
|
|
22
|
-
ModStatusVar,
|
|
23
|
-
)
|
|
24
|
-
from pypck.lcn_addr import LcnAddr
|
|
25
|
-
from pypck.lcn_defs import (
|
|
26
|
-
AccessControlPeriphery,
|
|
27
|
-
BatteryStatus,
|
|
28
|
-
HardwareType,
|
|
29
|
-
KeyAction,
|
|
30
|
-
LedStatus,
|
|
31
|
-
LogicOpStatus,
|
|
32
|
-
OutputPort,
|
|
33
|
-
SendKeyCommand,
|
|
34
|
-
Var,
|
|
35
|
-
VarValue,
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
MESSAGES = {
|
|
39
|
-
# Ack
|
|
40
|
-
"-M000010!": (ModAck, -1),
|
|
41
|
-
"-M000010005": (ModAck, 5),
|
|
42
|
-
# SK
|
|
43
|
-
"=M000010.SK007": (ModSk, 7),
|
|
44
|
-
# SN
|
|
45
|
-
"=M000010.SN1AB20A123401FW190B11HW015": (
|
|
46
|
-
ModSn,
|
|
47
|
-
0x1AB20A1234,
|
|
48
|
-
0x1,
|
|
49
|
-
0x190B11,
|
|
50
|
-
HardwareType.SH_PLUS,
|
|
51
|
-
),
|
|
52
|
-
"=M000010.SN1234567890AFFW190011HW011": (
|
|
53
|
-
ModSn,
|
|
54
|
-
0x1234567890,
|
|
55
|
-
0xAF,
|
|
56
|
-
0x190011,
|
|
57
|
-
HardwareType.UPP,
|
|
58
|
-
),
|
|
59
|
-
# Name
|
|
60
|
-
"=M000010.N1EG HWR Hau": (ModNameComment, "N", 0, "EG HWR Hau"),
|
|
61
|
-
"=M000010.N2EG HWR Hau": (ModNameComment, "N", 1, "EG HWR Hau"),
|
|
62
|
-
# Comment
|
|
63
|
-
"=M000010.K1EG HWR Hau": (ModNameComment, "K", 0, "EG HWR Hau"),
|
|
64
|
-
"=M000010.K2EG HWR Hau": (ModNameComment, "K", 1, "EG HWR Hau"),
|
|
65
|
-
"=M000010.K3EG HWR Hau": (ModNameComment, "K", 2, "EG HWR Hau"),
|
|
66
|
-
# Oem
|
|
67
|
-
"=M000010.O1EG HWR Hau": (ModNameComment, "O", 0, "EG HWR Hau"),
|
|
68
|
-
"=M000010.O2EG HWR Hau": (ModNameComment, "O", 1, "EG HWR Hau"),
|
|
69
|
-
"=M000010.O3EG HWR Hau": (ModNameComment, "O", 2, "EG HWR Hau"),
|
|
70
|
-
"=M000010.O4EG HWR Hau": (ModNameComment, "O", 3, "EG HWR Hau"),
|
|
71
|
-
# Groups
|
|
72
|
-
"=M000010.GP012005040": (
|
|
73
|
-
ModStatusGroups,
|
|
74
|
-
False,
|
|
75
|
-
12,
|
|
76
|
-
[LcnAddr(0, 5, True), LcnAddr(0, 40, True)],
|
|
77
|
-
),
|
|
78
|
-
"=M000010.GD008005040": (
|
|
79
|
-
ModStatusGroups,
|
|
80
|
-
True,
|
|
81
|
-
8,
|
|
82
|
-
[LcnAddr(0, 5, True), LcnAddr(0, 40, True)],
|
|
83
|
-
),
|
|
84
|
-
"=M000010.GD010005040030020010100200150099201": (
|
|
85
|
-
ModStatusGroups,
|
|
86
|
-
True,
|
|
87
|
-
10,
|
|
88
|
-
[
|
|
89
|
-
LcnAddr(0, 5, True),
|
|
90
|
-
LcnAddr(0, 40, True),
|
|
91
|
-
LcnAddr(0, 30, True),
|
|
92
|
-
LcnAddr(0, 20, True),
|
|
93
|
-
LcnAddr(0, 10, True),
|
|
94
|
-
LcnAddr(0, 100, True),
|
|
95
|
-
LcnAddr(0, 200, True),
|
|
96
|
-
LcnAddr(0, 150, True),
|
|
97
|
-
LcnAddr(0, 99, True),
|
|
98
|
-
LcnAddr(0, 201, True),
|
|
99
|
-
],
|
|
100
|
-
),
|
|
101
|
-
# Status Output
|
|
102
|
-
":M000010A1050": (ModStatusOutput, OutputPort.OUTPUT1.value, 50.0),
|
|
103
|
-
# Status Output Native
|
|
104
|
-
":M000010O1050": (ModStatusOutputNative, OutputPort.OUTPUT1.value, 50),
|
|
105
|
-
# Status Relays
|
|
106
|
-
":M000010Rx204": (
|
|
107
|
-
ModStatusRelays,
|
|
108
|
-
[False, False, True, True, False, False, True, True],
|
|
109
|
-
),
|
|
110
|
-
# Status BinSensors
|
|
111
|
-
":M000010Bx204": (
|
|
112
|
-
ModStatusBinSensors,
|
|
113
|
-
[False, False, True, True, False, False, True, True],
|
|
114
|
-
),
|
|
115
|
-
# Status Var
|
|
116
|
-
"%M000010.A00301200": (ModStatusVar, Var.VAR3, VarValue(1200)),
|
|
117
|
-
"%M000010.01200": (ModStatusVar, Var.UNKNOWN, VarValue(1200)),
|
|
118
|
-
"%M000010.S101200": (ModStatusVar, Var.R1VARSETPOINT, VarValue(1200)),
|
|
119
|
-
"%M000010.T1100050": (ModStatusVar, Var.THRS1, VarValue(50)),
|
|
120
|
-
"%M000010.T3400050": (ModStatusVar, Var.THRS3_4, VarValue(50)),
|
|
121
|
-
# Status Leds and LogicOps
|
|
122
|
-
"=M000010.TLAEBFAAAAAAAANTVN": (
|
|
123
|
-
ModStatusLedsAndLogicOps,
|
|
124
|
-
[
|
|
125
|
-
LedStatus.OFF,
|
|
126
|
-
LedStatus.ON,
|
|
127
|
-
LedStatus.BLINK,
|
|
128
|
-
LedStatus.FLICKER,
|
|
129
|
-
LedStatus.OFF,
|
|
130
|
-
LedStatus.OFF,
|
|
131
|
-
LedStatus.OFF,
|
|
132
|
-
LedStatus.OFF,
|
|
133
|
-
LedStatus.OFF,
|
|
134
|
-
LedStatus.OFF,
|
|
135
|
-
LedStatus.OFF,
|
|
136
|
-
LedStatus.OFF,
|
|
137
|
-
],
|
|
138
|
-
[LogicOpStatus.NONE, LogicOpStatus.SOME, LogicOpStatus.ALL, LogicOpStatus.NONE],
|
|
139
|
-
),
|
|
140
|
-
# Status Key Locks
|
|
141
|
-
"=M000010.TX255000063204": (
|
|
142
|
-
ModStatusKeyLocks,
|
|
143
|
-
[
|
|
144
|
-
[True, True, True, True, True, True, True, True],
|
|
145
|
-
[False, False, False, False, False, False, False, False],
|
|
146
|
-
[True, True, True, True, True, True, False, False],
|
|
147
|
-
[False, False, True, True, False, False, True, True],
|
|
148
|
-
],
|
|
149
|
-
),
|
|
150
|
-
# Status Access Control
|
|
151
|
-
"=M000010.ZI026043060013002": (
|
|
152
|
-
ModStatusAccessControl,
|
|
153
|
-
AccessControlPeriphery.TRANSMITTER,
|
|
154
|
-
"1a2b3c",
|
|
155
|
-
1,
|
|
156
|
-
2,
|
|
157
|
-
KeyAction.MAKE,
|
|
158
|
-
BatteryStatus.FULL,
|
|
159
|
-
),
|
|
160
|
-
"=M000010.ZI026043060013011": (
|
|
161
|
-
ModStatusAccessControl,
|
|
162
|
-
AccessControlPeriphery.TRANSMITTER,
|
|
163
|
-
"1a2b3c",
|
|
164
|
-
1,
|
|
165
|
-
2,
|
|
166
|
-
KeyAction.HIT,
|
|
167
|
-
BatteryStatus.WEAK,
|
|
168
|
-
),
|
|
169
|
-
"=M000010.ZT026043060": (
|
|
170
|
-
ModStatusAccessControl,
|
|
171
|
-
AccessControlPeriphery.TRANSPONDER,
|
|
172
|
-
"1a2b3c",
|
|
173
|
-
),
|
|
174
|
-
"=M000010.ZF026043060": (
|
|
175
|
-
ModStatusAccessControl,
|
|
176
|
-
AccessControlPeriphery.FINGERPRINT,
|
|
177
|
-
"1a2b3c",
|
|
178
|
-
),
|
|
179
|
-
"=M000010.ZC026043060": (
|
|
180
|
-
ModStatusAccessControl,
|
|
181
|
-
AccessControlPeriphery.CODELOCK,
|
|
182
|
-
"1a2b3c",
|
|
183
|
-
),
|
|
184
|
-
# Status scene outputs
|
|
185
|
-
"=M000010.SZ003025150075100140000033200": (
|
|
186
|
-
ModStatusSceneOutputs,
|
|
187
|
-
3,
|
|
188
|
-
[25, 75, 140, 33],
|
|
189
|
-
[150, 100, 0, 200],
|
|
190
|
-
),
|
|
191
|
-
# SKH
|
|
192
|
-
"+M004000010.SKH000001": (ModSendCommandHost, (0, 1)),
|
|
193
|
-
"+M004000010.SKH000001002003004005": (
|
|
194
|
-
ModSendCommandHost,
|
|
195
|
-
tuple(i for i in range(6)),
|
|
196
|
-
),
|
|
197
|
-
"+M004000010.SKH000001002003004005006007008009010011012013": (
|
|
198
|
-
ModSendCommandHost,
|
|
199
|
-
tuple(i for i in range(14)),
|
|
200
|
-
),
|
|
201
|
-
# SKH with partially invalid data
|
|
202
|
-
"+M004000010.SKH000001002": (ModSendCommandHost, (0, 1)),
|
|
203
|
-
"+M004000010.SKH000001002003": (ModSendCommandHost, (0, 1)),
|
|
204
|
-
"+M004000010.SKH000001002003004005006": (
|
|
205
|
-
ModSendCommandHost,
|
|
206
|
-
tuple(i for i in range(6)),
|
|
207
|
-
),
|
|
208
|
-
# SKH (new header)
|
|
209
|
-
"$M000010.SKH000001": (ModSendCommandHost, (0, 1)),
|
|
210
|
-
"$M000010.SKH000001002003004005": (
|
|
211
|
-
ModSendCommandHost,
|
|
212
|
-
tuple(i for i in range(6)),
|
|
213
|
-
),
|
|
214
|
-
"$M000010.SKH000001002003004005006007008009010011012013": (
|
|
215
|
-
ModSendCommandHost,
|
|
216
|
-
tuple(i for i in range(14)),
|
|
217
|
-
),
|
|
218
|
-
# SKH (new header) with partially invalid data
|
|
219
|
-
"$M000010.SKH000001002": (ModSendCommandHost, (0, 1)),
|
|
220
|
-
"$M000010.SKH000001002003": (ModSendCommandHost, (0, 1)),
|
|
221
|
-
"$M000010.SKH000001002003004005006": (
|
|
222
|
-
ModSendCommandHost,
|
|
223
|
-
tuple(i for i in range(6)),
|
|
224
|
-
),
|
|
225
|
-
# STH
|
|
226
|
-
"+M004000010.STH000000": (
|
|
227
|
-
ModSendKeysHost,
|
|
228
|
-
[SendKeyCommand.DONTSEND] * 3,
|
|
229
|
-
[False] * 8,
|
|
230
|
-
),
|
|
231
|
-
"+M004000010.STH057078": (
|
|
232
|
-
ModSendKeysHost,
|
|
233
|
-
[SendKeyCommand.HIT, SendKeyCommand.MAKE, SendKeyCommand.BREAK],
|
|
234
|
-
[False, True, True, True, False, False, True, False],
|
|
235
|
-
),
|
|
236
|
-
# STH
|
|
237
|
-
"$M000010.STH000000": (
|
|
238
|
-
ModSendKeysHost,
|
|
239
|
-
[SendKeyCommand.DONTSEND] * 3,
|
|
240
|
-
[False] * 8,
|
|
241
|
-
),
|
|
242
|
-
"$M000010.STH057078": (
|
|
243
|
-
ModSendKeysHost,
|
|
244
|
-
[SendKeyCommand.HIT, SendKeyCommand.MAKE, SendKeyCommand.BREAK],
|
|
245
|
-
[False, True, True, True, False, False, True, False],
|
|
246
|
-
),
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
@pytest.mark.parametrize("message, expected", MESSAGES.items())
|
|
251
|
-
def test_message_parsing_single_mod_input(message, expected):
|
|
252
|
-
"""Test if InputMod parses message correctly."""
|
|
253
|
-
exp = (expected[0])(LcnAddr(0, 10, False), *expected[1:])
|
|
254
|
-
inp = InputParser.parse(message)
|
|
255
|
-
assert len(inp) == 1
|
|
256
|
-
assert type(inp[0]) is type(exp) # pylint: disable=unidiomatic-typecheck
|
|
257
|
-
assert vars(inp[0]) == vars(exp)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|