zigbee-herdsman-converters 14.0.613 → 14.0.614

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.
@@ -1226,6 +1226,7 @@ const converters = {
1226
1226
  Object.values(constants.thermostatProgrammingOperationModes).join(', '));
1227
1227
  }
1228
1228
  await entity.write('hvacThermostat', {programingOperMode: val});
1229
+ return {state: {programming_operation_mode: value}};
1229
1230
  },
1230
1231
  convertGet: async (entity, key, meta) => {
1231
1232
  await entity.read('hvacThermostat', ['programingOperMode']);
@@ -1341,6 +1342,7 @@ const converters = {
1341
1342
  }
1342
1343
  const occupiedHeatingSetpoint = result;
1343
1344
  await entity.write('hvacThermostat', {occupiedHeatingSetpoint});
1345
+ return {state: {occupied_heating_setpoint: value}};
1344
1346
  },
1345
1347
  convertGet: async (entity, key, meta) => {
1346
1348
  await entity.read('hvacThermostat', ['occupiedHeatingSetpoint']);
@@ -1375,6 +1377,7 @@ const converters = {
1375
1377
  }
1376
1378
  const occupiedCoolingSetpoint = result;
1377
1379
  await entity.write('hvacThermostat', {occupiedCoolingSetpoint});
1380
+ return {state: {occupied_cooling_setpoint: value}};
1378
1381
  },
