zigbee-herdsman-converters 14.0.336 → 14.0.337

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.
@@ -7510,6 +7510,44 @@ const converters = {
7510
7510
  }
7511
7511
  },
7512
7512
  },
7513
+ sunricher_switch2801K2: {
7514
+ cluster: 'greenPower',
7515
+ type: ['commandNotification', 'commandCommisioningNotification'],
7516
+ convert: (model, msg, publish, options, meta) => {
7517
+ const commandID = msg.data.commandID;
7518
+ if (hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
7519
+ if (commandID === 224) return;
7520
+ const lookup = {0x21: 'press_on', 0x20: 'press_off', 0x34: 'release', 0x35: 'hold_on', 0x36: 'hold_off'};
7521
+ if (!lookup.hasOwnProperty(commandID)) {
7522
+ meta.logger.error(`Sunricher: missing command '${commandID}'`);
7523
+ } else {
7524
+ return {action: lookup[commandID]};
7525
+ }
7526
+ },
7527
+ },
7528
+ sunricher_switch2801K4: {
7529
+ cluster: 'greenPower',
7530
+ type: ['commandNotification', 'commandCommisioningNotification'],
7531
+ convert: (model, msg, publish, options, meta) => {
7532
+ const commandID = msg.data.commandID;
7533
+ if (hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
7534
+ if (commandID === 224) return;
7535
+ const lookup = {
7536
+ 0x21: 'press_on',
7537
+ 0x20: 'press_off',
7538
+ 0x37: 'press_high',
7539
+ 0x38: 'press_low',
7540
+ 0x35: 'hold_high',
7541
+ 0x36: 'hold_low',
7542
+ 0x34: 'release',
7543
+ };
7544
+ if (!lookup.hasOwnProperty(commandID)) {
7545
+ meta.logger.error(`Sunricher: missing command '${commandID}'`);
7546
+ } else {
7547
+ return {action: lookup[commandID]};
7548
+ }
7549
+ },
7550
+ },
7513
7551
  // #endregion
7514
7552
 
7515
7553
  // #region Ignore converters (these message dont need parsing).
@@ -0,0 +1,34 @@
1
+ const exposes = require('../lib/exposes');
2
+ const fz = require('../converters/fromZigbee');
3
+ const tz = require('../converters/toZigbee');
4
+ const reporting = require('../lib/reporting');
5
+
6
+ module.exports = [{
7
+ zigbeeModel: ['PERCALE2 D1.00P1.01Z1.00'],
8
+ model: 'PERCALE2',
9
+ vendor: 'Acova',
10
+ description: 'Percale 2 heater',
11
+ fromZigbee: [fz.thermostat, fz.hvac_user_interface],
12
+ toZigbee: [
13
+ tz.thermostat_local_temperature,
14
+ tz.thermostat_system_mode,
15
+ tz.thermostat_occupied_heating_setpoint,
16
+ tz.thermostat_unoccupied_heating_setpoint,
17
+ tz.thermostat_occupied_cooling_setpoint,
18
+ tz.thermostat_running_state,
19
+ ],
20
+ exposes: [
21
+ exposes.climate()
22
+ .withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
23
+ .withLocalTemperature()
24
+ .withSystemMode(['off', 'heat', 'auto'])
25
+ .withRunningState(['idle', 'heat']),
26
+ ],
27
+ configure: async (device, coordinatorEndpoint, logger) => {
28
+ const endpoint = device.getEndpoint(1);
29
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
30
+ await reporting.thermostatTemperature(endpoint);
31
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
32
+ await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
33
+ },
34
+ }];
@@ -233,4 +233,23 @@ module.exports = [
233
233
  },
234
234
  exposes: [e.soil_moisture(), e.battery(), e.temperature()],
235
235
  },
236
+ {
237
+ zigbeeModel: ['EFEKTA_eON213z'],
238
+ model: 'EFEKTA_eON213z',
239
+ vendor: 'Custom devices (DiY)',
240
+ description: '[Temperature and humidity sensor with e-ink2.13](http://efektalab.com/eON213z)',
241
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery],
242
+ toZigbee: [tz.factory_reset],
243
+ configure: async (device, coordinatorEndpoint, logger) => {
244
+ const endpoint = device.getEndpoint(1);
245
+ await reporting.bind(endpoint, coordinatorEndpoint, [
246
+ 'genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity']);
247
+ const overides = {min: 0, max: 21600, change: 0};
248
+ await reporting.batteryVoltage(endpoint, overides);
249
+ await reporting.batteryPercentageRemaining(endpoint, overides);
250
+ await reporting.temperature(endpoint, overides);
251
+ await reporting.humidity(endpoint, overides);
252
+ },
253
+ exposes: [e.battery(), e.temperature(), e.humidity()],
254
+ },
236
255
  ];
@@ -34,7 +34,9 @@ module.exports = [
34
34
  exposes.binary('viewing_direction', ea.ALL, true, false)
35
35
  .withDescription('Viewing/Display Direction. `false` Horizontal or `true` Vertical'),
36
36
  exposes.binary('heat_available', ea.ALL, true, false)
37
- .withDescription('Not clear how this affects operation. `false` No Heat Available or `true` Heat Available'),
37
+ .withDescription('Not clear how this affects operation. However, it would appear that the device does not execute any ' +
38
+ 'motor functions if this is set to false. This may be a means to conserve battery during periods that the heating ' +
39
+ 'system is not energized (e.g. during summer). `false` No Heat Available or `true` Heat Available'),
38
40
  exposes.binary('heat_required', ea.STATE_GET, true, false)
39
41
  .withDescription('Whether or not the unit needs warm water. `false` No Heat Request or `true` Heat Request'),
40
42
  exposes.enum('setpoint_change_source', ea.STATE, ['manual', 'schedule', 'externally'])
@@ -39,6 +39,27 @@ const gledoptoExtend = {
39
39
  [tz.gledopto_light_onoff_brightness, tz.gledopto_light_color_colortemp],
40
40
  ),
41
41
  }),
42
+ switch: (options={}) => ({
43
+ ...extend.switch(options),
44
+ onEvent: async (type, data, device) => {
45
+ // This device doesn't support reporting.
46
+ // Therefore we read the on/off state every 5 seconds.
47
+ // This is the same way as the Hue bridge does it.
48
+ if (type === 'stop') {
49
+ clearInterval(globalStore.getValue(device, 'interval'));
50
+ globalStore.clearValue(device, 'interval');
51
+ } else if (!globalStore.hasValue(device, 'interval')) {
52
+ const interval = setInterval(async () => {
53
+ try {
54
+ await device.endpoints[0].read('genOnOff', ['onOff']);
55
+ } catch (error) {
56
+ // Do nothing
57
+ }
58
+ }, 5000);
59
+ globalStore.putValue(device, 'interval', interval);
60
+ }
61
+ },
62
+ }),
42
63
  };
43
64
 
44
65
  module.exports = [
@@ -580,32 +601,21 @@ module.exports = [
580
601
  zigbeeModel: ['GL-G-007Z'],
581
602
  model: 'GL-G-007Z',
582
603
  vendor: 'Gledopto',
583
- description: 'Zigbee 9W Garden Lamp RGB+CCT',
604
+ description: 'Zigbee 9W garden lamp RGB+CCT',
584
605
  extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
585
606
  },
586
607
  {
587
608
  zigbeeModel: ['GL-W-001Z'],
588
609
  model: 'GL-W-001Z',
589
610
  vendor: 'Gledopto',
590
- description: 'Zigbee On/Off Wall Switch',
591
- extend: extend.switch(),
592
- onEvent: async (type, data, device) => {
593
- // This device doesn't support reporting.
594
- // Therefore we read the on/off state every 5 seconds.
595
- // This is the same way as the Hue bridge does it.
596
- if (type === 'stop') {
597
- clearInterval(globalStore.getValue(device, 'interval'));
598
- globalStore.clearValue(device, 'interval');
599
- } else if (!globalStore.hasValue(device, 'interval')) {
600
- const interval = setInterval(async () => {
601
- try {
602
- await device.endpoints[0].read('genOnOff', ['onOff']);
603
- } catch (error) {
604
- // Do nothing
605
- }
606
- }, 5000);
607
- globalStore.putValue(device, 'interval', interval);
608
- }
609
- },
611
+ description: 'Zigbee on/off wall switch',
612
+ extend: gledoptoExtend.switch(),
613
+ },
614
+ {
615
+ zigbeeModel: ['GL-SD-002'],
616
+ model: 'GL-SD-002',
617
+ vendor: 'Gledopto',
618
+ description: 'Zigbee 3.0 smart home switch',
619
+ extend: gledoptoExtend.switch(),
610
620
  },
611
621
  ];
package/devices/lidl.js CHANGED
@@ -417,6 +417,7 @@ module.exports = [
417
417
  configure: async (device, coordinatorEndpoint, logger) => {
418
418
  const endpoint = device.getEndpoint(1);
419
419
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
420
+ await reporting.batteryPercentageRemaining(endpoint);
420
421
  },
421
422
  },
422
423
  {
@@ -656,7 +657,7 @@ module.exports = [
656
657
  model: '368308_2010',
657
658
  vendor: 'Lidl',
658
659
  description: 'Silvercrest radiator valve with thermostat',
659
- fromZigbee: [fz.ignore_tuya_set_time, fzLocal.zs_thermostat, fz.tuya_data_point_dump],
660
+ fromZigbee: [fz.ignore_tuya_set_time, fzLocal.zs_thermostat],
660
661
  toZigbee: [tzLocal.zs_thermostat_current_heating_setpoint, tzLocal.zs_thermostat_child_lock,
661
662
  tzLocal.zs_thermostat_comfort_temp, tzLocal.zs_thermostat_eco_temp, tzLocal.zs_thermostat_preset_mode,
662
663
  tzLocal.zs_thermostat_system_mode, tzLocal.zs_thermostat_local_temperature_calibration,
@@ -234,4 +234,22 @@ module.exports = [
234
234
  await reporting.currentPositionLiftPercentage(endpoint);
235
235
  },
236
236
  },
237
+ {
238
+ fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x00000000010.....$/}],
239
+ model: 'SR-ZGP2801K2-DIM',
240
+ vendor: 'Sunricher',
241
+ description: 'Pushbutton transmitter module',
242
+ fromZigbee: [fz.sunricher_switch2801K2],
243
+ toZigbee: [],
244
+ exposes: [e.action(['press_on', 'press_off', 'hold_on', 'hold_off', 'release'])],
245
+ },
246
+ {
247
+ fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x000000005d5.....$/}],
248
+ model: 'SR-ZGP2801K4-DIM',
249
+ vendor: 'Sunricher',
250
+ description: 'Pushbutton transmitter module',
251
+ fromZigbee: [fz.sunricher_switch2801K4],
252
+ toZigbee: [],
253
+ exposes: [e.action(['press_on', 'press_off', 'press_high', 'press_low', 'hold_high', 'hold_low', 'release'])],
254
+ },
237
255
  ];
@@ -189,4 +189,12 @@ module.exports = [
189
189
  extend: extend.ledvance.light_onoff_brightness(),
190
190
  ota: ota.ledvance,
191
191
  },
192
+ {
193
+ zigbeeModel: ['A19 G2 RGBW'],
194
+ model: '75564',
195
+ vendor: 'Sylvania',
196
+ description: 'Smart+ adjustable white and full color bulb A19',
197
+ extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [142, 555]}),
198
+ ota: ota.ledvance,
199
+ },
192
200
  ];
package/devices/tuya.js CHANGED
@@ -66,7 +66,7 @@ module.exports = [
66
66
  },
67
67
  {
68
68
  fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_hktqahrq'}, {manufacturerName: '_TZ3000_hktqahrq'},
69
- {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'}],
69
+ {manufacturerName: '_TZ3000_q6a3tepg'}, {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'}],
70
70
  model: 'WHD02',
71
71
  vendor: 'TuYa',
72
72
  description: 'Wall switch module',
@@ -164,6 +164,8 @@ module.exports = [
164
164
  {modelID: 'TS0202', manufacturerName: '_TYZB01_dl7cejts'},
165
165
  {modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
166
166
  {modelID: 'TS0202', manufacturerName: '_TZ3000_mmtwjmaq'},
167
+ {modelID: 'TS0202', manufacturerName: '_TZ3000_mcxw5ehu'},
168
+ {modelID: 'TS0202', manufacturerName: '_TYZB01_hqbdru35'},
167
169
  {modelID: 'WHD02', manufacturerName: '_TZ3000_hktqahrq'}],
168
170
  model: 'TS0202',
169
171
  vendor: 'TuYa',
@@ -717,6 +719,7 @@ module.exports = [
717
719
  {modelID: 'TS0601', manufacturerName: '_TZE200_xuzcvlku'},
718
720
  {modelID: 'TS0601', manufacturerName: '_TZE200_4vobcgd3'},
719
721
  {modelID: 'TS0601', manufacturerName: '_TZE200_nogaemzt'},
722
+ {modelID: 'TS0601', manufacturerName: '_TZE200_r0jdjrvi'},
720
723
  {modelID: 'TS0601', manufacturerName: '_TZE200_pk0sfzvr'},
721
724
  {modelID: 'TS0601', manufacturerName: '_TZE200_fdtjuw7u'},
722
725
  {modelID: 'TS0601', manufacturerName: '_TZE200_zpzndjez'},
@@ -726,6 +729,7 @@ module.exports = [
726
729
  {modelID: 'TS0601', manufacturerName: '_TZE200_nueqqe6k'},
727
730
  {modelID: 'TS0601', manufacturerName: '_TZE200_xaabybja'},
728
731
  {modelID: 'TS0601', manufacturerName: '_TZE200_rmymn92d'},
732
+ {modelID: 'TS0601', manufacturerName: '_TZE200_3i3exuay'},
729
733
  {modelID: 'zo2pocs\u0000', manufacturerName: '_TYST11_fzo2pocs'},
730
734
  // Roller blinds:
731
735
  {modelID: 'TS0601', manufacturerName: '_TZE200_sbordckq'},
@@ -1212,7 +1216,7 @@ module.exports = [
1212
1216
  },
1213
1217
  },
1214
1218
  {
1215
- fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}],
1219
+ fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'}],
1216
1220
  model: 'TS0011_switch_module',
1217
1221
  vendor: 'TuYa',
1218
1222
  description: '1 gang switch module - (without neutral)',
@@ -1251,7 +1255,7 @@ module.exports = [
1251
1255
  },
1252
1256
  },
1253
1257
  {
1254
- fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}],
1258
+ fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}, {modelID: 'TS0012', manufacturerName: '_TZ3000_nPGIPl5D'}],
1255
1259
  model: 'TS0012_switch_module',
1256
1260
  vendor: 'TuYa',
1257
1261
  description: '2 gang switch module - (without neutral)',
package/devices/xiaomi.js CHANGED
@@ -49,6 +49,15 @@ module.exports = [
49
49
  toZigbee: [],
50
50
  exposes: [e.contact(), e.battery(), e.battery_voltage()],
51
51
  },
52
+ {
53
+ zigbeeModel: ['lumi.magnet.ac01'],
54
+ model: 'MCCGQ13LM',
55
+ vendor: 'Xiaomi',
56
+ description: 'Aqara P1 door & window contact sensor',
57
+ fromZigbee: [fz.ias_contact_alarm_1, fz.aqara_opple],
58
+ toZigbee: [],
59
+ exposes: [e.contact(), e.battery(), e.battery_voltage()],
60
+ },
52
61
  {
53
62
  zigbeeModel: ['lumi.dimmer.rcbac1'],
54
63
  model: 'ZNDDMK11LM',
package/lib/exposes.js CHANGED
@@ -511,7 +511,7 @@ module.exports = {
511
511
  battery: () => new Numeric('battery', access.STATE).withUnit('%').withDescription('Remaining battery in %').withValueMin(0).withValueMax(100),
512
512
  battery_low: () => new Binary('battery_low', access.STATE, true, false).withDescription('Indicates if the battery of this device is almost empty'),
513
513
  battery_voltage: () => new Numeric('voltage', access.STATE).withUnit('mV').withDescription('Voltage of the battery in millivolts'),
514
- boost_time: () => new Numeric('boost_time', access.STATE_SET).withUnit('s').withDescription('Boost time').withValueMin(0).withValueMax(600),
514
+ boost_time: () => new Numeric('boost_time', access.STATE_SET).withUnit('s').withDescription('Boost time').withValueMin(0).withValueMax(900),
515
515
  button_lock: () => new Binary('button_lock', access.ALL, 'ON', 'OFF').withDescription('Disables the physical switch button'),
516
516
  carbon_monoxide: () => new Binary('carbon_monoxide', access.STATE, true, false).withDescription('Indicates if CO (carbon monoxide) is detected'),
517
517
  child_lock: () => new Lock().withState('child_lock', 'LOCK', 'UNLOCK', 'Enables/disables physical input on the device', access.STATE_SET),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.336",
3
+ "version": "14.0.337",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.336",
3
+ "version": "14.0.337",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [