zigbee-herdsman-converters 14.0.472 → 14.0.475

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.
@@ -2491,7 +2491,6 @@ const converters = {
2491
2491
  const dpValue = tuya.firstDpValue(msg, meta, 'neo_nas_pd07');
2492
2492
  const dp = dpValue.dp;
2493
2493
  const value = tuya.getDataValue(dpValue);
2494
-
2495
2494
  if (dp === 101) return {occupancy: value > 0 ? true : false};
2496
2495
  else if (dp === 102) {
2497
2496
  return {
@@ -2504,8 +2503,19 @@ const converters = {
2504
2503
  return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
2505
2504
  } else if (dp === 105) {
2506
2505
  return {humidity: calibrateAndPrecisionRoundOptions(value, options, 'humidity')};
2506
+ } else if (dp === tuya.dataPoints.neoMinTemp) {
2507
+ return {temperature_min: value};
2508
+ } else if (dp === tuya.dataPoints.neoMaxTemp) {
2509
+ return {temperature_max: value};
2510
+ } else if (dp === tuya.dataPoints.neoMinHumidity) {
2511
+ return {humidity_min: value};
2512
+ } else if (dp === tuya.dataPoints.neoMaxHumidity) {
2513
+ return {humidity_max: value};
2514
+ } else if (dp === 113) {
2515
+ return {alarm: {0: 'over_temperature', 1: 'over_humidity',
2516
+ 2: 'below_min_temperature', 3: 'below_min_humdity', 4: 'off'}[value]};
2507
2517
  } else {
2508
- meta.logger.warn(`zigbee-herdsman-converters:NEO-PD07: NOT RECOGNIZED DP #${dp} with data ${JSON.stringify(dpValue)}`);
2518
+ meta.logger.warn(`fromZigbee.neo_nas_pd07: Unrecognized DP #${dp} with data ${JSON.stringify(dpValue)}`);
2509
2519
  }
2510
2520
  },
2511
2521
  },
@@ -3129,6 +3139,21 @@ const converters = {
3129
3139
  };
3130
3140
  },
3131
3141
  },
3142
+ plaid_battery: {
3143
+ cluster: 'genPowerCfg',
3144
+ type: ['readResponse', 'attributeReport'],
3145
+ convert: (model, msg, publish, options, meta) => {
3146
+ const payload = {};
3147
+ if (msg.data.hasOwnProperty('mainsVoltage')) {
3148
+ payload.voltage = msg.data['mainsVoltage'];
3149
+
3150
+ if (model.meta && model.meta.battery && model.meta.battery.voltageToPercentage) {
3151
+ payload.battery = batteryVoltageToPercentage(payload.voltage, model.meta.battery.voltageToPercentage);
3152
+ }
3153
+ }
3154
+ return payload;
3155
+ },
3156
+ },
3132
3157
  silvercrest_smart_led_string: {
3133
3158
  cluster: 'manuSpecificTuya',
3134
3159
  type: ['commandDataResponse', 'commandDataReport'],
@@ -7179,6 +7204,27 @@ const converters = {
7179
7204
  return {occupancy: (zoneStatus & 1) > 0, tamper: (zoneStatus & 4) > 0};
7180
7205
  },
7181
7206
  },
7207
+ ZB006X_settings: {
7208
+ cluster: 'manuSpecificTuya',
7209
+ type: ['commandDataResponse'],
7210
+ convert: (model, msg, publish, options, meta) => {
7211
+ const dpValue = tuya.firstDpValue(msg, meta, 'ZB006X_settings');
7212
+ const dp = dpValue.dp;
7213
+ const value = tuya.getDataValue(dpValue);
7214
+ if (dp === 103) {
7215
+ meta.logger.debug(`fromZigbee.ZB006X_settings: Found DP #${dp} with data ${JSON.stringify(dpValue)}`);
7216
+ return {ext_switch_type: {0: 'unknown', 1: 'toggle_sw', 2: 'momentary_sw', 3: 'rotary_sw', 4: 'auto_config'}[value]};
7217
+ } else if (dp === 105) {
7218
+ meta.logger.debug(`fromZigbee.ZB006X_settings: Found DP #${dp} with data ${JSON.stringify(dpValue)}`);
7219
+ return {load_detection_mode: {0: 'none', 1: 'first_power_on', 2: 'every_power_on'}[value]};
7220
+ } else if (dp === 109) {
7221
+ meta.logger.debug(`fromZigbee.ZB006X_settings: Found DP #${dp} with data ${JSON.stringify(dpValue)}`);
7222
+ return {control_mode: {0: 'local', 1: 'remote', 2: 'both'}[value]};
7223
+ } else {
7224
+ meta.logger.warn(`fromZigbee.ZB006X_settings: Unrecognized DP #${dp} with data ${JSON.stringify(dpValue)}`);
7225
+ }
7226
+ },
7227
+ },
7182
7228
  ZM35HQ_attr: {
7183
7229
  cluster: 'ssIasZone',
7184
7230
  type: ['attributeReport', 'readResponse'],
@@ -5332,6 +5332,27 @@ const converters = {
5332
5332
  await entity.read(payloads[key][0], [payloads[key][1]]);
5333
5333
  },
5334
5334
  },
5335
+ neo_nas_pd07: {
5336
+ key: ['temperature_max', 'temperature_min', 'humidity_max', 'humidity_min'],
5337
+ convertSet: async (entity, key, value, meta) => {
5338
+ switch (key) {
5339
+ case 'temperature_max':
5340
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.neoMaxTemp, value);
5341
+ break;
5342
+ case 'temperature_min':
5343
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.neoMinTemp, value);
5344
+ break;
5345
+ case 'humidity_max':
5346
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.neoMaxHumidity, value);
5347
+ break;
5348
+ case 'humidity_min':
5349
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.neoMinHumidity, value);
5350
+ break;
5351
+ default: // Unknown key
5352
+ throw new Error(`toZigbee.neo_nas_pd07: Unhandled key ${key}`);
5353
+ }
5354
+ },
5355
+ },
5335
5356
  neo_t_h_alarm: {
5336
5357
  key: [
5337
5358
  'alarm', 'melody', 'volume', 'duration',
@@ -6285,6 +6306,28 @@ const converters = {
6285
6306
  }
6286
6307
  },
6287
6308
  },
6309
+ ZB006X_settings: {
6310
+ key: ['ext_switch_type', 'load_detection_mode', 'control_mode'],
6311
+ convertSet: async (entity, key, value, meta) => {
6312
+ switch (key) {
6313
+ case 'ext_switch_type':
6314
+ meta.logger.debug(`toZigbee.ZB006X_settings: Send key/value [${key}|${value}]`);
6315
+ await tuya.sendDataPointEnum(entity, 103, {'unknown': 0, 'toggle_sw': 1,
6316
+ 'momentary_sw': 2, 'rotary_sw': 3, 'auto_config': 4}[value]);
6317
+ break;
6318
+ case 'load_detection_mode':
6319
+ meta.logger.debug(`toZigbee.ZB006X_settings: Send key/value [${key}|${value}]`);
6320
+ await tuya.sendDataPointEnum(entity, 105, {'none': 0, 'first_power_on': 1, 'every_power_on': 2}[value]);
6321
+ break;
6322
+ case 'control_mode':
6323
+ meta.logger.debug(`toZigbee.ZB006X_settings: Send key/value [${key}|${value}]`);
6324
+ await tuya.sendDataPointEnum(entity, 109, {'local': 0, 'remote': 1, 'both': 2}[value]);
6325
+ break;
6326
+ default: // Unknown key
6327
+ throw new Error(`toZigbee.ZB006X_settings: Unhandled key ${key}`);
6328
+ }
6329
+ },
6330
+ },
6288
6331
  ZM35HQ_attr: {
6289
6332
  key: [
6290
6333
  'sensitivity', 'keep_time',
package/devices/adeo.js CHANGED
@@ -8,7 +8,7 @@ const e = exposes.presets;
8
8
  module.exports = [
9
9
  {
10
10
  zigbeeModel: ['ZBEK-4'],
11
- model: 'IM-CDZDGAAA0005KA8MAN',
11
+ model: 'IM-CDZDGAAA0005KA_MAN',
12
12
  vendor: 'ADEO',
13
13
  description: 'ENKI LEXMAN RGBTW GU10 Bulb',
14
14
  extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
@@ -0,0 +1,11 @@
1
+ const extend = require('../lib/extend');
2
+
3
+ module.exports = [
4
+ {
5
+ zigbeeModel: ['CS-Z-CZ-2402'],
6
+ model: 'CS-Z-CZ-2402',
7
+ vendor: 'DNAKE',
8
+ description: 'Smart socket',
9
+ extend: extend.switch(),
10
+ },
11
+ ];
package/devices/fantem.js CHANGED
@@ -13,7 +13,15 @@ module.exports = [
13
13
  vendor: 'Fantem',
14
14
  description: 'Smart dimmer module without neutral',
15
15
  extend: extend.light_onoff_brightness({noConfigure: true}),
16
- exposes: [e.light_brightness()],
16
+ fromZigbee: [...extend.light_onoff_brightness({noConfigure: true}).fromZigbee, fz.ZB006X_settings],
17
+ toZigbee: [...extend.light_onoff_brightness({noConfigure: true}).toZigbee, tz.ZB006X_settings],
18
+ exposes: [e.light_brightness(),
19
+ exposes.enum('ext_switch_type', ea.STATE_SET, ['unknown', 'toggle_sw', 'momentary_sw', 'rotary_sw', 'auto_config'])
20
+ .withDescription('External switch type'),
21
+ exposes.enum('load_detection_mode', ea.STATE_SET, ['none', 'first_power_on', 'every_power_on'])
22
+ .withDescription('Load detection mode'),
23
+ exposes.enum('control_mode', ea.STATE_SET, ['local', 'remote', 'both']).withDescription('Control mode'),
24
+ ],
17
25
  configure: async (device, coordinatorEndpoint, logger) => {
18
26
  await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
19
27
  const endpoint = device.getEndpoint(1);
File without changes
package/devices/neo.js CHANGED
@@ -63,9 +63,15 @@ module.exports = [
63
63
  vendor: 'Neo',
64
64
  description: 'Motion, temperature & humidity sensor',
65
65
  fromZigbee: [fz.neo_nas_pd07],
66
- toZigbee: [],
66
+ toZigbee: [tz.neo_nas_pd07],
67
67
  onEvent: tuya.onEventSetTime,
68
68
  exposes: [e.occupancy(), e.humidity(), e.temperature(), e.tamper(), e.battery_low(),
69
- exposes.enum('power_type', ea.STATE, ['battery_full', 'battery_high', 'battery_medium', 'battery_low', 'usb'])],
69
+ exposes.enum('power_type', ea.STATE, ['battery_full', 'battery_high', 'battery_medium', 'battery_low', 'usb']),
70
+ exposes.enum('alarm', ea.STATE, ['over_temperature', 'over_humidity', 'below_min_temperature', 'below_min_humdity', 'off'])
71
+ .withDescription('Temperature/humidity alarm status'),
72
+ exposes.numeric('temperature_min', ea.STATE_SET).withUnit('°C').withValueMin(-40).withValueMax(40),
73
+ exposes.numeric('temperature_max', ea.STATE_SET).withUnit('°C').withValueMin(-40).withValueMax(40),
74
+ exposes.numeric('humidity_min', ea.STATE_SET).withUnit('%').withValueMin(0).withValueMax(100),
75
+ exposes.numeric('humidity_max', ea.STATE_SET).withUnit('%').withValueMin(0).withValueMax(100)],
70
76
  },
71
77
  ];
@@ -117,6 +117,24 @@ module.exports = [
117
117
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
118
118
  ota: ota.zigbeeOTA,
119
119
  },
120
+ {
121
+ zigbeeModel: ['915005997601'],
122
+ model: '915005997601',
123
+ vendor: 'Philips',
124
+ description: 'Hue Devere M white ambiance white & dimmer',
125
+ meta: {turnsOffAtBrightness1: true},
126
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
127
+ ota: ota.zigbeeOTA,
128
+ },
129
+ {
130
+ zigbeeModel: ['915005997701'],
131
+ model: '915005997701',
132
+ vendor: 'Philips',
133
+ description: 'Hue Devere L white ambiance white & dimmer',
134
+ meta: {turnsOffAtBrightness1: true},
135
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
136
+ ota: ota.zigbeeOTA,
137
+ },
120
138
  {
121
139
  zigbeeModel: ['929003054001'],
122
140
  model: '929003054001',
package/devices/plaid.js CHANGED
@@ -11,13 +11,15 @@ module.exports = [
11
11
  vendor: 'PLAID SYSTEMS',
12
12
  description: 'Spruce temperature and moisture sensor',
13
13
  toZigbee: [],
14
- fromZigbee: [fz.temperature, fz.humidity],
15
- exposes: [e.humidity(), e.temperature()],
14
+ fromZigbee: [fz.temperature, fz.humidity, fz.plaid_battery],
15
+ exposes: [e.humidity(), e.temperature(), e.battery(), e.battery_voltage()],
16
+ meta: {battery: {voltageToPercentage: '3V_2500'}},
16
17
  configure: async (device, coordinatorEndpoint, logger) => {
17
18
  const endpoint = device.getEndpoint(1);
18
- await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity']);
19
+ await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg']);
19
20
  await reporting.temperature(endpoint);
20
21
  await reporting.humidity(endpoint);
22
+ device.powerSource = 'Battery';
21
23
  },
22
24
  },
23
25
  ];
package/devices/tuya.js CHANGED
@@ -45,7 +45,7 @@ const tzLocal = {
45
45
 
46
46
  const fzLocal = {
47
47
  scenes_recall_scene_65029: {
48
- cluster: 65029,
48
+ cluster: '65029',
49
49
  type: ['raw', 'attributeReport'],
50
50
  convert: (model, msg, publish, options, meta) => {
51
51
  const id = meta.device.modelID === '005f0c3b' ? msg.data[0] : msg.data[msg.data.length - 1];
@@ -215,7 +215,7 @@ module.exports = [
215
215
  {
216
216
  fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_mvn6jl7x'},
217
217
  {modelID: 'TS011F', manufacturerName: '_TZ3000_raviyuvk'}, {modelID: 'TS011F', manufacturerName: '_TYZB01_hlla45kx'},
218
- {modelID: 'TS011F', manufacturerName: '_TZ3000_92qd4sqa'}],
218
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_92qd4sqa'}, {modelID: 'TS011F', manufacturerName: '_TZ3000_zwaadvus'}],
219
219
  model: 'TS011F_2_gang_wall',
220
220
  vendor: 'TuYa',
221
221
  description: '2 gang wall outlet',
@@ -1929,6 +1929,22 @@ module.exports = [
1929
1929
  exposes: [exposes.binary('trigger', ea.STATE_SET, true, false).withDescription('Trigger the door movement'),
1930
1930
  exposes.binary('garage_door_contact', ea.STATE, true, false)],
1931
1931
  },
1932
+ {
1933
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_wfxuhoea'}],
1934
+ model: 'GDC311ZBQ1',
1935
+ vendor: 'TuYa',
1936
+ description: 'LoraTap garage door opener with wireless sensor',
1937
+ fromZigbee: [fz.matsee_garage_door_opener, fz.ignore_basic_report],
1938
+ toZigbee: [tz.matsee_garage_door_opener, tz.tuya_data_point_test],
1939
+ whiteLabel: [{vendor: 'LoraTap', model: 'GDC311ZBQ1'}],
1940
+ configure: async (device, coordinatorEndpoint, logger) => {
1941
+ const endpoint = device.getEndpoint(1);
1942
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
1943
+ },
1944
+ exposes: [exposes.binary('trigger', ea.STATE_SET, true, false).withDescription('Trigger the door movement'),
1945
+ exposes.binary('garage_door_contact', ea.STATE, false, true)
1946
+ .withDescription('Indicates if the garage door contact is closed (= true) or open (= false)')],
1947
+ },
1932
1948
  {
1933
1949
  fingerprint: [{modelID: 'TS0201', manufacturerName: '_TZ3000_qaaysllp'}],
1934
1950
  model: 'LCZ030',
package/devices/ynoa.js CHANGED
@@ -2,6 +2,7 @@ const exposes = require('../lib/exposes');
2
2
  const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
3
  const reporting = require('../lib/reporting');
4
4
  const e = exposes.presets;
5
+ const extend = require('..//lib/extend');
5
6
 
6
7
  module.exports = [
7
8
  {
@@ -18,4 +19,27 @@ module.exports = [
18
19
  await reporting.batteryPercentageRemaining(endpoint);
19
20
  },
20
21
  },
22
+ {
23
+ zigbeeModel: ['ZBT-RGBWLight-M0000'],
24
+ model: 'LA-GU10-RGBW',
25
+ vendor: 'Ynoa',
26
+ description: 'Smart LED GU10 RGB CCT',
27
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 526], supportsHS: true}),
28
+ },
29
+ {
30
+ zigbeeModel: ['ZBT-RGBWSwitch-D0800'],
31
+ model: 'LA-5KEY-RGBW',
32
+ vendor: 'Ynoa',
33
+ description: '5 key control for RGBW light',
34
+ fromZigbee: [fz.command_on, fz.command_off, fz.command_move_to_color_temp,
35
+ fz.command_move_to_color, fz.command_move_to_level, fz.battery],
36
+ exposes: [e.battery(), e.battery_low(), e.action(['on', 'off', 'brightness_move_to_level',
37
+ 'color_temperature_move', 'color_move'])],
38
+ toZigbee: [],
39
+ configure: async (device, coordinatorEndpoint, logger) => {
40
+ const endpoint = device.getEndpoint(1);
41
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
42
+ await reporting.batteryPercentageRemaining(endpoint);
43
+ },
44
+ },
21
45
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.472",
3
+ "version": "14.0.475",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [