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 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,EAA6C,MAAM,cAAc,CAAC;AAu6CnG,eAAO,MAAM,WAAW,EAAE,oBAAoB,EAmsC7C,CAAC"}
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"}
@@ -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: [m.identify(), m.light({ configureReporting: true, effect: false })],
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, potential free",
1978
- extend: [m.onOff({ powerOnBehavior: false })],
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
- boschExtend.bmct(),
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"],