zigbee-herdsman-converters 14.0.350 → 14.0.354

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.
@@ -5114,11 +5114,10 @@ const converters = {
5114
5114
  let buttonLookup = null;
5115
5115
  if (['WXKG02LM_rev2', 'WXKG07LM', 'WXKG17LM'].includes(model.model)) buttonLookup = {1: 'left', 2: 'right', 3: 'both'};
5116
5116
  if (['QBKG12LM', 'QBKG24LM'].includes(model.model)) buttonLookup = {5: 'left', 6: 'right', 7: 'both'};
5117
- if (['QBKG25LM'].includes(model.model)) buttonLookup = {41: 'left', 42: 'center', 43: 'right'};
5118
5117
  if (['QBKG39LM', 'QBKG41LM', 'WS-EUK02', 'WS-EUK04', 'QBKG20LM', 'QBKG31LM'].includes(model.model)) {
5119
5118
  buttonLookup = {41: 'left', 42: 'right', 51: 'both'};
5120
5119
  }
5121
- if (['QBKG26LM', 'QBKG34LM'].includes(model.model)) {
5120
+ if (['QBKG25LM', 'QBKG26LM', 'QBKG34LM'].includes(model.model)) {
5122
5121
  buttonLookup = {
5123
5122
  41: 'left', 42: 'center', 43: 'right',
5124
5123
  51: 'left_center', 52: 'left_right', 53: 'center_right',
@@ -1982,9 +1982,9 @@ const converters = {
1982
1982
  xiaomi_switch_power_outage_memory: {
1983
1983
  key: ['power_outage_memory'],
1984
1984
  convertSet: async (entity, key, value, meta) => {
1985
- if (['ZNCZ04LM', 'QBKG25LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM', 'QBKG39LM', 'QBKG41LM', 'ZNCZ15LM',
1986
- 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG31LM', 'QBCZ15LM', 'QBKG20LM', 'QBKG38LM',
1987
- 'QBKG34LM', 'QBCZ14LM', 'QBKG19LM', 'QBKG40LM', 'QBKG41LM'].includes(meta.mapped.model)) {
1985
+ if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
1986
+ 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
1987
+ 'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM'].includes(meta.mapped.model)) {
1988
1988
  await entity.write('aqaraOpple', {0x0201: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
1989
1989
  } else if (['ZNCZ02LM', 'QBCZ11LM'].includes(meta.mapped.model)) {
1990
1990
  const payload = value ?
@@ -2005,9 +2005,9 @@ const converters = {
2005
2005
  return {state: {power_outage_memory: value}};
2006
2006
  },
2007
2007
  convertGet: async (entity, key, meta) => {
2008
- if (['ZNCZ04LM', 'QBKG25LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM', 'QBKG39LM', 'QBKG41LM', 'ZNCZ15LM',
2009
- 'WS-EUK02', 'WS-EUK01', 'QBKG31LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM', 'QBKG34LM', 'QBKG19LM',
2010
- 'QBKG38LM', 'QBKG40LM', 'QBKG41LM'].includes(meta.mapped.model)) {
2008
+ if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
2009
+ 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2010
+ 'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM'].includes(meta.mapped.model)) {
2011
2011
  await entity.read('aqaraOpple', [0x0201]);
2012
2012
  } else if (['ZNCZ02LM', 'QBCZ11LM', 'ZNCZ11LM'].includes(meta.mapped.model)) {
2013
2013
  await entity.read('aqaraOpple', [0xFFF0]);
@@ -2105,8 +2105,8 @@ const converters = {
2105
2105
  xiaomi_led_disabled_night: {
2106
2106
  key: ['led_disabled_night'],
2107
2107
  convertSet: async (entity, key, value, meta) => {
2108
- if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM', 'QBKG25LM', 'QBKG19LM', 'DLKZMK11LM',
2109
- 'QBKG34LM'].includes(meta.mapped.model)) {
2108
+ if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2109
+ 'QBKG34LM', 'DLKZMK11LM'].includes(meta.mapped.model)) {
2110
2110
  await entity.write('aqaraOpple', {0x0203: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
2111
2111
  } else if (['ZNCZ11LM'].includes(meta.mapped.model)) {
2112
2112
  const payload = value ?
@@ -2120,8 +2120,8 @@ const converters = {
2120
2120
  return {state: {led_disabled_night: value}};
2121
2121
  },
2122
2122
  convertGet: async (entity, key, meta) => {
2123
- if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM', 'QBKG25LM', 'QBKG19LM', 'DLKZMK11LM',
2124
- 'QBKG34LM'].includes(meta.mapped.model)) {
2123
+ if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
2124
+ 'QBKG34LM', 'DLKZMK11LM'].includes(meta.mapped.model)) {
2125
2125
  await entity.read('aqaraOpple', [0x0203], manufacturerOptions.xiaomi);
2126
2126
  } else {
2127
2127
  throw new Error('Not supported');
package/devices/ikea.js CHANGED
@@ -546,7 +546,12 @@ module.exports = [
546
546
  toZigbee: [],
547
547
  ota: ota.tradfri,
548
548
  meta: {battery: {dontDividePercentage: true}},
549
- configure: configureRemote,
549
+ configure: async (device, coordinatorEndpoint, logger) => {
550
+ // Binding genOnOff is not required to make device send events.
551
+ const endpoint = device.getEndpoint(1);
552
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
553
+ await reporting.batteryPercentageRemaining(endpoint);
554
+ },
550
555
  },
551
556
  {
552
557
  zigbeeModel: ['TRADFRI on/off switch'],
@@ -596,7 +601,12 @@ module.exports = [
596
601
  toZigbee: [],
597
602
  ota: ota.tradfri,
598
603
  meta: {disableActionGroup: true, battery: {dontDividePercentage: true}},
599
- configure: configureRemote,
604
+ configure: async (device, coordinatorEndpoint, logger) => {
605
+ // Binding genOnOff is not required to make device send events.
606
+ const endpoint = device.getEndpoint(1);
607
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
608
+ await reporting.batteryPercentageRemaining(endpoint);
609
+ },
600
610
  },
601
611
  {
602
612
  zigbeeModel: ['SYMFONISK Sound Controller'],
@@ -35,6 +35,21 @@ module.exports = [
35
35
  },
36
36
  exposes: [e.lock(), e.battery()],
37
37
  },
38
+ {
39
+ zigbeeModel: ['SMARTCODE_DEADBOLT_10_W3'],
40
+ model: '99140-031',
41
+ vendor: 'Kwikset',
42
+ description: 'SmartCode traditional electronic deadbolt',
43
+ fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery],
44
+ toZigbee: [tz.lock],
45
+ configure: async (device, coordinatorEndpoint, logger) => {
46
+ const endpoint = device.getEndpoint(2);
47
+ await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
48
+ await reporting.lockState(endpoint);
49
+ await reporting.batteryPercentageRemaining(endpoint);
50
+ },
51
+ exposes: [e.lock(), e.battery()],
52
+ },
38
53
  {
39
54
  zigbeeModel: ['SMARTCODE_DEADBOLT_5'],
40
55
  model: '99100-045',
package/devices/lellki.js CHANGED
@@ -142,4 +142,31 @@ module.exports = [
142
142
  .withDescription('Recover state after power outage')],
143
143
  onEvent: tuya.onEventMeasurementPoll,
144
144
  },
145
+ {
146
+ fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_c7nc9w3c'}],
147
+ model: 'WP30-EU',
148
+ description: 'Power cord 4 sockets EU (with power monitoring)',
149
+ vendor: 'LELLKI',
150
+ extend: extend.switch(),
151
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
152
+ toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
153
+ configure: async (device, coordinatorEndpoint, logger) => {
154
+ const endpoint = device.getEndpoint(1);
155
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
156
+ await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
157
+ await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
158
+ endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
159
+ endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
160
+ device.save();
161
+ },
162
+ options: [exposes.options.measurement_poll_interval()],
163
+ exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
164
+ e.switch().withEndpoint('l3'), e.power(), e.current(), e.voltage().withAccess(ea.STATE),
165
+ e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
166
+ .withDescription('Recover state after power outage')],
167
+ endpoint: (device) => {
168
+ return {l1: 1, l2: 2, l3: 3};
169
+ },
170
+ onEvent: tuya.onEventMeasurementPoll,
171
+ },
145
172
  ];
package/devices/owon.js CHANGED
@@ -102,4 +102,23 @@ module.exports = [
102
102
  device.save();
103
103
  },
104
104
  },
105
+ {
106
+ zigbeeModel: ['THS317-ET'],
107
+ model: 'THS317-ET',
108
+ vendor: 'OWON',
109
+ description: 'Temperature and humidity sensor',
110
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery],
111
+ toZigbee: [],
112
+ exposes: [e.battery(), e.temperature(), e.humidity()],
113
+ configure: async (device, coordinatorEndpoint, logger) => {
114
+ const endpoint = device.getEndpoint(2);
115
+ await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg']);
116
+ await reporting.temperature(endpoint);
117
+ await reporting.humidity(endpoint);
118
+ await reporting.batteryVoltage(endpoint);
119
+ await reporting.batteryPercentageRemaining(endpoint);
120
+ device.powerSource = 'Battery';
121
+ device.save();
122
+ },
123
+ },
105
124
  ];
@@ -1104,7 +1104,7 @@ module.exports = [
1104
1104
  ota: ota.zigbeeOTA,
1105
1105
  },
1106
1106
  {
1107
- zigbeeModel: ['LCW002', '4090230P9'],
1107
+ zigbeeModel: ['LCW002', '4090230P9', '929003053101'],
1108
1108
  model: '4090230P9',
1109
1109
  vendor: 'Philips',
1110
1110
  description: 'Hue Liane',
@@ -1457,9 +1457,18 @@ module.exports = [
1457
1457
  zigbeeModel: ['1746430P7'],
1458
1458
  model: '1746430P7',
1459
1459
  vendor: 'Philips',
1460
- description: 'Hue outdoor Resonate wall lamp',
1460
+ description: 'Hue outdoor Resonate wall lamp (black)',
1461
1461
  meta: {turnsOffAtBrightness1: true},
1462
- extend: hueExtend.light_onoff_brightness_colortemp_color(),
1462
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1463
+ ota: ota.zigbeeOTA,
1464
+ },
1465
+ {
1466
+ zigbeeModel: ['1746447P7'],
1467
+ model: '1746447P7',
1468
+ vendor: 'Philips',
1469
+ description: 'Hue outdoor Resonate wall lamp (silver)',
1470
+ meta: {turnsOffAtBrightness1: true},
1471
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1463
1472
  ota: ota.zigbeeOTA,
1464
1473
  },
1465
1474
  {
@@ -8,6 +8,21 @@ const e = exposes.presets;
8
8
  const ea = exposes.access;
9
9
 
10
10
  module.exports = [
11
+ {
12
+ zigbeeModel: ['NHPB/SHUTTER/1'],
13
+ model: 'S520567',
14
+ vendor: 'Schneider Electric',
15
+ description: 'Roller shutter',
16
+ fromZigbee: [fz.cover_position_tilt],
17
+ toZigbee: [tz.cover_position_tilt, tz.cover_state],
18
+ exposes: [e.cover_position()],
19
+ meta: {coverInverted: true},
20
+ configure: async (device, coordinatorEndpoint, logger) => {
21
+ const endpoint = device.getEndpoint(5);
22
+ await reporting.bind(endpoint, coordinatorEndpoint, ['closuresWindowCovering']);
23
+ await reporting.currentPositionLiftPercentage(endpoint);
24
+ },
25
+ },
11
26
  {
12
27
  zigbeeModel: ['iTRV'],
13
28
  model: 'WV704R0A0902',
package/devices/siglis.js CHANGED
@@ -1,9 +1,46 @@
1
- const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
2
- const tz = require('zigbee-herdsman-converters/converters/toZigbee');
3
- const exposes = require('zigbee-herdsman-converters/lib/exposes');
4
- const reporting = require('zigbee-herdsman-converters/lib/reporting');
1
+ const fz = require('../converters/fromZigbee');
2
+ const tz = require('../converters/toZigbee');
3
+ const exposes = require('../lib/exposes');
4
+ const reporting = require('../lib/reporting');
5
5
  const e = exposes.presets;
6
6
 
7
+ const siglisManufacturerCode = 0x129C;
8
+ const zigfredEndpoint = 5;
9
+
10
+ const zifgredFromZigbee = {
11
+ cluster: 'manuSpecificSiglisZigfred',
12
+ type: ['attributeReport'],
13
+ convert: (model, msg, publish, options, meta) => {
14
+ const buttonEvent = msg.data['buttonEvent'];
15
+
16
+ if (buttonEvent != null) {
17
+ const buttonLookup = {
18
+ 0: 'button_1',
19
+ 1: 'button_2',
20
+ 2: 'button_3',
21
+ 3: 'button_4',
22
+ };
23
+
24
+ const actionLookup = {
25
+ 0: 'release',
26
+ 1: 'single',
27
+ 2: 'double',
28
+ 3: 'hold',
29
+ };
30
+
31
+ const button = buttonEvent & 0xff;
32
+ const state = (buttonEvent >> 8) & 0xff;
33
+
34
+ const buttonName = buttonLookup[button];
35
+ const stateName = actionLookup[state];
36
+
37
+ if (buttonName && stateName) {
38
+ const action = `${buttonName}_${stateName}`;
39
+ return {action};
40
+ }
41
+ }
42
+ },
43
+ };
7
44
 
8
45
  module.exports = [
9
46
  {
@@ -11,27 +48,67 @@ module.exports = [
11
48
  model: 'ZFU-1D-CH',
12
49
  vendor: 'Siglis',
13
50
  description: 'zigfred uno smart in-wall switch',
14
- exposes: [e.light_brightness_colorxy().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.light_brightness().withEndpoint('l3')],
15
- fromZigbee: [fz.color_colortemp, fz.on_off, fz.brightness, fz.level_config, fz.power_on_behavior, fz.ignore_basic_report],
16
- toZigbee: [tz.light_onoff_brightness, tz.light_color, tz.ignore_transition, tz.ignore_rate, tz.light_brightness_move,
17
- tz.light_brightness_step, tz.level_config, tz.power_on_behavior, tz.light_hue_saturation_move,
18
- tz.light_hue_saturation_step, tz.light_color_options, tz.light_color_mode],
51
+ exposes: [e.light_brightness_colorxy().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.light_brightness().withEndpoint('l3'),
52
+ e.action([
53
+ 'button_1_single', 'button_1_double', 'button_1_hold', 'button_1_release',
54
+ 'button_2_single', 'button_2_double', 'button_2_hold', 'button_2_release',
55
+ 'button_3_single', 'button_3_double', 'button_3_hold', 'button_3_release',
56
+ 'button_4_single', 'button_4_double', 'button_4_hold', 'button_4_release',
57
+ ])],
58
+ fromZigbee: [
59
+ zifgredFromZigbee,
60
+ fz.color_colortemp,
61
+ fz.on_off,
62
+ fz.brightness,
63
+ fz.level_config,
64
+ fz.power_on_behavior,
65
+ fz.ignore_basic_report,
66
+ ],
67
+ toZigbee: [
68
+ tz.light_onoff_brightness,
69
+ tz.light_color,
70
+ tz.ignore_transition,
71
+ tz.ignore_rate,
72
+ tz.light_brightness_move,
73
+ tz.light_brightness_step,
74
+ tz.level_config,
75
+ tz.power_on_behavior,
76
+ tz.light_hue_saturation_move,
77
+ tz.light_hue_saturation_step,
78
+ tz.light_color_options,
79
+ tz.light_color_mode,
80
+ ],
19
81
  meta: {multiEndpoint: true},
20
82
  endpoint: (device) => {
21
- return {'l1': 5, 'l2': 6, 'l3': 7};
83
+ return {
84
+ 'l1': zigfredEndpoint,
85
+ 'l2': 6,
86
+ 'l3': 7,
87
+ };
22
88
  },
23
89
  configure: async (device, coordinatorEndpoint, logger) => {
24
- const controlEp = device.getEndpoint(5);
90
+ const controlEp = device.getEndpoint(zigfredEndpoint);
25
91
  const relayEp = device.getEndpoint(6);
26
92
  const dimmerEp = device.getEndpoint(7);
93
+
27
94
  // Bind Control EP (LED)
28
95
  await reporting.bind(controlEp, coordinatorEndpoint, ['genOnOff']);
29
96
  await reporting.bind(controlEp, coordinatorEndpoint, ['genLevelCtrl']);
30
97
  await reporting.onOff(controlEp);
31
98
  await reporting.brightness(controlEp);
99
+ await reporting.bind(controlEp, coordinatorEndpoint, ['manuSpecificSiglisZigfred']);
100
+ const payload = [{
101
+ attribute: 'buttonEvent',
102
+ minimumReportInterval: 0,
103
+ maximumReportInterval: 0,
104
+ reportableChange: 0,
105
+ }];
106
+ await controlEp.configureReporting('manuSpecificSiglisZigfred', payload, {manufacturerCode: siglisManufacturerCode});
107
+
32
108
  // Bind Relay EP
33
109
  await reporting.bind(relayEp, coordinatorEndpoint, ['genOnOff']);
34
110
  await reporting.onOff(relayEp);
111
+
35
112
  // Bind Dimmer EP
36
113
  await reporting.bind(dimmerEp, coordinatorEndpoint, ['genOnOff']);
37
114
  await reporting.bind(dimmerEp, coordinatorEndpoint, ['genLevelCtrl']);
package/devices/sinope.js CHANGED
@@ -35,15 +35,28 @@ module.exports = [
35
35
 
36
36
  try {
37
37
  await reporting.thermostatSystemMode(endpoint);
38
+ } catch (error) {/* Not all support this */}
39
+
40
+ try {
38
41
  await reporting.thermostatRunningState(endpoint);
39
- await reporting.readMeteringMultiplierDivisor(endpoint);
40
- await reporting.currentSummDelivered(endpoint, {min: 10, max: 303, change: [1, 1]});
42
+ } catch (error) {/* Not all support this */}
43
+
44
+ await reporting.readMeteringMultiplierDivisor(endpoint);
45
+ await reporting.currentSummDelivered(endpoint, {min: 10, max: 303, change: [1, 1]});
46
+ try {
41
47
  await reporting.instantaneousDemand(endpoint, {min: 10, max: 304, change: 1});
42
- await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
48
+ } catch (error) {/* Do nothing*/}
49
+
50
+ await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
51
+ try {
43
52
  await reporting.activePower(endpoint, {min: 10, max: 305, change: 1});
53
+ } catch (error) {/* Do nothing*/}
54
+ try {
44
55
  await reporting.rmsCurrent(endpoint, {min: 10, max: 306, change: 100}); // divider 1000: 0.1Arms
56
+ } catch (error) {/* Do nothing*/}
57
+ try {
45
58
  await reporting.rmsVoltage(endpoint, {min: 10, max: 307, change: 5}); // divider 10: 0.5Vrms
46
- } catch (error) {/* Not all support this */}
59
+ } catch (error) {/* Do nothing*/}
47
60
 
48
61
  // Disable default reporting
49
62
  await reporting.temperature(endpoint, {min: 1, max: 0xFFFF});
@@ -121,7 +134,7 @@ module.exports = [
121
134
  tz.sinope_thermostat_enable_outdoor_temperature, tz.sinope_thermostat_outdoor_temperature, tz.sinope_floor_control_mode,
122
135
  tz.sinope_ambiant_max_heat_setpoint, tz.sinope_floor_min_heat_setpoint, tz.sinope_floor_max_heat_setpoint,
123
136
  tz.sinope_temperature_sensor, tz.sinope_time_format],
124
- exposes: [e.local_temperature(), e.keypad_lockout(),
137
+ exposes: [e.local_temperature(), e.keypad_lockout(), e.power(), e.current(), e.voltage(),
125
138
  exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5).withLocalTemperature()
126
139
  .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat']).withPiHeatingDemand(),
127
140
  exposes.enum('backlight_auto_dim', ea.SET, ['on demand', 'sensing']).withDescription('Control backlight dimming behavior')],
package/devices/sonoff.js CHANGED
@@ -70,11 +70,11 @@ module.exports = [
70
70
  exposes: [e.battery(), e.action(['single', 'double', 'long'])],
71
71
  fromZigbee: [fz.ewelink_action, fz.battery],
72
72
  toZigbee: [],
73
- meta: {battery: {voltageToPercentage: '3V_2500'}},
74
73
  configure: async (device, coordinatorEndpoint, logger) => {
75
74
  const endpoint = device.getEndpoint(1);
76
75
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genPowerCfg']);
77
76
  await reporting.batteryVoltage(endpoint);
77
+ await reporting.batteryPercentageRemaining(endpoint);
78
78
  },
79
79
  },
80
80
  {
@@ -126,12 +126,12 @@ module.exports = [
126
126
  description: 'Motion sensor',
127
127
  fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery],
128
128
  toZigbee: [],
129
- meta: {battery: {voltageToPercentage: '3V_2500'}},
130
129
  configure: async (device, coordinatorEndpoint, logger) => {
131
130
  const endpoint = device.getEndpoint(1);
132
131
  const bindClusters = ['genPowerCfg'];
133
132
  await reporting.bind(endpoint, coordinatorEndpoint, bindClusters);
134
133
  await reporting.batteryVoltage(endpoint);
134
+ await reporting.batteryPercentageRemaining(endpoint);
135
135
  },
136
136
  exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
137
137
  },
package/devices/tuya.js CHANGED
@@ -9,8 +9,9 @@ const e = exposes.presets;
9
9
  const ea = exposes.access;
10
10
 
11
11
 
12
- const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak', '_TZ3000_ew3ldmgx',
13
- '_TZ3000_jvzvulen', '_TZ3000_mraovvmm', '_TZ3000_nfnmi125', '_TZ3000_ps3dmato', '_TZ3000_w0qqde0g', '_TZ3000_u5u4cakc'];
12
+ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak', '_TZ3000_ew3ldmgx', '_TZ3000_gjnozsaz',
13
+ '_TZ3000_jvzvulen', '_TZ3000_mraovvmm', '_TZ3000_nfnmi125', '_TZ3000_ps3dmato', '_TZ3000_w0qqde0g', '_TZ3000_u5u4cakc',
14
+ '_TZ3000_rdtixbnu'];
14
15
 
15
16
  module.exports = [
16
17
  {
@@ -125,6 +126,7 @@ module.exports = [
125
126
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_x2fqbdun'},
126
127
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_589kq4ul'},
127
128
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_1mtktxdk'},
129
+ {modelID: 'TS0505B', manufacturerName: '_TZ3210_remypqqm'},
128
130
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_0rn9qhnu'},
129
131
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_bicjqpg4'},
130
132
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_cmaky9gq'},
@@ -844,6 +846,7 @@ module.exports = [
844
846
  whiteLabel: [
845
847
  {vendor: 'Moes', model: 'TV01-ZB'},
846
848
  {vendor: 'Tesla Smart', model: 'TSL-TRV-TV01ZG'},
849
+ {vendor: 'Unknown/id3.pl', model: 'GTZ08'},
847
850
  ],
848
851
  ota: ota.zigbeeOTA,
849
852
  fromZigbee: [fz.ignore_basic_report, fz.ignore_tuya_set_time, fz.tvtwo_thermostat],
@@ -1187,7 +1190,7 @@ module.exports = [
1187
1190
  exposes: [e.humidity(), e.temperature(), e.battery()],
1188
1191
  },
1189
1192
  {
1190
- fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_l8fsgo6p'}],
1193
+ fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_l8fsgo6p'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}],
1191
1194
  zigbeeModel: ['TS0011'],
1192
1195
  model: 'TS0011',
1193
1196
  vendor: 'TuYa',
@@ -1207,7 +1210,7 @@ module.exports = [
1207
1210
  },
1208
1211
  },
1209
1212
  {
1210
- fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'},
1213
+ fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'},
1211
1214
  {modelID: 'TS0011', manufacturerName: '_TZ3000_txpirhfq'}],
1212
1215
  model: 'TS0011_switch_module',
1213
1216
  vendor: 'TuYa',
package/devices/xiaomi.js CHANGED
@@ -584,7 +584,7 @@ module.exports = [
584
584
  model: 'QBKG25LM',
585
585
  vendor: 'Xiaomi',
586
586
  description: 'Aqara D1 3 gang smart wall switch (no neutral wire)',
587
- fromZigbee: [fz.on_off, fz.legacy.QBKG25LM_click, fz.aqara_opple],
587
+ fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
588
588
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
589
589
  tz.aqara_switch_mode_switch],
590
590
  meta: {multiEndpoint: true},
@@ -607,9 +607,9 @@ module.exports = [
607
607
  'Quick mode makes the device respond faster.'),
608
608
  e.power_outage_memory(), e.led_disabled_night(), e.temperature().withAccess(ea.STATE),
609
609
  e.action([
610
- 'left_single', 'left_double', 'left_triple', 'left_hold', 'left_release',
611
- 'center_single', 'center_double', 'center_triple', 'center_hold', 'center_release',
612
- 'right_single', 'right_double', 'right_triple', 'right_hold', 'right_release']),
610
+ 'left_single', 'left_double', 'center_single', 'center_double', 'right_single', 'right_double',
611
+ 'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
612
+ 'single_center_right', 'double_center_right', 'single_all', 'double_all']),
613
613
  ],
614
614
  onEvent: preventReset,
615
615
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -622,11 +622,8 @@ module.exports = [
622
622
  model: 'QBKG26LM',
623
623
  vendor: 'Xiaomi',
624
624
  description: 'Aqara D1 3 gang smart wall switch (with neutral wire)',
625
- extend: extend.switch(),
626
625
  exposes: [
627
- e.switch().withEndpoint('left'),
628
- e.switch().withEndpoint('center'),
629
- e.switch().withEndpoint('right'),
626
+ e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right'),
630
627
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
631
628
  .withDescription('Decoupled mode for left button')
632
629
  .withEndpoint('left'),
@@ -636,27 +633,22 @@ module.exports = [
636
633
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
637
634
  .withDescription('Decoupled mode for right button')
638
635
  .withEndpoint('right'),
639
- e.power().withAccess(ea.STATE), e.action([
640
- 'hold_left', 'single_left', 'double_left', 'triple_left', 'release_left',
641
- 'hold_center', 'single_center', 'double_center', 'triple_center', 'release_center',
642
- 'hold_right', 'single_right', 'double_right', 'triple_right', 'release_right',
636
+ e.power().withAccess(ea.STATE), e.power_outage_memory(), e.led_disabled_night(),
637
+ e.temperature().withAccess(ea.STATE),
638
+ e.action([
639
+ 'single_left', 'double_left', 'single_center', 'double_center', 'single_right', 'double_right',
643
640
  'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
644
641
  'single_center_right', 'double_center_right', 'single_all', 'double_all']),
645
642
  ],
646
- fromZigbee: [fz.on_off, fz.aqara_opple, fz.xiaomi_multistate_action, fz.xiaomi_power],
647
- toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple],
643
+ fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple, fz.xiaomi_multistate_action],
644
+ toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
645
+ tz.xiaomi_led_disabled_night],
648
646
  meta: {multiEndpoint: true},
649
647
  endpoint: (device) => {
650
- return {'left': 1, 'center': 2, 'right': 3, 'system': 1};
648
+ return {'left': 1, 'center': 2, 'right': 3};
651
649
  },
652
650
  configure: async (device, coordinatorEndpoint, logger) => {
653
651
  await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
654
- await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
655
- await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
656
- await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
657
- await reporting.onOff(device.getEndpoint(1));
658
- await reporting.onOff(device.getEndpoint(2));
659
- await reporting.onOff(device.getEndpoint(3));
660
652
  },
661
653
  onEvent: preventReset,
662
654
  },
@@ -1725,6 +1717,7 @@ module.exports = [
1725
1717
  configure: async (device, coordinatorEndpoint, logger) => {
1726
1718
  await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
1727
1719
  },
1720
+ ota: ota.zigbeeOTA,
1728
1721
  },
1729
1722
  {
1730
1723
  zigbeeModel: ['lumi.magnet.agl02'],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.350",
3
+ "version": "14.0.354",
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.350",
3
+ "version": "14.0.354",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [