zigbee-herdsman-converters 14.0.333 → 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.
@@ -1757,6 +1757,29 @@ const converters = {
1757
1757
  }
1758
1758
  },
1759
1759
  },
1760
+ tuya_illuminance_temperature_humidity_sensor: {
1761
+ cluster: 'manuSpecificTuya',
1762
+ type: ['commandSetDataResponse', 'commandGetData'],
1763
+ options: [exposes.options.precision('temperature'), exposes.options.calibration('temperature'),
1764
+ exposes.options.precision('humidity'), exposes.options.calibration('humidity')],
1765
+ convert: (model, msg, publish, options, meta) => {
1766
+ const dp = msg.data.dp;
1767
+ const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
1768
+ switch (dp) {
1769
+ case tuya.dataPoints.thitTemperature:
1770
+ return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1771
+ case tuya.dataPoints.thitHumidity:
1772
+ return {humidity: calibrateAndPrecisionRoundOptions(value, options, 'humidity')};
1773
+ case tuya.dataPoints.thitBatteryPercentage:
1774
+ return {battery: value};
1775
+ case tuya.dataPoints.thitIlluminanceLux:
1776
+ return {illuminance_lux: value};
1777
+ default:
1778
+ meta.logger.warn(`zigbee-herdsman-converters:tuya_illuminance_temperature_humidity_sensor: NOT RECOGNIZED ` +
1779
+ `DP #${dp} with data ${JSON.stringify(msg.data)}`);
1780
+ }
1781
+ },
1782
+ },
1760
1783
  ts0201_temperature_humidity_alarm: {
1761
1784
  cluster: 'manuSpecificTuya_2',
1762
1785
  type: ['attributeReport', 'readResponse'],
@@ -2448,7 +2471,7 @@ const converters = {
2448
2471
  buttonMapping = {1: '1', 2: '2'};
2449
2472
  } else if (model.model === 'TS0043') {
2450
2473
  buttonMapping = {1: '1', 2: '2', 3: '3'};
2451
- } else if (['TS0044', 'YSR-MINI-Z'].includes(model.model)) {
2474
+ } else if (['TS0044', 'YSR-MINI-Z', 'TS004F'].includes(model.model)) {
2452
2475
  buttonMapping = {1: '1', 2: '2', 3: '3', 4: '4'};
2453
2476
  }
2454
2477
  const button = buttonMapping ? `${buttonMapping[msg.endpoint.ID]}_` : '';
@@ -7487,6 +7510,44 @@ const converters = {
7487
7510
  }
7488
7511
  },
7489
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
+ },
7490
7551
  // #endregion
7491
7552
 
7492
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'])
@@ -42,8 +44,8 @@ module.exports = [
42
44
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
43
45
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
44
46
  exposes.numeric('external_measured_room_sensor', ea.ALL)
45
- .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes at every 100 ' +
46
- 'value change. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
47
+ .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
48
+ 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
47
49
  exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
48
50
  .withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
49
51
  '3=Open window detected, 4=In window open state from external but detected closed locally'),
@@ -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/hive.js CHANGED
@@ -183,8 +183,8 @@ module.exports = [
183
183
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
184
184
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
185
185
  exposes.numeric('external_measured_room_sensor', ea.ALL)
186
- .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes at every 100 ' +
187
- 'value change. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
186
+ .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
187
+ 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
188
188
  exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
189
189
  .withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
190
190
  '3=Open window detected, 4=In window open state from external but detected closed locally'),
package/devices/icasa.js CHANGED
@@ -81,6 +81,7 @@ module.exports = [
81
81
  model: 'ICZB-RM11S',
82
82
  vendor: 'iCasa',
83
83
  description: 'Zigbee 3.0 remote control',
84
+ meta: {battery: {dontDividePercentage: true}},
84
85
  fromZigbee: [fz.command_recall, fz.command_on, fz.command_off, fz.command_move, fz.command_stop, fz.battery],
85
86
  exposes: [e.battery(), e.action(['recall_*', 'on', 'off', 'brightness_stop', 'brightness_move_up', 'brightness_move_down'])],
86
87
  toZigbee: [],
package/devices/ikea.js CHANGED
@@ -146,10 +146,12 @@ const ikea = {
146
146
  convertSet: async (entity, key, value, meta) => {
147
147
  if (key == 'fan_state' && value.toLowerCase() == 'on') {
148
148
  value = getMetaValue(entity, meta.mapped, 'fanStateOn', 'allEqual', 'on');
149
+ } else {
150
+ value = value.toString().toLowerCase();
149
151
  }
150
152
 
151
153
  let fanMode;
152
- switch (value.toLowerCase()) {
154
+ switch (value) {
153
155
  case 'off':
154
156
  fanMode = 0;
155
157
  break;
@@ -161,7 +163,7 @@ const ikea = {
161
163
  }
162
164
 
163
165
  await entity.write('manuSpecificIkeaAirPurifier', {'fanMode': fanMode}, manufacturerOptions.ikea);
164
- return {state: {fan_mode: value.toLowerCase(), fan_state: value.toLowerCase() === 'off' ? 'OFF' : 'ON'}};
166
+ return {state: {fan_mode: value, fan_state: value === 'off' ? 'OFF' : 'ON'}};
165
167
  },
166
168
  convertGet: async (entity, key, meta) => {
167
169
  await entity.read('manuSpecificIkeaAirPurifier', ['fanMode']);
package/devices/immax.js CHANGED
@@ -140,4 +140,23 @@ module.exports = [
140
140
  description: 'Neo RECUADRO SMART, color temp, dimmable, Zigbee 3.0',
141
141
  extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
142
142
  },
143
+ {
144
+ fingerprint: [{modelID: 'TS0202', manufacturerName: '_TZ3210_jijr1sss'}],
145
+ model: '07502L',
146
+ vendor: 'Immax',
147
+ description: '4 in 1 multi sensor',
148
+ fromZigbee: [fz.battery, fz.ignore_basic_report, fz.illuminance, fz.ZB003X, fz.ZB003X_attr, fz.ZB003X_occupancy],
149
+ toZigbee: [tz.ZB003X],
150
+ exposes: [e.occupancy(), e.tamper(), e.battery(), e.illuminance(), e.illuminance_lux().withUnit('lx'), e.temperature(),
151
+ e.humidity(), exposes.numeric('reporting_time', ea.STATE_SET).withDescription('Reporting interval in minutes'),
152
+ exposes.numeric('temperature_calibration', ea.STATE_SET).withDescription('Temperature calibration'),
153
+ exposes.numeric('humidity_calibration', ea.STATE_SET).withDescription('Humidity calibration'),
154
+ exposes.numeric('illuminance_calibration', ea.STATE_SET).withDescription('Illuminance calibration'),
155
+ exposes.binary('pir_enable', ea.STATE_SET, true, false).withDescription('Enable PIR sensor'),
156
+ exposes.binary('led_enable', ea.STATE_SET, true, false).withDescription('Enabled LED'),
157
+ exposes.binary('reporting_enable', ea.STATE_SET, true, false).withDescription('Enabled reporting'),
158
+ exposes.enum('sensitivity', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('PIR sensor sensitivity'),
159
+ // eslint-disable-next-line
160
+ exposes.enum('keep_time', ea.STATE_SET, ['0', '30', '60', '120', '240']).withDescription('PIR keep time in seconds')],
161
+ },
143
162
  ];
@@ -85,7 +85,7 @@ module.exports = [
85
85
  extend: extend.light_onoff_brightness_colortemp(),
86
86
  },
87
87
  {
88
- zigbeeModel: ['ZHA-PIRSensor'],
88
+ fingerprint: [{modelID: 'ZHA-PIRSensor', manufacturerName: 'Leedarson'}],
89
89
  model: '5AA-SS-ZA-H0',
90
90
  vendor: 'Leedarson',
91
91
  description: 'Motion sensor',
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
  {
@@ -655,8 +656,8 @@ module.exports = [
655
656
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_chyvmhay'}],
656
657
  model: '368308_2010',
657
658
  vendor: 'Lidl',
658
- description: 'Silvercrest rdiator valve with thermostat',
659
- fromZigbee: [fz.ignore_tuya_set_time, fzLocal.zs_thermostat, fz.tuya_data_point_dump],
659
+ description: 'Silvercrest radiator valve with thermostat',
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,
package/devices/owon.js CHANGED
@@ -83,4 +83,23 @@ module.exports = [
83
83
  await reporting.thermostatAcLouverPosition(endpoint);
84
84
  },
85
85
  },
86
+ {
87
+ zigbeeModel: ['THS317'],
88
+ model: 'THS317',
89
+ vendor: 'OWON',
90
+ description: 'Temperature and humidity sensor',
91
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery],
92
+ toZigbee: [],
93
+ exposes: [e.battery(), e.temperature(), e.humidity()],
94
+ configure: async (device, coordinatorEndpoint, logger) => {
95
+ const endpoint = device.getEndpoint(2);
96
+ await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg']);
97
+ await reporting.temperature(endpoint);
98
+ await reporting.humidity(endpoint);
99
+ await reporting.batteryVoltage(endpoint);
100
+ await reporting.batteryPercentageRemaining(endpoint);
101
+ device.powerSource = 'Battery';
102
+ device.save();
103
+ },
104
+ },
86
105
  ];
@@ -33,4 +33,19 @@ module.exports = [
33
33
  await reporting.batteryPercentageRemaining(endpoint);
34
34
  },
35
35
  },
36
+ {
37
+ fingerprint: [{modelID: 'ZHA-PirSensor', manufacturerName: 'LDS'}],
38
+ model: 'PECMS01',
39
+ vendor: 'Perenio',
40
+ description: 'Motion sensor',
41
+ fromZigbee: [fz.battery, fz.ias_occupancy_alarm_1],
42
+ toZigbee: [],
43
+ meta: {battery: {dontDividePercentage: true}},
44
+ exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
45
+ configure: async (device, coordinatorEndpoint, logger) => {
46
+ const endpoint = device.getEndpoint(1);
47
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
48
+ await reporting.batteryPercentageRemaining(endpoint);
49
+ },
50
+ },
36
51
  ];
package/devices/popp.js CHANGED
@@ -42,8 +42,8 @@ module.exports = [
42
42
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
43
43
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
44
44
  exposes.numeric('external_measured_room_sensor', ea.ALL)
45
- .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes at every 100 ' +
46
- 'value change. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
45
+ .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
46
+ 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
47
47
  exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
48
48
  .withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
49
49
  '3=Open window detected, 4=In window open state from external but detected closed locally'),
@@ -282,4 +282,21 @@ module.exports = [
282
282
  await reporting.batteryVoltage(endpoint, {min: 30, max: 21600, change: 1});
283
283
  },
284
284
  },
285
+ {
286
+ zigbeeModel: ['PMM-300Z1'],
287
+ model: 'PMM-300Z1',
288
+ vendor: 'ShinaSystem',
289
+ description: 'SiHAS energy monitor',
290
+ fromZigbee: [fz.electrical_measurement, fz.metering],
291
+ toZigbee: [tz.electrical_measurement_power],
292
+ exposes: [e.power().withAccess(ea.STATE_GET), e.energy()],
293
+ configure: async (device, coordinatorEndpoint, logger) => {
294
+ const endpoint = device.getEndpoint(1);
295
+ await reporting.bind(endpoint, coordinatorEndpoint, ['haElectricalMeasurement', 'seMetering']);
296
+ await reporting.activePower(endpoint, {min: 1, max: 600, change: 5});
297
+ await reporting.instantaneousDemand(endpoint, {min: 1, max: 600, change: 1});
298
+ endpoint.saveClusterAttributeKeyValue('seMetering', {multiplier: 1, divisor: 1000});
299
+ await reporting.currentSummDelivered(endpoint, {min: 1, max: 600, change: 5});
300
+ },
301
+ },
285
302
  ];
@@ -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
@@ -36,6 +36,15 @@ module.exports = [
36
36
  toZigbee: [],
37
37
  exposes: [e.temperature(), e.humidity(), e.battery()],
38
38
  },
39
+ {
40
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_vzqtvljm'}],
41
+ model: 'TS0601_illuminance_temperature_humidity_sensor',
42
+ vendor: 'TuYa',
43
+ description: 'Illuminance, temperature & humidity sensor',
44
+ fromZigbee: [fz.tuya_illuminance_temperature_humidity_sensor],
45
+ toZigbee: [],
46
+ exposes: [e.temperature(), e.humidity(), e.illuminance_lux(), e.battery()],
47
+ },
39
48
  {
40
49
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_8ygsuhe1'},
41
50
  {modelID: 'TS0601', manufacturerName: '_TZE200_yvx5lh6k'}, {modelID: 'TS0601', manufacturerName: '_TZE200_ryfmq5rl'}],
@@ -57,7 +66,7 @@ module.exports = [
57
66
  },
58
67
  {
59
68
  fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_hktqahrq'}, {manufacturerName: '_TZ3000_hktqahrq'},
60
- {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'}],
69
+ {manufacturerName: '_TZ3000_q6a3tepg'}, {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'}],
61
70
  model: 'WHD02',
62
71
  vendor: 'TuYa',
63
72
  description: 'Wall switch module',
@@ -115,8 +124,8 @@ module.exports = [
115
124
  model: 'TS0505B',
116
125
  vendor: 'TuYa',
117
126
  description: 'Zigbee RGB+CCT light',
118
- whiteLabel: [{vendor: 'Mercator ikuü', model: 'SMD4106W-RGB-ZB'},
119
- {vendor: 'TuYa', model: 'A5C-21F7-01'}, {vendor: 'Mercator ikuü', model: 'S9E27LED9W-RGB-Z'}],
127
+ whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMD4106W-RGB-ZB'},
128
+ {vendor: 'TuYa', model: 'A5C-21F7-01'}, {vendor: 'Mercator Ikuü', model: 'S9E27LED9W-RGB-Z'}],
120
129
  extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
121
130
  meta: {applyRedFix: true, enhancedHue: false},
122
131
  },
@@ -155,6 +164,8 @@ module.exports = [
155
164
  {modelID: 'TS0202', manufacturerName: '_TYZB01_dl7cejts'},
156
165
  {modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
157
166
  {modelID: 'TS0202', manufacturerName: '_TZ3000_mmtwjmaq'},
167
+ {modelID: 'TS0202', manufacturerName: '_TZ3000_mcxw5ehu'},
168
+ {modelID: 'TS0202', manufacturerName: '_TYZB01_hqbdru35'},
158
169
  {modelID: 'WHD02', manufacturerName: '_TZ3000_hktqahrq'}],
159
170
  model: 'TS0202',
160
171
  vendor: 'TuYa',
@@ -241,7 +252,7 @@ module.exports = [
241
252
  {vendor: 'Earda', model: 'EDM-1ZAA-EU'},
242
253
  {vendor: 'Earda', model: 'EDM-1ZAB-EU'},
243
254
  {vendor: 'Earda', model: 'EDM-1ZBA-EU'},
244
- {vendor: 'Mercator ikuü', model: 'SSWD01'},
255
+ {vendor: 'Mercator Ikuü', model: 'SSWD01'},
245
256
  ],
246
257
  },
247
258
  {
@@ -437,7 +448,7 @@ module.exports = [
437
448
  model: 'TS0502B',
438
449
  vendor: 'TuYa',
439
450
  description: 'Light controller',
440
- whiteLabel: [{vendor: 'Mercator ikuü', model: 'SMI7040', description: 'Ford Batten Light'}],
451
+ whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMI7040', description: 'Ford Batten Light'}],
441
452
  extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
442
453
  },
443
454
  {
@@ -545,16 +556,24 @@ module.exports = [
545
556
  model: 'TS004F',
546
557
  vendor: 'TuYa',
547
558
  description: 'Wireless switch with 4 buttons',
548
- exposes: [e.battery(), e.action(
549
- ['on', 'off', 'brightness_move_up', 'brightness_step_up', 'brightness_step_down', 'brightness_move_down', 'brightness_stop'])],
550
- fromZigbee: [fz.battery, fz.command_on, fz.command_off, fz.command_step, fz.command_move, fz.command_stop],
551
- toZigbee: [],
559
+ exposes: [e.battery(), e.action(['1_single', '1_double', '1_hold', '2_single', '2_double', '2_hold',
560
+ '3_single', '3_double', '3_hold', '4_single', '4_double', '4_hold'])],
561
+ fromZigbee: [fz.battery, fz.tuya_on_off_action],
562
+ toZigbee: [tz.tuya_operation_mode],
552
563
  configure: async (device, coordinatorEndpoint, logger) => {
553
564
  const endpoint = device.getEndpoint(1);
554
- await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
565
+ await endpoint.read('genBasic', [0x0004, 0x000, 0x0001, 0x0005, 0x0007, 0xfffe]);
566
+ await endpoint.write('genOnOff', {'tuyaOperationMode': 1});
567
+ await endpoint.read('genOnOff', ['tuyaOperationMode']);
555
568
  try {
556
- await reporting.batteryPercentageRemaining(endpoint);
557
- } catch (error) {/* Fails for some*/}
569
+ await endpoint.read(0xE001, [0xD011]);
570
+ } catch (err) {/* do nothing */}
571
+ await endpoint.read('genPowerCfg', ['batteryVoltage', 'batteryPercentageRemaining']);
572
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
573
+ await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
574
+ await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
575
+ await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
576
+ await reporting.bind(device.getEndpoint(4), coordinatorEndpoint, ['genOnOff']);
558
577
  },
559
578
  },
560
579
  {
@@ -700,6 +719,7 @@ module.exports = [
700
719
  {modelID: 'TS0601', manufacturerName: '_TZE200_xuzcvlku'},
701
720
  {modelID: 'TS0601', manufacturerName: '_TZE200_4vobcgd3'},
702
721
  {modelID: 'TS0601', manufacturerName: '_TZE200_nogaemzt'},
722
+ {modelID: 'TS0601', manufacturerName: '_TZE200_r0jdjrvi'},
703
723
  {modelID: 'TS0601', manufacturerName: '_TZE200_pk0sfzvr'},
704
724
  {modelID: 'TS0601', manufacturerName: '_TZE200_fdtjuw7u'},
705
725
  {modelID: 'TS0601', manufacturerName: '_TZE200_zpzndjez'},
@@ -709,6 +729,7 @@ module.exports = [
709
729
  {modelID: 'TS0601', manufacturerName: '_TZE200_nueqqe6k'},
710
730
  {modelID: 'TS0601', manufacturerName: '_TZE200_xaabybja'},
711
731
  {modelID: 'TS0601', manufacturerName: '_TZE200_rmymn92d'},
732
+ {modelID: 'TS0601', manufacturerName: '_TZE200_3i3exuay'},
712
733
  {modelID: 'zo2pocs\u0000', manufacturerName: '_TYST11_fzo2pocs'},
713
734
  // Roller blinds:
714
735
  {modelID: 'TS0601', manufacturerName: '_TZE200_sbordckq'},
@@ -1185,7 +1206,7 @@ module.exports = [
1185
1206
  {vendor: 'Vrey', model: 'VR-X712U-0013'},
1186
1207
  {vendor: 'TUYATEC', model: 'GDKES-01TZXD'},
1187
1208
  {vendor: 'Lonsonho', model: 'QS-Zigbee-S05-L', description: '1 gang smart switch module without neutral wire'},
1188
- {vendor: 'Mercator ikuü', model: 'SSW01'},
1209
+ {vendor: 'Mercator Ikuü', model: 'SSW01'},
1189
1210
  ],
1190
1211
  configure: async (device, coordinatorEndpoint, logger) => {
1191
1212
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
@@ -1195,7 +1216,7 @@ module.exports = [
1195
1216
  },
1196
1217
  },
1197
1218
  {
1198
- fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}],
1219
+ fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'}],
1199
1220
  model: 'TS0011_switch_module',
1200
1221
  vendor: 'TuYa',
1201
1222
  description: '1 gang switch module - (without neutral)',
@@ -1234,7 +1255,7 @@ module.exports = [
1234
1255
  },
1235
1256
  },
1236
1257
  {
1237
- fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}],
1258
+ fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}, {modelID: 'TS0012', manufacturerName: '_TZ3000_nPGIPl5D'}],
1238
1259
  model: 'TS0012_switch_module',
1239
1260
  vendor: 'TuYa',
1240
1261
  description: '2 gang switch module - (without neutral)',
@@ -1318,7 +1339,7 @@ module.exports = [
1318
1339
  {
1319
1340
  fingerprint: [{modelID: 'TS0014', manufacturerName: '_TZ3000_jr2atpww'}, {modelID: 'TS0014', manufacturerName: '_TYZB01_dvakyzhd'},
1320
1341
  {modelID: 'TS0014', manufacturerName: '_TZ3210_w3hl6rao'}, {modelID: 'TS0014', manufacturerName: '_TYZB01_bagt1e4o'},
1321
- {modelID: 'TS0014', manufacturerName: '_TZ3000_r0pmi2p3'}],
1342
+ {modelID: 'TS0014', manufacturerName: '_TZ3000_r0pmi2p3'}, {modelID: 'TS0014', manufacturerName: '_TZ3000_fxjdcikv'}],
1322
1343
  model: 'TS0014',
1323
1344
  vendor: 'TuYa',
1324
1345
  description: 'Smart light switch - 4 gang without neutral wire',
@@ -1329,7 +1350,7 @@ module.exports = [
1329
1350
  return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4};
1330
1351
  },
1331
1352
  whiteLabel: [{vendor: 'TUYATEC', model: 'GDKES-04TZXD'}, {vendor: 'Vizo', model: 'VZ-222S'},
1332
- {vendor: 'MakeGood', model: 'MG-ZG04W/B/G'}],
1353
+ {vendor: 'MakeGood', model: 'MG-ZG04W/B/G'}, {vendor: 'Mercator Ikuü', model: 'SSW04'}],
1333
1354
  meta: {multiEndpoint: true},
1334
1355
  configure: async (device, coordinatorEndpoint, logger) => {
1335
1356
  try {
@@ -1517,7 +1538,8 @@ module.exports = [
1517
1538
  exposes: [e.battery(), e.illuminance(), e.illuminance_lux()],
1518
1539
  },
1519
1540
  {
1520
- fingerprint: [{modelID: 'TS0210', manufacturerName: '_TYZB01_3zv6oleo'}],
1541
+ fingerprint: [{modelID: 'TS0210', manufacturerName: '_TYZB01_3zv6oleo'},
1542
+ {modelID: 'TS0210', manufacturerName: '_TYZB01_j9xxahcl'}],
1521
1543
  model: 'TS0210',
1522
1544
  vendor: 'TuYa',
1523
1545
  description: 'Vibration sensor',