zigbee-herdsman-converters 14.0.303 → 14.0.307

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.
@@ -2798,6 +2798,7 @@ const converters = {
2798
2798
  const h = parseInt(value.substring(0, 4), 16);
2799
2799
  const s = parseInt(value.substring(4, 8), 16);
2800
2800
  const b = parseInt(value.substring(8, 12), 16);
2801
+ result.color_mode = 'hs';
2801
2802
  result.color = {b: mapNumberRange(b, 0, 1000, 0, 255), h, s: mapNumberRange(s, 0, 1000, 0, 100)};
2802
2803
  result.brightness = result.color.b;
2803
2804
  } else if (dp === tuya.dataPoints.silvercrestSetEffect) {
@@ -23,4 +23,11 @@ module.exports = [
23
23
  extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [158, 495]}),
24
24
  meta: {turnsOffAtBrightness1: true},
25
25
  },
26
+ {
27
+ zigbeeModel: ['ZB_A60_RGBCW'],
28
+ model: 'ZB_A60_RGBCW',
29
+ vendor: 'Ajax Online',
30
+ description: 'Smart Zigbee pro 12W A60 RGBCW bulb',
31
+ extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
32
+ },
26
33
  ];
@@ -9,7 +9,8 @@ const ea = exposes.access;
9
9
 
10
10
  module.exports = [
11
11
  {
12
- // eTRV0100 is the same as Hive TRV. If implementing anything, please consider changing Hive TRV001 too.
12
+ // eTRV0100 is the same as Hive TRV001 and Popp eT093WRO. If implementing anything, please consider
13
+ // changing those two too.
13
14
  zigbeeModel: ['eTRV0100'],
14
15
  model: '014G2461',
15
16
  vendor: 'Danfoss',
@@ -37,7 +38,7 @@ module.exports = [
37
38
  exposes.binary('heat_required', ea.STATE_GET, true, false)
38
39
  .withDescription('Whether or not the unit needs warm water. `false` No Heat Request or `true` Heat Request'),
39
40
  exposes.enum('setpoint_change_source', ea.STATE, ['manual', 'schedule', 'externally'])
40
- .withDescription('Values observed are `0` (set locally) or `2` (set via Zigbee)'),
41
+ .withDescription('Values observed are `0` (manual), `1` (schedule) or `2` (externally)'),
41
42
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
42
43
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
43
44
  exposes.numeric('external_measured_room_sensor', ea.ALL)
@@ -71,10 +72,10 @@ module.exports = [
71
72
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
72
73
 
73
74
  // standard ZCL attributes
74
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.HOUR, max: 43200, change: 1});
75
- await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 25});
76
- await reporting.thermostatPIHeatingDemand(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 1});
77
- await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 25});
75
+ await reporting.batteryPercentageRemaining(endpoint);
76
+ await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
77
+ await reporting.thermostatPIHeatingDemand(endpoint);
78
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
78
79
 
79
80
  // danfoss attributes
80
81
  await endpoint.configureReporting('hvacThermostat', [{
@@ -0,0 +1,20 @@
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
+ const extend = require('../lib/extend');
6
+
7
+ module.exports = [
8
+ {
9
+ fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_majwnphg'}],
10
+ model: 'JR-ZDS01',
11
+ vendor: 'Girier',
12
+ description: '1 gang mini switch',
13
+ toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.tuya_switch_type]),
14
+ fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.tuya_switch_type]),
15
+ exposes: extend.switch().exposes.concat([exposes.presets.power_on_behavior(), exposes.presets.switch_type_2()]),
16
+ configure: async (device, coordinatorEndpoint, logger) => {
17
+ await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
18
+ },
19
+ },
20
+ ];
package/devices/hive.js CHANGED
@@ -150,6 +150,8 @@ module.exports = [
150
150
  },
151
151
  },
152
152
  {
153
+ // TRV001 is the same as Danfoss Ally (eTRV0100) and Popp eT093WRO. If implementing anything, please consider
154
+ // changing those two too.
153
155
  zigbeeModel: ['TRV001'],
154
156
  model: 'UK7004240',
155
157
  vendor: 'Hive',
@@ -160,7 +162,7 @@ module.exports = [
160
162
  tz.danfoss_heat_available, tz.danfoss_heat_required, tz.danfoss_day_of_week, tz.danfoss_trigger_time,
161
163
  tz.danfoss_window_open_internal, tz.danfoss_window_open_external, tz.danfoss_load_estimate,
162
164
  tz.danfoss_viewing_direction, tz.danfoss_external_measured_room_sensor, tz.thermostat_keypad_lockout,
163
- tz.thermostat_system_mode],
165
+ tz.thermostat_system_mode, tz.danfoss_load_balancing_enable, tz.danfoss_load_room_mean],
164
166
  exposes: [e.battery(), e.keypad_lockout(),
165
167
  exposes.binary('mounted_mode_active', ea.STATE_GET, true, false)
166
168
  .withDescription('Is the unit in mounting mode. This is set to `false` for mounted (already on ' +
@@ -176,6 +178,8 @@ module.exports = [
176
178
  .withDescription('Not clear how this affects operation. `false` No Heat Available or `true` Heat Available'),
177
179
  exposes.binary('heat_required', ea.STATE_GET, true, false)
178
180
  .withDescription('Whether or not the unit needs warm water. `false` No Heat Request or `true` Heat Request'),
181
+ exposes.enum('setpoint_change_source', ea.STATE, ['manual', 'schedule', 'externally'])
182
+ .withDescription('Values observed are `0` (manual), `1` (schedule) or `2` (externally)'),
179
183
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
180
184
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
181
185
  exposes.numeric('external_measured_room_sensor', ea.ALL)
@@ -195,6 +199,11 @@ module.exports = [
195
199
  exposes.numeric('algorithm_scale_factor', ea.ALL).withValueMin(1).withValueMax(10)
196
200
  .withDescription('Scale factor of setpoint filter timeconstant ("aggressiveness" of control algorithm) '+
197
201
  '1= Quick ... 5=Moderate ... 10=Slow'),
202
+ exposes.binary('load_balancing_enable', ea.ALL, true, false)
203
+ .withDescription('Whether or not the thermostat acts as standalone thermostat or shares load with other ' +
204
+ 'thermostats in the room. The gateway must update load_room_mean if enabled.'),
205
+ exposes.numeric('load_room_mean', ea.ALL)
206
+ .withDescription('Mean radiator load for room calculated by gateway for load balancing purposes'),
198
207
  exposes.numeric('load_estimate', ea.STATE_GET)
199
208
  .withDescription('Load estimate on this radiator')],
200
209
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -243,6 +252,8 @@ module.exports = [
243
252
  'danfossMountedModeControl',
244
253
  'danfossMountedModeActive',
245
254
  'danfossExternalMeasuredRoomSensor',
255
+ 'danfossLoadBalancingEnable',
256
+ 'danfossLoadRoomMean',
246
257
  ], options);
247
258
 
248
259
  // read systemMode to have an initial value
@@ -10,6 +10,7 @@ module.exports = [
10
10
  vendor: 'Perenio',
11
11
  description: 'Flood alarm device',
12
12
  fromZigbee: [fz.ias_water_leak_alarm_1, fz.ignore_basic_report, fz.battery],
13
+ meta: {battery: {dontDividePercentage: true}},
13
14
  toZigbee: [],
14
15
  configure: async (device, coordinatorEndpoint, logger) => {
15
16
  const endpoint = device.getEndpoint(1);
@@ -1964,12 +1964,12 @@ module.exports = [
1964
1964
  ota: ota.zigbeeOTA,
1965
1965
  },
1966
1966
  {
1967
- zigbeeModel: ['5047131P9'],
1967
+ zigbeeModel: ['5047131P9', '5047131P6'],
1968
1968
  model: '5047131P9',
1969
1969
  vendor: 'Philips',
1970
- description: 'Hue White ambiance Buckram',
1970
+ description: 'Hue White ambiance Buckram single spotlight with bluetooth',
1971
1971
  meta: {turnsOffAtBrightness1: true},
1972
- extend: hueExtend.light_onoff_brightness_colortemp(),
1972
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
1973
1973
  ota: ota.zigbeeOTA,
1974
1974
  },
1975
1975
  {
@@ -2197,4 +2197,13 @@ module.exports = [
2197
2197
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2198
2198
  ota: ota.zigbeeOTA,
2199
2199
  },
2200
+ {
2201
+ zigbeeModel: ['5047131P8'],
2202
+ model: '5047131P8',
2203
+ vendor: 'Philips',
2204
+ description: 'Hue White ambiance Buckram single spotlight',
2205
+ meta: {turnsOffAtBrightness1: true},
2206
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
2207
+ ota: ota.zigbeeOTA,
2208
+ },
2200
2209
  ];
package/devices/popp.js CHANGED
@@ -21,7 +21,7 @@ module.exports = [
21
21
  tz.danfoss_heat_available, tz.danfoss_heat_required, tz.danfoss_day_of_week, tz.danfoss_trigger_time,
22
22
  tz.danfoss_window_open_internal, tz.danfoss_window_open_external, tz.danfoss_load_estimate,
23
23
  tz.danfoss_viewing_direction, tz.danfoss_external_measured_room_sensor, tz.thermostat_keypad_lockout,
24
- tz.thermostat_system_mode],
24
+ tz.thermostat_system_mode, tz.danfoss_load_balancing_enable, tz.danfoss_load_room_mean],
25
25
  exposes: [e.battery(), e.keypad_lockout(),
26
26
  exposes.binary('mounted_mode_active', ea.STATE_GET, true, false)
27
27
  .withDescription('Is the unit in mounting mode. This is set to `false` for mounted (already on ' +
@@ -38,7 +38,7 @@ module.exports = [
38
38
  exposes.binary('heat_required', ea.STATE_GET, true, false)
39
39
  .withDescription('Whether or not the unit needs warm water. `false` No Heat Request or `true` Heat Request'),
40
40
  exposes.enum('setpoint_change_source', ea.STATE, ['manual', 'schedule', 'externally'])
41
- .withDescription('Values observed are `0` (set locally) or `2` (set via Zigbee)'),
41
+ .withDescription('Values observed are `0` (manual), `1` (schedule) or `2` (externally)'),
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)
@@ -58,6 +58,11 @@ module.exports = [
58
58
  exposes.numeric('algorithm_scale_factor', ea.ALL).withValueMin(1).withValueMax(10)
59
59
  .withDescription('Scale factor of setpoint filter timeconstant ("aggressiveness" of control algorithm) '+
60
60
  '1= Quick ... 5=Moderate ... 10=Slow'),
61
+ exposes.binary('load_balancing_enable', ea.ALL, true, false)
62
+ .withDescription('Whether or not the thermostat acts as standalone thermostat or shares load with other ' +
63
+ 'thermostats in the room. The gateway must update load_room_mean if enabled.'),
64
+ exposes.numeric('load_room_mean', ea.ALL)
65
+ .withDescription('Mean radiator load for room calculated by gateway for load balancing purposes'),
61
66
  exposes.numeric('load_estimate', ea.STATE_GET)
62
67
  .withDescription('Load estimate on this radiator')],
63
68
  ota: ota.zigbeeOTA,
@@ -67,10 +72,10 @@ module.exports = [
67
72
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
68
73
 
69
74
  // standard ZCL attributes
70
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.HOUR, max: 43200, change: 1});
71
- await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 25});
72
- await reporting.thermostatPIHeatingDemand(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 1});
73
- await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 25});
75
+ await reporting.batteryPercentageRemaining(endpoint);
76
+ await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
77
+ await reporting.thermostatPIHeatingDemand(endpoint);
78
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
74
79
 
75
80
  // danfoss attributes
76
81
  await endpoint.configureReporting('hvacThermostat', [{
@@ -107,6 +112,8 @@ module.exports = [
107
112
  'danfossMountedModeControl',
108
113
  'danfossMountedModeActive',
109
114
  'danfossExternalMeasuredRoomSensor',
115
+ 'danfossLoadBalancingEnable',
116
+ 'danfossLoadRoomMean',
110
117
  ], options);
111
118
 
112
119
  // read systemMode to have an initial value
package/devices/tuya.js CHANGED
@@ -750,7 +750,8 @@ module.exports = [
750
750
  {
751
751
  zigbeeModel: ['kud7u2l'],
752
752
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_ckud7u2l'}, {modelID: 'TS0601', manufacturerName: '_TZE200_ywdxldoj'},
753
- {modelID: 'TS0601', manufacturerName: '_TZE200_cwnjrr72'}, {modelID: 'TS0601', manufacturerName: '_TZE200_chyvmhay'}],
753
+ {modelID: 'TS0601', manufacturerName: '_TZE200_cwnjrr72'}, {modelID: 'TS0601', manufacturerName: '_TZE200_chyvmhay'},
754
+ {modelID: 'TS0601', manufacturerName: '_TZE200_pvvbommb'}],
754
755
  model: 'TS0601_thermostat',
755
756
  vendor: 'TuYa',
756
757
  description: 'Radiator valve with thermostat',
@@ -914,11 +915,12 @@ module.exports = [
914
915
  {modelID: 'TS011F', manufacturerName: '_TZ3000_ew3ldmgx'},
915
916
  {modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato'},
916
917
  {modelID: 'TS011F', manufacturerName: '_TZ3000_mraovvmm'},
917
- {modelID: 'TS011F', manufacturerName: '_TZ3000_jvzvulen'}],
918
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_jvzvulen'},
919
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g'}],
918
920
  model: 'TS011F_plug_1',
919
921
  description: 'Smart plug (with power monitoring)',
920
922
  vendor: 'TuYa',
921
- whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}],
923
+ whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}, {vendor: 'NEO', model: 'NAS-WR01B'}],
922
924
  fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
923
925
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
924
926
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -7,6 +7,22 @@ const ea = exposes.access;
7
7
  const globalStore = require('../lib/store');
8
8
 
9
9
  module.exports = [
10
+ {
11
+ zigbeeModel: ['URC4470BC0-X-R'],
12
+ model: 'XHS1-UE',
13
+ vendor: 'Universal Electronics Inc',
14
+ description: 'Wireless digital pet resistant PIR detector',
15
+ fromZigbee: [fz.ias_occupancy_alarm_1, fz.temperature, fz.battery],
16
+ toZigbee: [],
17
+ meta: {battery: {voltageToPercentage: '3V_2100'}},
18
+ configure: async (device, coordinatorEndpoint, logger) => {
19
+ const endpoint = device.getEndpoint(1);
20
+ await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
21
+ await reporting.temperature(endpoint);
22
+ await reporting.batteryVoltage(endpoint);
23
+ },
24
+ exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.temperature(), e.battery()],
25
+ },
10
26
  {
11
27
  zigbeeModel: ['URC4460BC0-X-R'],
12
28
  model: 'XHS2-UE',
package/devices/xiaomi.js CHANGED
@@ -40,6 +40,15 @@ const preventReset = async (type, data, device) => {
40
40
  };
41
41
 
42
42
  module.exports = [
43
+ {
44
+ zigbeeModel: ['lumi.magnet.acn001'],
45
+ model: 'MCCGQ14LM',
46
+ vendor: 'Xiaomi',
47
+ description: 'Aqara E1 door & window contact sensor',
48
+ fromZigbee: [fz.ias_contact_alarm_1, fz.aqara_opple_report],
49
+ toZigbee: [],
50
+ exposes: [e.contact(), e.battery(), e.battery_voltage()],
51
+ },
43
52
  {
44
53
  zigbeeModel: ['lumi.dimmer.rcbac1'],
45
54
  model: 'ZNDDMK11LM',
@@ -1,6 +1,5 @@
1
1
  const productionURL = 'http://fw.ota.homesmart.ikea.net/feed/version_info.json';
2
2
  const testURL = 'http://fw.test.ota.homesmart.ikea.net/feed/version_info.json';
3
- const assert = require('assert');
4
3
  const common = require('./common');
5
4
  const axios = common.getAxios();
6
5
  let useTestURL = false;
@@ -14,7 +13,11 @@ async function getImageMeta(current, logger, device) {
14
13
  const imageType = current.imageType;
15
14
  const images = (await axios.get(url)).data;
16
15
  const image = images.find((i) => i.fw_image_type === imageType);
17
- assert(image !== undefined, `No image available for imageType '${imageType}'`);
16
+
17
+ if (!image) {
18
+ throw new Error(`No image available for imageType '${imageType}'`);
19
+ }
20
+
18
21
  return {
19
22
  fileVersion: (image.fw_file_version_MSB << 16) | image.fw_file_version_LSB,
20
23
  url: image.fw_binary_url,
package/lib/reporting.js CHANGED
@@ -148,7 +148,7 @@ module.exports = {
148
148
  await endpoint.configureReporting('hvacThermostat', p);
149
149
  },
150
150
  thermostatPIHeatingDemand: async (endpoint, overrides) => {
151
- const p = payload('pIHeatingDemand', 0, repInterval.MINUTES_5, 10, overrides);
151
+ const p = payload('pIHeatingDemand', 0, repInterval.HOUR, 10, overrides);
152
152
  await endpoint.configureReporting('hvacThermostat', p);
153
153
  },
154
154
  thermostatRunningState: async (endpoint, overrides) => {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.303",
3
+ "version": "14.0.307",
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.303",
3
+ "version": "14.0.307",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [