zigbee-herdsman-converters 15.0.75 → 15.0.77

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.
@@ -5379,7 +5379,7 @@ const converters = {
5379
5379
  if (['QBKG39LM', 'QBKG41LM', 'WS-EUK02', 'WS-EUK04', 'QBKG20LM', 'QBKG28LM', 'QBKG31LM'].includes(model.model)) {
5380
5380
  buttonLookup = {41: 'left', 42: 'right', 51: 'both'};
5381
5381
  }
5382
- if (['QBKG25LM', 'QBKG26LM', 'QBKG34LM', 'ZNQBKG31LM'].includes(model.model)) {
5382
+ if (['QBKG25LM', 'QBKG26LM', 'QBKG29LM', 'QBKG34LM', 'ZNQBKG31LM'].includes(model.model)) {
5383
5383
  buttonLookup = {
5384
5384
  41: 'left', 42: 'center', 43: 'right',
5385
5385
  51: 'left_center', 52: 'left_right', 53: 'center_right',
@@ -2217,7 +2217,7 @@ const converters = {
2217
2217
  key: ['power_outage_memory'],
2218
2218
  convertSet: async (entity, key, value, meta) => {
2219
2219
  if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2220
- 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM', 'QBKG28LM',
2220
+ 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM', 'QBKG28LM', 'QBKG29LM',
2221
2221
  'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
2222
2222
  'WS-USC02', 'WS-USC04', 'ZNQBKG31LM',
2223
2223
  ].includes(meta.mapped.model)) {
@@ -2242,7 +2242,7 @@ const converters = {
2242
2242
  },
2243
2243
  convertGet: async (entity, key, meta) => {
2244
2244
  if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2245
- 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM', 'QBKG28LM',
2245
+ 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM', 'QBKG28LM', 'QBKG29LM',
2246
2246
  'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
2247
2247
  'WS-USC02', 'WS-USC04', 'ZNQBKG31LM',
2248
2248
  ].includes(meta.mapped.model)) {
@@ -2362,7 +2362,7 @@ const converters = {
2362
2362
  key: ['led_disabled_night'],
2363
2363
  convertSet: async (entity, key, value, meta) => {
2364
2364
  if (['ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2365
- 'QBKG28LM', 'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
2365
+ 'QBKG28LM', 'QBKG29LM', 'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
2366
2366
  'WS-EUK03', 'WS-EUK04', 'SP-EUC01'].includes(meta.mapped.model)) {
2367
2367
  await entity.write('aqaraOpple', {0x0203: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
2368
2368
  } else if (['ZNCZ11LM'].includes(meta.mapped.model)) {
@@ -2378,7 +2378,7 @@ const converters = {
2378
2378
  },
2379
2379
  convertGet: async (entity, key, meta) => {
2380
2380
  if (['ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2381
- 'QBKG28LM', 'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
2381
+ 'QBKG28LM', 'QBKG29LM', 'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
2382
2382
  'WS-EUK03', 'WS-EUK04', 'SP-EUC01'].includes(meta.mapped.model)) {
2383
2383
  await entity.read('aqaraOpple', [0x0203], manufacturerOptions.xiaomi);
2384
2384
  } else {
package/devices/bosch.js CHANGED
@@ -48,6 +48,26 @@ const displayOrientation = {
48
48
 
49
49
  // Radiator Thermostat II
50
50
  const tzLocal = {
51
+ bwa1: {
52
+ key: ['alarm_on_motion', 'test'],
53
+ convertSet: async (entity, key, value, meta) => {
54
+ if (key === 'alarm_on_motion') {
55
+ value = value.toUpperCase();
56
+ const index = stateOffOn[value];
57
+ await entity.write(0xFCAC, {0x0003: {value: index, type: 0x10}}, boschManufacturer);
58
+ return {state: {alarm_on_motion: value}};
59
+ }
60
+ },
61
+ convertGet: async (entity, key, meta) => {
62
+ switch (key) {
63
+ case 'alarm_on_motion':
64
+ await entity.read(0xFCAC, [0x0003], boschManufacturer);
65
+ break;
66
+ default: // Unknown key
67
+ throw new Error(`Unhandled key toZigbee.bosch_twinguard.convertGet ${key}`);
68
+ }
69
+ },
70
+ },
51
71
  bosch_thermostat: {
52
72
  key: ['window_open', 'boost', 'system_mode', 'pi_heating_demand'],
53
73
  convertSet: async (entity, key, value, meta) => {
@@ -212,6 +232,19 @@ const tzLocal = {
212
232
 
213
233
 
214
234
  const fzLocal = {
235
+ bwa1_alarm_on_motion: {
236
+ cluster: '64684',
237
+ type: ['attributeReport', 'readResponse'],
238
+ options: [],
239
+ convert: (model, msg, publish, options, meta) => {
240
+ const result = {};
241
+ const data = msg.data;
242
+ if (data.hasOwnProperty(0x0003)) {
243
+ result.alarm_on_motion = (Object.keys(stateOffOn)[msg.data[0x0003]]);
244
+ }
245
+ return result;
246
+ },
247
+ },
215
248
  bosch_contact: {
216
249
  cluster: 'ssIasZone',
217
250
  type: 'commandStatusChangeNotification',
@@ -396,6 +429,46 @@ const fzLocal = {
396
429
  };
397
430
 
398
431
  const definition = [
432
+ {
433
+ zigbeeModel: ['RBSH-WS-ZB-EU'],
434
+ model: 'BWA-1',
435
+ vendor: 'Bosch',
436
+ description: 'Zigbee smart water leak detector',
437
+ fromZigbee: [fz.ias_water_leak_alarm_1, fz.battery, fzLocal.bwa1_alarm_on_motion],
438
+ toZigbee: [tzLocal.bwa1],
439
+ meta: {battery: {voltageToPercentage: '3V_2500'}},
440
+ configure: async (device, coordinatorEndpoint, logger) => {
441
+ const endpoint = device.getEndpoint(1);
442
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', '64684']);
443
+ await reporting.batteryPercentageRemaining(endpoint);
444
+ await reporting.batteryVoltage(endpoint);
445
+ await endpoint.configureReporting(0xFCAC, [{
446
+ attribute: {ID: 0x0003, type: herdsman.Zcl.DataType.bool},
447
+ minimumReportInterval: 0,
448
+ maximumReportInterval: constants.repInterval.HOUR,
449
+ reportableChange: 1,
450
+ }], boschManufacturer);
451
+ },
452
+ exposes: [
453
+ e.water_leak(), e.battery(), e.tamper(),
454
+ exposes.binary('alarm_on_motion', ea.ALL, 'ON', 'OFF').withDescription('Enable/Disable sound alarm on motion'),
455
+ ],
456
+ },
457
+ {
458
+ zigbeeModel: ['RBSH-SD-ZB-EU'],
459
+ model: 'BSD-2',
460
+ vendor: 'Bosch',
461
+ description: 'Smoke alarm detector',
462
+ fromZigbee: [fz.battery, fz.ias_smoke_alarm_1],
463
+ toZigbee: [],
464
+ meta: {},
465
+ configure: async (device, coordinatorEndpoint, logger) => {
466
+ const endpoint = device.getEndpoint(1);
467
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 64684]);
468
+ await reporting.batteryPercentageRemaining(endpoint);
469
+ },
470
+ exposes: [e.smoke(), e.battery(), e.battery_low(), e.test()],
471
+ },
399
472
  {
400
473
  zigbeeModel: ['RFDL-ZB', 'RFDL-ZB-EU', 'RFDL-ZB-H', 'RFDL-ZB-K', 'RFDL-ZB-CHI', 'RFDL-ZB-MS', 'RFDL-ZB-ES', 'RFPR-ZB',
401
474
  'RFPR-ZB-EU', 'RFPR-ZB-CHI', 'RFPR-ZB-ES', 'RFPR-ZB-MS'],
package/devices/lidl.js CHANGED
@@ -836,9 +836,18 @@ module.exports = [
836
836
  },
837
837
  },
838
838
  {
839
- fingerprint: [{modelID: 'TS0505A', manufacturerName: '_TZ3000_gek6snaj'},
840
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_iystcadi'}],
841
- model: '14149505L/14149506L',
839
+ fingerprint: [{modelID: 'TS0505A', manufacturerName: '_TZ3000_gek6snaj'}],
840
+ model: '14149505L/14149506L_1',
841
+ vendor: 'Lidl',
842
+ description: 'Livarno Lux light bar RGB+CCT (black/white)',
843
+ extend: tuya.extend.light_onoff_brightness_colortemp_color({noConfigure: true}),
844
+ configure: async (device, coordinatorEndpoint, logger) => {
845
+ device.getEndpoint(1).saveClusterAttributeKeyValue('lightingColorCtrl', {colorCapabilities: 29});
846
+ },
847
+ },
848
+ {
849
+ fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3210_iystcadi'}],
850
+ model: '14149505L/14149506L_2',
842
851
  vendor: 'Lidl',
843
852
  description: 'Livarno Lux light bar RGB+CCT (black/white)',
844
853
  toZigbee: [tz.on_off, tzLocal.led_control],
package/devices/namron.js CHANGED
@@ -757,4 +757,18 @@ module.exports = [
757
757
  await reporting.activePower(endpoint);
758
758
  },
759
759
  },
760
+ {
761
+ zigbeeModel: ['4512747'],
762
+ model: '4512747',
763
+ vendor: 'Namron',
764
+ description: 'Curtain motor controller',
765
+ fromZigbee: [fz.cover_position_tilt],
766
+ toZigbee: [tz.cover_state, tz.cover_position_tilt],
767
+ exposes: [e.cover_position()],
768
+ configure: async (device, coordinatorEndpoint, logger) => {
769
+ const endpoint = device.getEndpoint(1);
770
+ await reporting.bind(endpoint, coordinatorEndpoint, ['closuresWindowCovering']);
771
+ await reporting.currentPositionLiftPercentage(endpoint);
772
+ },
773
+ },
760
774
  ];
package/devices/nue_3a.js CHANGED
@@ -122,6 +122,25 @@ module.exports = [
122
122
  await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
123
123
  },
124
124
  },
125
+ {
126
+ zigbeeModel: ['LXN-4S27LX1.0'],
127
+ model: 'HGZB-4S',
128
+ vendor: 'Nue / 3A',
129
+ description: 'Smart light switch - 4 gang v2.0',
130
+ extend: extend.switch(),
131
+ exposes: [
132
+ e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.switch().withEndpoint('l3'), e.switch().withEndpoint('l4')],
133
+ endpoint: (device) => {
134
+ return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4};
135
+ },
136
+ meta: {multiEndpoint: true},
137
+ configure: async (device, coordinatorEndpoint, logger) => {
138
+ await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
139
+ await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
140
+ await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
141
+ await reporting.bind(device.getEndpoint(4), coordinatorEndpoint, ['genOnOff']);
142
+ },
143
+ },
125
144
  {
126
145
  zigbeeModel: ['FB56+ZSW1IKJ1.7', 'FB56+ZSW1IKJ2.5', 'FB56+ZSW1IKJ2.7'],
127
146
  model: 'HGZB-043',
package/devices/owon.js CHANGED
@@ -105,6 +105,24 @@ module.exports = [
105
105
  change: [10, 10]}); // divider 1000: 0,01kWh
106
106
  },
107
107
  },
108
+ {
109
+ zigbeeModel: ['WSP403-E'],
110
+ model: 'WSP403',
111
+ vendor: 'OWON',
112
+ description: 'Smart plug',
113
+ fromZigbee: [fz.on_off, fz.metering],
114
+ toZigbee: [tz.on_off],
115
+ exposes: [e.switch(), e.power(), e.energy()],
116
+ configure: async (device, coordinatorEndpoint, logger) => {
117
+ const endpoint = device.getEndpoint(1);
118
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
119
+ await reporting.onOff(endpoint);
120
+ await reporting.readMeteringMultiplierDivisor(endpoint);
121
+ await reporting.instantaneousDemand(endpoint, {min: 5, max: constants.repInterval.MINUTES_5, change: 2}); // divider 1000: 2W
122
+ await reporting.currentSummDelivered(endpoint, {min: 5, max: constants.repInterval.MINUTES_5,
123
+ change: [10, 10]}); // divider 1000: 0,01kWh
124
+ },
125
+ },
108
126
  {
109
127
  zigbeeModel: ['WSP404'],
110
128
  model: 'WSP404',
@@ -620,7 +620,7 @@ module.exports = [
620
620
  extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
621
621
  },
622
622
  {
623
- zigbeeModel: ['LWA003', 'LWW002'],
623
+ zigbeeModel: ['LWA003', 'LWW002', 'LWA025'],
624
624
  model: '9290022268',
625
625
  vendor: 'Philips',
626
626
  description: 'Hue White A19 bulb with Bluetooth',
@@ -279,7 +279,7 @@ module.exports = [
279
279
  model: 'CCT5011-0001/CCT5011-0002/MEG5011-0001',
280
280
  vendor: 'Schneider Electric',
281
281
  description: 'Micro module switch',
282
- extend: extend.switch(),
282
+ extend: extend.switch({disablePowerOnBehavior: true}),
283
283
  whiteLabel: [{vendor: 'Elko', model: 'EKO07144'}],
284
284
  configure: async (device, coordinatorEndpoint, logger) => {
285
285
  const endpoint = device.getEndpoint(1);
package/devices/tuya.js CHANGED
@@ -3372,6 +3372,7 @@ module.exports = [
3372
3372
  {modelID: 'TS0210', manufacturerName: '_TYZB01_kulduhbj'},
3373
3373
  {modelID: 'TS0210', manufacturerName: '_TYZB01_cc3jzhlj'},
3374
3374
  {modelID: 'TS0210', manufacturerName: '_TZ3000_bmfw9ykl'},
3375
+ {modelID: 'TS0210', manufacturerName: '_TYZB01_geigpsy4'},
3375
3376
  {modelID: 'TS0210', manufacturerName: '_TZ3000_fkxmyics'}],
3376
3377
  model: 'TS0210',
3377
3378
  vendor: 'TuYa',
@@ -4150,4 +4151,14 @@ module.exports = [
4150
4151
  .withDescription('Volume of the alarm'),
4151
4152
  ],
4152
4153
  },
4154
+ {
4155
+ fingerprint: tuya.fingerprint('TS0041', ['_TZ3000_fa9mlvja']),
4156
+ model: 'IH-K663',
4157
+ vendor: 'TuYa',
4158
+ description: 'Smart button',
4159
+ exposes: [e.battery(), e.battery_voltage(), e.action(['single', 'double'])],
4160
+ fromZigbee: [fz.tuya_on_off_action, fz.battery],
4161
+ toZigbee: [],
4162
+ configure: tuya.configureMagicPacket,
4163
+ },
4153
4164
  ];
@@ -24,6 +24,7 @@ module.exports = [
24
24
  exposes.binary('window_open_force', ea.ALL, true, false)
25
25
  .withDescription('Manually set window_open, ~1 minute to take affect.'),
26
26
  e.keypad_lockout(),
27
+ e.battery(),
27
28
  ],
28
29
  configure: async (device, coordinatorEndpoint, logger) => {
29
30
  const endpoint = device.getEndpoint(1);
package/devices/woox.js CHANGED
@@ -160,10 +160,11 @@ module.exports = [
160
160
  vendor: 'Woox',
161
161
  description: 'Smart siren',
162
162
  fromZigbee: [fz.battery, fz.ts0216_siren, fz.ias_alarm_only_alarm_1, fz.power_source],
163
- toZigbee: [tz.warning, tz.ts0216_volume],
163
+ toZigbee: [tz.warning, tz.ts0216_volume, tz.ts0216_duration],
164
164
  exposes: [e.battery(), e.battery_voltage(), e.warning(), exposes.binary('alarm', ea.STATE, true, false),
165
165
  exposes.binary('ac_connected', ea.STATE, true, false).withDescription('Is the device plugged in'),
166
- exposes.numeric('volume', ea.ALL).withValueMin(0).withValueMax(100).withDescription('Volume of siren')],
166
+ exposes.numeric('volume', ea.ALL).withValueMin(0).withValueMax(100).withDescription('Volume of siren'),
167
+ exposes.numeric('duration', ea.ALL).withValueMin(0).withValueMax(3600).withDescription('Duration of siren')],
167
168
  meta: {disableDefaultResponse: true},
168
169
  configure: async (device, coordinatorEndpoint) => {
169
170
  const endpoint = device.getEndpoint(1);
package/devices/xiaomi.js CHANGED
@@ -1175,6 +1175,48 @@ module.exports = [
1175
1175
  await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
1176
1176
  },
1177
1177
  },
1178
+ {
1179
+ zigbeeModel: ['lumi.switch.l3acn1'],
1180
+ model: 'QBKG29LM',
1181
+ vendor: 'Xiaomi',
1182
+ description: 'Aqara smart wall switch H1 EU (no neutral, triple rocker)',
1183
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
1184
+ toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
1185
+ tz.xiaomi_flip_indicator_light, tz.xiaomi_led_disabled_night, tz.aqara_switch_mode_switch],
1186
+ meta: {multiEndpoint: true},
1187
+ endpoint: (device) => ({left: 1, center: 2, right: 3}),
1188
+ exposes: [
1189
+ e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right'),
1190
+ e.power_outage_memory(), e.flip_indicator_light(), e.led_disabled_night(), e.power_outage_count(),
1191
+ exposes
1192
+ .enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
1193
+ .withDescription('Decoupled mode for left button')
1194
+ .withEndpoint('left'),
1195
+ exposes
1196
+ .enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
1197
+ .withDescription('Decoupled mode for center button')
1198
+ .withEndpoint('center'),
1199
+ exposes
1200
+ .enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
1201
+ .withDescription('Decoupled mode for right button')
1202
+ .withEndpoint('right'),
1203
+ exposes
1204
+ .enum('mode_switch', ea.ALL, ['anti_flicker_mode', 'quick_mode'])
1205
+ .withDescription(
1206
+ 'Anti flicker mode can be used to solve blinking issues of some lights.' +
1207
+ 'Quick mode makes the device respond faster.'),
1208
+ e.device_temperature().withAccess(ea.STATE),
1209
+ e.action([
1210
+ 'single_left', 'double_left', 'single_center', 'double_center', 'single_right', 'double_right',
1211
+ 'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
1212
+ 'single_center_right', 'double_center_right', 'single_all', 'double_all',
1213
+ ]),
1214
+ ],
1215
+ onEvent: preventReset,
1216
+ configure: async (device, coordinatorEndpoint, logger) => {
1217
+ await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
1218
+ },
1219
+ },
1178
1220
  {
1179
1221
  zigbeeModel: ['lumi.switch.n1aeu1'],
1180
1222
  model: 'WS-EUK03',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "15.0.75",
3
+ "version": "15.0.77",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -38,7 +38,7 @@
38
38
  "buffer-crc32": "^0.2.13",
39
39
  "https-proxy-agent": "^5.0.1",
40
40
  "tar-stream": "^3.0.0",
41
- "zigbee-herdsman": "^0.14.99"
41
+ "zigbee-herdsman": "^0.14.100"
42
42
  },
43
43
  "devDependencies": {
44
44
  "eslint": "*",