z4d-certified-devices 6.465__py3-none-any.whl → 7.488__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.
Files changed (30) hide show
  1. z4d_certified_devices/Certified/Chameleon/ERL Z3.json +168 -0
  2. z4d_certified_devices/Certified/Danfoss/RV001.json +1 -0
  3. z4d_certified_devices/Certified/Danfoss/eT093WRG.json +11 -10
  4. z4d_certified_devices/Certified/Danfoss/eT093WRO.json +10 -5
  5. z4d_certified_devices/Certified/Danfoss/eTRV0100.json +2 -0
  6. z4d_certified_devices/Certified/Develco/KEPZB-110.json +37 -0
  7. z4d_certified_devices/Certified/Hobeian/CK-BL702-ROUTER-01(7018).json +29 -0
  8. z4d_certified_devices/Certified/Hobeian/ZG-222Z.json +30 -0
  9. z4d_certified_devices/Certified/Hobeian/ZG-223Z.json +30 -0
  10. z4d_certified_devices/Certified/Hobeian/ZG-227Z.json +28 -0
  11. z4d_certified_devices/Certified/Hobeian/ZG-303Z.json +28 -0
  12. z4d_certified_devices/Certified/Innr/OSP 210.json +30 -0
  13. z4d_certified_devices/Certified/LUMI/lumi.sensor_ht.agl02.json +12 -1
  14. z4d_certified_devices/Certified/Somfy/Linky Energy Sensor.json +168 -0
  15. z4d_certified_devices/Certified/Sonoff/SNZB-02LD.json +37 -0
  16. z4d_certified_devices/Certified/Sonoff/SWV.json +1 -1
  17. z4d_certified_devices/Certified/Tuya/TS0001-router.json +31 -0
  18. z4d_certified_devices/Certified/Tuya/TS011F-plug-Elivco.json +2 -1
  19. z4d_certified_devices/Certified/Tuya/TS011F-with_threshold.json +2 -0
  20. z4d_certified_devices/Certified/Tuya/TS0601-Solar-Siren.json +1 -0
  21. z4d_certified_devices/Certified/Tuya/TS130F-Blind.json +2 -1
  22. z4d_certified_devices/Certified/Tuya/ZG-223.json +30 -0
  23. z4d_certified_devices/__init__.py +166 -61
  24. z4d_certified_devices/version.py +2 -2
  25. {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/METADATA +1 -1
  26. {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/RECORD +30 -18
  27. {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/WHEEL +0 -0
  28. {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/licenses/LICENSE.txt +0 -0
  29. {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/top_level.txt +0 -0
  30. {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/zip-safe +0 -0
@@ -0,0 +1,168 @@
1
+ {
2
+ "_comment": "Chameleon ERL for Linky (OEM to Somfy)",
3
+ "Ep": {
4
+ "01": {
5
+ "0000": "",
6
+ "0003": "",
7
+ "0004": "",
8
+ "000a": "",
9
+ "0702": {
10
+ "Attributes": {
11
+ "0000": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EAST", "Name": "EAST", "EvalFunc": "compute_metering_conso", "UpdDomoDeviceWithAttribute": "0000", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
12
+
13
+ "0400": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTI_SINSTS", "Name": "SINSTI_SINSTS", "EvalFunc": "compute_metering_conso", "UpdDomoDeviceWithCluster": "0b04", "UpdDomoDeviceWithAttribute": "050f", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
14
+
15
+ "0001": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EAIT", "Name": "EAIT", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
16
+
17
+ "0020": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "NTARF", "Name": "NTARF", "UpdDomoDeviceWithCluster": "0009", "UpdDomoDeviceWithAttribute": "0020", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
18
+
19
+ "0100": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF01", "Name": "EASF01", "EvalFunc": "compute_metering_conso", "UpdDomoDeviceWithAttribute": "0100", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
20
+ "0102": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF02", "Name": "EASF02", "EvalFunc": "compute_metering_conso", "UpdDomoDeviceWithAttribute": "0102", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
21
+ "0104": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF03", "Name": "EASF03", "EvalFunc": "compute_metering_conso", "UpdDomoDeviceWithAttribute": "0100", "UpdDomoDeviceWithEp": "f2", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
22
+ "0106": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF04", "Name": "EASF04", "EvalFunc": "compute_metering_conso", "UpdDomoDeviceWithAttribute": "0102", "UpdDomoDeviceWithEp": "f2", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
23
+ "0108": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF05", "Name": "EASF05", "EvalFunc": "compute_metering_conso", "UpdDomoDeviceWithAttribute": "0100", "UpdDomoDeviceWithEp": "f3", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
24
+ "010a": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF06", "Name": "EASF06", "EvalFunc": "compute_metering_conso", "UpdDomoDeviceWithAttribute": "0102", "UpdDomoDeviceWithEp": "f3", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
25
+ "010c": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF07", "Name": "EASF07", "EvalFunc": "compute_metering_conso", "ActionList": [ "check_store_value", "store_specif_attribute"] },
26
+ "010e": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF08", "Name": "EASF08", "EvalFunc": "compute_metering_conso", "ActionList": [ "check_store_value", "store_specif_attribute"] },
27
+ "0110": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF09", "Name": "EASF09", "EvalFunc": "compute_metering_conso", "ActionList": [ "check_store_value", "store_specif_attribute"] },
28
+ "0112": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EASF10", "Name": "EASF10", "EvalFunc": "compute_metering_conso", "ActionList": [ "check_store_value", "store_specif_attribute"] },
29
+
30
+ "0101": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "EAIT", "Name": "EAIT", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
31
+ "0200": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "ORGANE_COUPURE", "Name": "ORGANE_COUPURE", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
32
+ "0204": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "STGE4-7", "Name": "STGE4-7", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
33
+ "0209": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "LINKY_MODE", "Name": "LINKY_MODE", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
34
+ "0307": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "PRM", "Name": "PRM", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
35
+ "0308": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "ADCO", "Name": "ADCO", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
36
+ "030f": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "NGTF/OPTARIF", "Name": "NGTF/OPTARIF", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
37
+
38
+ "045d": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SMAXSN", "Name": "SMAXSN", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
39
+ "045e": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "", "Name": "", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
40
+ "045f": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SMAXIN", "Name": "SMAXIN", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
41
+ "0460": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "", "Name": "", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
42
+ "0461": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "", "Name": "", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
43
+ "0462": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "", "Name": "", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
44
+ "0463": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "", "Name": "", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
45
+ "0464": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "", "Name": "", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
46
+ "0c00": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTI", "Name": "", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
47
+ "0d05": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "ERQ1", "Name": "ERQ1", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
48
+ "0d06": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "ERQ2", "Name": "ERQ2", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
49
+ "0d07": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "ERQ3", "Name": "ERQ3", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
50
+ "0d08": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "ERQ4", "Name": "ERQ4", "ActionList": [ "check_store_value", "store_specif_attribute" ] }
51
+ }
52
+ },
53
+ "0705": "",
54
+ "070d": {
55
+ "Attributes": {
56
+ "0100": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "RELAIS", "Name": "RELAIS", "DataType": "18", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
57
+ "0101": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "NJOURF", "Name": "NJOURF", "DataType": "30", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
58
+ "0102": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "PTEC/LTARF", "Name": "PTEC/LTARF", "DataType": "41", "UpdDomoDeviceWithCluster": "0009", "UpdDomoDeviceWithAttribute": "0039", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
59
+ "0103": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "STGE/DEMAIN", "Name": "STGE/DEMAIN", "DataType": "18","UpdDomoDeviceWithCluster": "0009", "UpdDomoDeviceWithAttribute": "0003", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] }
60
+ }
61
+ },
62
+ "0b01": {
63
+ "Attributes": {
64
+ "000a": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "VTIC", "Name": "VTIC", "DataType": "41", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
65
+ "000c": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "PRM", "Name": "PRM", "DataType": "42", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
66
+ "000d": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "PREF/ISOUSC", "Name": "PREF/ISOUSC", "DataType": "2a", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
67
+ "000e": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "PCOUP", "Name": "PCOUP", "DataType": "2a", "ActionList": [ "check_store_value", "store_specif_attribute" ] }
68
+ }
69
+ },
70
+ "0b04": {
71
+ "Attributes": {
72
+ "0306": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTI_SINSTS", "Name": "SINSTI_SINSTS", "EvalFunc": "compute_electrical_measurement_conso", "UpdDomoDeviceWithAttribute": "050f", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
73
+
74
+ "0505": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "URMS1", "Name": "URMS1", "DataType": "21", "UpdDomoDeviceWithCluster": "0001", "UpdDomoDeviceWithEp": "f4", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
75
+ "0905": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "URMS2", "Name": "URMS2", "DataType": "21", "UpdDomoDeviceWithCluster": "0001", "UpdDomoDeviceWithEp": "f5", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
76
+ "0a05": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "URMS3", "Name": "URMS3", "DataType": "21", "UpdDomoDeviceWithCluster": "0001", "UpdDomoDeviceWithEp": "f6", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
77
+
78
+ "0508": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "IINST1", "Name": "IINST1", "DataType": "21", "EvalFunc": "compute_electrical_measurement_conso", "UpdDomoDeviceWithAttribute": "0508", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
79
+ "0908": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "IINST2", "Name": "IINST2", "DataType": "21", "EvalFunc": "compute_electrical_measurement_conso", "UpdDomoDeviceWithAttribute": "0908", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ]},
80
+ "0a08": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "IINST3", "Name": "IINST3", "DataType": "21", "EvalFunc": "compute_electrical_measurement_conso", "UpdDomoDeviceWithAttribute": "0a08", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
81
+
82
+ "050f": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTS1", "Name": "SINSTS1", "DataType": "21", "EvalFunc": "compute_electrical_measurement_conso", "UpdDomoDeviceWithAttribute": "050f", "UpdDomoDeviceWithEp": "f4","ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ]},
83
+ "090f": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTS2", "Name": "SINSTS2", "DataType": "21", "EvalFunc": "compute_electrical_measurement_conso", "UpdDomoDeviceWithAttribute": "050f", "UpdDomoDeviceWithEp": "f5", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
84
+ "0a0f": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTS3", "Name": "SINSTS3", "DataType": "21", "EvalFunc": "compute_electrical_measurement_conso", "UpdDomoDeviceWithAttribute": "050f", "UpdDomoDeviceWithEp": "f6", "ActionList": [ "check_store_value", "store_specif_attribute", "upd_domo_device" ] },
85
+
86
+ "0511": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "UMOY1", "Name": "UMOY1", "DataType": "21", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
87
+ "0911": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "UMOY2", "Name": "UMOY2", "DataType": "21", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
88
+ "0a11": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "UMOY3", "Name": "UMOY3", "DataType": "21", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
89
+
90
+ "050a": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "IMAX1", "Name": "IMAX1", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
91
+ "090a": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "IMAX2", "Name": "IMAX2", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
92
+ "0a0a": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "IMAX3", "Name": "IMAX3", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
93
+
94
+ "050b": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTS1", "Name": "SINSTS1", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
95
+ "090b": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTS2", "Name": "SINSTS2", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
96
+ "0a0b": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SINSTS3", "Name": "SINSTS3", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
97
+
98
+ "05a0": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SMAXSN1", "Name": "SMAXSN1", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
99
+ "09a0": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SMAXSN2", "Name": "SMAXSN2", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
100
+ "0aa0": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SMAXSN3", "Name": "SMAXSN3", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
101
+
102
+ "05a1": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SMAXSN1-1", "Name": "SMAXSN1-1", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
103
+ "09a1": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SMAXSN2-1", "Name": "SMAXSN2-1", "ActionList": [ "check_store_value", "store_specif_attribute" ] },
104
+ "0aa1": { "SpecifStoragelvl1": "Chameleon", "SpecifStoragelvl2": "SMAXSN3-1", "Name": "SMAXSN3-1", "ActionList": [ "check_store_value", "store_specif_attribute" ] }
105
+
106
+ }
107
+ },
108
+ "0b05": "",
109
+ "Type": "Ampere/Ampere3/Meter/Power/P1Meter/P1Meter_HPHC/LinkyCurrentTarif/LinkyCurrentDayColor/LinkyNextDayColor/ProdPower/ProdMeter"
110
+ },
111
+ "e8": {
112
+ "0000": "",
113
+ "0003": "",
114
+ "000a": "",
115
+ "0019": "",
116
+ "Type": ""
117
+ },
118
+ "f2": { "Type": "P1Meter_HPHC" },
119
+ "f3": { "Type": "P1Meter_HPHC" },
120
+ "f4": { "Type": "Power/Voltage" },
121
+ "f5": { "Type": "Power/Voltage" },
122
+ "f6": { "Type": "Power/Voltage" }
123
+
124
+ },
125
+ "FakeEp": [ "f2", "f3", "f4", "f5", "f6" ],
126
+ "Type": "",
127
+ "ClusterToBind": [ "0702", "0b04", "0b01", "070D" ],
128
+ "ConfigureReporting": {
129
+ "0702": {
130
+ "Attributes": {
131
+ "0020": { "DataType": "30", "MinInterval": "0005", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
132
+ "0100": { "DataType": "25", "MinInterval": "003C", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "000000000001" },
133
+ "0102": { "DataType": "25", "MinInterval": "003C", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "000000000001" },
134
+ "0104": { "DataType": "25", "MinInterval": "003C", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "000000000001" },
135
+ "0106": { "DataType": "25", "MinInterval": "003C", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "000000000001" },
136
+ "0108": { "DataType": "25", "MinInterval": "003C", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "000000000001" },
137
+ "010a": { "DataType": "25", "MinInterval": "003C", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "000000000001" }
138
+ }
139
+ },
140
+ "0b04": {
141
+ "Attributes": {
142
+ "0508": { "DataType": "21", "MinInterval": "000A", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
143
+ "0908": { "DataType": "21", "MinInterval": "000E", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
144
+ "0a08": { "DataType": "21", "MinInterval": "000E", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
145
+
146
+ "050F": { "DataType": "21", "MinInterval": "000A", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
147
+ "090f": { "DataType": "21", "MinInterval": "000E", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
148
+ "0a0f": { "DataType": "21", "MinInterval": "000E", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
149
+
150
+ "0505": { "DataType": "21", "MinInterval": "000A", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
151
+ "0905": { "DataType": "21", "MinInterval": "000A", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" },
152
+ "0a05": { "DataType": "21", "MinInterval": "000A", "MaxInterval": "0E10", "TimeOut": "0000", "Change": "0001" }
153
+ }
154
+ }
155
+ },
156
+ "ReadAttributes": {
157
+ "0000": [ "0000", "0001", "0002", "0003", "0006", "0007", "4000" ],
158
+ "0b01": [ "000a", "000c", "000d", "000e"],
159
+ "0702": [ "0000", "0001", "0020", "0100", "0101", "0102", "0104", "0106", "0108", "010a", "010c", "010e", "0110", "0112", "0200", "0204", "0209", "0307", "0308", "030f", "0400", "045d", "045e", "045f", "0460", "0461", "0462", "0463", "0464", "0c00", "0d05", "0d06", "0d07", "0d08", "0300", "0301", "0302", "0000", "0020", "0308", "030f", "0400"],
160
+ "070d": [ "0102", "0101", "0100", "0103" ],
161
+ "0b04": [ "0306","0505","0508","050a","050b","050f","0511","05a0","05a1","0905","0908","090a","090b","090f","0911","09a0","09a1","0a05","0a08","0a0a","0a0b","0a0f","0a11","0aa0","0aa1", "0600", "0601", "0602", "0603", "0604", "0605", "0508", "0304" ],
162
+ "0019": []
163
+ },
164
+ "PollingEnabled": 1,
165
+ "LINKY_COLOR_SENSOR": true,
166
+ "Param": {
167
+ }
168
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "_source": "https://github.com/zigbeefordomoticz/z4d-certified-devices/issues/112",
3
+ "_blakadder": "https://zigbee.blakadder.com/Sonoff_SNZB-02D.html",
4
+ "_comment": "Waterproof (IP65) sensor with screen and probe temperature detection",
5
+ "_version": "1.0",
6
+ "MinPluginVersion": "7.1.022",
7
+ "Ep": {
8
+ "01": {
9
+ "0000": "",
10
+ "0001": "",
11
+ "0003": "",
12
+ "0020": "",
13
+ "0402": "",
14
+ "fc57": "",
15
+ "fc11": "",
16
+ "0019": "",
17
+ "Type": "Temp"
18
+ }
19
+ },
20
+ "Type": "",
21
+ "ClusterToBind": [ "0402", "0001" ],
22
+ "ConfigureReporting": {
23
+ },
24
+ "ReadAttributes": {
25
+ "0000": [ "0004", "0000", "0001", "0005", "0003", "0007", "4000" ],
26
+ "0001": [ "0021", "0020" ],
27
+ "0402": [ "0000", "0001", "0002" ],
28
+ "fc11": [ "0007", "2003"],
29
+ "0019": []
30
+ },
31
+ "BatteryDevice": 1,
32
+ "BatteryPercentageConverter": 2,
33
+ "Param": {
34
+ "SONOFF_TEMP_UNIT": 0,
35
+ "SONOFF_TEMP_CALIBRATION": 0
36
+ }
37
+ }
@@ -10,7 +10,7 @@
10
10
  "0003": "",
11
11
  "0006": "",
12
12
  "0020": "",
13
- "0404": { "Attributes": { "0000": { "Enabled": true, "Name": "Flow Meansurement", "EvalExp": "((value*1000)/60)", "ActionList": [ "check_store_value", "upd_domo_device" ] }}},
13
+ "0404": { "Attributes": { "0000": { "Enabled": true, "Name": "Flow Meansurement", "EvalExp": "round((value*100)/60,2)", "ActionList": [ "check_store_value", "upd_domo_device" ] }}},
14
14
  "0b05": "",
15
15
  "fc57": "",
16
16
  "fc11": { "Attributes": {
@@ -0,0 +1,31 @@
1
+ {
2
+ "_comment": "Zigbee Extender",
3
+ "_version": "",
4
+ "_blakadder": "",
5
+ "_source": "",
6
+ "Identifier": [
7
+ ["TS0001", "_TZ3000_n0lphcok" ]
8
+ ],
9
+ "Ep": {
10
+ "01": {
11
+ "0000": "",
12
+ "0004": "",
13
+ "0005": "",
14
+ "0006": "",
15
+ "0019": "",
16
+ "e000": "",
17
+ "e001": "",
18
+ "Type": "Switch"
19
+ }
20
+ },
21
+ "Type": "",
22
+ "ClusterToBind": [ "0006" ],
23
+ "ConfigureReporting": { },
24
+ "ReadAttributes": {
25
+ "0019": [ ],
26
+ "0006": [ "0000", "4001", "4002" ],
27
+ "0000": [ "0000", "0001", "0002", "0003", "0004", "0005", "0007" ]
28
+ },
29
+ "Param": { },
30
+ "GroupMembership": { }
31
+ }
@@ -3,7 +3,8 @@
3
3
  "_comment": "Tuya Plug",
4
4
  "_version": "1.0",
5
5
  "Identifier": [
6
- [ "TS011F", "_TZ3000_okaz9tjs" ]
6
+ [ "TS011F", "_TZ3000_okaz9tjs" ],
7
+ [ "TS011F", "_TZ3000_wzmuk9ai" ]
7
8
 
8
9
  ],
9
10
  "Ep" : {
@@ -7,6 +7,8 @@
7
7
  [ "TS011F", "_TZ3000_qystbcjg" ],
8
8
  [ "TS011F", "_TZ3000_zrm3oxsh" ],
9
9
  [ "TS011F", "_TZ3000_303avxxt" ],
10
+ [ "TS011F", "_TZ3000_ibefeicf" ],
11
+ [ "TS011F", "_TZ3000_zv6x8bt2" ],
10
12
  [ "TS011F", "_TZ3000_zjchz7pd" ]
11
13
  ],
12
14
  "Ep": {
@@ -4,6 +4,7 @@
4
4
  "_version": "1.0",
5
5
  "Identifier": [
6
6
  [ "TS0601", "_TZE200_nlrfgpny"],
7
+ [ "TS0601", "_TZE284_nlrfgpny"],
7
8
  [ "TS0601", "_TZE204_nlrfgpny"]
8
9
  ],
9
10
  "Ep": {
@@ -10,7 +10,8 @@
10
10
  ["TS130F", "_TZ3000_qqdbccb3"],
11
11
  ["TS130F", "_TZ3000_dbpmpco1"],
12
12
  ["TS130F", "_TZ3000_rnaovf1x"],
13
- ["TS130F", "_TZ3000_cet6ch1r"]
13
+ ["TS130F", "_TZ3000_cet6ch1r"],
14
+ ["TS130F", "_TZ3000_26gjlugm"]
14
15
  ],
15
16
 
16
17
  "Ep": {
@@ -0,0 +1,30 @@
1
+ {
2
+ "_comment": "",
3
+ "_version": "",
4
+ "_blakadder": "",
5
+ "_source": "",
6
+ "Ep": {
7
+ "01": {
8
+ "0000": "",
9
+ "0500": "",
10
+ "0001": "",
11
+ "0400": "",
12
+ "Type": "Water/Voltage/Lux"
13
+ }
14
+ },
15
+ "Type": "",
16
+ "ClusterToBind": [],
17
+ "ConfigureReporting": {
18
+ "0400": { "0000": { "Change": "000f", "DataType": "21", "MaxInterval": "012c", "MinInterval": "0005", "TimeOut": "0000" } }
19
+ },
20
+ "ReadAttributes": {
21
+ "0000": [ "0004", "0000", "0001", "0005", "0007" ],
22
+ "0001": [ "0020", "0021", "fffd" ],
23
+ "0400": [ "0000", "0001", "0002", "fffd" ],
24
+ "0500": [ "0000", "0001", "0002", "0010" ]
25
+ },
26
+ "BatteryDevice": 1,
27
+ "BatteryPercentageConverter": 2,
28
+ "Param": {},
29
+ "GroupMembership": {}
30
+ }
@@ -1,89 +1,194 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
3
  #
4
- # Implementation of Zigbee for Domoticz plugin.
4
+ # Zigbee for Domoticz Plugin - Certified Device Configuration Loader
5
5
  #
6
- # This file is part of Zigbee for Domoticz plugin. https://github.com/zigbeefordomoticz/Domoticz-Zigbee
7
- # (C) 2015-2024
6
+ # This file is part of the Zigbee for Domoticz plugin: https://github.com/zigbeefordomoticz/Domoticz-Zigbee
7
+ # (C) 2015-2025
8
8
  #
9
- # Initial authors: zaraki673 & pipiche38
9
+ # SPDX-License-Identifier: GPL-3.0
10
10
  #
11
- # SPDX-License-Identifier: GPL-3.0 license
11
+ """
12
+ Module: certified_devices_loader
13
+ ================================
14
+
15
+ This module provides functionality to import and register **certified Zigbee device configurations**
16
+ for the Zigbee for Domoticz plugin.
17
+
18
+ It scans the `Certified/` subdirectory within a specified repository path, where each manufacturer
19
+ has a dedicated folder containing JSON files that describe device models and their attributes.
20
+
21
+ The loader validates JSON integrity, checks plugin version compatibility, and populates
22
+ the plugin’s internal mappings:
23
+
24
+ - `self.DeviceConf`: Maps device model names to their JSON definitions.
25
+ - `self.ModelManufMapping`: Maps manufacturer identifiers to model names.
26
+
27
+ Key Functions
28
+ -------------
29
+ - `z4d_import_device_configuration(self, path_name)`: Main entry point to load all configurations.
30
+ - `_iter_valid_entries(directory)`: Internal helper to skip unwanted files.
31
+ - `_load_json_file(self, filename)`: Loads and validates JSON configuration files.
32
+ - `_is_plugin_version_compatible(model_def, plugin_version)`: Ensures compatibility with plugin version.
33
+ - `_register_device_config(self, model_name, model_def)`: Registers a certified device configuration.
34
+
35
+ Logging
36
+ -------
37
+ All operations are logged through `self.log.logging()` under the "z4dCertifiedDevices" category,
38
+ using log levels: `Status`, `Debug`, and `Error`.
39
+
40
+ Example Directory Layout
41
+ ------------------------
42
+ Certified/
43
+ ├── IKEA/
44
+ │ ├── TRADFRI_bulb.json
45
+ │ └── README.md
46
+ └── Philips/
47
+ └── Hue_dimmer.json
48
+
49
+ Example Usage
50
+ -------------
51
+ >>> z4d_import_device_configuration(plugin_instance, "/opt/zigbee4domoticz/CertifiedDevices")
52
+
53
+ """
54
+
12
55
 
13
56
  import json
14
- import os.path
15
- from pathlib import Path
16
57
  import os
58
+ from pathlib import Path
17
59
 
18
60
  from .version import __version__
19
61
 
20
62
 
21
63
  def z4d_import_device_configuration(self, path_name):
64
+ """
65
+ Load all certified Zigbee device configuration files from the given path.
66
+
67
+ This function scans the Certified Devices directory structure:
68
+ Certified/<Manufacturer>/<Device>.json
69
+ Each valid JSON file defines a certified Zigbee device model configuration.
22
70
 
71
+ Steps:
72
+ 1. Validate that the Certified directory exists.
73
+ 2. Iterate over each manufacturer folder.
74
+ 3. Parse and load each JSON config file if compatible with plugin version.
75
+ 4. Populate self.DeviceConf and self.ModelManufMapping.
76
+
77
+ Args:
78
+ self: Plugin instance, expected to have:
79
+ - self.pluginParameters (dict)
80
+ - self.DeviceConf (dict)
81
+ - self.ModelManufMapping (dict)
82
+ - self.log.logging(category, level, message)
83
+ path_name (str | Path): Base path containing the "Certified" subdirectory.
84
+
85
+ Logs:
86
+ - Status: Summary of loaded device count.
87
+ - Debug: Step-by-step loading details.
88
+ - Error: Any file or version compatibility issues.
89
+ """
23
90
  model_certified = Path(path_name) / "Certified"
24
- plugin_version = self.pluginParameters.get("PluginVersion")
25
91
 
26
- if not os.path.isdir(model_certified):
27
- self.log.logging("z4dCertifiedDevices", "Status", f"Z4D found an empty Certified Db {model_certified}")
92
+ if not model_certified.is_dir():
93
+ self.log.logging("z4dCertifiedDevices", "Status",
94
+ f"Z4D found an empty Certified Db {model_certified}")
28
95
  return
29
-
30
- for device_brand in os.listdir(model_certified):
31
- if device_brand in ("README.md", ".PRECIOUS"):
32
- continue
33
-
34
- model_directory = Path(model_certified) / device_brand
35
-
36
- for model_device_file in os.listdir(model_directory):
37
- if model_device_file in ("README.md", ".PRECIOUS"):
38
- continue
39
-
40
- filename = model_directory / model_device_file
41
-
42
- try:
43
- with open(filename, "rt", encoding='utf-8') as file_handle:
44
- model_definition = json.load(file_handle)
45
-
46
- except (ValueError, Exception) as error:
47
- error_type = type(error).__name__
48
- error_msg = f"JSON ConfFile: {filename} load failed with error: {error_type}, skipping this config file."
49
- self.log.logging("z4dCertifiedDevices", "Error", error_msg)
96
+
97
+ plugin_version = self.pluginParameters.get("PluginVersion")
98
+ device_count_before = len(self.DeviceConf)
99
+
100
+ for brand_dir in _iter_valid_entries(model_certified):
101
+ for config_file in _iter_valid_entries(model_certified / brand_dir):
102
+ filename = model_certified / brand_dir / config_file
103
+ model_def = _load_json_file(self, filename)
104
+ if not model_def:
50
105
  continue
51
-
52
- device_model_name = _get_model_name(model_device_file)
53
-
54
- if device_model_name in self.DeviceConf:
55
- self.log.logging("z4dCertifiedDevices", "Debug", f"Config for {device_brand}/{device_model_name} not loaded as already defined")
106
+
107
+ model_name = Path(config_file).stem
108
+
109
+ if model_name in self.DeviceConf:
110
+ self.log.logging("z4dCertifiedDevices", "Debug",
111
+ f"Config for {brand_dir}/{model_name} already defined, skipped.")
56
112
  continue
57
-
58
- self.log.logging("z4dCertifiedDevices", "Debug", f"processing certified {device_brand}/{device_model_name}")
59
-
60
- if not _is_model_requirement_match_plugin_version(self, model_definition, plugin_version):
61
- min_plugin_version = model_definition.get("MinPluginVersion", "N/A")
62
- error_msg = f"Certified Devices load skip this Certified device {device_brand}-{device_model_name} requires Plugin version {min_plugin_version}"
63
- self.log.logging("z4dCertifiedDevices", "Error", error_msg)
113
+
114
+ if not _is_plugin_version_compatible(model_def, plugin_version):
115
+ required = model_def.get("MinPluginVersion", "N/A")
116
+ self.log.logging("z4dCertifiedDevices", "Error",
117
+ f"Skipping {brand_dir}/{model_name}: requires Plugin ≥ {required}")
64
118
  continue
65
119
 
66
- _process_device_config_file(self, device_model_name, model_definition)
120
+ _register_device_config(self, model_name, model_def)
121
+ self.log.logging("z4dCertifiedDevices", "Debug",
122
+ f"Loaded certified {brand_dir}/{model_name}")
123
+
124
+ new_device_count = len(self.DeviceConf) - device_count_before
125
+ self.log.logging("z4dCertifiedDevices", "Status",
126
+ f"Z4D loaded {new_device_count} certified devices from repository version [{__version__}]")
127
+ self.log.logging("z4dCertifiedDevices", "Debug",
128
+ f"DeviceConf keys: {list(self.DeviceConf.keys())}")
129
+ self.log.logging("z4dCertifiedDevices", "Debug",
130
+ f"ModelManufMapping keys: {list(self.ModelManufMapping.keys())}")
131
+
132
+
133
+ # ---------------------------------------------------------------------------
134
+ # Internal helpers
135
+ # ---------------------------------------------------------------------------
136
+
137
+ def _iter_valid_entries(directory: Path):
138
+ """Yield directory entries, skipping README.md and .PRECIOUS."""
139
+ for entry in os.listdir(directory):
140
+ if entry not in ("README.md", ".PRECIOUS"):
141
+ yield entry
142
+
143
+
144
+ def _load_json_file(self, filename: Path):
145
+ """
146
+ Load and parse a JSON configuration file.
147
+
148
+ Returns:
149
+ dict | None: Parsed JSON data if successful, otherwise None.
150
+
151
+ Logs:
152
+ - Error: If the file cannot be read or contains invalid JSON.
153
+ """
154
+ try:
155
+ with open(filename, "r", encoding="utf-8") as fh:
156
+ return json.load(fh)
157
+
158
+ except FileNotFoundError:
159
+ self.log.logging(
160
+ "z4dCertifiedDevices", "Error",
161
+ f"Configuration file not found: {filename}"
162
+ )
163
+
164
+ except json.JSONDecodeError as err:
165
+ self.log.logging(
166
+ "z4dCertifiedDevices", "Error",
167
+ f"Invalid JSON in {filename} (line {err.lineno}, column {err.colno}): {err.msg}"
168
+ )
169
+
170
+ except OSError as err:
171
+ self.log.logging(
172
+ "z4dCertifiedDevices", "Error",
173
+ f"I/O error while reading {filename}: {err.strerror or err}"
174
+ )
67
175
 
68
- self.log.logging("z4dCertifiedDevices", "Debug", f"Config loaded: {self.DeviceConf.keys()}")
69
- self.log.logging("z4dCertifiedDevices", "Debug", f"Certified Devices ModelManufMapping loaded - {self.ModelManufMapping.keys()}")
70
-
71
- self.log.logging("z4dCertifiedDevices", "Status", f"Z4D loads {len(self.DeviceConf)} certified devices from repository version [{__version__}]")
176
+ return None
72
177
 
73
178
 
74
- def _get_model_name(model_device_file):
75
- """Remove .json from filename to get the Device Model."""
76
- return os.path.splitext(os.path.basename(model_device_file))[0]
179
+ def _is_plugin_version_compatible(model_def: dict, plugin_version: str) -> bool:
180
+ """Return True if the model's minimum required plugin version is met."""
181
+ min_version = model_def.get("MinPluginVersion")
182
+ return not (min_version and plugin_version < min_version)
77
183
 
78
184
 
79
- def _is_model_requirement_match_plugin_version(self, model_definition, plugin_version):
80
- """ is the config file working with this version of the plugin """
81
- return not ("MinPluginVersion" in model_definition and plugin_version < model_definition["MinPluginVersion"])
185
+ def _register_device_config(self, model_name: str, model_def: dict):
186
+ """
187
+ Register the loaded device configuration.
82
188
 
83
-
84
- def _process_device_config_file(self, device_model_name, model_definition):
85
- """Load the config into DeviceConf and, if needed (Tuya), load into the model name mapping."""
86
- self.DeviceConf[device_model_name] = model_definition
87
- identifier_list = model_definition.get("Identifier", [])
88
- for identifier_tuple in identifier_list:
89
- self.ModelManufMapping[tuple(identifier_tuple)] = device_model_name
189
+ Adds the device model to `DeviceConf` and updates
190
+ `ModelManufMapping` with all identifiers.
191
+ """
192
+ self.DeviceConf[model_name] = model_def
193
+ for identifier in model_def.get("Identifier", []):
194
+ self.ModelManufMapping[tuple(identifier)] = model_name
@@ -1,3 +1,3 @@
1
- MAJOR_VERSION = 6
2
- MINOR_VERSION = 465
1
+ MAJOR_VERSION = 7
2
+ MINOR_VERSION = 488
3
3
  __version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: z4d-certified-devices
3
- Version: 6.465
3
+ Version: 7.488
4
4
  Summary: "Certified devices for Zigbee for Domoticz plugin"
5
5
  Home-page: https://github.com/zigbeefordomoticz/z4d-certified-devices
6
6
  Author: "Patrick Pichon"