z4d-certified-devices 5.410__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/Casa.ia/CAC221.json +7 -34
- z4d_certified_devices/Certified/Chameleon/ERL Z3.json +168 -0
- z4d_certified_devices/Certified/Chameleon/MWA1-TIC.json +3 -1
- 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/Develco/SPLZB-131.json +7 -6
- z4d_certified_devices/Certified/EcoDim/EcoDim-Zigbee 3.0.json +16 -1
- z4d_certified_devices/Certified/GammaTroniques/TICMeter.json +68 -18
- 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/Ikea/RODRET Dimmer.json +25 -0
- z4d_certified_devices/Certified/Ikea/RODRET wireless dimmer.json +25 -0
- z4d_certified_devices/Certified/Ikea/TRADFRI SHORTCUT Button.json +57 -0
- z4d_certified_devices/Certified/Ikea/TRADFRI onoff switch.json +43 -0
- z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI openclose remote.json +3 -2
- z4d_certified_devices/Certified/Ikea/TRADFRI wireless dimmer.json +26 -0
- z4d_certified_devices/Certified/Ikea/TRETAKT Smart plug.json +39 -0
- z4d_certified_devices/Certified/Innr/OSP 210.json +30 -0
- z4d_certified_devices/Certified/{INNR → Innr}/SP 120.json +0 -1
- z4d_certified_devices/Certified/LUMI/lumi.flood.agl02.json +28 -0
- z4d_certified_devices/Certified/LUMI/lumi.sensor_ht.agl02.json +12 -1
- z4d_certified_devices/Certified/Namron/4512737.json +1 -1
- z4d_certified_devices/Certified/Nodon/SIN-4-1-21.json +37 -0
- z4d_certified_devices/Certified/Nodon/SIN-4-RS-20.json +9 -2
- z4d_certified_devices/Certified/Nodon/SIN-4-RS-20_PRO.json +9 -2
- z4d_certified_devices/Certified/SALUS/SPE600.json +3 -3
- 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/Sonoff/ZBMINIR2.json +30 -0
- z4d_certified_devices/Certified/Sonoff/ZBMicro.json +36 -0
- z4d_certified_devices/Certified/Tuya/ME201WZ.json +47 -0
- z4d_certified_devices/Certified/Tuya/TLC2206-ZB-EU.json +47 -0
- 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-Irrigation-Valve.json +1 -0
- z4d_certified_devices/Certified/Tuya/TS0601-Solar-Siren.json +1 -0
- z4d_certified_devices/Certified/Tuya/TS0601-ZDMS16-1.json +48 -0
- z4d_certified_devices/Certified/Tuya/TS0601-soil-sensor.json +1 -0
- z4d_certified_devices/Certified/Tuya/TS0601-soil-sensor_3.json +38 -0
- z4d_certified_devices/Certified/Tuya/TS0601-vibration.json +12 -9
- z4d_certified_devices/Certified/Tuya/TS130F-Blind.json +4 -2
- z4d_certified_devices/Certified/Tuya/TS130F-_TZ3000_5iixzdo7.json +24 -7
- 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-5.410.dist-info → z4d_certified_devices-7.488.dist-info}/METADATA +1 -1
- {z4d_certified_devices-5.410.dist-info → z4d_certified_devices-7.488.dist-info}/RECORD +119 -100
- {z4d_certified_devices-5.410.dist-info → z4d_certified_devices-7.488.dist-info}/WHEEL +1 -1
- z4d_certified_devices/Certified/GammaTroniques/TICMeter-historique-tri-base.json +0 -88
- z4d_certified_devices/Certified/GammaTroniques/TICMeter-historique-tri-hchp.json +0 -76
- z4d_certified_devices/Certified/GammaTroniques/TICMeter-historique-tri-tempo.json +0 -81
- z4d_certified_devices/Certified/IKEA_TRADFRI/TRADFRI SHORTCUT Button.json +0 -56
- z4d_certified_devices/Certified/IKEA_TRADFRI/TRADFRI onoff switch.json +0 -42
- z4d_certified_devices/Certified/IKEA_TRADFRI/TRADFRI wireless dimmer.json +0 -39
- z4d_certified_devices/Certified/Others/EcoDim-Zigbee 3.0.json +0 -37
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/FLOALT panel WS 30x90.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/FLOALT panel WS 60x60.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/FYRTUR block-out roller blind.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/INSPELNING Smart plug.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/KADRILJ roller blind.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/PARASOLL DoorWindow Sensor.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/Remote Control N2.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/STARKVIND Air purifier.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/STOFTMOLN ceilingwall lamp WW24.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI Driver 10W.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI Driver 30W.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI Signal Repeater.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E12 WS opal 400lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E14 CWS globe 806lm.json.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E14 W opch 400lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E14 WS 470lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E14 WS globe 470lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E14 WS opal 400lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E14 WS opal 600lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E26 WS clear 950lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E26 WS opal 980lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 CWS 806lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 CWS opal 600lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 W opal 1000lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 W opal 470lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WS clear 806lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WS clear 950lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WS globe 1055lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WS opal 1000lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WS opal 950lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WS opal 980lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WW 806lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WW G95 CL 470lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 WW clear 250lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 opal 1000lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb E27 opal 470lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb GU10 W 400lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb GU10 WS 345lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb GU10 WS 400lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb GU10 WW 345lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI bulb GU10 WW 400lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI control outlet.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI motion sensor.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI remote control.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRI transformer 10W.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRIbulbE14WScandleopal470lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRIbulbE14WSglobeopal470lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRIbulbE14WWclear250lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRIbulbE27WSglobeopal1055lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRIbulbE27WWG95CL470lm_IKEAofSweden.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRIbulbE27WWclear250lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRIbulbGU10WS345lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/TRADFRIbulbT120E27WSopal470lm.json +0 -0
- /z4d_certified_devices/Certified/{IKEA_TRADFRI → Ikea}/VINDSTYRKA.json +0 -0
- /z4d_certified_devices/Certified/{INNR → Innr}/OSL 130 C.json +0 -0
- /z4d_certified_devices/Certified/{INNR → Innr}/PL 110.json +0 -0
- /z4d_certified_devices/Certified/{INNR → Innr}/PL 115.json +0 -0
- /z4d_certified_devices/Certified/{INNR → Innr}/RB 248 T.json +0 -0
- /z4d_certified_devices/Certified/{INNR → Innr}/RB 285 C.json +0 -0
- /z4d_certified_devices/Certified/{INNR → Innr}/SP 220.json +0 -0
- {z4d_certified_devices-5.410.dist-info → z4d_certified_devices-7.488.dist-info}/licenses/LICENSE.txt +0 -0
- {z4d_certified_devices-5.410.dist-info → z4d_certified_devices-7.488.dist-info}/top_level.txt +0 -0
- {z4d_certified_devices-5.410.dist-info → z4d_certified_devices-7.488.dist-info}/zip-safe +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_blakadder": "",
|
|
3
|
+
"_comment": "Zigbee 1 channel Dimmer",
|
|
4
|
+
"_version": "1.0",
|
|
5
|
+
"Identifier": [
|
|
6
|
+
[ "TS0601" ,"_TZE204_5cuocqty" ],
|
|
7
|
+
[ "TS0601" ,"_TZE204_nqqylykc" ],
|
|
8
|
+
[ "TS0601" ,"_TZE204_tgdnh7pw" ],
|
|
9
|
+
[ "TS0601" ,"_TZE204_2cyb66xl" ]
|
|
10
|
+
],
|
|
11
|
+
"Ep": {
|
|
12
|
+
"01": {
|
|
13
|
+
"0000": "",
|
|
14
|
+
"0004": "",
|
|
15
|
+
"0005": "",
|
|
16
|
+
"ef00": "",
|
|
17
|
+
"000a": "",
|
|
18
|
+
"0019": "",
|
|
19
|
+
"Type": "LvlControl"
|
|
20
|
+
},
|
|
21
|
+
"f2": {
|
|
22
|
+
"0021": "",
|
|
23
|
+
"Type": ""
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"Type": "",
|
|
27
|
+
"ClusterToBind": [ "0000", "ef00" ],
|
|
28
|
+
"ConfigureReporting": {},
|
|
29
|
+
"ReadAttributes": {
|
|
30
|
+
"0000": [ "0004", "0000", "0001", "0005", "0007" ],
|
|
31
|
+
"0019": [ ]
|
|
32
|
+
},
|
|
33
|
+
"TUYA_REGISTRATION": 19,
|
|
34
|
+
"TS0601_DP": {
|
|
35
|
+
"01": { "sensor_type": "switch", "action_type": "switch" },
|
|
36
|
+
"02": { "sensor_type": "dimmer", "action_type": "dimmer" },
|
|
37
|
+
"04": { "store_tuya_attribute": "SwitchType", "action_type": "SwitchType" },
|
|
38
|
+
"03": { "store_tuya_attribute": "MinBrightness", "action_type": "MinBrightness" },
|
|
39
|
+
"05": { "store_tuya_attribute": "MaxBrightness", "action_type": "MaxBrightness" },
|
|
40
|
+
"06": { "store_tuya_attribute": "countdown" },
|
|
41
|
+
"0e": { "store_tuya_attribute": "PowerOnAfterOffOn", "action_type": "PowerOnAfterOffOn" }
|
|
42
|
+
},
|
|
43
|
+
"Param": {
|
|
44
|
+
"SwitchType": 0,
|
|
45
|
+
"MinBrightness": 20,
|
|
46
|
+
"MaxBrightness": 100
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Tuya Soil sensor",
|
|
3
|
+
"_blakadder": "",
|
|
4
|
+
"Identifier": [
|
|
5
|
+
[ "TS0601", "_TZE284_aao3yzhs"],
|
|
6
|
+
[ "TS0601", "_TZE284_nhgdf6qr"],
|
|
7
|
+
[ "TS0601", "_TZE284_ap9owrsa"]
|
|
8
|
+
],
|
|
9
|
+
|
|
10
|
+
"Ep": {
|
|
11
|
+
"01": {
|
|
12
|
+
"0000": "",
|
|
13
|
+
"0004": "",
|
|
14
|
+
"0005": "",
|
|
15
|
+
"0019": "",
|
|
16
|
+
"Type": "Temp/Humi"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"Type": "",
|
|
20
|
+
"ClusterToBind": [ "0000"],
|
|
21
|
+
"ConfigureReporting": {
|
|
22
|
+
},
|
|
23
|
+
"ReadAttributes": {
|
|
24
|
+
"0000": [ "0004", "0005", "0000", "0001", "0007", "ffe2", "ffe4", "ffdf", "fffe" ],
|
|
25
|
+
"0019": [],
|
|
26
|
+
"ef00": []
|
|
27
|
+
},
|
|
28
|
+
"TS0601_DP": {
|
|
29
|
+
"03": { "store_tuya_attribute": "soil_moisture", "sensor_type": "humidity"},
|
|
30
|
+
"05": { "sensor_type": "temperature", "EvalExp": "(value/10)", "domo_round": 2},
|
|
31
|
+
"09": { "store_tuya_attribute": "temp_unit"},
|
|
32
|
+
"0e": { "store_tuya_attribute": "battery_state"},
|
|
33
|
+
"0f": { "sensor_type": "battery"}
|
|
34
|
+
},
|
|
35
|
+
"BatteryDevice": 1,
|
|
36
|
+
"Param": {
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"0500": "",
|
|
13
13
|
"000a": "",
|
|
14
14
|
"0019": "",
|
|
15
|
-
"Type": "
|
|
15
|
+
"Type": "Vibration/Tilt/Orientation"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"Type": "",
|
|
@@ -26,15 +26,18 @@
|
|
|
26
26
|
"ef00": []
|
|
27
27
|
},
|
|
28
28
|
"TS0601_DP": {
|
|
29
|
-
"01": { "sensor_type": "
|
|
30
|
-
"07": { "sensor_type": "
|
|
31
|
-
"65": { "store_tuya_attribute": "coord_x"},
|
|
32
|
-
"66": { "store_tuya_attribute": "coord_y"},
|
|
33
|
-
"67": { "store_tuya_attribute": "coord_z"},
|
|
29
|
+
"01": { "sensor_type": "vibration" },
|
|
30
|
+
"07": { "sensor_type": "tilt"},
|
|
31
|
+
"65": { "store_tuya_attribute": "coord_x", "sensor_type": "vibration_tilt_x"},
|
|
32
|
+
"66": { "store_tuya_attribute": "coord_y", "sensor_type": "vibration_tilt_y"},
|
|
33
|
+
"67": { "store_tuya_attribute": "coord_z", "sensor_type": "vibration_tilt_z" },
|
|
34
34
|
"68": { "store_tuya_attribute": "VibrationSensitivity", "action_type": "VibrationSensitivity"},
|
|
35
|
-
"69": { "
|
|
35
|
+
"69": { "sensor_type": "battery"}
|
|
36
36
|
},
|
|
37
|
+
"DisableTamper": true,
|
|
38
|
+
"BatteryDevice": 1,
|
|
39
|
+
"BatteryPercentageConverter": 2,
|
|
37
40
|
"Param": {
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
"VibrationSensitivity": 2
|
|
42
|
+
}
|
|
40
43
|
}
|
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
["TS130F", "_TZ3210_ol1uhvza"],
|
|
10
10
|
["TS130F", "_TZ3000_qqdbccb3"],
|
|
11
11
|
["TS130F", "_TZ3000_dbpmpco1"],
|
|
12
|
-
["TS130F", "
|
|
12
|
+
["TS130F", "_TZ3000_rnaovf1x"],
|
|
13
|
+
["TS130F", "_TZ3000_cet6ch1r"],
|
|
14
|
+
["TS130F", "_TZ3000_26gjlugm"]
|
|
13
15
|
],
|
|
14
16
|
|
|
15
17
|
"Ep": {
|
|
@@ -23,7 +25,7 @@
|
|
|
23
25
|
"8000": { "Enabled": true, "Name": "Tuya_0102_8000", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
24
26
|
"f000": { "Enabled": true, "Name": "Tuya_0102_f000", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
25
27
|
"f001": { "Enabled": true, "Name": "Tuya_0102_f001", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
26
|
-
"f002": { "Enabled": true, "Name": "Tuya_0102_f002", "DataType": "
|
|
28
|
+
"f002": { "Enabled": true, "Name": "Tuya_0102_f002", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
27
29
|
"f003": { "Enabled": true, "Name": "Tuya_0102_f002", "DataType": "21" , "ActionList": [ "check_store_value"]}
|
|
28
30
|
}
|
|
29
31
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_comment": "
|
|
3
|
-
"
|
|
2
|
+
"_comment": "LoraTap QCSMART Curtain Switch - SC500ZB-V4",
|
|
3
|
+
"_source": "https://github.com/zigbeefordomoticz/z4d-certified-devices/issues/99#issuecomment-2799022644",
|
|
4
4
|
"_version": "1.0",
|
|
5
5
|
"Ep": {
|
|
6
6
|
"01": {
|
|
@@ -11,12 +11,28 @@
|
|
|
11
11
|
"000a": "",
|
|
12
12
|
"0102": {
|
|
13
13
|
"Attributes": {
|
|
14
|
-
"
|
|
15
|
-
"
|
|
14
|
+
"8000": { "Enabled": true, "Name": "MotorMode", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
15
|
+
"f000": { "Enabled": true, "Name": "MovingState", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
16
|
+
"f001": { "Enabled": true, "Name": "CalibrationMode", "DataType": "30" , "UpdDomoDeviceWithAttribute": "f001", "ActionList": [ "check_store_value", "upd_domo_device"]},
|
|
17
|
+
"f002": { "Enabled": true, "Name": "MotorReversal", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
18
|
+
"f003": { "Enabled": true, "Name": "Calibration", "DataType": "21" , "ActionList": [ "check_store_value"]}
|
|
16
19
|
}
|
|
17
20
|
},
|
|
18
21
|
"0019": "",
|
|
19
|
-
"Type": "Curtain"
|
|
22
|
+
"Type": "Curtain/ShutterCalibration"
|
|
23
|
+
},
|
|
24
|
+
"02": {
|
|
25
|
+
"0102": {
|
|
26
|
+
"Attributes": {
|
|
27
|
+
"8000": { "Enabled": true, "Name": "MotorMode", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
28
|
+
"f000": { "Enabled": true, "Name": "MovingState", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
29
|
+
"f001": { "Enabled": true, "Name": "CalibrationMode", "DataType": "30" , "UpdDomoDeviceWithAttribute": "f001", "ActionList": [ "check_store_value", "upd_domo_device"]},
|
|
30
|
+
"f002": { "Enabled": true, "Name": "MotorReversal", "DataType": "30" , "ActionList": [ "check_store_value"]},
|
|
31
|
+
"f003": { "Enabled": true, "Name": "Calibration", "DataType": "21" , "ActionList": [ "check_store_value"]}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"e001": "",
|
|
35
|
+
"Type": "ShutterCalibration"
|
|
20
36
|
},
|
|
21
37
|
"f2": {
|
|
22
38
|
"0021": "",
|
|
@@ -31,8 +47,9 @@
|
|
|
31
47
|
"0006": [ "8001", "5000" ]
|
|
32
48
|
},
|
|
33
49
|
"Param": {
|
|
34
|
-
"
|
|
50
|
+
"TuyaMotorMode": 0,
|
|
35
51
|
"TuyaMotoReversal": 0,
|
|
36
|
-
"
|
|
52
|
+
"TuyaCalibrationTime_Ep_01": 0,
|
|
53
|
+
"TuyaCalibrationTime_Ep_02": 0
|
|
37
54
|
}
|
|
38
55
|
}
|
|
@@ -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.")
|
|
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}"
|