1379
1382
  convertGet: async (entity, key, meta) => {
1380
1383
  await entity.read('hvacThermostat', ['occupiedCoolingSetpoint']);
@@ -0,0 +1,110 @@
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 utils = require('../lib/utils');
6
+ const assert = require('assert');
7
+ const e = exposes.presets;
8
+ const ea = exposes.access;
9
+
10
+
11
+ const thermostatPositions = {
12
+ 'quarter_open': 1,
13
+ 'half_open': 2,
14
+ 'three_quarters_open': 3,
15
+ 'fully_open': 4,
16
+ };
17
+
18
+ const tzLocal = {
19
+ quiet_fan: {
20
+ key: ['quiet_fan'],
21
+ convertSet: async (entity, key, value, meta) => {
22
+ assert(typeof value === 'boolean');
23
+ await entity.write('hvacFanCtrl', {0x1000: {value: value ? 1 : 0, type: 0x10}}, {manufacturerCode: 0x125b});
24
+ return {state: {quiet_fan: value}};
25
+ },
26
+ },
27
+ ac_louver_position: {
28
+ key: ['ac_louver_position'],
29
+ convertSet: async (entity, key, value, meta) => {
30
+ value = value.toLowerCase();
31
+ utils.validateValue(value, Object.keys(thermostatPositions));
32
+ const index = thermostatPositions[value];
33
+ await entity.write('hvacThermostat', {0x4273: {value: index, type: 0x30}}, {manufacturerCode: 0x125b});
34
+ return {state: {ac_louver_position: value}};
35
+ },
36
+ },
37
+ preset: {
38
+ key: ['preset'],
39
+ convertSet: async (entity, key, value, meta) => {
40
+ value = value.toLowerCase();
41
+ utils.validateValue(value, ['activity', 'boost', 'eco', 'none']);
42
+ const activity = value === 'activity' ? 1 : 0;
43
+ const boost = value === 'boost' ? 1 : 0;
44
+ const eco = value === 'eco' ? 4 : 0;
45
+
46
+ await entity.write('hvacThermostat', {0x4275: {value: activity, type: 0x30}}, {manufacturerCode: 0x125b});
47
+ await entity.write('hvacThermostat', {'programingOperMode': eco});
48
+ await entity.write('hvacThermostat', {0x4270: {value: boost, type: 0x10}}, {manufacturerCode: 0x125b});
49
+
50
+ return {state: {preset: value}};
51
+ },
52
+ },
53
+ swingMode: {
54
+ key: ['swing_mode'],
55
+ convertSet: async (entity, key, value, meta) => {
56
+ value = value.toLowerCase();
57
+ utils.validateValue(value, ['on', 'off']);
58
+ await entity.write('hvacThermostat', {0x4274: {value: value === 'on' ? 1 : 0, type: 0x10}}, {manufacturerCode: 0x125b});
59
+ return {state: {swing_mode: value}};
60
+ },
61
+ },
62
+ };
63
+
64
+ module.exports = [{
65
+ zigbeeModel: ['Adapter Zigbee FUJITSU'],
66
+ model: 'GW003-AS-IN-TE-FC',
67
+ vendor: 'Atlantic Group',
68
+ description: 'Interface Naviclim for Takao air conditioners',
69
+ fromZigbee: [
70
+ fz.thermostat,
71
+ fz.fan,
72
+ ],
73
+ toZigbee: [
74
+ tzLocal.ac_louver_position,
75
+ tzLocal.preset,
76
+ tzLocal.quiet_fan,
77
+ tzLocal.swingMode,
78
+ tz.fan_mode,
79
+ tz.thermostat_local_temperature,
80
+ tz.thermostat_occupied_cooling_setpoint,
81
+ tz.thermostat_occupied_heating_setpoint,
82
+ tz.thermostat_programming_operation_mode,
83
+ tz.thermostat_system_mode,
84
+ ],
85
+ exposes: [
86
+ e.programming_operation_mode(),
87
+ exposes.climate()
88
+ .withLocalTemperature()
89
+ .withSetpoint('occupied_cooling_setpoint', 18, 30, 0.5)
90
+ .withSetpoint('occupied_heating_setpoint', 16, 30, 0.5)
91
+ .withSystemMode(['off', 'heat', 'cool', 'auto', 'dry', 'fan_only'])
92
+ .withPreset(['activity', 'boost', 'eco'])
93
+ .withFanMode(['low', 'medium', 'high', 'auto'])
94
+ .withSwingMode(['on', 'off'], ea.STATE_SET),
95
+ exposes.binary('quiet_fan', ea.STATE_SET, true, false).withDescription('Fan quiet mode'),
96
+ exposes.enum('ac_louver_position', ea.STATE_SET, Object.keys(thermostatPositions))
97
+ .withDescription('Ac louver position of this device'),
98
+ ],
99
+ configure: async (device, coordinatorEndpoint, logger) => {
100
+ const endpoint1 = device.getEndpoint(1);
101
+ const binds1 = ['hvacFanCtrl', 'genIdentify', 'hvacFanCtrl', 'hvacThermostat', 'manuSpecificPhilips2'];
102
+ await reporting.bind(endpoint1, coordinatorEndpoint, binds1);
103
+ await reporting.thermostatTemperature(endpoint1);
104
+ await reporting.thermostatOccupiedCoolingSetpoint(endpoint1);
105
+ await reporting.thermostatSystemMode(endpoint1);
106
+
107
+ const endpoint232 = device.getEndpoint(232);
108
+ await reporting.bind(endpoint232, coordinatorEndpoint, ['haDiagnostic']);
109
+ },
110
+ }];
@@ -772,9 +772,39 @@ module.exports = [
772
772
  exposes.binary('factory_reset_co2', ea.STATE_SET, 'ON', 'OFF').withDescription('Factory Reset CO2 sensor'),
773
773
  exposes.binary('enable_gas', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable CO2 Gas Control'),
774
774
  exposes.numeric('high_gas', ea.STATE_SET).withUnit('ppm').withDescription('Setting High CO2 Gas Border')
775
- .withValueMin(0).withValueMax(99),
775
+ .withValueMin(400).withValueMax(2000),
776
776
  exposes.numeric('low_gas', ea.STATE_SET).withUnit('ppm').withDescription('Setting Low CO2 Gas Border')
777
+ .withValueMin(400).withValueMax(2000),
778
+ exposes.binary('enable_temperature', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable Temperature Control'),
779
+ exposes.numeric('high_temperature', ea.STATE_SET).withUnit('C').withDescription('Setting High Temperature Border')
780
+ .withValueMin(-5).withValueMax(50),
781
+ exposes.numeric('low_temperature', ea.STATE_SET).withUnit('C').withDescription('Setting Low Temperature Border')
782
+ .withValueMin(-5).withValueMax(50),
783
+ exposes.binary('enable_humidity', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable Humidity Control'),
784
+ exposes.numeric('high_humidity', ea.STATE_SET).withUnit('C').withDescription('Setting High Humidity Border')
777
785
  .withValueMin(0).withValueMax(99),
786
+ exposes.numeric('low_humidity', ea.STATE_SET).withUnit('C').withDescription('Setting Low Humidity Border')
787
+ .withValueMin(0).withValueMax(99)],
788
+ },
789
+ {
790
+ zigbeeModel: ['SNZB-02_EFEKTA'],
791
+ model: 'SNZB-02_EFEKTA',
792
+ vendor: 'Custom devices (DiY)',
793
+ description: 'Alternative firmware for the SONOFF SNZB-02 sensor from EfektaLab, DIY',
794
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery, fzLocal.termostat_config, fzLocal.hydrostat_config, fzLocal.node_config],
795
+ toZigbee: [tz.factory_reset, tzLocal.termostat_config, tzLocal.hydrostat_config, tzLocal.node_config],
796
+ configure: async (device, coordinatorEndpoint, logger) => {
797
+ const endpoint = device.getEndpoint(1);
798
+ await reporting.bind(endpoint, coordinatorEndpoint, [
799
+ 'genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity']);
800
+ const overides = {min: 0, max: 21600, change: 0};
801
+ await reporting.batteryVoltage(endpoint, overides);
802
+ await reporting.batteryPercentageRemaining(endpoint, overides);
803
+ },
804
+ exposes: [e.battery(), e.temperature(), e.humidity(),
805
+ exposes.numeric('report_delay', ea.STATE_SET).withUnit('Minutes')
806
+ .withDescription('Adjust Report Delay. Setting the time in minutes, by default 5 minutes')
807
+ .withValueMin(1).withValueMax(60),
778
808
  exposes.binary('enable_temperature', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable Temperature Control'),
779
809
  exposes.numeric('high_temperature', ea.STATE_SET).withUnit('C').withDescription('Setting High Temperature Border')
780
810
  .withValueMin(-5).withValueMax(50),
package/devices/ikea.js CHANGED
@@ -457,7 +457,7 @@ module.exports = [
457
457
  meta: {supportsHueAndSaturation: false},
458
458
  },
459
459
  {
460
- zigbeeModel: ['TRADFRI bulb E26 CWS 800lm', 'TRADFRI bulb E27 CWS 806lm'],
460
+ zigbeeModel: ['TRADFRI bulb E26 CWS 800lm', 'TRADFRI bulb E27 CWS 806lm', 'TRADFRI bulb E26 CWS 806lm'],
461
461
  model: 'LED1924G9',
462
462
  vendor: 'IKEA',
463
463
  description: 'TRADFRI bulb E26/E27 CWS 800/806 lumen, dimmable, color, opal white',
@@ -175,4 +175,30 @@ module.exports = [
175
175
  extend: extend.ledvance.light_onoff_brightness(),
176
176
  ota: ota.ledvance,
177
177
  },
178
+ {
179
+ zigbeeModel: ['B40 DIM T'],
180
+ model: '4058075729063',
181
+ vendor: 'LEDVANCE',
182
+ description: 'SMART+ Classic B40 E14 dimmable white',
183
+ extend: extend.ledvance.light_onoff_brightness(),
184
+ ota: ota.ledvance,
185
+ },
186
+ {
187
+ zigbeeModel: ['PAR16 DIM T'],
188
+ model: '4058075729148',
189
+ vendor: 'LEDVANCE',
190
+ description: 'SMART+ Spot PAR16 50 GU10 dimmable white',
191
+ extend: extend.ledvance.light_onoff_brightness(),
192
+ ota: ota.ledvance,
193
+ },
194
+ {
195
+ zigbeeModel: ['P40 DIM T'],
196
+ model: '4058075729100',
197
+ vendor: 'LEDVANCE',
198
+ description: 'SMART+ Classic P40 E14 dimmable white',
199
+ extend: extend.ledvance.light_onoff_brightness(),
200
+ ota: ota.ledvance,
201
+ },
202
+
203
+
178
204
  ];
@@ -174,9 +174,10 @@ module.exports = [
174
174
  vendor: 'Legrand',
175
175
  description: 'Wired switch without neutral',
176
176
  extend: extend.light_onoff_brightness({noConfigure: true}),
177
- fromZigbee: [fz.brightness, fz.identify, fz.on_off, fz.lighting_ballast_configuration, fz.legrand_cluster_fc01],
177
+ fromZigbee: [fz.brightness, fz.identify, fz.on_off, fz.lighting_ballast_configuration, fz.legrand_cluster_fc01,
178
+ fz.power_on_behavior],
178
179
  toZigbee: [tz.light_onoff_brightness, tz.legrand_settingEnableLedInDark, tz.legrand_settingEnableLedIfOn,
179
- tz.legrand_deviceMode, tz.legrand_identify, tz.ballast_config],
180
+ tz.legrand_deviceMode, tz.legrand_identify, tz.ballast_config, tz.power_on_behavior],
180
181
  exposes: [e.light_brightness(),
181
182
  exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
182
183
  .withDescription('Specifies the minimum brightness value'),
@@ -185,7 +186,8 @@ module.exports = [
185
186
  exposes.binary('device_mode', ea.ALL, 'dimmer_on', 'dimmer_off').withDescription('Allow the device to change brightness'),
186
187
  exposes.binary('led_in_dark', ea.ALL, 'ON', 'OFF').withDescription(`Enables the LED when the light is turned off, allowing to
187
188
  see the switch in the dark`),
188
- exposes.binary('led_if_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is turned on')],
189
+ exposes.binary('led_if_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the light is turned on'),
190
+ e.power_on_behavior()],
189
191
  configure: async (device, coordinatorEndpoint, logger) => {
190
192
  await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
191
193
  const endpoint = device.getEndpoint(1);
@@ -201,10 +203,14 @@ module.exports = [
201
203
  vendor: 'Legrand',
202
204
  ota: ota.zigbeeOTA,
203
205
  description: 'Power socket with power consumption monitoring',
204
- fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement],
205
- toZigbee: [tz.on_off, tz.legrand_settingEnableLedInDark, tz.legrand_identify, tz.legrand_settingEnableLedIfOn],
206
+ fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.power_on_behavior],
207
+ toZigbee: [tz.on_off, tz.legrand_settingEnableLedInDark, tz.legrand_identify, tz.legrand_settingEnableLedIfOn,
208
+ tz.power_on_behavior],
206
209
  exposes: [e.switch(), e.action(['identify']), e.power(),
207
- exposes.binary('led_if_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the device is turned on')],
210
+ exposes.binary('led_in_dark', ea.ALL, 'ON', 'OFF').withDescription(`Enables the LED when the power socket is turned off,
211
+ allowing to see it in the dark`),
212
+ exposes.binary('led_if_on', ea.ALL, 'ON', 'OFF').withDescription('Enables the LED when the device is turned on'),
213
+ e.power_on_behavior()],
208
214
  configure: async (device, coordinatorEndpoint, logger) => {
209
215
  const endpoint = device.getEndpoint(1);
210
216
  await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'haElectricalMeasurement']);
@@ -326,12 +332,14 @@ module.exports = [
326
332
  model: '064882',
327
333
  vendor: 'Legrand',
328
334
  description: 'Cable outlet with pilot wire and consumption measurement',
329
- fromZigbee: [fz.legrand_cluster_fc01, fz.legrand_cable_outlet_mode, fz.on_off, fz.electrical_measurement],
330
- toZigbee: [tz.legrand_deviceMode, tz.legrand_cableOutletMode, tz.on_off, tz.electrical_measurement_power],
335
+ fromZigbee: [fz.legrand_cluster_fc01, fz.legrand_cable_outlet_mode, fz.on_off, fz.electrical_measurement, fz.power_on_behavior],
336
+ toZigbee: [tz.legrand_deviceMode, tz.legrand_cableOutletMode, tz.on_off, tz.electrical_measurement_power, tz.power_on_behavior],
331
337
  exposes: [exposes.binary('device_mode', ea.ALL, 'pilot_on', 'pilot_off'),
332
338
  exposes.enum('cable_outlet_mode', ea.ALL, ['comfort', 'comfort-1', 'comfort-2', 'eco', 'frost_protection', 'off']),
333
339
  exposes.switch().withState('state', true, 'Works only when the pilot wire is deactivated'),
334
- e.power().withAccess(ea.STATE_GET)],
340
+ e.power().withAccess(ea.STATE_GET),
341
+ e.power_on_behavior().withDescription(`Controls the behavior when the device is powered on. Works only when the pilot wire is
342
+ deactivated`)],
335
343
  configure: async (device, coordinatorEndpoint, logger) => {
336
344
  const endpoint = device.getEndpoint(1);
337
345
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'manuSpecificLegrandDevices2']);
@@ -329,6 +329,13 @@ module.exports = [
329
329
  description: 'Hue White ambiance Pillar spotlight',
330
330
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
331
331
  },
332
+ {
333
+ zigbeeModel: ['929003046001'],
334
+ model: '5309031P8',
335
+ vendor: 'Philips',
336
+ description: 'Hue White ambiance Runner spot white (1 spot)',
337
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
338
+ },
332
339
  {
333
340
  zigbeeModel: ['929002376301'],
334
341
  model: '929002376301',
@@ -12,7 +12,7 @@ module.exports = [
12
12
  description: 'Roller shade',
13
13
  fromZigbee: [fz.cover_position_tilt, fz.battery],
14
14
  toZigbee: [tz.cover_state, tz.cover_position_tilt],
15
- meta: {battery: {dontDividePercentage: true}},
15
+ meta: {battery: {dontDividePercentage: true}, coverInverted: true},
16
16
  configure: async (device, coordinatorEndpoint, logger) => {
17
17
  const endpoint = device.getEndpoint(1);
18
18
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
package/devices/tuya.js CHANGED
@@ -336,6 +336,16 @@ const fzLocal = {
336
336
  return fz.battery.convert(model, msg, publish, options, meta);
337
337
  },
338
338
  },
339
+ TS0201_humidity: {
340
+ ...fz.humidity,
341
+ convert: (model, msg, publish, options, meta) => {
342
+ const result = fz.humidity.convert(model, msg, publish, options, meta);
343
+ if (meta.device.manufacturerName === '_TZ3000_ywagc4rj') {
344
+ result.humidity = result.humidity * 10;
345
+ }
346
+ return result;
347
+ },
348
+ },
339
349
  TS0222: {
340
350
  cluster: 'manuSpecificTuya',
341
351
  type: ['commandDataResponse', 'commandDataReport'],
@@ -1326,7 +1336,7 @@ module.exports = [
1326
1336
  vendor: 'TuYa',
1327
1337
  description: 'Temperature & humidity sensor with display',
1328
1338
  whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-IS4'}],
1329
- fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fz.humidity],
1339
+ fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fzLocal.TS0201_humidity],
1330
1340
  toZigbee: [],
1331
1341
  exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
1332
1342
  configure: async (device, coordinatorEndpoint, logger) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.613",
3
+ "version": "14.0.614",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [