zigbee-herdsman-converters 15.0.84 → 15.0.86

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/devices/bosch.js CHANGED
@@ -46,6 +46,12 @@ const displayOrientation = {
46
46
  'flipped': 1,
47
47
  };
48
48
 
49
+ // Radiator Thermostat II
50
+ const displayedTemperature = {
51
+ 'target': 0,
52
+ 'measured': 1,
53
+ };
54
+
49
55
  // Radiator Thermostat II
50
56
  const tzLocal = {
51
57
  bwa1: {
@@ -69,7 +75,7 @@ const tzLocal = {
69
75
  },
70
76
  },
71
77
  bosch_thermostat: {
72
- key: ['window_open', 'boost', 'system_mode', 'pi_heating_demand'],
78
+ key: ['window_open', 'boost', 'system_mode', 'pi_heating_demand', 'remote_temperature'],
73
79
  convertSet: async (entity, key, value, meta) => {
74
80
  if (key === 'window_open') {
75
81
  value = value.toUpperCase();
@@ -105,6 +111,12 @@ const tzLocal = {
105
111
  boschManufacturer);
106
112
  return {state: {pi_heating_demand: value}};
107
113
  }
114
+ if (key === 'remote_temperature') {
115
+ const remoteTemperature = (Math.round((value * 2).toFixed(1)) / 2).toFixed(1) * 100;
116
+ await entity.write('hvacThermostat',
117
+ {0x4040: {value: remoteTemperature, type: herdsman.Zcl.DataType.int16}}, boschManufacturer);
118
+ return {state: {remote_temperature: value}};
119
+ }
108
120
  },
109
121
  convertGet: async (entity, key, meta) => {
110
122
  switch (key) {
@@ -120,6 +132,9 @@ const tzLocal = {
120
132
  case 'pi_heating_demand':
121
133
  await entity.read('hvacThermostat', [0x4020], boschManufacturer);
122
134
  break;
135
+ case 'remote_temperature':
136
+ await entity.read('hvacThermostat', [0x4040], boschManufacturer);
137
+ break;
123
138
 
124
139
  default: // Unknown key
125
140
  throw new Error(`Unhandled key toZigbee.bosch_thermostat.convertGet ${key}`);
@@ -127,7 +142,7 @@ const tzLocal = {
127
142
  },
128
143
  },
129
144
  bosch_userInterface: {
130
- key: ['display_orientation', 'display_ontime', 'display_brightness', 'child_lock'],
145
+ key: ['display_orientation', 'display_ontime', 'display_brightness', 'child_lock', 'displayed_temperature'],
131
146
  convertSet: async (entity, key, value, meta) => {
132
147
  if (key === 'display_orientation') {
133
148
  const index = displayOrientation[value];
@@ -147,6 +162,11 @@ const tzLocal = {
147
162
  await entity.write('hvacUserInterfaceCfg', {keypadLockout});
148
163
  return {state: {child_lock: value}};
149
164
  }
165
+ if (key === 'displayed_temperature') {
166
+ const index = displayedTemperature[value];
167
+ await entity.write('hvacUserInterfaceCfg', {0x4039: {value: index, type: herdsman.Zcl.DataType.enum8}}, boschManufacturer);
168
+ return {state: {displayed_temperature: value}};
169
+ }
150
170
  },
151
171
  convertGet: async (entity, key, meta) => {
152
172
  switch (key) {
@@ -162,6 +182,9 @@ const tzLocal = {
162
182
  case 'child_lock':
163
183
  await entity.read('hvacUserInterfaceCfg', ['keypadLockout']);
164
184
  break;
185
+ case 'displayed_temperature':
186
+ await entity.read('hvacUserInterfaceCfg', [0x4039], boschManufacturer);
187
+ break;
165
188
  default: // Unknown key
166
189
  throw new Error(`Unhandled key toZigbee.bosch_userInterface.convertGet ${key}`);
167
190
  }
@@ -281,6 +304,9 @@ const fzLocal = {
281
304
  convert: (model, msg, publish, options, meta) => {
282
305
  const result = {};
283
306
  const data = msg.data;
307
+ if (data.hasOwnProperty(0x4040)) {
308
+ result.remote_temperature = utils.precisionRound(data[0x4040], 2) / 100;
309
+ }
284
310
  if (data.hasOwnProperty(0x4042)) {
285
311
  result.window_open = (Object.keys(stateOffOn)[data[0x4042]]);
286
312
  }
@@ -293,6 +319,7 @@ const fzLocal = {
293
319
  }
294
320
  if (data.hasOwnProperty(0x4020)) {
295
321
  result.pi_heating_demand = data[0x4020];
322
+ result.running_state = result.pi_heating_demand >= 10 ? 'heat' : 'idle';
296
323
  }
297
324
 
298
325
  return result;
@@ -307,6 +334,9 @@ const fzLocal = {
307
334
  if (data.hasOwnProperty(0x400b)) {
308
335
  result.display_orientation = (Object.keys(displayOrientation)[data[0x400b]]);
309
336
  }
337
+ if (data.hasOwnProperty(0x4039)) {
338
+ result.displayed_temperature = (Object.keys(displayedTemperature)[data[0x4039]]);
339
+ }
310
340
  if (data.hasOwnProperty(0x403a)) {
311
341
  result.display_ontime = data[0x403a];
312
342
  }
@@ -529,13 +559,21 @@ const definition = [
529
559
  .withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
530
560
  .withLocalTemperatureCalibration(-5, 5, 0.1)
531
561
  .withSystemMode(['off', 'heat', 'auto'])
532
- .withPiHeatingDemand(ea.ALL),
562
+ .withPiHeatingDemand(ea.ALL)
563
+ .withRunningState(['idle', 'heat'], ea.STATE),
533
564
  exposes.binary('boost', ea.ALL, 'ON', 'OFF')
534
565
  .withDescription('Activate Boost heating'),
535
566
  exposes.binary('window_open', ea.ALL, 'ON', 'OFF')
536
567
  .withDescription('Window open'),
537
568
  exposes.enum('display_orientation', ea.ALL, Object.keys(displayOrientation))
538
569
  .withDescription('Display orientation'),
570
+ exposes.numeric('remote_temperature', ea.ALL)
571
+ .withValueMin(0)
572
+ .withValueMax(30)
573
+ .withValueStep(0.1)
574
+ .withUnit('°C')
575
+ .withDescription('Input for remote temperature sensor. ' +
576
+ 'Setting this will disable the internal temperature sensor until batteries are removed!'),
539
577
  exposes.numeric('display_ontime', ea.ALL)
540
578
  .withValueMin(5)
541
579
  .withValueMax(30)
@@ -544,6 +582,8 @@ const definition = [
544
582
  .withValueMin(0)
545
583
  .withValueMax(10)
546
584
  .withDescription('Specifies the brightness value of the display'),
585
+ exposes.enum('displayed_temperature', ea.ALL, Object.keys(displayedTemperature))
586
+ .withDescription('Temperature displayed on the thermostat'),
547
587
  e.child_lock().setAccess('state', ea.ALL),
548
588
  e.battery(),
549
589
  ],
@@ -585,10 +625,10 @@ const definition = [
585
625
  }], boschManufacturer);
586
626
 
587
627
  await endpoint.read('hvacThermostat', ['localTemperatureCalibration']);
588
- await endpoint.read('hvacThermostat', [0x4007, 0x4020, 0x4042, 0x4043], boschManufacturer);
628
+ await endpoint.read('hvacThermostat', [0x4007, 0x4020, 0x4040, 0x4042, 0x4043], boschManufacturer);
589
629
 
590
630
  await endpoint.read('hvacUserInterfaceCfg', ['keypadLockout']);
591
- await endpoint.read('hvacUserInterfaceCfg', [0x400b, 0x403a, 0x403b], boschManufacturer);
631
+ await endpoint.read('hvacUserInterfaceCfg', [0x400b, 0x4039, 0x403a, 0x403b], boschManufacturer);
592
632
  },
593
633
  },
594
634
  {
package/devices/moes.js CHANGED
@@ -314,24 +314,6 @@ module.exports = [
314
314
  .withDescription('Boost Time Setting 100 sec - 900 sec, (default = 300 sec)').withValueMin(100)
315
315
  .withValueMax(900).withValueStep(100)],
316
316
  },
317
- {
318
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_e3oitdyu'}],
319
- model: 'MS-105B',
320
- vendor: 'Moes',
321
- description: 'Smart dimmer module (2 gang)',
322
- fromZigbee: [fz.moes_105_dimmer, fz.ignore_basic_report],
323
- toZigbee: [tz.moes_105_dimmer],
324
- meta: {turnsOffAtBrightness1: true, multiEndpoint: true},
325
- configure: async (device, coordinatorEndpoint, logger) => {
326
- await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
327
- if (device.getEndpoint(2)) await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
328
- },
329
- exposes: [e.light_brightness().withEndpoint('l1').setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET),
330
- e.light_brightness().withEndpoint('l2').setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET)],
331
- endpoint: (device) => {
332
- return {'l1': 1, 'l2': 1};
333
- },
334
- },
335
317
  {
336
318
  fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3000_7hcgjxpc'},
337
319
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_rcggc0ys'}],
package/devices/namron.js CHANGED
@@ -217,7 +217,16 @@ module.exports = [
217
217
  zigbeeModel: ['4512701'],
218
218
  model: '4512701',
219
219
  vendor: 'Namron',
220
- description: 'Zigbee 1 channel switch K2',
220
+ description: 'Zigbee 1 channel switch K2 (White)',
221
+ fromZigbee: [fz.command_on, fz.command_off, fz.battery, fz.command_move, fz.command_stop],
222
+ exposes: [e.battery(), e.action(['on', 'off', 'brightness_move_up', 'brightness_move_down', 'brightness_stop'])],
223
+ toZigbee: [],
224
+ },
225
+ {
226
+ zigbeeModel: ['4512728'],
227
+ model: '4512728',
228
+ vendor: 'Namron',
229
+ description: 'Zigbee 1 channel switch K2 (Black)',
221
230
  fromZigbee: [fz.command_on, fz.command_off, fz.battery, fz.command_move, fz.command_stop],
222
231
  exposes: [e.battery(), e.action(['on', 'off', 'brightness_move_up', 'brightness_move_down', 'brightness_stop'])],
223
232
  toZigbee: [],
@@ -24,6 +24,13 @@ module.exports = [
24
24
  description: 'Hue white ambiance bathroom ceiling light Adore with Bluetooth',
25
25
  extend: philips.extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
26
26
  },
27
+ {
28
+ zigbeeModel: ['929003056701'],
29
+ model: '929003056701',
30
+ vendor: 'Philips',
31
+ description: 'Hue white ambiance Adore ceiling light',
32
+ extend: philips.extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
33
+ },
27
34
  {
28
35
  zigbeeModel: ['929003045301_01', '929003045301_02', '929003045301_03'],
29
36
  model: '929003045301',
@@ -9,6 +9,11 @@ const ota = require('../lib/ota');
9
9
  const e = exposes.presets;
10
10
  const ea = exposes.access;
11
11
 
12
+ const exposesLocal = {
13
+ indicator_mode: exposes.enum('indicator_mode', ea.ALL, ['consistent_with_load', 'reverse_with_load', 'always_off', 'always_on'])
14
+ .withDescription('Led Indicator Mode'),
15
+ };
16
+
12
17
  const tzLocal = {
13
18
  lift_duration: {
14
19
  key: ['lift_duration'],
@@ -17,6 +22,20 @@ const tzLocal = {
17
22
  return {state: {lift_duration: value}};
18
23
  },
19
24
  },
25
+ indicator_mode: {
26
+ key: ['indicator_mode'],
27
+ convertSet: async (entity, key, value, meta) => {
28
+ const endpoint = entity.getDevice().getEndpoint(21);
29
+ const lookup = {'reverse_with_load': 2, 'consistent_with_load': 0, 'always_off': 3, 'always_on': 1};
30
+ utils.validateValue(value, Object.keys(lookup));
31
+ await endpoint.write(0xFF17, {0x0000: {value: lookup[value], type: 0x30}}, {manufacturerCode: 0x105e});
32
+ return {state: {indicator_mode: value}};
33
+ },
34
+ convertGet: async (entity, key, meta) => {
35
+ const endpoint = entity.getDevice().getEndpoint(21);
36
+ await endpoint.read(0xFF17, [0x0000], {manufacturerCode: 0x105e});
37
+ },
38
+ },
20
39
  };
21
40
 
22
41
  const fzLocal = {
@@ -170,6 +189,18 @@ const fzLocal = {
170
189
  return ret;
171
190
  },
172
191
  },
192
+ indicator_mode: {
193
+ cluster: 'clipsalWiserSwitchConfigurationClusterServer',
194
+ type: ['attributeReport', 'readResponse'],
195
+ convert: (model, msg, publish, options, meta) => {
196
+ const result = {};
197
+ const lookup = {0: 'consistent_with_load', 1: 'always_on', 2: 'reverse_with_load', 3: 'always_off'};
198
+ if ('indicator_mode' in msg.data) {
199
+ result.indicator_mode = lookup[msg.data['indicator_mode']];
200
+ }
201
+ return result;
202
+ },
203
+ },
173
204
  };
174
205
 
175
206
  module.exports = [
@@ -353,13 +384,14 @@ module.exports = [
353
384
  model: '41EPBDWCLMZ/354PBDMBTZ',
354
385
  vendor: 'Schneider Electric',
355
386
  description: 'Wiser 40/300-Series Module Dimmer',
356
- fromZigbee: [fz.on_off, fz.brightness, fz.level_config, fz.lighting_ballast_configuration],
357
- toZigbee: [tz.light_onoff_brightness, tz.level_config, tz.ballast_config],
387
+ fromZigbee: [fz.on_off, fz.brightness, fz.level_config, fz.lighting_ballast_configuration, fzLocal.indicator_mode],
388
+ toZigbee: [tz.light_onoff_brightness, tz.level_config, tz.ballast_config, tzLocal.indicator_mode],
358
389
  exposes: [e.light_brightness(),
359
390
  exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
360
391
  .withDescription('Specifies the minimum light output of the ballast'),
361
392
  exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
362
- .withDescription('Specifies the maximum light output of the ballast')],
393
+ .withDescription('Specifies the maximum light output of the ballast'),
394
+ exposesLocal.indicator_mode],
363
395
  configure: async (device, coordinatorEndpoint, logger) => {
364
396
  const endpoint = device.getEndpoint(3);
365
397
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
@@ -372,7 +404,12 @@ module.exports = [
372
404
  model: '41E2PBSWMZ/356PB2MBTZ',
373
405
  vendor: 'Schneider Electric',
374
406
  description: 'Wiser 40/300-Series module switch 2A',
375
- extend: extend.switch(),
407
+ ota: ota.zigbeeOTA,
408
+ extend: extend.switch( {
409
+ exposes: [exposesLocal.indicator_mode],
410
+ fromZigbee: [fzLocal.indicator_mode],
411
+ toZigbee: [tzLocal.indicator_mode],
412
+ }),
376
413
  configure: async (device, coordinatorEndpoint, logger) => {
377
414
  const endpoint = device.getEndpoint(1);
378
415
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
@@ -384,7 +421,11 @@ module.exports = [
384
421
  model: '41E10PBSWMZ-VW',
385
422
  vendor: 'Schneider Electric',
386
423
  description: 'Wiser 40/300-Series module switch 10A with ControlLink',
387
- extend: extend.switch(),
424
+ extend: extend.switch({
425
+ exposes: [exposesLocal.indicator_mode],
426
+ fromZigbee: [fzLocal.indicator_mode],
427
+ toZigbee: [tzLocal.indicator_mode],
428
+ }),
388
429
  configure: async (device, coordinatorEndpoint, logger) => {
389
430
  const endpoint = device.getEndpoint(1);
390
431
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
@@ -18,7 +18,7 @@ module.exports = [
18
18
  extend: extend.light_onoff_brightness_colortemp(),
19
19
  },
20
20
  {
21
- zigbeeModel: ['HOMA1002', 'HOMA0019', 'HOMA0006', 'HOMA000F', '019'],
21
+ zigbeeModel: ['HOMA1002', 'HOMA0019', 'HOMA0006', 'HOMA000F', '019', 'HOMA1004'],
22
22
  model: 'HLC610-Z',
23
23
  vendor: 'Shenzhen Homa',
24
24
  description: 'Wireless dimmable controller',
package/devices/tuya.js CHANGED
@@ -854,7 +854,7 @@ module.exports = [
854
854
  exposes: [e.carbon_monoxide(), e.co()],
855
855
  },
856
856
  {
857
- fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ggev5fsl', '_TZE200_u319yc66']),
857
+ fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ggev5fsl', '_TZE200_u319yc66', '_TZE204_yojqa8xn']),
858
858
  model: 'TS0601_gas_sensor_1',
859
859
  vendor: 'TuYa',
860
860
  description: 'Gas sensor',
@@ -1310,7 +1310,7 @@ module.exports = [
1310
1310
  ],
1311
1311
  },
1312
1312
  {
1313
- fingerprint: tuya.fingerprint('TS0601', ['_TZE200_fjjbhx9d']),
1313
+ fingerprint: tuya.fingerprint('TS0601', ['_TZE200_fjjbhx9d', '_TZE200_e3oitdyu']),
1314
1314
  model: 'TS0601_dimmer_2',
1315
1315
  vendor: 'TuYa',
1316
1316
  description: '2 gang smart dimmer',
@@ -1343,6 +1343,7 @@ module.exports = [
1343
1343
  },
1344
1344
  whiteLabel: [
1345
1345
  {vendor: 'Moes', model: 'ZS-EUD_2gang'},
1346
+ {vendor: 'Moes', model: 'MS-105B'}, // _TZE200_e3oitdyu
1346
1347
  ],
1347
1348
  },
1348
1349
  {
@@ -1450,7 +1451,7 @@ module.exports = [
1450
1451
  whiteLabel: [{vendor: 'LoraTap', model: 'SC400'}],
1451
1452
  exposes: [e.cover_position(), exposes.enum('moving', ea.STATE, ['UP', 'STOP', 'DOWN']),
1452
1453
  exposes.binary('calibration', ea.ALL, 'ON', 'OFF'), exposes.binary('motor_reversal', ea.ALL, 'ON', 'OFF'),
1453
- exposes.enum('backlight_mode', ea.ALL, ['LOW', 'MEDIUM', 'HIGH']),
1454
+ exposes.enum('backlight_mode', ea.ALL, ['low', 'medium', 'high']),
1454
1455
  exposes.numeric('calibration_time', ea.STATE).withUnit('S').withDescription('Calibration time')],
1455
1456
  },
1456
1457
  {
@@ -1999,11 +2000,12 @@ module.exports = [
1999
2000
  },
2000
2001
  },
2001
2002
  {
2002
- fingerprint: tuya.fingerprint('TS0002', ['_TZ3000_01gpyda5', '_TZ3000_bvrlqyj7', '_TZ3000_7ed9cqgi', '_TZ3000_zmy4lslw']),
2003
+ fingerprint: tuya.fingerprint('TS0002', ['_TZ3000_01gpyda5', '_TZ3000_bvrlqyj7', '_TZ3000_7ed9cqgi',
2004
+ '_TZ3000_zmy4lslw', '_TZ3000_ruxexjfz']),
2003
2005
  model: 'TS0002_switch_module',
2004
2006
  vendor: 'TuYa',
2005
2007
  description: '2 gang switch module',
2006
- whiteLabel: [{vendor: 'OXT', model: 'SWTZ22'}],
2008
+ whiteLabel: [{vendor: 'OXT', model: 'SWTZ22'}, {vendor: 'Nous', model: 'L13Z'}],
2007
2009
  extend: tuya.extend.switch({switchType: true, endpoints: ['l1', 'l2']}),
2008
2010
  endpoint: (device) => {
2009
2011
  return {'l1': 1, 'l2': 2};
@@ -3770,11 +3772,19 @@ module.exports = [
3770
3772
  fromZigbee: [fz.tuya_remote],
3771
3773
  toZigbee: [],
3772
3774
  },
3775
+ {
3776
+ zigbeeModel: ['TS0052'],
3777
+ model: 'TS0052',
3778
+ vendor: 'TuYa',
3779
+ description: 'Zigbee dimmer module 1 channel',
3780
+ extend: tuya.extend.light_onoff_brightness(),
3781
+ },
3773
3782
  {
3774
3783
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ikvncluo'},
3775
3784
  {modelID: 'TS0601', manufacturerName: '_TZE200_lyetpprm'},
3776
3785
  {modelID: 'TS0601', manufacturerName: '_TZE200_jva8ink8'},
3777
3786
  {modelID: 'TS0601', manufacturerName: '_TZE200_holel4dk'},
3787
+ {modelID: 'TS0601', manufacturerName: '_TZE200_xpq2rzhq'},
3778
3788
  {modelID: 'TS0601', manufacturerName: '_TZE200_wukb7rhc'},
3779
3789
  {modelID: 'TS0601', manufacturerName: '_TZE204_ztc6ggyl'},
3780
3790
  {modelID: 'TS0601', manufacturerName: '_TZE200_ztc6ggyl'}],
package/devices/xiaomi.js CHANGED
@@ -2239,6 +2239,14 @@ module.exports = [
2239
2239
  vendor: 'Xiaomi',
2240
2240
  fromZigbee: [fz.xiaomi_basic, fz.xiaomi_curtain_position, fz.xiaomi_curtain_position_tilt],
2241
2241
  toZigbee: [tz.xiaomi_curtain_position_state, tz.xiaomi_curtain_options],
2242
+ onEvent: async (type, data, device) => {
2243
+ if (type === 'message' && data.type === 'attributeReport' && data.cluster === 'genBasic' &&
2244
+ data.data.hasOwnProperty('1028') && data.data['1028'] == 0) {
2245
+ // Try to read the position after the motor stops, the device occasionally report wrong data right after stopping
2246
+ // Might need to add delay, seems to be working without one but needs more tests.
2247
+ await device.getEndpoint(1).read('genAnalogOutput', ['presentValue']);
2248
+ }
2249
+ },
2242
2250
  exposes: [e.cover_position().setAccess('state', ea.ALL),
2243
2251
  exposes.binary('running', ea.STATE, true, false)
2244
2252
  .withDescription('Whether the motor is moving or not'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "15.0.84",
3
+ "version": "15.0.86",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -34,11 +34,11 @@
34
34
  },
35
35
  "homepage": "https://github.com/Koenkk/zigbee-herdsman-converters",
36
36
  "dependencies": {
37
- "axios": "^1.3.4",
37
+ "axios": "^1.3.5",
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.103"
41
+ "zigbee-herdsman": "^0.14.105"
42
42
  },
43
43
  "devDependencies": {
44
44
  "eslint": "*",