zigbee-herdsman-converters 14.0.369 → 14.0.370

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.
@@ -1164,7 +1164,8 @@ const converters = {
1164
1164
 
1165
1165
  if (options.simulated_brightness) {
1166
1166
  globalStore.putValue(msg.endpoint, 'simulated_brightness_brightness', msg.data.level);
1167
- payload.brightness = msg.data.level;
1167
+ const property = postfixWithEndpointName('brightness', msg, model);
1168
+ payload[property] = msg.data.level;
1168
1169
  }
1169
1170
 
1170
1171
  return payload;
@@ -1195,7 +1196,8 @@ const converters = {
1195
1196
  brightness += delta;
1196
1197
  brightness = numberWithinRange(brightness, 0, 255);
1197
1198
  globalStore.putValue(msg.endpoint, 'simulated_brightness_brightness', brightness);
1198
- publish({brightness});
1199
+ const property = postfixWithEndpointName('brightness', msg, model);
1200
+ publish({[property]: brightness});
1199
1201
  }, intervalOpts);
1200
1202
 
1201
1203
  globalStore.putValue(msg.endpoint, 'simulated_brightness_timer', timer);
@@ -1225,7 +1227,8 @@ const converters = {
1225
1227
  brightness += delta;
1226
1228
  brightness = numberWithinRange(brightness, 0, 255);
1227
1229
  globalStore.putValue(msg.endpoint, 'simulated_brightness_brightness', brightness);
1228
- payload.brightness = brightness;
1230
+ const property = postfixWithEndpointName('brightness', msg, model);
1231
+ payload[property] = brightness;
1229
1232
  }
1230
1233
 
1231
1234
  return payload;
@@ -4679,17 +4682,21 @@ const converters = {
4679
4682
  },
4680
4683
  tuya_smoke: {
4681
4684
  cluster: 'manuSpecificTuya',
4682
- type: ['commandDataResponse'],
4685
+ type: ['commandDataResponse', 'commandDataReport'],
4683
4686
  convert: (model, msg, publish, options, meta) => {
4684
- const dpValue = tuya.firstDpValue(msg, meta, 'tuya_smoke');
4685
- const dp = dpValue.dp;
4686
- const value = tuya.getDataValue(dpValue);
4687
- switch (dp) {
4688
- case tuya.dataPoints.state:
4689
- return {smoke: value === 0};
4690
- default:
4691
- meta.logger.warn(`zigbee-herdsman-converters:tuya_smoke: Unrecognized DP #${ dp} with data ${JSON.stringify(dpValue)}`);
4687
+ const result = {};
4688
+ for (const dpValue of msg.data.dpValues) {
4689
+ const dp = dpValue.dp;
4690
+ const value = tuya.getDataValue(dpValue);
4691
+ switch (dp) {
4692
+ case tuya.dataPoints.state:
4693
+ result.smoke = value === 0;
4694
+ break;
4695
+ default:
4696
+ meta.logger.warn(`zigbee-herdsman-converters:tuya_smoke: Unrecognized DP #${ dp} with data ${JSON.stringify(dpValue)}`);
4697
+ }
4692
4698
  }
4699
+ return result;
4693
4700
  },
4694
4701
  },
4695
4702
  tuya_woox_smoke: {
@@ -5943,7 +5950,13 @@ const converters = {
5943
5950
  ZMCSW032D_cover_position: {
5944
5951
  cluster: 'closuresWindowCovering',
5945
5952
  type: ['attributeReport', 'readResponse'],
5946
- options: [exposes.options.invert_cover()],
5953
+ options: [
5954
+ exposes.options.invert_cover(),
5955
+ exposes.numeric('time_close')
5956
+ .withDescription(`Set the full closing time of the roller shutter (e.g. set it to 20) (value is in s).`),
5957
+ exposes.numeric('time_open')
5958
+ .withDescription(`Set the full opening time of the roller shutter (e.g. set it to 21) (value is in s).`),
5959
+ ],
5947
5960
  convert: (model, msg, publish, options, meta) => {
5948
5961
  const result = {};
5949
5962
  const timeCoverSetMiddle = 60;
package/devices/aldi.js CHANGED
@@ -12,14 +12,6 @@ module.exports = [
12
12
  extend: extend.light_onoff_brightness_colortemp_color({disableColorTempStartup: true}),
13
13
  meta: {applyRedFix: true},
14
14
  },
15
- {
16
- fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3000_kohbva1f'}],
17
- model: 'L122CB63H11A9.0W',
18
- vendor: 'Aldi',
19
- description: 'LIGHTWAY smart home LED-lamp - bulb',
20
- extend: extend.light_onoff_brightness_colortemp_color({disableColorTempStartup: true}),
21
- meta: {applyRedFix: true},
22
- },
23
15
  {
24
16
  fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3000_iivsrikg'}],
25
17
  model: 'L122AA63H11A6.5W',
@@ -14,7 +14,11 @@ module.exports = [
14
14
  description: 'Light switch with neutral',
15
15
  fromZigbee: [fz.identify, fz.on_off, fz.K4003C_binary_input],
16
16
  toZigbee: [tz.on_off, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn, tz.legrand_identify],
17
- exposes: [e.switch(), e.action(['identify', 'on', 'off'])],
17
+ exposes: [
18
+ e.switch(), e.action(['identify', 'on', 'off']),
19
+ exposes.binary('permanent_led', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
20
+ exposes.binary('led_when_on', ea.STATE_SET, 'ON', 'OFF').withDescription('Enables the LED when the light is on'),
21
+ ],
18
22
  configure: async (device, coordinatorEndpoint, logger) => {
19
23
  const endpoint = device.getEndpoint(1);
20
24
  await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genBinaryInput']);
@@ -26,7 +30,12 @@ module.exports = [
26
30
  vendor: 'BTicino',
27
31
  description: 'Dimmer switch with neutral',
28
32
  extend: extend.light_onoff_brightness({noConfigure: true}),
29
- exposes: [e.light_brightness()],
33
+ exposes: [
34
+ e.light_brightness(),
35
+ exposes.binary('dimmer_enabled', ea.STATE_SET, 'ON', 'OFF').withDescription('Allow the device to change brightness'),
36
+ exposes.binary('permanent_led', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
37
+ exposes.binary('led_when_on', ea.STATE_SET, 'ON', 'OFF').withDescription('Enables the LED when the light is on'),
38
+ ],
30
39
  fromZigbee: [fz.brightness, fz.identify, fz.on_off],
31
40
  toZigbee: [tz.light_onoff_brightness, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn,
32
41
  tz.legrand_settingEnableDimmer, tz.legrand_identify],
package/devices/ecodim.js CHANGED
@@ -121,4 +121,11 @@ module.exports = [
121
121
  toZigbee: [],
122
122
  meta: {multiEndpoint: true, battery: {dontDividePercentage: true}},
123
123
  },
124
+ {
125
+ fingerprint: [{modelID: 'TS0501B', manufacturerName: '_TZ3210_yluvwhjc'}],
126
+ model: 'ED-10042',
127
+ vendor: 'EcoDim',
128
+ description: 'Zigbee LED filament light dimmable E27, globe G125, flame 2200K',
129
+ extend: extend.light_onoff_brightness(),
130
+ },
124
131
  ];
package/devices/iris.js CHANGED
@@ -74,7 +74,7 @@ module.exports = [
74
74
  exposes: [e.contact(), e.battery_low(), e.tamper(), e.temperature(), e.battery()],
75
75
  },
76
76
  {
77
- zigbeeModel: ['3450-L'],
77
+ zigbeeModel: ['3450-L', '3450-L2'],
78
78
  model: '3450-L',
79
79
  vendor: 'Iris',
80
80
  description: 'Smart fob',
package/devices/konke.js CHANGED
@@ -73,4 +73,13 @@ module.exports = [
73
73
  toZigbee: [],
74
74
  exposes: [e.water_leak(), e.battery_low(), e.tamper()],
75
75
  },
76
+ {
77
+ fingerprint: [{modelID: 'TS0222', manufacturerName: '_TYZB01_fi5yftwv'}],
78
+ model: 'KK-ES-J01W',
79
+ vendor: 'Konke',
80
+ description: 'Room temperature, relative humidity and illuminance sensor',
81
+ fromZigbee: [fz.battery, fz.illuminance, fz.humidity, fz.temperature],
82
+ toZigbee: [],
83
+ exposes: [e.battery(), e.illuminance(), e.illuminance_lux().withUnit('lx'), e.humidity(), e.temperature()],
84
+ },
76
85
  ];
package/devices/nodon.js CHANGED
@@ -16,6 +16,8 @@ module.exports = [
16
16
  configure: async (device, coordinatorEndpoint, logger) => {
17
17
  const endpoint = device.getEndpoint(1);
18
18
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
19
+ await reporting.currentPositionLiftPercentage(endpoint);
20
+ await reporting.currentPositionTiltPercentage(endpoint);
19
21
  },
20
22
  exposes: [e.cover_position()],
21
23
  },
package/devices/osram.js CHANGED
@@ -178,11 +178,11 @@ module.exports = [
178
178
  ota: ota.ledvance,
179
179
  },
180
180
  {
181
- zigbeeModel: ['Surface Light TW'],
181
+ zigbeeModel: ['Surface Light TW', 'ZLO-CeilingTW-OS'],
182
182
  model: 'AB401130055',
183
183
  vendor: 'OSRAM',
184
184
  description: 'LIGHTIFY Surface Light LED Tunable White',
185
- extend: extend.ledvance.light_onoff_brightness_colortemp(),
185
+ extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
186
186
  ota: ota.ledvance,
187
187
  },
188
188
  {
package/devices/owon.js CHANGED
@@ -106,15 +106,14 @@ module.exports = [
106
106
  zigbeeModel: ['THS317-ET'],
107
107
  model: 'THS317-ET',
108
108
  vendor: 'OWON',
109
- description: 'Temperature and humidity sensor',
110
- fromZigbee: [fz.temperature, fz.humidity, fz.battery],
109
+ description: 'Temperature sensor',
110
+ fromZigbee: [fz.temperature, fz.battery],
111
111
  toZigbee: [],
112
- exposes: [e.battery(), e.temperature(), e.humidity()],
112
+ exposes: [e.battery(), e.temperature()],
113
113
  configure: async (device, coordinatorEndpoint, logger) => {
114
- const endpoint = device.getEndpoint(2);
115
- await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg']);
114
+ const endpoint = device.getEndpoint(3);
115
+ await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
116
116
  await reporting.temperature(endpoint);
117
- await reporting.humidity(endpoint);
118
117
  await reporting.batteryVoltage(endpoint);
119
118
  await reporting.batteryPercentageRemaining(endpoint);
120
119
  device.powerSource = 'Battery';
@@ -29,6 +29,15 @@ const hueExtend = {
29
29
  };
30
30
 
31
31
  module.exports = [
32
+ {
33
+ zigbeeModel: ['915005996401'],
34
+ model: '915005996401',
35
+ vendor: 'Philips',
36
+ description: 'Hue white ambiance ceiling light Enrave S with Bluetooth',
37
+ meta: {turnsOffAtBrightness1: true},
38
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
39
+ ota: ota.zigbeeOTA,
40
+ },
32
41
  {
33
42
  zigbeeModel: ['929003054001'],
34
43
  model: '929003054001',
@@ -610,4 +610,24 @@ module.exports = [
610
610
  await reporting.readMeteringMultiplierDivisor(endpoint);
611
611
  },
612
612
  },
613
+ {
614
+ zigbeeModel: ['LK/OUTLET/1'],
615
+ model: '545D6115',
616
+ vendor: 'Schneider Electric',
617
+ description: 'LK FUGA wiser wireless socket outlet',
618
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.EKO09738_metering, fz.power_on_behavior],
619
+ toZigbee: [tz.on_off, tz.power_on_behavior],
620
+ exposes: [e.switch(), e.power(), e.energy(), e.current(), e.voltage(),
621
+ exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
622
+ .withDescription('Controls the behaviour when the device is powered on')],
623
+ configure: async (device, coordinatorEndpoint, logger) => {
624
+ const endpoint = device.getEndpoint(6);
625
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
626
+ await reporting.onOff(endpoint);
627
+ // Unit supports acVoltage and acCurrent, but only acCurrent divisor/multiplier can be read
628
+ await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor', 'acCurrentMultiplier']);
629
+ await reporting.readMeteringMultiplierDivisor(endpoint);
630
+ await reporting.currentSummDelivered(endpoint, {min: 60, change: 1});
631
+ },
632
+ },
613
633
  ];
@@ -6,6 +6,22 @@ const extend = require('../lib/extend');
6
6
  const e = exposes.presets;
7
7
 
8
8
  module.exports = [
9
+ {
10
+ zigbeeModel: ['ON/OFF(2CH)'],
11
+ model: 'UP-SA-9127D',
12
+ vendor: 'Sunricher',
13
+ description: 'LED-trading 2 channel AC switch',
14
+ extend: extend.switch(),
15
+ exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2')],
16
+ endpoint: (device) => {
17
+ return {'l1': 1, 'l2': 2};
18
+ },
19
+ meta: {multiEndpoint: true},
20
+ configure: async (device, coordinatorEndpoint, logger) => {
21
+ await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
22
+ await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
23
+ },
24
+ },
9
25
  {
10
26
  zigbeeModel: ['HK-ZD-CCT-A'],
11
27
  model: 'HK-ZD-CCT-A',
package/devices/tuya.js CHANGED
@@ -158,6 +158,7 @@ module.exports = [
158
158
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_589kq4ul'},
159
159
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_1mtktxdk'},
160
160
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_remypqqm'},
161
+ {modelID: 'TS0505B', manufacturerName: '_TZ3000_kohbva1f'},
161
162
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_0rn9qhnu'},
162
163
  {modelID: 'TS0505B', manufacturerName: '_TZ3210_bicjqpg4'},
163
164
  {modelID: 'TS0505B', manufacturerName: '_TZ3000_cmaky9gq'},
@@ -166,7 +167,10 @@ module.exports = [
166
167
  vendor: 'TuYa',
167
168
  description: 'Zigbee RGB+CCT light',
168
169
  whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMD4106W-RGB-ZB'},
169
- {vendor: 'TuYa', model: 'A5C-21F7-01'}, {vendor: 'Mercator Ikuü', model: 'S9E27LED9W-RGB-Z'}],
170
+ {vendor: 'TuYa', model: 'A5C-21F7-01'}, {vendor: 'Mercator Ikuü', model: 'S9E27LED9W-RGB-Z'},
171
+ {vendor: 'Aldi', model: 'L122CB63H11A9.0W', description: 'LIGHTWAY smart home LED-lamp - bulb'},
172
+ {vendor: 'Lidl', model: '14153706L', description: 'Livarno smart LED ceiling light'},
173
+ ],
170
174
  extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
171
175
  meta: {applyRedFix: true, enhancedHue: false},
172
176
  },
@@ -1151,7 +1155,8 @@ module.exports = [
1151
1155
  },
1152
1156
  {
1153
1157
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_byzdayie'},
1154
- {modelID: 'TS0601', manufacturerName: '_TZE200_fsb6zw01'}],
1158
+ {modelID: 'TS0601', manufacturerName: '_TZE200_fsb6zw01'},
1159
+ {modelID: 'TS0601', manufacturerName: '_TZE200_ewxhg6o9'}],
1155
1160
  model: 'TS0601_din',
1156
1161
  vendor: 'TuYa',
1157
1162
  description: 'Zigbee smart energy meter DDS238-2 Zigbee',
@@ -2,17 +2,56 @@ const url = 'https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/index.js
2
2
  const assert = require('assert');
3
3
  const common = require('./common');
4
4
  const axios = common.getAxios();
5
+ const fs = require('fs');
6
+ const URI = require('uri-js');
7
+
8
+ let overrideFileName = null;
5
9
 
6
10
  /**
7
11
  * Helper functions
8
12
  */
9
13
 
14
+
15
+ function isValidUrl(url) {
16
+ let parsed;
17
+ try {
18
+ parsed = URI.parse(url);
19
+ } catch (_) {
20
+ return false;
21
+ }
22
+ return parsed.scheme === 'http' || parsed.scheme === 'https';
23
+ }
24
+
25
+ async function getFile(urlOrName) {
26
+ if (isValidUrl(urlOrName)) {
27
+ return (await axios.get(urlOrName)).data;
28
+ }
29
+
30
+ return JSON.parse(fs.readFileSync(urlOrName));
31
+ }
32
+
33
+ async function getIndex(logger) {
34
+ const index = (await axios.get(url)).data;
35
+
36
+ logger.debug(`ZigbeeOTA: downloaded main index`);
37
+
38
+ if (overrideFileName) {
39
+ logger.debug(`ZigbeeOTA: Loading override index ${overrideFileName}`);
40
+ const localIndex = await getFile(overrideFileName);
41
+
42
+ // Resulting index will have overriden items first
43
+ return localIndex.concat(index);
44
+ }
45
+
46
+ return index;
47
+ }
48
+
10
49
  async function getImageMeta(current, logger, device) {
11
50
  const modelId = device.modelID;
12
51
  const imageType = current.imageType;
13
52
  const manufacturerCode = current.manufacturerCode;
14
53
  const manufacturerName = device.manufacturerName;
15
- const images = (await axios.get(url)).data;
54
+ const images = await getIndex(logger);
16
55
 
17
56
  // NOTE: Officially an image can be determined with a combination of manufacturerCode and imageType.
18
57
  // However Gledopto pro products use the same imageType (0) for every device while the image is different.
@@ -46,4 +85,7 @@ module.exports = {
46
85
  getImageMeta,
47
86
  isUpdateAvailable,
48
87
  updateToLatest,
88
+ useIndexOverride: (indexFileName) => {
89
+ overrideFileName = indexFileName;
90
+ },
49
91
  };
package/lib/tuya.js CHANGED
@@ -86,6 +86,9 @@ async function onEventMeasurementPoll(type, data, device, options) {
86
86
  try {
87
87
  await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
88
88
  await endpoint.read('seMetering', ['currentSummDelivered']);
89
+ if (device.manufacturerName === '_TZ3000_u5u4cakc') {
90
+ await endpoint.read('genOnOff', ['onOff']);
91
+ }
89
92
  } catch (error) {/* Do nothing*/}
90
93
  }, seconds*1000);
91
94
  globalStore.putValue(device, 'interval', interval);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.369",
3
+ "version": "14.0.370",
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.369",
3
+ "version": "14.0.370",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [