aiohomematic-test-support 2025.12.23__py3-none-any.whl → 2026.1.23__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.
@@ -1,3 +1,5 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2021-2026
1
3
  """
2
4
  Test support infrastructure for aiohomematic.
3
5
 
@@ -16,6 +18,8 @@ Key Components
16
18
  playback support for deterministic testing.
17
19
  - **helper**: Test helper utilities for common testing operations.
18
20
  - **const**: Test-specific constants and configuration values.
21
+ - **event_capture**: Event capture and assertion utilities for behavior testing.
22
+ - **event_mock**: Event-driven mock server for test triggers.
19
23
 
20
24
  Usage Example
21
25
  -------------
@@ -30,9 +34,36 @@ Using the factory to create a test central with session playback:
30
34
 
31
35
  # Test operations
32
36
  await central.start()
33
- device = central.get_device_by_address("VCU0000001")
37
+ device = central.device_coordinator.get_device_by_address("VCU0000001")
34
38
  await central.stop()
35
39
 
40
+ Using EventCapture for behavior-focused testing:
41
+
42
+ from aiohomematic_test_support.event_capture import EventCapture
43
+ from aiohomematic.central.events import CircuitBreakerTrippedEvent
44
+
45
+ capture = EventCapture()
46
+ capture.subscribe_to(central.event_bus, CircuitBreakerTrippedEvent)
47
+
48
+ # ... trigger failures ...
49
+
50
+ capture.assert_event_emitted(CircuitBreakerTrippedEvent, failure_count=5)
51
+ capture.cleanup()
52
+
53
+ Using EventDrivenMockServer for event-triggered test behavior:
54
+
55
+ from aiohomematic_test_support.event_mock import EventDrivenMockServer
56
+ from aiohomematic.central.events import DataRefreshTriggeredEvent
57
+
58
+ mock_server = EventDrivenMockServer(event_bus=central.event_bus)
59
+ mock_server.when(DataRefreshTriggeredEvent).then_call(
60
+ lambda event: inject_mock_data()
61
+ )
62
+
63
+ # ... trigger refresh ...
64
+
65
+ mock_server.cleanup()
66
+
36
67
  The session player replays pre-recorded backend responses, enabling fast and
37
68
  reproducible tests without backend dependencies.
38
69
 
@@ -45,4 +76,4 @@ test dependencies to access test support functionality.
45
76
 
46
77
  from __future__ import annotations
47
78
 
48
- __version__ = "2025.12.23"
79
+ __version__ = "2026.1.23"
@@ -1,9 +1,16 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2021-2026
1
3
  """Constants for tests."""
2
4
 
3
5
  from __future__ import annotations
4
6
 
7
+ import functools
8
+ import json
9
+ import os
10
+ from typing import cast
11
+
5
12
  from aiohomematic.client.json_rpc import _JsonKey
6
- from aiohomematic.const import LOCAL_HOST, HubValueType, Interface, ProgramData, SystemVariableData
13
+ from aiohomematic.const import LOCAL_HOST, UTF_8, HubValueType, Interface, ProgramData, SystemVariableData
7
14
 
8
15
  CENTRAL_NAME = "CentralTest"
9
16
  CCU_HOST = LOCAL_HOST
@@ -237,367 +244,21 @@ PROGRAM_DATA_JSON_DESCRIPTION = [
237
244
  for p in PROGRAM_DATA
238
245
  ]
239
246
 
240
- ADDRESS_DEVICE_TRANSLATION = {
241
- "VCU3432945": "HmIP-STV.json",
242
- "VCU0000011": "HMW-LC-Bl1-DR.json",
243
- "VCU4070501": "HmIP-FSM16.json",
244
- "VCU0000019": "263 155.json",
245
- "VCU5628817": "HmIP-SMO.json",
246
- "VCU0000185": "HM-RC-Sec3-B.json",
247
- "VCU0000079": "HM-LC-Dim1PWM-CV.json",
248
- "VCU0000200": "HM-RC-2-PBU-FM.json",
249
- "VCU0000274": "HM-Sen-MDIR-WM55.json",
250
- "VCU0000127": "HM-MOD-EM-8Bit.json",
251
- "VCU0000325": "HM-LC-Sw4-SM.json",
252
- "VCU0000110": "HM-LC-Dim2T-SM.json",
253
- "VCU0000301": "HM-LC-Sw1-Pl-DN-R3.json",
254
- "VCU0000172": "HM-RC-4-2.json",
255
- "VCU0000103": "HM-LC-Dim1T-Pl-2.json",
256
- "VCU0000184": "HM-RC-Sec3.json",
257
- "VCU0000093": "HM-LC-Dim1T-DR.json",
258
- "VCU0000275": "HM-Sen-Wa-Od.json",
259
- "VCU5092447": "HmIP-SMO-A.json",
260
- "VCU3941846": "HMIP-PSM.json",
261
- "VCU4984404": "HmIPW-STHD.json",
262
- "VCU0000026": "HM-WDS20-TH-O.json",
263
- "VCU0000064": "HM-LC-Dim1L-Pl-2.json",
264
- "VCU1150287": "HmIP-HAP.json",
265
- "VCU0000348": "HM-Sec-WDS.json",
266
- "VCU0000017": "HM-PB-4Dis-WM.json",
267
- "VCU3560967": "HmIP-HDM1.json",
268
- "VCU0000287": "HM-LC-Sw2PBU-FM.json",
269
- "VCU0000014": "HMW-LC-Sw2-DR.json",
270
- "VCU0000155": "OLIGO.smart.iq.HM.json",
271
- "VCU0000343": "HM-Sec-TiS.json",
272
- "VCU5864966": "HmIP-SWDO-I.json",
273
- "VCU0000150": "KS550.json",
274
- "VCU0000121": "HM-LC-Dim1L-Pl.json",
275
- "VCU0000177": "HM-RC-Key4-2.json",
276
- "VCU0000216": "HM-Sec-RHS.json",
277
- "VCU0000142": "HM-Dis-TD-T.json",
278
- "VCU0000305": "HM-LC-Sw1-Pl-CT-R1.json",
279
- "VCU0000131": "HM-ES-PMSw1-Pl-DN-R3.json",
280
- "VCU0000114": "HM-Dis-WM55.json",
281
- "VCU0000105": "263 134.json",
282
- "VCU0000334": "HM-LC-Sw2-DR.json",
283
- "VCU0000328": "HM-LC-Sw1-FM.json",
284
- "VCU4264293": "HmIP-RCV-50.json",
285
- "VCU0000196": "HM-RC-12-SW.json",
286
- "VCU0000310": "HM-LC-Sw1-PCB.json",
287
- "VCU0000002": "HMW-IO-12-Sw14-DR.json",
288
- "VCU0000138": "HM-ES-PMSwX.json",
289
- "VCU4613288": "HmIP-FROLL.json",
290
- "VCU0000130": "HM-ES-PMSw1-Pl-DN-R2.json",
291
- "VCU8655720": "HmIP-CCU3.json",
292
- "VCU0000166": "263 135.json",
293
- "VCU0000339": "HM-LC-Sw1-SM-ATmega168.json",
294
- "VCU0000353": "WS888.json",
295
- "VCU0000178": "HM-RC-Key4-3.json",
296
- "VCU1289997": "HmIP-SPDR.json",
297
- "VCU0000252": "263 162.json",
298
- "VCU0000198": "HM-RC-19-B.json",
299
- "VCU0000016": "HMW-Sen-SC-12-FM.json",
300
- "VCU1815001": "HmIP-SWD.json",
301
- "VCU7171997": "HB-WDS40-THP-O.json",
302
- "VCU0000100": "HM-LC-Dim2T-SM-2.json",
303
- "VCU0000167": "HM-PB-2-FM.json",
304
- "VCU0000239": "ZEL STG RM FFK.json",
305
- "VCU2721398": "HmIPW-DRI32.json",
306
- "VCU0000345": "HM-WDS30-OT2-SM-2.json",
307
- "VCU0000025": "263 158.json",
308
- "VCU0000280": "HM-SwI-X.json",
309
- "VCU1673350": "HmIPW-FIO6.json",
310
- "VCU0000073": "HM-LC-Dim1L-Pl-3.json",
311
- "VCU5429697": "HmIP-SAM.json",
312
- "VCU0000096": "HM-LC-Dim2L-SM-2.json",
313
- "VCU0000236": "S550IA.json",
314
- "VCU0000211": "ZEL STG RM FDK.json",
315
- "VCU7808411": "HmIP-eTRV-B1.json",
316
- "VCU8333683": "HmIP-SWDM-B2.json",
317
- "VCU0000054": "HM-CC-TC.json",
318
- "VCU0000169": "ZEL STG RM FST UP4.json",
319
- "VCU4523900": "HmIP-STHO.json",
320
- "VCU0000340": "HM-LC-Sw4-SM-ATmega168.json",
321
- "VCU0000087": "HM-LC-Dim1T-Pl-3.json",
322
- "VCU0000137": "HM-ES-PMSw1-Pl.json",
323
- "VCU0000175": "HM-RC-4-3.json",
324
- "VCU0000341": "HM-TC-IT-WM-W-EU.json",
325
- "VCU0000300": "HM-LC-Sw1-Pl-DN-R2.json",
326
- "VCU0000081": "HM-LC-Dim1TPBU-FM-2.json",
327
- "VCU0000240": "HM-Sec-SC-2.json",
328
- "VCU8066814": "RPI-RF-MOD.json",
329
- "VCU4898089": "HmIP-KRC4.json",
330
- "VCU1954019": "HmIP-FAL230-C10.json",
331
- "VCU0000350": "HM-Sec-Win.json",
332
- "VCU0000243": "HM-SCI-3-FM.json",
333
- "VCU0000023": "ASH550.json",
334
- "VCU4567298": "HmIP-DBB.json",
335
- "VCU8492627": "HB-UNI-Sensor1.json",
336
- "VCU0000218": "WDF solar.json",
337
- "VCU0000327": "HM-LC-Sw4-WM.json",
338
- "VCU0000208": "HM-ReSC-Win-PCB-xx.json",
339
- "VCU0000278": "ZEL STG RM FSS UP3.json",
340
- "VCU0000122": "HM-LC-Dim1L-CV.json",
341
- "VCU0000004": "HMW-IO-12-Sw7-DR.json",
342
- "VCU0000055": "HM-CC-VD.json",
343
- "VCU0000135": "HM-ES-PMSw1-SM.json",
344
- "VCU0000296": "HM-LC-Sw2-FM-2.json",
345
- "VCU3790312": "HmIP-SWO-B.json",
346
- "VCU0000256": "HM-Sec-SD-Generic.json",
347
- "VCU0000148": "HM-Sec-Key-O.json",
348
- "VCU7652142": "HmIP-SRD.json",
349
- "VCU0000183": "HM-RC-P1.json",
350
- "VCU0000115": "HM-LC-DW-WM.json",
351
- "VCU0000322": "HM-LC-Sw1-Pl-2.json",
352
- "VCU0000193": "HM-RC-X.json",
353
- "VCU0000060": "HM-OU-CFM-TW.json",
354
- "VCU1891174": "HmIPW-DRS8.json",
355
- "VCU6874371": "HmIP-MOD-RC8.json",
356
- "VCU0000010": "HMW-LC-Bl1-DR-2.json",
357
- "VCU0000273": "HM-MD.json",
358
- "VCU0000018": "ZEL STG RM DWT 10.json",
359
- "VCU0000337": "HM-LC-SwX.json",
360
- "VCU0000133": "HM-ES-PMSw1-Pl-DN-R5.json",
361
- "VCU0000247": "HM-Sec-MDIR-2.json",
362
- "VCU6354483": "HmIP-STHD.json",
363
- "VCU0000066": "263 132.json",
364
- "VCU0000330": "HM-LC-Sw2-FM.json",
365
- "VCU1769958": "HmIP-BWTH.json",
366
- "VCU0000203": "BRC-H.json",
367
- "VCU0000304": "HM-LC-Sw1-DR.json",
368
- "VCU2118827": "HmIP-DLS.json",
369
- "VCU0000165": "ZEL STG RM WT 2.json",
370
- "VCU0000199": "HM-RC-19-SW.json",
371
- "VCU5778428": "HmIP-HEATING.json",
372
- "VCU0000201": "HM-RC-2-PBU-FM-2.json",
373
- "VCU1437294": "HmIP-SMI.json",
374
- "VCU0000293": "HM-LC-Sw4-PCB-2.json",
375
- "VCU7981740": "HmIP-SRH.json",
376
- "VCU0000170": "263 145.json",
377
- "VCU3056370": "HmIP-SLO.json",
378
- "VCU4243444": "HmIP-WRCD.json",
379
- "VCU0000036": "HM-LC-Bl1-SM-2.json",
380
- "VCU0000159": "HM-OU-X.json",
381
- "VCU0000303": "HM-LC-Sw1-Pl-DN-R5.json",
382
- "VCU9834159": "HB-LC-Bl1PBU-FM.json",
383
- "VCU0000251": "HM-Sec-MDIR.json",
384
- "VCU0000357": "HM-WDC7000.json",
385
- "VCU0000111": "HM-LC-Dim1T-FM.json",
386
- "VCU0000277": "HM-SwI-3-FM.json",
387
- "VCU0000152": "KS550Tech.json",
388
- "VCU0000188": "HM-PB-4-WM.json",
389
- "VCU1543608": "HmIP-MP3P.json",
390
- "VCU0000037": "HM-LC-Bl1-FM-2.json",
391
- "VCU0000164": "HM-PB-2-WM55.json",
392
- "VCU0000045": "HM-LC-Bl1-FM.json",
393
- "VCU0000276": "ST6-SH.json",
394
- "VCU2128127": "HmIP-BSM.json",
395
- "VCU6985973": "HmIP-BSL.json",
396
- "VCU6153495": "HmIP-FCI1.json",
397
- "VCU0000265": "HM-Sen-LI-O.json",
398
- "VCU0000146": "HM-Sec-Key.json",
399
- "VCU2737768": "HMIP-SWDO.json",
400
- "VCU0000143": "HM-WDS100-C6-O-2.json",
401
- "VCU0000302": "HM-LC-Sw1-Pl-DN-R4.json",
402
- "VCU0000057": "HM-RCV-50.json",
403
- "VCU1152627": "HmIP-RC8.json",
404
- "VCU0000336": "ZEL STG RM FZS-2.json",
405
- "VCU0000279": "263 144.json",
406
- "VCU0000012": "HMW-LC-Dim1L-DR.json",
407
- "VCU0000094": "HM-LC-Dim1T-FM-LF.json",
408
- "VCU0000292": "HM-LC-Sw4-SM-2.json",
409
- "VCU7204276": "HmIP-DRSI4.json",
410
- "VCU2333555": "HmIP-FSI16.json",
411
- "VCU5424977": "HmIP-DSD-PCB.json",
412
- "VCU8063453": "HmIP-STH.json",
413
- "VCU0000237": "HM-WDS30-T-O.json",
414
- "VCU0000332": "HM-LC-Sw2-PB-FM.json",
415
- "VCU0000021": "HM-LC-AO-SM.json",
416
- "VCU0000264": "HM-Sen-X.json",
417
- "VCU0000132": "HM-ES-PMSw1-Pl-DN-R4.json",
418
- "VCU0000246": "HM-Sec-MDIR-3.json",
419
- "VCU0000145": "HM-LC-JaX.json",
420
- "VCU0000083": "263 133.json",
421
- "VCU0000346": "HM-WDS40-TH-I-2.json",
422
- "VCU0000182": "HM-RC-4-B.json",
423
- "VCU0000190": "RC-H.json",
424
- "VCU7447418": "HmIP-PCBS2.json",
425
- "VCU9344471": "HmIP-SPI.json",
426
- "VCU0000351": "HM-Sec-Win-Generic.json",
427
- "VCU0000015": "HMW-Sen-SC-12-DR.json",
428
- "VCU7935803": "HMIP-WRC2.json",
429
- "VCU0000289": "HM-LC-Sw1-Pl-3.json",
430
- "VCU2680226": "HmIP-WTH-2.json",
431
- "VCU6306084": "HmIP-BRC2.json",
432
- "VCU0000335": "ZEL STG RM FZS.json",
433
- "VCU0000168": "HM-PBI-4-FM.json",
434
- "VCU0000074": "HM-LC-Dim1L-CV-2.json",
435
- "VCU0000288": "HM-LC-Sw4-Ba-PCB.json",
436
- "VCU2573721": "HmIP-SMO-2.json",
437
- "VCU0000180": "HM-RC-Sec4-3.json",
438
- "VCU0000181": "HM-RC-4.json",
439
- "VCU0000186": "HM-RC-Key3.json",
440
- "VCU0000272": "HM-Sen-MDIR-O.json",
441
- "VCU0000329": "263 130.json",
442
- "VCU0000309": "HM-LC-Sw1-Pl-CT-R5.json",
443
- "VCU5980155": "HmIP-PCBS-BAT.json",
444
- "INT0000001": "HM-CC-VG-1.json",
445
- "VCU0000354": "WS550Tech.json",
446
- "VCU0000259": "263 167.json",
447
- "VCU0000344": "HM-WDS30-OT2-SM.json",
448
- "VCU8249617": "HmIP-ASIR-2.json",
449
- "VCU0000158": "HM-OU-LED16.json",
450
- "VCU1004487": "HmIPW-DRAP.json",
451
- "VCU0000290": "HM-LC-Sw1-SM-2.json",
452
- "VCU7549831": "HmIP-STE2-PCB.json",
453
- "VCU0000082": "HM-LC-Dim1TPBU-FM.json",
454
- "VCU0000321": "HM-LC-Sw1-Pl.json",
455
- "VCU0000206": "HM-Sen-RD-O.json",
456
- "VCU9724704": "HmIP-DLD.json",
457
- "VCU1768323": "HmIP-eTRV-C-2.json",
458
- "VCU0000217": "HM-Sec-xx.json",
459
- "VCU0000123": "HM-LC-Dim2L-CV.json",
460
- "VCU0000295": "HM-LC-Sw1-FM-2.json",
461
- "VCU0000056": "ZEL STG RM FSA.json",
462
- "VCU0000078": "HM-LC-Dim1PWM-CV-2.json",
463
- "VCU0000001": "HMW-RCV-50.json",
464
- "VCU0000051": "HM-CC-RT-DN-BoM.json",
465
- "VCU0000153": "KS550LC.json",
466
- "VCU0000174": "HM-RC-8.json",
467
- "VCU0000192": "ZEL STG RM HS 4.json",
468
- "VCU0000171": "HM-PBI-X.json",
469
- "VCU0000027": "HM-WDS40-TH-I.json",
470
- "VCU0000088": "HM-LC-Dim1T-CV-2.json",
471
- "VCU0000043": "263 147.json",
472
- "VCU8205532": "HmIP-SCTH230.json",
473
- "VCU0000266": "HM-Sen-MDIR-O-3.json",
474
- "VCU0000352": "WS550.json",
475
- "VCU0000331": "HM-LC-Sw1-PB-FM.json",
476
- "VCU3880755": "HB-UNI-Sensor-THPD-BME280.json",
477
- "VCU0000020": "HM-PB-4Dis-WM-2.json",
478
- "VCU0000267": "HM-Sen-MDIR-O-2.json",
479
- "VCU2407364": "HmIP-PCBS.json",
480
- "VCU1841406": "HmIP-SWO-PL.json",
481
- "VCU2826390": "HmIPW-STH.json",
482
- "VCU0000197": "HM-RC-19.json",
483
- "VCU0000260": "HM-Sec-SFA-SM.json",
484
- "VCU0000007": "HMW-IO-4-FM.json",
485
- "VCU3188750": "HmIP-WGC.json",
486
- "VCU0000048": "263 146.json",
487
- "VCU0000062": "CMM.json",
488
- "VCU3609622": "HmIP-eTRV-2.json",
489
- "VCU4743739": "HmIPW-SPI.json",
490
- "VCU0000294": "HM-LC-Sw4-WM-2.json",
491
- "VCU0000187": "HM-RC-Key3-B.json",
492
- "VCU6948166": "HmIP-DRDI3.json",
493
- "VCU0000311": "HM-MOD-Re-8.json",
494
- "VCU0000202": "HM-RC-Dis-H-x-EU.json",
495
- "VCU5801873": "HmIP-PMFS.json",
496
- "VCU0000209": "HM-LC-RGBW-WM.json",
497
- "VCU0000324": "HM-LC-Sw2-SM.json",
498
- "VCU5644414": "HmIP-SWDM.json",
499
- "VCU0000262": "HM-Sen-DB-PCB.json",
500
- "VCU8539034": "HmIP-WRCR.json",
501
- "VCU0000022": "ASH550I.json",
502
- "VCU0000126": "HM-MOD-EM-8.json",
503
- "VCU0000149": "HM-Sec-Key-Generic.json",
504
- "VCU0000151": "KS888.json",
505
- "VCU0000059": "HM-OU-CFM-Pl.json",
506
- "VCU0000254": "HM-Sec-SCo.json",
507
- "VCU3015080": "HmIP-SCI.json",
508
- "VCU0000125": "HSS-DX.json",
509
- "VCU0000049": "HM-LC-BlX.json",
510
- "VCU0000333": "HM-LC-Sw4-DR.json",
511
- "VCU0000047": "ZEL STG RM FEP 230V.json",
512
- "VCU0000312": "HM-LC-Sw1-Ba-PCB.json",
513
- "VCU1494703": "HmIP-eTRV-E.json",
514
- "VCU0000070": "HM-LC-DDC1-PCB.json",
515
- "VCU0000053": "ZEL STG RM FWT.json",
516
- "VCU0000005": "HMW-IO-12-FM.json",
517
- "VCU9333179": "HmIP-ASIR.json",
518
- "VCU0000046": "HM-LC-Bl1-PB-FM.json",
519
- "VCU0000204": "HM-RC-SB-X.json",
520
- "VCU0000207": "HM-Sys-sRP-Pl.json",
521
- "VCU0000286": "263 131.json",
522
- "VCU0000308": "HM-LC-Sw1-Pl-CT-R4.json",
523
- "VCU8126977": "HmIP-MOD-OC8.json",
524
- "VCU4704397": "HmIPW-WRC6.json",
525
- "VCU7807849": "HmIPW-DRBL4.json",
526
- "VCU0000255": "HM-Sec-SD.json",
527
- "VCU5597068": "HmIPW-SMI55.json",
528
- "VCU0000179": "HM-RC-Sec4-2.json",
529
- "VCU1399816": "HmIP-BDT.json",
530
- "VCU0000044": "HM-LC-Bl1-SM.json",
531
- "VCU0000297": "HM-LC-Sw4-DR-2.json",
532
- "VCU0000191": "atent.json",
533
- "VCU0000089": "HM-LC-Dim1T-FM-2.json",
534
- "VCU0000029": "IS-WDS-TH-OD-S-R3.json",
535
- "VCU8255833": "HmIP-STHO-A.json",
536
- "VCU1803301": "HmIP-USBSM.json",
537
- "VCU9933791": "HmIPW-DRD3.json",
538
- "VCU0000299": "HM-LC-Sw1-Pl-DN-R1.json",
539
- "VCU1366171": "HMIP-PS.json",
540
- "VCU6977344": "HmIP-MIO16-PCB.json",
541
- "VCU0000212": "HM-Sec-RHS-2.json",
542
- "VCU0000028": "263 157.json",
543
- "VCU0000108": "HM-LC-Dim1T-Pl.json",
544
- "VCU2913614": "HmIP-WHS2.json",
545
- "VCU8585352": "HmIP-DRSI1.json",
546
- "VCU8451105": "HmIPW-WTH.json",
547
- "VCU1362746": "HmIP-SWO-PR.json",
548
- "VCU7631078": "HmIP-FDT.json",
549
- "VCU0000154": "HM-WDS100-C6-O.json",
550
- "VCU0000356": "WS550LCW.json",
551
- "VCU0000124": "HM-LC-Dim2L-SM.json",
552
- "VCU0000253": "HM-Sec-MD.json",
553
- "VCU0000113": "HM-Dis-EP-WM55.json",
554
- "VCU0000245": "HM-Sec-SC.json",
555
- "VCU1223813": "HmIP-FBL.json",
556
- "VCU0000307": "HM-LC-Sw1-Pl-CT-R3.json",
557
- "VCU0000129": "HM-ES-PMSw1-Pl-DN-R1.json",
558
- "VCU8688276": "HmIP-eTRV-B.json",
559
- "VCU0000241": "HM-CC-SCD.json",
560
- "VCU6531931": "HmIP-RCB1.json",
561
- "VCU0000008": "HMW-IO-SR-FM.json",
562
- "VCU0000194": "HM-RC-12.json",
563
- "VCU0000144": "HM-LC-Ja1PBU-FM.json",
564
- "VCU0000355": "WS550LCB.json",
565
- "VCU0000042": "HM-LC-Bl1PBU-FM.json",
566
- "VCU0000061": "HM-OU-CM-PCB.json",
567
- "VCU1111390": "HmIP-HDM2.json",
568
- "VCU0000258": "HM-Sec-SD-2-Generic.json",
569
- "VCU0000050": "HM-CC-RT-DN.json",
570
- "VCU0000141": "HM-ES-TX-WM.json",
571
- "VCU0000109": "HM-LC-Dim1T-CV.json",
572
- "VCU2822385": "HmIP-SWSD.json",
573
- "VCU0000160": "HM-PB-2-WM55-2.json",
574
- "VCU1533290": "HmIP-WRC6.json",
575
- "VCU5334484": "HmIP-KRCA.json",
576
- "VCU1260322": "HmIP-RFUSB.json",
577
- "VCU0000242": "263 160.json",
578
- "VCU0000306": "HM-LC-Sw1-Pl-CT-R2.json",
579
- "VCU0000298": "HM-LC-Sw2-DR-2.json",
580
- "VCU0000338": "HM-LC-Sw1-Pl-OM54.json",
581
- "VCU0000195": "HM-RC-12-B.json",
582
- "VCU0000176": "HM-RC-4-3-D.json",
583
- "VCU0000261": "HM-Sec-Sir-WM.json",
584
- "VCU8537918": "HmIP-BROLL.json",
585
- "VCU0000134": "HM-ES-PMSw1-DR.json",
586
- "VCU0000326": "HM-LC-Sw4-PCB.json",
587
- "VCU0000271": "HM-Sen-MDIR-SM.json",
588
- "VCU9981826": "HmIP-SFD.json",
589
- "VCU0000349": "HM-Sec-WDS-2.json",
590
- "VCU0000189": "HM-PB-2-WM.json",
591
- "VCU0000098": "HM-DW-WM.json",
592
- "VCU0000058": "HM-OU-CF-Pl.json",
593
- "VCU0000285": "HM-LC-Sw1PBU-FM.json",
594
- "VCU0000257": "HM-Sec-SD-2.json",
595
- "VCU0000147": "HM-Sec-Key-S.json",
596
- "VCU2428569": "HmIPW-FAL230-C6.json",
597
- "VCU0000263": "HM-Sen-EP.json",
598
- "VCU9628024": "HmIPW-FALMOT-C12.json",
599
- "VCU0000024": "HM-WDS10-TH-O.json",
600
- "VCU0000173": "HM-PB-6-WM55.json",
601
- "VCU9710932": "HmIP-SMI55.json",
602
- "VCU0000323": "HM-LC-Sw1-SM.json",
603
- }
247
+
248
+ @functools.cache
249
+ def _load_device_translation() -> dict[str, str]:
250
+ """Load device translation mapping from JSON file."""
251
+ file_path = os.path.join(os.path.dirname(__file__), "data", "device_translation.json")
252
+ if os.path.exists(file_path):
253
+ with open(file_path, encoding=UTF_8) as f:
254
+ return cast(dict[str, str], json.load(f))
255
+ return {}
256
+
257
+
258
+ def get_address_device_translation() -> dict[str, str]:
259
+ """Return the address to device translation mapping."""
260
+ return _load_device_translation()
261
+
262
+
263
+ # Public accessor - use this instead of direct dict access
264
+ ADDRESS_DEVICE_TRANSLATION = get_address_device_translation()