zigbee-herdsman-converters 25.17.1 → 25.19.0
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.
- package/CHANGELOG.md +36 -0
- package/dist/devices/bosch.d.ts.map +1 -1
- package/dist/devices/bosch.js +112 -313
- package/dist/devices/bosch.js.map +1 -1
- package/dist/devices/innr.d.ts.map +1 -1
- package/dist/devices/innr.js +15 -1
- package/dist/devices/innr.js.map +1 -1
- package/dist/devices/philips.d.ts.map +1 -1
- package/dist/devices/philips.js +7 -0
- package/dist/devices/philips.js.map +1 -1
- package/dist/devices/tuya.d.ts.map +1 -1
- package/dist/devices/tuya.js +117 -16
- package/dist/devices/tuya.js.map +1 -1
- package/dist/devices/zemismart.js +6 -6
- package/dist/devices/zemismart.js.map +1 -1
- package/dist/lib/bosch.d.ts +85 -0
- package/dist/lib/bosch.d.ts.map +1 -0
- package/dist/lib/bosch.js +981 -0
- package/dist/lib/bosch.js.map +1 -0
- package/dist/lib/tuya.d.ts +1 -2
- package/dist/lib/tuya.d.ts.map +1 -1
- package/dist/lib/tuya.js +2 -2
- package/dist/lib/tuya.js.map +1 -1
- package/dist/models-index.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [25.19.0](https://github.com/Koenkk/zigbee-herdsman-converters/compare/v25.18.0...v25.19.0) (2025-09-07)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* Bosch `BMCT-RZ` / `BMCT-DZ`: rework both devices to expose all official features ([#9941](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9941)) ([a0c3b04](https://github.com/Koenkk/zigbee-herdsman-converters/commit/a0c3b04ddbe6c3624802ad6781547808bfce58b2))
|
|
9
|
+
* Bosch BWA-1, BSIR-EZ and RFPR-ZB-SH-EU: support OTA updates ([#9943](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9943)) ([6de8eaa](https://github.com/Koenkk/zigbee-herdsman-converters/commit/6de8eaabbda16328bfb67e6cc7d52c25f875ed45))
|
|
10
|
+
* Tuya MG-ZG01W: support more features ([#9938](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9938)) ([193904b](https://github.com/Koenkk/zigbee-herdsman-converters/commit/193904b9ecf417fdc46851fdc6ae047197d30df2))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **detect:** Detect `_TZ3000_7kscdesh` as Tuya TS0222 ([#9942](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9942)) ([efcbd78](https://github.com/Koenkk/zigbee-herdsman-converters/commit/efcbd78b4e3d37f7c4491ad6428486c211bfa459))
|
|
16
|
+
* **detect:** Detect `_TZ3000_afgzktgb` as Tuya TS0001_switch_module ([#9937](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9937)) ([45efc1e](https://github.com/Koenkk/zigbee-herdsman-converters/commit/45efc1e39a18d0cede356438f0c08e2a6d9e34fa))
|
|
17
|
+
* **detect:** Detect `_TZ3290_nba3knpsarkawgnt` as Tuya ZS06 ([#9947](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9947)) ([89d785c](https://github.com/Koenkk/zigbee-herdsman-converters/commit/89d785c189954e1bf2e7fd66241f18313758185d))
|
|
18
|
+
* **detect:** Detect `_TZE284_9xstqowh` as Tongou TOQCB2-80 ([#9940](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9940)) ([6d9b094](https://github.com/Koenkk/zigbee-herdsman-converters/commit/6d9b09428df24c508f0fe092a9eaf54bbf0e6eaf))
|
|
19
|
+
* **detect:** Detect `_TZE284_l8xiyymq` as ZSVIOT PN6 ([#9944](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9944)) ([2cde356](https://github.com/Koenkk/zigbee-herdsman-converters/commit/2cde3563eca0bce45a6eb15bb4ae9f41511c402f))
|
|
20
|
+
|
|
21
|
+
## [25.18.0](https://github.com/Koenkk/zigbee-herdsman-converters/compare/v25.17.1...v25.18.0) (2025-09-06)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* **add:** 929003808401 ([#9929](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9929)) ([69e744a](https://github.com/Koenkk/zigbee-herdsman-converters/commit/69e744a320fbd0dcabf43e6bc78abc4c2fb1d9e1))
|
|
27
|
+
* **add:** RCL 232 C ([#9931](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9931)) ([14a6d4e](https://github.com/Koenkk/zigbee-herdsman-converters/commit/14a6d4ebf76839eeb05398c9808a5cec40008799))
|
|
28
|
+
* **add:** TS020C ([#9934](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9934)) ([460fbf3](https://github.com/Koenkk/zigbee-herdsman-converters/commit/460fbf3920eb1f436ee7282def8f0a29572a9f71))
|
|
29
|
+
* **add:** ZB414 ([#9930](https://github.com/Koenkk/zigbee-herdsman-converters/issues/9930)) ([6f5eb36](https://github.com/Koenkk/zigbee-herdsman-converters/commit/6f5eb367da523bff11e9e85f8595dc582f2e880c))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Bug Fixes
|
|
33
|
+
|
|
34
|
+
* **detect:** Detect `_TZ3290_nba3knpsarkawgnt` as Moes UFO-R11 https://github.com/Koenkk/zigbee-herdsman-converters/issues/9933 ([88b7b7e](https://github.com/Koenkk/zigbee-herdsman-converters/commit/88b7b7ec6cc11e37626481e7f940093495d62a51))
|
|
35
|
+
* **detect:** Detect `_TZE284_e4pf6l87` as Zemismart ZMS-206EU-3 https://github.com/Koenkk/zigbee2mqtt/issues/27305 ([00b6d91](https://github.com/Koenkk/zigbee-herdsman-converters/commit/00b6d91a67e8d577ef3316131d9e0a942d89edd7))
|
|
36
|
+
* Innr OFL 142 C: disable unsupported power on behaviour https://github.com/Koenkk/zigbee2mqtt/issues/27922 ([3dda420](https://github.com/Koenkk/zigbee-herdsman-converters/commit/3dda420cfa2831268c37cda863da9618c0bb3db2))
|
|
37
|
+
* Tuya: fix `mcuSyncTime` error for various devices https://github.com/Koenkk/zigbee2mqtt/issues/28486 ([5bbbb23](https://github.com/Koenkk/zigbee-herdsman-converters/commit/5bbbb234e224bc991409d1542d65ea45987db738))
|
|
38
|
+
|
|
3
39
|
## [25.17.1](https://github.com/Koenkk/zigbee-herdsman-converters/compare/v25.17.0...v25.17.1) (2025-09-05)
|
|
4
40
|
|
|
5
41
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bosch.d.ts","sourceRoot":"","sources":["../../src/devices/bosch.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"bosch.d.ts","sourceRoot":"","sources":["../../src/devices/bosch.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,oBAAoB,EAAyC,MAAM,cAAc,CAAC;AAwoC/F,eAAO,MAAM,WAAW,EAAE,oBAAoB,EAkvC7C,CAAC"}
|
package/dist/devices/bosch.js
CHANGED
|
@@ -37,6 +37,7 @@ exports.definitions = void 0;
|
|
|
37
37
|
const zigbee_herdsman_1 = require("zigbee-herdsman");
|
|
38
38
|
const fz = __importStar(require("../converters/fromZigbee"));
|
|
39
39
|
const tz = __importStar(require("../converters/toZigbee"));
|
|
40
|
+
const bosch_1 = require("../lib/bosch");
|
|
40
41
|
const constants = __importStar(require("../lib/constants"));
|
|
41
42
|
const constants_1 = require("../lib/constants");
|
|
42
43
|
const exposes = __importStar(require("../lib/exposes"));
|
|
@@ -101,6 +102,33 @@ const labelConfirmation = `Specifies LED color (rgb) and pattern of the confirma
|
|
|
101
102
|
4-7: Durations for sequence fade-in -> on -> fade-out -> off (e.g. 01020102)
|
|
102
103
|
8: Number of Repetitions (01=1 to ff=255)
|
|
103
104
|
Example: 30ff00000102010001`;
|
|
105
|
+
const boschBmctRzSettings = {
|
|
106
|
+
deviceModes: {
|
|
107
|
+
switch: 0x00,
|
|
108
|
+
pulsed: 0x01,
|
|
109
|
+
},
|
|
110
|
+
switchTypes: {
|
|
111
|
+
button: 0x05,
|
|
112
|
+
rocker_switch: 0x07,
|
|
113
|
+
none: 0x00,
|
|
114
|
+
},
|
|
115
|
+
switchModes: {
|
|
116
|
+
coupled: 0x00,
|
|
117
|
+
decoupled: 0x01,
|
|
118
|
+
},
|
|
119
|
+
hasDualSwitchInputs: false,
|
|
120
|
+
};
|
|
121
|
+
const boschBmctDzSettings = {
|
|
122
|
+
switchTypes: {
|
|
123
|
+
button: 0x05,
|
|
124
|
+
none: 0x00,
|
|
125
|
+
},
|
|
126
|
+
switchModes: {
|
|
127
|
+
coupled: 0x00,
|
|
128
|
+
decoupled: 0x01,
|
|
129
|
+
},
|
|
130
|
+
hasDualSwitchInputs: false,
|
|
131
|
+
};
|
|
104
132
|
const boschExtend = {
|
|
105
133
|
hvacThermostatCluster: () => m.deviceAddCustomCluster("hvacThermostat", {
|
|
106
134
|
ID: zigbee_herdsman_1.Zcl.Clusters.hvacThermostat.ID,
|
|
@@ -815,287 +843,6 @@ const boschExtend = {
|
|
|
815
843
|
isModernExtend: true,
|
|
816
844
|
};
|
|
817
845
|
},
|
|
818
|
-
bmct: () => {
|
|
819
|
-
const stateDeviceMode = {
|
|
820
|
-
light: 0x04,
|
|
821
|
-
shutter: 0x01,
|
|
822
|
-
disabled: 0x00,
|
|
823
|
-
};
|
|
824
|
-
const stateMotor = {
|
|
825
|
-
stopped: 0x00,
|
|
826
|
-
opening: 0x01,
|
|
827
|
-
closing: 0x02,
|
|
828
|
-
unknownOne: 0x03,
|
|
829
|
-
unknownTwo: 0x04,
|
|
830
|
-
};
|
|
831
|
-
const stateSwitchType = {
|
|
832
|
-
button: 0x01,
|
|
833
|
-
button_key_change: 0x02,
|
|
834
|
-
rocker_switch: 0x03,
|
|
835
|
-
rocker_switch_key_change: 0x04,
|
|
836
|
-
none: 0x00,
|
|
837
|
-
};
|
|
838
|
-
const stateSwitchMode = {
|
|
839
|
-
coupled: 0x00,
|
|
840
|
-
decoupled: 0x01,
|
|
841
|
-
only_short_press_decoupled: 0x02,
|
|
842
|
-
only_long_press_decoupled: 0x03,
|
|
843
|
-
};
|
|
844
|
-
const stateOffOn = {
|
|
845
|
-
OFF: 0x00,
|
|
846
|
-
ON: 0x01,
|
|
847
|
-
};
|
|
848
|
-
const fromZigbee = [
|
|
849
|
-
fz.on_off_force_multiendpoint,
|
|
850
|
-
fz.power_on_behavior,
|
|
851
|
-
fz.cover_position_tilt,
|
|
852
|
-
{
|
|
853
|
-
cluster: "boschSpecific",
|
|
854
|
-
type: ["raw"],
|
|
855
|
-
convert: (model, msg, publish, options, meta) => {
|
|
856
|
-
const command = msg.data[4];
|
|
857
|
-
if (command !== 0x03 && command !== 0x04) {
|
|
858
|
-
return;
|
|
859
|
-
}
|
|
860
|
-
let state;
|
|
861
|
-
const status = msg.data[5];
|
|
862
|
-
const duration = msg.data[6] / 10;
|
|
863
|
-
switch (status) {
|
|
864
|
-
case 0:
|
|
865
|
-
state = "press_released";
|
|
866
|
-
break;
|
|
867
|
-
case 1:
|
|
868
|
-
state = duration !== 0 ? "hold" : "hold_released";
|
|
869
|
-
break;
|
|
870
|
-
case 2:
|
|
871
|
-
state = "closed";
|
|
872
|
-
break;
|
|
873
|
-
case 3:
|
|
874
|
-
state = "opened";
|
|
875
|
-
break;
|
|
876
|
-
}
|
|
877
|
-
const triggeredSide = command === 0x03 ? "left" : "right";
|
|
878
|
-
return { action: `${state}_${triggeredSide}`, action_duration: duration };
|
|
879
|
-
},
|
|
880
|
-
},
|
|
881
|
-
{
|
|
882
|
-
cluster: "boschSpecific",
|
|
883
|
-
type: ["attributeReport", "readResponse"],
|
|
884
|
-
convert: (model, msg, publish, options, meta) => {
|
|
885
|
-
const result = {};
|
|
886
|
-
const data = msg.data;
|
|
887
|
-
if (data.deviceMode !== undefined) {
|
|
888
|
-
result.device_mode = Object.keys(stateDeviceMode).find((key) => stateDeviceMode[key] === msg.data.deviceMode);
|
|
889
|
-
const deviceMode = msg.data.deviceMode;
|
|
890
|
-
if (deviceMode !== meta.device.meta.deviceMode) {
|
|
891
|
-
meta.device.meta.deviceMode = deviceMode;
|
|
892
|
-
meta.deviceExposesChanged();
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
if (data.switchType !== undefined) {
|
|
896
|
-
const switchType = msg.data.switchType;
|
|
897
|
-
result.switch_type = Object.keys(stateSwitchType).find((key) => stateSwitchType[key] === switchType);
|
|
898
|
-
if (switchType !== meta.device.meta.switchType) {
|
|
899
|
-
meta.device.meta.switchType = switchType;
|
|
900
|
-
meta.deviceExposesChanged();
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
if (data.switchMode !== undefined) {
|
|
904
|
-
const property = utils.postfixWithEndpointName("switch_mode", msg, model, meta);
|
|
905
|
-
result[property] = Object.keys(stateSwitchMode).find((key) => stateSwitchMode[key] === msg.data.switchMode);
|
|
906
|
-
}
|
|
907
|
-
if (data.calibrationOpeningTime !== undefined) {
|
|
908
|
-
result.calibration_opening_time = msg.data.calibrationOpeningTime / 10;
|
|
909
|
-
}
|
|
910
|
-
if (data.calibrationClosingTime !== undefined) {
|
|
911
|
-
result.calibration_closing_time = msg.data.calibrationClosingTime / 10;
|
|
912
|
-
}
|
|
913
|
-
if (data.calibrationButtonHoldTime !== undefined) {
|
|
914
|
-
result.calibration_button_hold_time = msg.data.calibrationButtonHoldTime / 10;
|
|
915
|
-
}
|
|
916
|
-
if (data.calibrationMotorStartDelay !== undefined) {
|
|
917
|
-
result.calibration_motor_start_delay = msg.data.calibrationMotorStartDelay / 10;
|
|
918
|
-
}
|
|
919
|
-
if (data.childLock !== undefined) {
|
|
920
|
-
const property = utils.postfixWithEndpointName("child_lock", msg, model, meta);
|
|
921
|
-
result[property] = msg.data.childLock === 1 ? "ON" : "OFF";
|
|
922
|
-
}
|
|
923
|
-
if (data.motorState !== undefined) {
|
|
924
|
-
result.motor_state = Object.keys(stateMotor).find((key) => stateMotor[key] === msg.data.motorState);
|
|
925
|
-
}
|
|
926
|
-
if (data.autoOffEnabled !== undefined) {
|
|
927
|
-
const property = utils.postfixWithEndpointName("auto_off_enabled", msg, model, meta);
|
|
928
|
-
result[property] = msg.data.autoOffEnabled === 1 ? "ON" : "OFF";
|
|
929
|
-
}
|
|
930
|
-
if (data.autoOffTime !== undefined) {
|
|
931
|
-
const property = utils.postfixWithEndpointName("auto_off_time", msg, model, meta);
|
|
932
|
-
result[property] = msg.data.autoOffTime / 60;
|
|
933
|
-
}
|
|
934
|
-
return result;
|
|
935
|
-
},
|
|
936
|
-
},
|
|
937
|
-
];
|
|
938
|
-
const toZigbee = [
|
|
939
|
-
tz.power_on_behavior,
|
|
940
|
-
tz.cover_position_tilt,
|
|
941
|
-
{
|
|
942
|
-
key: [
|
|
943
|
-
"device_mode",
|
|
944
|
-
"switch_type",
|
|
945
|
-
"switch_mode",
|
|
946
|
-
"child_lock",
|
|
947
|
-
"state",
|
|
948
|
-
"on_time",
|
|
949
|
-
"off_wait_time",
|
|
950
|
-
"auto_off_enabled",
|
|
951
|
-
"auto_off_time",
|
|
952
|
-
],
|
|
953
|
-
convertSet: async (entity, key, value, meta) => {
|
|
954
|
-
if (key === "state") {
|
|
955
|
-
if ("ID" in entity && entity.ID === 1) {
|
|
956
|
-
await tz.cover_state.convertSet(entity, key, value, meta);
|
|
957
|
-
}
|
|
958
|
-
else {
|
|
959
|
-
await tz.on_off.convertSet(entity, key, value, meta);
|
|
960
|
-
}
|
|
961
|
-
}
|
|
962
|
-
if (key === "on_time" || key === "on_wait_time") {
|
|
963
|
-
if ("ID" in entity && entity.ID !== 1) {
|
|
964
|
-
await tz.on_off.convertSet(entity, key, value, meta);
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
if (key === "device_mode") {
|
|
968
|
-
const index = utils.getFromLookup(value, stateDeviceMode);
|
|
969
|
-
await entity.write("boschSpecific", { deviceMode: index });
|
|
970
|
-
await entity.read("boschSpecific", ["deviceMode"]);
|
|
971
|
-
return { state: { device_mode: value } };
|
|
972
|
-
}
|
|
973
|
-
if (key === "switch_type") {
|
|
974
|
-
const applyDefaultForSwitchModeAndChildLock = async (endpoint) => {
|
|
975
|
-
const switchModeDefault = utils.getFromLookup("coupled", stateSwitchMode);
|
|
976
|
-
const childLockDefault = utils.getFromLookup("OFF", stateOffOn);
|
|
977
|
-
await endpoint.write("boschSpecific", {
|
|
978
|
-
switchMode: switchModeDefault,
|
|
979
|
-
childLock: childLockDefault,
|
|
980
|
-
});
|
|
981
|
-
await endpoint.read("boschSpecific", ["switchMode", "childLock"]);
|
|
982
|
-
};
|
|
983
|
-
const switchType = utils.getFromLookup(value, stateSwitchType);
|
|
984
|
-
await entity.write("boschSpecific", { switchType: switchType });
|
|
985
|
-
await entity.read("boschSpecific", ["switchType"]);
|
|
986
|
-
await applyDefaultForSwitchModeAndChildLock(entity);
|
|
987
|
-
const leftEndpoint = meta.device.getEndpoint(2);
|
|
988
|
-
await applyDefaultForSwitchModeAndChildLock(leftEndpoint);
|
|
989
|
-
const rightEndpoint = meta.device.getEndpoint(3);
|
|
990
|
-
await applyDefaultForSwitchModeAndChildLock(rightEndpoint);
|
|
991
|
-
return { state: { switch_type: value } };
|
|
992
|
-
}
|
|
993
|
-
if (key === "switch_mode") {
|
|
994
|
-
const index = utils.getFromLookup(value, stateSwitchMode);
|
|
995
|
-
await entity.write("boschSpecific", { switchMode: index });
|
|
996
|
-
return { state: { switch_mode: value } };
|
|
997
|
-
}
|
|
998
|
-
if (key === "child_lock") {
|
|
999
|
-
const index = utils.getFromLookup(value, stateOffOn);
|
|
1000
|
-
await entity.write("boschSpecific", { childLock: index });
|
|
1001
|
-
return { state: { child_lock: value } };
|
|
1002
|
-
}
|
|
1003
|
-
if (key === "auto_off_enabled") {
|
|
1004
|
-
const index = utils.getFromLookup(value, stateOffOn);
|
|
1005
|
-
await entity.write("boschSpecific", { autoOffEnabled: index });
|
|
1006
|
-
return { state: { auto_off_enabled: value } };
|
|
1007
|
-
}
|
|
1008
|
-
if (key === "auto_off_time" && typeof value === "number") {
|
|
1009
|
-
await entity.write("boschSpecific", { autoOffTime: value * 60 });
|
|
1010
|
-
return { state: { auto_off_time: value } };
|
|
1011
|
-
}
|
|
1012
|
-
},
|
|
1013
|
-
convertGet: async (entity, key, meta) => {
|
|
1014
|
-
switch (key) {
|
|
1015
|
-
case "state":
|
|
1016
|
-
case "on_time":
|
|
1017
|
-
case "off_wait_time":
|
|
1018
|
-
if ("ID" in entity && entity.ID !== 1) {
|
|
1019
|
-
await entity.read("genOnOff", ["onOff"]);
|
|
1020
|
-
}
|
|
1021
|
-
break;
|
|
1022
|
-
case "device_mode":
|
|
1023
|
-
await entity.read("boschSpecific", ["deviceMode"]);
|
|
1024
|
-
break;
|
|
1025
|
-
case "switch_type":
|
|
1026
|
-
await entity.read("boschSpecific", ["switchType"]);
|
|
1027
|
-
break;
|
|
1028
|
-
case "switch_mode":
|
|
1029
|
-
await entity.read("boschSpecific", ["switchMode"]);
|
|
1030
|
-
break;
|
|
1031
|
-
case "child_lock":
|
|
1032
|
-
await entity.read("boschSpecific", ["childLock"]);
|
|
1033
|
-
break;
|
|
1034
|
-
case "auto_off_enabled":
|
|
1035
|
-
await entity.read("boschSpecific", ["autoOffEnabled"]);
|
|
1036
|
-
break;
|
|
1037
|
-
case "auto_off_time":
|
|
1038
|
-
await entity.read("boschSpecific", ["autoOffTime"]);
|
|
1039
|
-
break;
|
|
1040
|
-
default:
|
|
1041
|
-
throw new Error(`Unhandled key boschExtend.bmct.toZigbee.convertGet ${key}`);
|
|
1042
|
-
}
|
|
1043
|
-
},
|
|
1044
|
-
},
|
|
1045
|
-
{
|
|
1046
|
-
key: ["calibration_closing_time", "calibration_opening_time", "calibration_button_hold_time", "calibration_motor_start_delay"],
|
|
1047
|
-
convertSet: async (entity, key, value, meta) => {
|
|
1048
|
-
if (key === "calibration_opening_time") {
|
|
1049
|
-
const number = utils.toNumber(value, "calibration_opening_time");
|
|
1050
|
-
const index = number * 10;
|
|
1051
|
-
await entity.write("boschSpecific", { calibrationOpeningTime: index });
|
|
1052
|
-
return { state: { calibration_opening_time: number } };
|
|
1053
|
-
}
|
|
1054
|
-
if (key === "calibration_closing_time") {
|
|
1055
|
-
const number = utils.toNumber(value, "calibration_closing_time");
|
|
1056
|
-
const index = number * 10;
|
|
1057
|
-
await entity.write("boschSpecific", { calibrationClosingTime: index });
|
|
1058
|
-
return { state: { calibration_closing_time: number } };
|
|
1059
|
-
}
|
|
1060
|
-
if (key === "calibration_button_hold_time") {
|
|
1061
|
-
const number = utils.toNumber(value, "calibration_button_hold_time");
|
|
1062
|
-
const index = number * 10;
|
|
1063
|
-
await entity.write("boschSpecific", { calibrationButtonHoldTime: index });
|
|
1064
|
-
return { state: { calibration_button_hold_time: number } };
|
|
1065
|
-
}
|
|
1066
|
-
if (key === "calibration_motor_start_delay") {
|
|
1067
|
-
const number = utils.toNumber(value, "calibration_motor_start_delay");
|
|
1068
|
-
const index = number * 10;
|
|
1069
|
-
await entity.write("boschSpecific", { calibrationMotorStartDelay: index });
|
|
1070
|
-
return { state: { calibration_motor_start_delay: number } };
|
|
1071
|
-
}
|
|
1072
|
-
},
|
|
1073
|
-
convertGet: async (entity, key, meta) => {
|
|
1074
|
-
switch (key) {
|
|
1075
|
-
case "calibration_opening_time":
|
|
1076
|
-
await entity.read("boschSpecific", ["calibrationOpeningTime"]);
|
|
1077
|
-
break;
|
|
1078
|
-
case "calibration_closing_time":
|
|
1079
|
-
await entity.read("boschSpecific", ["calibrationClosingTime"]);
|
|
1080
|
-
break;
|
|
1081
|
-
case "calibration_button_hold_time":
|
|
1082
|
-
await entity.read("boschSpecific", ["calibrationButtonHoldTime"]);
|
|
1083
|
-
break;
|
|
1084
|
-
case "calibration_motor_start_delay":
|
|
1085
|
-
await entity.read("boschSpecific", ["calibrationMotorStartDelay"]);
|
|
1086
|
-
break;
|
|
1087
|
-
default:
|
|
1088
|
-
throw new Error(`Unhandled key boschExtend.bmct.toZigbee.convertGet ${key}`);
|
|
1089
|
-
}
|
|
1090
|
-
},
|
|
1091
|
-
},
|
|
1092
|
-
];
|
|
1093
|
-
return {
|
|
1094
|
-
fromZigbee,
|
|
1095
|
-
toZigbee,
|
|
1096
|
-
isModernExtend: true,
|
|
1097
|
-
};
|
|
1098
|
-
},
|
|
1099
846
|
};
|
|
1100
847
|
const tzLocal = {
|
|
1101
848
|
rbshoszbeu: {
|
|
@@ -1353,6 +1100,7 @@ exports.definitions = [
|
|
|
1353
1100
|
}),
|
|
1354
1101
|
m.quirkCheckinInterval(0),
|
|
1355
1102
|
],
|
|
1103
|
+
ota: true,
|
|
1356
1104
|
},
|
|
1357
1105
|
{
|
|
1358
1106
|
zigbeeModel: ["RBSH-WS-ZB-EU"],
|
|
@@ -1401,6 +1149,7 @@ exports.definitions = [
|
|
|
1401
1149
|
await endpoint.read("ssIasZone", ["zoneStatus"]);
|
|
1402
1150
|
await endpoint.read("boschSpecific", ["alarmOnMotion"], manufacturerOptions);
|
|
1403
1151
|
},
|
|
1152
|
+
ota: true,
|
|
1404
1153
|
},
|
|
1405
1154
|
{
|
|
1406
1155
|
zigbeeModel: ["RBSH-SD-ZB-EU"],
|
|
@@ -1939,6 +1688,7 @@ exports.definitions = [
|
|
|
1939
1688
|
await endpoint.read("genPowerCfg", ["batteryPercentageRemaining"]);
|
|
1940
1689
|
await endpoint.read("ssIasZone", ["zoneStatus"]);
|
|
1941
1690
|
},
|
|
1691
|
+
ota: true,
|
|
1942
1692
|
},
|
|
1943
1693
|
{
|
|
1944
1694
|
zigbeeModel: ["RBSH-SWDV-ZB"],
|
|
@@ -1967,15 +1717,91 @@ exports.definitions = [
|
|
|
1967
1717
|
model: "BMCT-DZ",
|
|
1968
1718
|
vendor: "Bosch",
|
|
1969
1719
|
description: "Phase-cut dimmer",
|
|
1970
|
-
extend: [
|
|
1720
|
+
extend: [
|
|
1721
|
+
bosch_1.boschBmctExtend.handleZclVersionReadRequest(),
|
|
1722
|
+
m.deviceAddCustomCluster("boschSpecific", {
|
|
1723
|
+
ID: 0xfca0,
|
|
1724
|
+
manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.ROBERT_BOSCH_GMBH,
|
|
1725
|
+
attributes: {
|
|
1726
|
+
switchType: { ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.ENUM8 },
|
|
1727
|
+
childLock: { ID: 0x0008, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
|
|
1728
|
+
dimmerType: { ID: 0x0022, type: zigbee_herdsman_1.Zcl.DataType.ENUM8 },
|
|
1729
|
+
minimumBrightness: { ID: 0x0025, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
|
|
1730
|
+
maximumBrightness: { ID: 0x0026, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
|
|
1731
|
+
switchMode: { ID: 0x0031, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
|
|
1732
|
+
},
|
|
1733
|
+
commands: {},
|
|
1734
|
+
commandsResponse: {},
|
|
1735
|
+
}),
|
|
1736
|
+
m.light({
|
|
1737
|
+
configureReporting: true,
|
|
1738
|
+
levelConfig: { features: ["on_level", "current_level_startup"] },
|
|
1739
|
+
powerOnBehavior: true,
|
|
1740
|
+
effect: false,
|
|
1741
|
+
}),
|
|
1742
|
+
bosch_1.boschBmctExtend.switchType({
|
|
1743
|
+
switchTypeLookup: boschBmctDzSettings.switchTypes,
|
|
1744
|
+
}),
|
|
1745
|
+
bosch_1.boschBmctExtend.reportSwitchAction({
|
|
1746
|
+
switchTypeLookup: boschBmctDzSettings.switchTypes,
|
|
1747
|
+
hasDualSwitchInputs: boschBmctDzSettings.hasDualSwitchInputs,
|
|
1748
|
+
}),
|
|
1749
|
+
bosch_1.boschBmctExtend.switchMode({
|
|
1750
|
+
switchModeLookup: boschBmctDzSettings.switchModes,
|
|
1751
|
+
switchTypeLookup: boschBmctDzSettings.switchTypes,
|
|
1752
|
+
}),
|
|
1753
|
+
bosch_1.boschBmctExtend.childLock(),
|
|
1754
|
+
bosch_1.boschBmctExtend.brightnessRange(),
|
|
1755
|
+
bosch_1.boschBmctExtend.dimmerType(),
|
|
1756
|
+
],
|
|
1971
1757
|
ota: true,
|
|
1972
1758
|
},
|
|
1973
1759
|
{
|
|
1974
1760
|
zigbeeModel: ["RBSH-MMR-ZB-EU"],
|
|
1975
1761
|
model: "BMCT-RZ",
|
|
1976
1762
|
vendor: "Bosch",
|
|
1977
|
-
description: "Relay
|
|
1978
|
-
extend: [
|
|
1763
|
+
description: "Relay (potential free)",
|
|
1764
|
+
extend: [
|
|
1765
|
+
bosch_1.boschBmctExtend.handleZclVersionReadRequest(),
|
|
1766
|
+
m.deviceAddCustomCluster("boschSpecific", {
|
|
1767
|
+
ID: 0xfca0,
|
|
1768
|
+
manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.ROBERT_BOSCH_GMBH,
|
|
1769
|
+
attributes: {
|
|
1770
|
+
switchType: { ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.ENUM8 },
|
|
1771
|
+
autoOffEnabled: { ID: 0x0006, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
|
|
1772
|
+
autoOffTime: { ID: 0x0007, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
|
|
1773
|
+
childLock: { ID: 0x0008, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
|
|
1774
|
+
pulseLength: { ID: 0x0024, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
|
|
1775
|
+
switchMode: { ID: 0x0031, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
|
|
1776
|
+
actuatorType: { ID: 0x0034, type: zigbee_herdsman_1.Zcl.DataType.ENUM8 },
|
|
1777
|
+
},
|
|
1778
|
+
commands: {},
|
|
1779
|
+
commandsResponse: {},
|
|
1780
|
+
}),
|
|
1781
|
+
bosch_1.boschBmctExtend.rzDeviceModes({
|
|
1782
|
+
deviceModesLookup: boschBmctRzSettings.deviceModes,
|
|
1783
|
+
}),
|
|
1784
|
+
m.onOff({ powerOnBehavior: false }),
|
|
1785
|
+
bosch_1.boschBmctExtend.switchType({
|
|
1786
|
+
switchTypeLookup: boschBmctRzSettings.switchTypes,
|
|
1787
|
+
}),
|
|
1788
|
+
bosch_1.boschBmctExtend.reportSwitchAction({
|
|
1789
|
+
switchTypeLookup: boschBmctRzSettings.switchTypes,
|
|
1790
|
+
hasDualSwitchInputs: boschBmctRzSettings.hasDualSwitchInputs,
|
|
1791
|
+
}),
|
|
1792
|
+
bosch_1.boschBmctExtend.switchMode({
|
|
1793
|
+
switchModeLookup: boschBmctRzSettings.switchModes,
|
|
1794
|
+
switchTypeLookup: boschBmctRzSettings.switchTypes,
|
|
1795
|
+
}),
|
|
1796
|
+
bosch_1.boschBmctExtend.childLock(),
|
|
1797
|
+
bosch_1.boschBmctExtend.autoOff(),
|
|
1798
|
+
bosch_1.boschBmctExtend.pulseLength({
|
|
1799
|
+
updateDeviceMode: true,
|
|
1800
|
+
deviceModesLookup: boschBmctRzSettings.deviceModes,
|
|
1801
|
+
}),
|
|
1802
|
+
bosch_1.boschBmctExtend.actuatorType(),
|
|
1803
|
+
],
|
|
1804
|
+
ota: true,
|
|
1979
1805
|
},
|
|
1980
1806
|
{
|
|
1981
1807
|
zigbeeModel: ["RBSH-MMS-ZB-EU"],
|
|
@@ -2055,7 +1881,8 @@ exports.definitions = [
|
|
|
2055
1881
|
},
|
|
2056
1882
|
commandsResponse: {},
|
|
2057
1883
|
}),
|
|
2058
|
-
|
|
1884
|
+
bosch_1.boschBmctExtend.handleZclVersionReadRequest(),
|
|
1885
|
+
bosch_1.boschBmctExtend.slzExtends(),
|
|
2059
1886
|
boschExtend.seMeteringCluster(),
|
|
2060
1887
|
boschExtend.resetEnergyReading(),
|
|
2061
1888
|
],
|
|
@@ -2250,34 +2077,6 @@ exports.definitions = [
|
|
|
2250
2077
|
}
|
|
2251
2078
|
return [e.enum("device_mode", ea.ALL, Object.keys(stateDeviceMode)).withDescription("Device mode")];
|
|
2252
2079
|
},
|
|
2253
|
-
onEvent: (event) => {
|
|
2254
|
-
if (event.type !== "deviceInterview") {
|
|
2255
|
-
return;
|
|
2256
|
-
}
|
|
2257
|
-
// During interview, the Bosch BMCT-SLZ is requesting
|
|
2258
|
-
// the zclVersion attribute from the coordinator. As
|
|
2259
|
-
// Z2M doesn't know the zclVersion of the device yet,
|
|
2260
|
-
// the request is left unanswered. This makes the device
|
|
2261
|
-
// believe it dropped out of network every 10 minutes which
|
|
2262
|
-
// not only generates unnecessary network congestion, but
|
|
2263
|
-
// makes the LED on the device blink during that sequence
|
|
2264
|
-
// as well. To prevent that, we have to manually answer
|
|
2265
|
-
// the zclVersion request at the earliest possible stage
|
|
2266
|
-
// and mimic the answer from the Bosch SHC II.
|
|
2267
|
-
event.data.device.customReadResponse = (frame, endpoint) => {
|
|
2268
|
-
const isZclVersionRequest = frame.isCluster("genBasic") && frame.payload.find((i) => i.attrId === 0);
|
|
2269
|
-
if (!isZclVersionRequest) {
|
|
2270
|
-
return false;
|
|
2271
|
-
}
|
|
2272
|
-
const payload = {
|
|
2273
|
-
zclVersion: 1,
|
|
2274
|
-
};
|
|
2275
|
-
endpoint.readResponse(frame.cluster.name, frame.header.transactionSequenceNumber, payload).catch((e) => {
|
|
2276
|
-
logger_1.logger.warning(`Custom zclVersion response failed for '${event.data.device.ieeeAddr}': ${e}`, NS);
|
|
2277
|
-
});
|
|
2278
|
-
return true;
|
|
2279
|
-
};
|
|
2280
|
-
},
|
|
2281
2080
|
},
|
|
2282
2081
|
{
|
|
2283
2082
|
zigbeeModel: ["RBSH-US4BTN-ZB-EU"],
|