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.
- z4d_certified_devices/Certified/Chameleon/ERL Z3.json +168 -0
- z4d_certified_devices/Certified/Danfoss/RV001.json +1 -0
- z4d_certified_devices/Certified/Danfoss/eT093WRG.json +11 -10
- z4d_certified_devices/Certified/Danfoss/eT093WRO.json +10 -5
- z4d_certified_devices/Certified/Danfoss/eTRV0100.json +2 -0
- z4d_certified_devices/Certified/Develco/KEPZB-110.json +37 -0
- z4d_certified_devices/Certified/Hobeian/CK-BL702-ROUTER-01(7018).json +29 -0
- z4d_certified_devices/Certified/Hobeian/ZG-222Z.json +30 -0
- z4d_certified_devices/Certified/Hobeian/ZG-223Z.json +30 -0
- z4d_certified_devices/Certified/Hobeian/ZG-227Z.json +28 -0
- z4d_certified_devices/Certified/Hobeian/ZG-303Z.json +28 -0
- z4d_certified_devices/Certified/Innr/OSP 210.json +30 -0
- z4d_certified_devices/Certified/LUMI/lumi.sensor_ht.agl02.json +12 -1
- z4d_certified_devices/Certified/Somfy/Linky Energy Sensor.json +168 -0
- z4d_certified_devices/Certified/Sonoff/SNZB-02LD.json +37 -0
- z4d_certified_devices/Certified/Sonoff/SWV.json +1 -1
- z4d_certified_devices/Certified/Tuya/TS0001-router.json +31 -0
- z4d_certified_devices/Certified/Tuya/TS011F-plug-Elivco.json +2 -1
- z4d_certified_devices/Certified/Tuya/TS011F-with_threshold.json +2 -0
- z4d_certified_devices/Certified/Tuya/TS0601-Solar-Siren.json +1 -0
- z4d_certified_devices/Certified/Tuya/TS130F-Blind.json +2 -1
- z4d_certified_devices/Certified/Tuya/ZG-223.json +30 -0
- z4d_certified_devices/__init__.py +166 -61
- z4d_certified_devices/version.py +2 -2
- {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/METADATA +1 -1
- {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/RECORD +30 -18
- {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/WHEEL +0 -0
- {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/licenses/LICENSE.txt +0 -0
- {z4d_certified_devices-6.465.dist-info → z4d_certified_devices-7.488.dist-info}/top_level.txt +0 -0
- {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*
|
|
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
|
+
}
|
|
@@ -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
|
-
#
|
|
4
|
+
# Zigbee for Domoticz Plugin - Certified Device Configuration Loader
|
|
5
5
|
#
|
|
6
|
-
# This file is part of Zigbee for Domoticz plugin
|
|
7
|
-
# (C) 2015-
|
|
6
|
+
# This file is part of the Zigbee for Domoticz plugin: https://github.com/zigbeefordomoticz/Domoticz-Zigbee
|
|
7
|
+
# (C) 2015-2025
|
|
8
8
|
#
|
|
9
|
-
#
|
|
9
|
+
# SPDX-License-Identifier: GPL-3.0
|
|
10
10
|
#
|
|
11
|
-
|
|
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
|
|
27
|
-
self.log.logging("z4dCertifiedDevices", "Status",
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
if
|
|
55
|
-
self.log.logging("z4dCertifiedDevices", "Debug",
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
75
|
-
"""
|
|
76
|
-
|
|
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
|
|
80
|
-
"""
|
|
81
|
-
|
|
185
|
+
def _register_device_config(self, model_name: str, model_def: dict):
|
|
186
|
+
"""
|
|
187
|
+
Register the loaded device configuration.
|
|
82
188
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
"""
|
|
86
|
-
self.DeviceConf[
|
|
87
|
-
|
|
88
|
-
|
|
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
|
z4d_certified_devices/version.py
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
MAJOR_VERSION =
|
|
2
|
-
MINOR_VERSION =
|
|
1
|
+
MAJOR_VERSION = 7
|
|
2
|
+
MINOR_VERSION = 488
|
|
3
3
|
__version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}"
|