zigbee-herdsman-converters 14.0.344 → 14.0.345

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.
@@ -1757,6 +1757,37 @@ const converters = {
1757
1757
  }
1758
1758
  },
1759
1759
  },
1760
+ nous_lcd_temperature_humidity_sensor: {
1761
+ cluster: 'manuSpecificTuya',
1762
+ type: ['commandGetData'],
1763
+ options: [exposes.options.precision('temperature'), exposes.options.calibration('temperature'),
1764
+ exposes.options.precision('humidity'), exposes.options.calibration('humidity')],
1765
+ convert: (model, msg, publish, options, meta) => {
1766
+ const dp = msg.data.dp;
1767
+ const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
1768
+ switch (dp) {
1769
+ case tuya.dataPoints.nousTemperature:
1770
+ return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1771
+ case tuya.dataPoints.nousHumidity:
1772
+ return {humidity: calibrateAndPrecisionRoundOptions(value, options, 'humidity')};
1773
+ case tuya.dataPoints.nousBattery:
1774
+ return {battery: value};
1775
+ case tuya.dataPoints.nousTempUnitConvert:
1776
+ return {temperature_unit_convert: {0x00: '°C', 0x01: '°F'}[value]};
1777
+ case tuya.dataPoints.nousMaxTemp:
1778
+ return {max_temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1779
+ case tuya.dataPoints.nousMinTemp:
1780
+ return {min_temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1781
+ case tuya.dataPoints.nousTempAlarm:
1782
+ return {temperature_alarm: {0x00: 'canceled', 0x01: 'lower_alarm', 0x02: 'upper_alarm'}[value]};
1783
+ case tuya.dataPoints.nousTempSensitivity:
1784
+ return {temperature_sensitivity: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1785
+ default:
1786
+ meta.logger.warn(`zigbee-herdsman-converters:nous_lcd_temperature_humidity_sensor: NOT RECOGNIZED ` +
1787
+ `DP #${dp} with data ${JSON.stringify(msg.data)}`);
1788
+ }
1789
+ },
1790
+ },
1760
1791
  tuya_illuminance_temperature_humidity_sensor: {
1761
1792
  cluster: 'manuSpecificTuya',
1762
1793
  type: ['commandDataReport', 'commandDataResponse'],
@@ -4955,8 +4986,19 @@ const converters = {
4955
4986
  payload.voltage = value;
4956
4987
  payload.battery = batteryVoltageToPercentage(value, '3V_2100');
4957
4988
  } else if (index === 3) payload.temperature = calibrateAndPrecisionRoundOptions(value, options, 'temperature'); // 0x03
4958
- else if (index === 100) payload.state = value === 1 ? 'ON' : 'OFF'; // 0x64
4959
- else if (index === 149) {
4989
+ else if (index === 100) {
4990
+ if (['QBKG19LM', 'QBKG20LM', 'QBKG39LM', 'QBKG41LM', 'QBCZ15LM'].includes(model.model)) {
4991
+ const mapping = model.model === 'QBCZ15LM' ? 'relay' : 'left';
4992
+ payload[`state_${mapping}`] = value === 1 ? 'ON' : 'OFF';
4993
+ } else {
4994
+ payload.state = value === 1 ? 'ON' : 'OFF';
4995
+ }
4996
+ } else if (index === 101) {
4997
+ if (['QBKG19LM', 'QBKG20LM', 'QBKG39LM', 'QBKG41LM', 'QBCZ15LM'].includes(model.model)) {
4998
+ const mapping = model.model === 'QBCZ15LM' ? 'usb' : 'right';
4999
+ payload[`state_${mapping}`] = value === 1 ? 'ON' : 'OFF';
5000
+ }
5001
+ } else if (index === 149) {
4960
5002
  payload.energy = precisionRound(value, 2); // 0x95
4961
5003
  // Consumption is deprecated
4962
5004
  payload.consumption = payload.energy;
@@ -4973,6 +4973,27 @@ const converters = {
4973
4973
  }
4974
4974
  },
4975
4975
  },
4976
+ nous_lcd_temperature_humidity_sensor: {
4977
+ key: ['min_temperature', 'max_temperature', 'temperature_sensitivity', 'temperature_unit_convert'],
4978
+ convertSet: async (entity, key, value, meta) => {
4979
+ switch (key) {
4980
+ case 'temperature_unit_convert':
4981
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.nousTempUnitConvert, ['°C', '°F'].indexOf(value));
4982
+ break;
4983
+ case 'min_temperature':
4984
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMinTemp, Math.round(value * 10));
4985
+ break;
4986
+ case 'max_temperature':
4987
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMaxTemp, Math.round(value * 10));
4988
+ break;
4989
+ case 'temperature_sensitivity':
4990
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousTempSensitivity, Math.round(value * 10));
4991
+ break;
4992
+ default: // Unknown key
4993
+ meta.logger.warn(`Unhandled key ${key}`);
4994
+ }
4995
+ },
4996
+ },
4976
4997
  heiman_ir_remote: {
4977
4998
  key: ['send_key', 'create', 'learn', 'delete', 'get_list'],
4978
4999
  convertSet: async (entity, key, value, meta) => {
package/devices/bitron.js CHANGED
@@ -190,7 +190,7 @@ module.exports = [
190
190
  tz.thermostat_running_state, tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode],
191
191
  exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5).withLocalTemperature()
192
192
  .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat', 'cool'])
193
- .withLocalTemperatureCalibration(-20, 20, 1), e.keypad_lockout()],
193
+ .withLocalTemperatureCalibration(-30, 30, 0.1), e.keypad_lockout()],
194
194
  meta: {battery: {voltageToPercentage: '3V_2500_3200'}},
195
195
  configure: async (device, coordinatorEndpoint, logger) => {
196
196
  const endpoint = device.getEndpoint(1);
@@ -175,7 +175,7 @@ module.exports = [
175
175
  .withSystemMode(['off', 'heat', 'cool', 'emergency_heating'])
176
176
  .withRunningState(['idle', 'heat', 'cool', 'fan_only']).withFanMode(['auto', 'on'])
177
177
  .withSetpoint('occupied_cooling_setpoint', 10, 30, 1)
178
- .withLocalTemperatureCalibration(-20, 20, 1)],
178
+ .withLocalTemperatureCalibration(-30, 30, 0.1)],
179
179
  meta: {battery: {voltageToPercentage: '3V_1500_2800'}},
180
180
  configure: async (device, coordinatorEndpoint, logger) => {
181
181
  const endpoint = device.getEndpoint(1);
@@ -201,7 +201,7 @@ module.exports = [
201
201
  .withSystemMode(['off', 'heat', 'cool', 'emergency_heating'])
202
202
  .withRunningState(['idle', 'heat', 'cool', 'fan_only']).withFanMode(['auto', 'on'])
203
203
  .withSetpoint('occupied_cooling_setpoint', 10, 30, 1)
204
- .withLocalTemperatureCalibration(-20, 20, 1)],
204
+ .withLocalTemperatureCalibration(-30, 30, 0.1)],
205
205
  meta: {battery: {voltageToPercentage: '3V_1500_2800'}},
206
206
  configure: async (device, coordinatorEndpoint, logger) => {
207
207
  const endpoint = device.getEndpoint(1);
@@ -290,4 +290,25 @@ module.exports = [
290
290
  },
291
291
  exposes: [e.battery(), e.temperature(), e.humidity(), e.pressure()],
292
292
  },
293
+ {
294
+ zigbeeModel: ['EFEKTA_THP'],
295
+ model: 'EFEKTA_THP',
296
+ vendor: 'Custom devices (DiY)',
297
+ description: '[DIY temperature, humidity and atmospheric pressure sensor, long battery life](http://efektalab.com/eON_THP)',
298
+ fromZigbee: [fz.temperature, fz.humidity, fz.pressure, fz.battery],
299
+ toZigbee: [tz.factory_reset],
300
+ configure: async (device, coordinatorEndpoint, logger) => {
301
+ const endpoint = device.getEndpoint(1);
302
+ await reporting.bind(endpoint, coordinatorEndpoint, [
303
+ 'genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity', 'msPressureMeasurement']);
304
+ const overides = {min: 0, max: 21600, change: 0};
305
+ await reporting.batteryVoltage(endpoint, overides);
306
+ await reporting.batteryPercentageRemaining(endpoint, overides);
307
+ await reporting.temperature(endpoint, overides);
308
+ await reporting.humidity(endpoint, overides);
309
+ await reporting.pressureExtended(endpoint, overides);
310
+ await endpoint.read('msPressureMeasurement', ['scale']);
311
+ },
312
+ exposes: [e.battery(), e.temperature(), e.humidity(), e.pressure()],
313
+ },
293
314
  ];
package/devices/ecozy.js CHANGED
@@ -19,7 +19,7 @@ module.exports = [
19
19
  tz.thermostat_pi_heating_demand, tz.thermostat_running_state],
20
20
  exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 1).withLocalTemperature()
21
21
  .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat'])
22
- .withLocalTemperatureCalibration(-20, 20, 1)
22
+ .withLocalTemperatureCalibration(-30, 30, 0.1)
23
23
  .withPiHeatingDemand(ea.STATE_GET)],
24
24
  configure: async (device, coordinatorEndpoint, logger) => {
25
25
  const endpoint = device.getEndpoint(3);
package/devices/elko.js CHANGED
@@ -45,7 +45,7 @@ module.exports = [
45
45
  '(quick) wooden floors.'),
46
46
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 50, 1)
47
47
  .withLocalTemperature(ea.STATE)
48
- .withLocalTemperatureCalibration(-20, 20, 1)
48
+ .withLocalTemperatureCalibration(-30, 30, 0.1)
49
49
  .withSystemMode(['off', 'heat']).withRunningState(['idle', 'heat'])
50
50
  .withSensor(['air', 'floor', 'supervisor_floor']),
51
51
  exposes.numeric('floor_temp', ea.STATE_GET).withUnit('°C')
@@ -20,7 +20,7 @@ module.exports = [
20
20
  tz.eurotronic_current_heating_setpoint, tz.eurotronic_trv_mode, tz.eurotronic_valve_position],
21
21
  exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 30, 0.5).withLocalTemperature()
22
22
  .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat'])
23
- .withLocalTemperatureCalibration(-20, 20, 1)
23
+ .withLocalTemperatureCalibration(-30, 30, 0.1)
24
24
  .withPiHeatingDemand(),
25
25
  exposes.enum('trv_mode', exposes.access.ALL, [1, 2])
26
26
  .withDescription('Select between direct control of the valve via the `valve_position` or automatic control of the '+
package/devices/hgkg.js CHANGED
@@ -17,7 +17,7 @@ module.exports = [
17
17
  tz.moes_thermostat_deadzone_temperature, tz.moes_thermostat_max_temperature_limit],
18
18
  exposes: [e.child_lock(), e.deadzone_temperature(), e.max_temperature_limit(),
19
19
  exposes.climate().withSetpoint('current_heating_setpoint', 5, 30, 1, ea.STATE_SET)
20
- .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
20
+ .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
21
21
  .withSystemMode(['off', 'cool'], ea.STATE_SET).withRunningState(['idle', 'heat', 'cool'], ea.STATE)
22
22
  .withPreset(['hold', 'program']).withSensor(['IN', 'AL', 'OU'], ea.STATE_SET)],
23
23
  onEvent: tuya.onEventSetLocalTime,
package/devices/hive.js CHANGED
@@ -575,6 +575,20 @@ module.exports = [
575
575
  await reporting.batteryPercentageRemaining(endpoint);
576
576
  },
577
577
  },
578
+ {
579
+ zigbeeModel: ['SLT3C'],
580
+ model: 'SLT3C',
581
+ vendor: 'Hive',
582
+ description: 'Heating thermostat remote control',
583
+ fromZigbee: [fz.battery],
584
+ toZigbee: [],
585
+ exposes: [e.battery()],
586
+ configure: async (device, coordinatorEndpoint, logger) => {
587
+ const endpoint = device.getEndpoint(9);
588
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
589
+ await reporting.batteryPercentageRemaining(endpoint);
590
+ },
591
+ },
578
592
  {
579
593
  zigbeeModel: ['SLB2'],
580
594
  model: 'SLB2',
@@ -2,6 +2,8 @@ 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 extend = require('../lib/extend');
5
+ const tz = require('../converters/toZigbee');
6
+ const ota = require('../lib/ota');
5
7
  const e = exposes.presets;
6
8
 
7
9
  module.exports = [
@@ -108,6 +110,16 @@ module.exports = [
108
110
  await reporting.onOff(endpoint);
109
111
  },
110
112
  },
113
+ {
114
+ zigbeeModel: ['5128.10'],
115
+ model: '5128.10',
116
+ vendor: 'Iluminize',
117
+ description: 'Zigbee 3.0 switch shutter SW with level control',
118
+ fromZigbee: [fz.cover_position_via_brightness, fz.cover_state_via_onoff],
119
+ toZigbee: [tz.cover_state, tz.cover_via_brightness],
120
+ exposes: [e.cover_position()],
121
+ ota: ota.zigbeeOTA,
122
+ },
111
123
  {
112
124
  zigbeeModel: ['ZG2801K2-G1-RGB-CCT-LEAD'],
113
125
  model: '511.557',
@@ -81,6 +81,6 @@ module.exports = [
81
81
  exposes.climate().withSetpoint('occupied_heating_setpoint', 10, 30, 1).withLocalTemperature()
82
82
  .withSystemMode(['off', 'auto', 'heat', 'cool']).withFanMode(['auto', 'on', 'smart'])
83
83
  .withSetpoint('occupied_cooling_setpoint', 10, 30, 1)
84
- .withLocalTemperatureCalibration(-20, 20, 1).withPiHeatingDemand()],
84
+ .withLocalTemperatureCalibration(-30, 30, 0.1).withPiHeatingDemand()],
85
85
  },
86
86
  ];
package/devices/lidl.js CHANGED
@@ -579,6 +579,16 @@ module.exports = [
579
579
  device.getEndpoint(1).saveClusterAttributeKeyValue('lightingColorCtrl', {colorCapabilities: 16});
580
580
  },
581
581
  },
582
+ {
583
+ fingerprint: [{modelID: 'TS0502A', manufacturerName: '_TZ3000_8uaoilu9'}],
584
+ model: '14153905L',
585
+ vendor: 'Lidl',
586
+ description: 'Livarno Home LED floor lamp',
587
+ ...extend.light_onoff_brightness_colortemp({disableColorTempStartup: true, colorTempRange: [153, 333]}),
588
+ configure: async (device, coordinatorEndpoint, logger) => {
589
+ device.getEndpoint(1).saveClusterAttributeKeyValue('lightingColorCtrl', {colorCapabilities: 16});
590
+ },
591
+ },
582
592
  {
583
593
  fingerprint: [{modelID: 'TS0505A', manufacturerName: '_TZ3000_9cpuaca6'}],
584
594
  model: '14148906L',
@@ -629,6 +639,18 @@ module.exports = [
629
639
  extend: extend.light_onoff_brightness({disableEffect: true}),
630
640
  meta: {turnsOffAtBrightness1: false},
631
641
  },
642
+ {
643
+ fingerprint: [{modelID: 'TS0101', manufacturerName: '_TZ3000_br3laukf'}],
644
+ model: 'HG06620',
645
+ vendor: 'Lidl',
646
+ description: 'Silvercrest garden spike with 2 sockets',
647
+ extend: extend.switch(),
648
+ configure: async (device, coordinatorEndpoint, logger) => {
649
+ const endpoint = device.getEndpoint(1);
650
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
651
+ await reporting.onOff(endpoint);
652
+ },
653
+ },
632
654
  {
633
655
  fingerprint: [
634
656
  {modelID: 'TS0501A', manufacturerName: '_TZ3000_7dcddnye'},
@@ -674,7 +696,7 @@ module.exports = [
674
696
  exposes.numeric('current_heating_setpoint_auto', ea.STATE_SET).withValueMin(0.5).withValueMax(29.5)
675
697
  .withValueStep(0.5).withUnit('°C').withDescription('Temperature setpoint automatic'),
676
698
  exposes.climate().withSetpoint('current_heating_setpoint', 0.5, 29.5, 0.5, ea.STATE_SET)
677
- .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
699
+ .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
678
700
  .withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET)
679
701
  .withPreset(['schedule', 'manual', 'holiday', 'boost']),
680
702
  exposes.numeric('detectwindow_temperature', ea.STATE_SET).withUnit('°C').withDescription('Open window detection temperature')
package/devices/moes.js CHANGED
@@ -87,7 +87,7 @@ module.exports = [
87
87
  tz.moes_thermostat_deadzone_temperature, tz.moes_thermostat_max_temperature_limit],
88
88
  exposes: [e.child_lock(), e.deadzone_temperature(), e.max_temperature_limit(),
89
89
  exposes.climate().withSetpoint('current_heating_setpoint', 5, 30, 1, ea.STATE_SET)
90
- .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
90
+ .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
91
91
  .withSystemMode(['off', 'heat'], ea.STATE_SET).withRunningState(['idle', 'heat', 'cool'], ea.STATE)
92
92
  .withPreset(['hold', 'program']).withSensor(['IN', 'AL', 'OU'], ea.STATE_SET)],
93
93
  onEvent: tuya.onEventSetLocalTime,
@@ -211,7 +211,7 @@ module.exports = [
211
211
  exposes.binary('window', ea.STATE, 'CLOSED', 'OPEN').withDescription('Window status closed or open '),
212
212
  exposes.climate()
213
213
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
214
- .withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
214
+ .withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
215
215
  .withPreset(['programming', 'manual', 'temporary_manual', 'holiday'],
216
216
  'MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. '+
217
217
  'When the set temperature is lower than the "minimum temperature", the valve is closed (forced closed). ' +
@@ -0,0 +1,40 @@
1
+ const exposes = require('../lib/exposes');
2
+ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
+ const tz = require('../converters/toZigbee');
4
+ const tuya = require('../lib/tuya');
5
+ const reporting = require('../lib/reporting');
6
+ const e = exposes.presets;
7
+ const ea = exposes.access;
8
+
9
+ module.exports = [
10
+ {
11
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_nnrfa68v'}],
12
+ model: 'E6',
13
+ vendor: 'Nous',
14
+ description: 'Temperature & humidity LCD sensor',
15
+ fromZigbee: [fz.nous_lcd_temperature_humidity_sensor, fz.ignore_tuya_set_time],
16
+ toZigbee: [tz.nous_lcd_temperature_humidity_sensor],
17
+ onEvent: tuya.onEventSetLocalTime,
18
+ configure: async (device, coordinatorEndpoint, logger) => {
19
+ const endpoint = device.getEndpoint(1);
20
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic']);
21
+ },
22
+ exposes: [
23
+ e.temperature(),
24
+ e.humidity(),
25
+ e.battery(),
26
+ exposes.enum('temperature_unit_convert', ea.STATE_SET, ['celsius', 'fahrenheit']).withDescription('Current display unit'),
27
+ exposes.enum('temperature_alarm', ea.STATE, ['canceled', 'lower_alarm', 'upper_alarm'])
28
+ .withDescription('Temperature alarm status'),
29
+ exposes.numeric('max_temperature', ea.STATE_SET)
30
+ .withUnit('°C').withValueMin(-20).withValueMax(60)
31
+ .withDescription('Alarm temperature max'),
32
+ exposes.numeric('min_temperature', ea.STATE_SET).withUnit('°C')
33
+ .withValueMin(-20).withValueMax(60)
34
+ .withDescription('Alarm temperature min'),
35
+ exposes.numeric('temperature_sensitivity', ea.STATE_SET)
36
+ .withUnit('°C').withValueMin(0.1).withValueMax(50).withValueStep(0.1)
37
+ .withDescription('Temperature sensitivity'),
38
+ ],
39
+ },
40
+ ];
@@ -509,7 +509,7 @@ module.exports = [
509
509
  vendor: 'Philips',
510
510
  description: 'Hue Lux A19 bulb E27',
511
511
  meta: {turnsOffAtBrightness1: true},
512
- extend: hueExtend.light_onoff_brightness_colortemp(),
512
+ extend: hueExtend.light_onoff_brightness(),
513
513
  ota: ota.zigbeeOTA,
514
514
  },
515
515
  {
@@ -1273,6 +1273,15 @@ module.exports = [
1273
1273
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
1274
1274
  ota: ota.zigbeeOTA,
1275
1275
  },
1276
+ {
1277
+ zigbeeModel: ['929003099001'],
1278
+ model: '929003099001',
1279
+ vendor: 'Philips',
1280
+ description: 'Hue white ambiance Aurelle square panel light',
1281
+ meta: {turnsOffAtBrightness1: true},
1282
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
1283
+ ota: ota.zigbeeOTA,
1284
+ },
1276
1285
  {
1277
1286
  zigbeeModel: ['LTC015'],
1278
1287
  model: '3216331P5',
@@ -43,7 +43,7 @@ module.exports = [
43
43
  exposes: [e.battery_low(), e.window_detection(), e.child_lock(), exposes.climate()
44
44
  .withSetpoint('current_heating_setpoint', 5, 30, 0.5, ea.STATE_SET).withLocalTemperature(ea.STATE)
45
45
  .withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET)
46
- .withLocalTemperatureCalibration(-6, 6, 1, ea.STATE_SET)
46
+ .withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
47
47
  .withAwayMode()],
48
48
  },
49
49
  ];
@@ -444,7 +444,7 @@ module.exports = [
444
444
  exposes.climate()
445
445
  .withSetpoint('occupied_heating_setpoint', 7, 30, 0.5, ea.STATE_SET)
446
446
  .withLocalTemperature(ea.STATE)
447
- .withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
447
+ .withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
448
448
  .withPiHeatingDemand()],
449
449
  meta: {battery: {voltageToPercentage: '3V_2500'}},
450
450
  configure: async (device, coordinatorEndpoint, logger) => {
package/devices/tuya.js CHANGED
@@ -136,7 +136,8 @@ module.exports = [
136
136
  },
137
137
  {
138
138
  fingerprint: [{modelID: 'TS0503B', manufacturerName: '_TZ3000_i8l0nqdu'},
139
- {modelID: 'TS0503B', manufacturerName: '_TZ3210_a5fxguxr'}],
139
+ {modelID: 'TS0503B', manufacturerName: '_TZ3210_a5fxguxr'},
140
+ {modelID: 'TS0503B', manufacturerName: '_TZ3000_g5xawfcq'}],
140
141
  model: 'TS0503B',
141
142
  vendor: 'TuYa',
142
143
  description: 'Zigbee RGB light',
@@ -170,6 +171,7 @@ module.exports = [
170
171
  {modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
171
172
  {modelID: 'TS0202', manufacturerName: '_TZ3000_mmtwjmaq'},
172
173
  {modelID: 'TS0202', manufacturerName: '_TZ3000_mcxw5ehu'},
174
+ {modelID: 'TS0202', manufacturerName: '_TZ3000_msl6wxk9'},
173
175
  {modelID: 'TS0202', manufacturerName: '_TYZB01_hqbdru35'},
174
176
  {modelID: 'WHD02', manufacturerName: '_TZ3000_hktqahrq'}],
175
177
  model: 'TS0202',
@@ -544,6 +546,11 @@ module.exports = [
544
546
  e.action(['1_single', '1_double', '1_hold', '2_single', '2_double', '2_hold', '3_single', '3_double', '3_hold'])],
545
547
  fromZigbee: [fz.tuya_on_off_action, fz.battery],
546
548
  toZigbee: [],
549
+ configure: async (device, coordinatorEndpoint, logger) => {
550
+ const endpoint = device.getEndpoint(1);
551
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
552
+ await reporting.batteryPercentageRemaining(endpoint);
553
+ },
547
554
  },
548
555
  {
549
556
  zigbeeModel: ['TS0044'],
@@ -809,7 +816,7 @@ module.exports = [
809
816
  e.child_lock(), e.window_detection(), e.battery_low(), e.valve_detection(), e.position(),
810
817
  exposes.climate().withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
811
818
  .withLocalTemperature(ea.STATE).withSystemMode(['heat', 'auto', 'off'], ea.STATE_SET)
812
- .withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
819
+ .withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
813
820
  .withAwayMode().withPreset(['schedule', 'manual', 'boost', 'complex', 'comfort', 'eco']),
814
821
  e.auto_lock(), e.away_mode(), e.away_preset_days(), e.boost_time(), e.comfort_temperature(), e.eco_temperature(), e.force(),
815
822
  e.max_temperature(), e.min_temperature(), e.away_preset_temperature(),
@@ -840,7 +847,7 @@ module.exports = [
840
847
  e.battery_low(), e.child_lock(), e.open_window(), e.open_window_temperature().withValueMin(0).withValueMax(30),
841
848
  e.holiday_temperature().withValueMin(0).withValueMax(30), e.comfort_temperature().withValueMin(0).withValueMax(30),
842
849
  e.eco_temperature().withValueMin(0).withValueMax(30),
843
- exposes.climate().withPreset(['auto', 'manual', 'holiday']).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
850
+ exposes.climate().withPreset(['auto', 'manual', 'holiday']).withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
844
851
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 0, 30, 0.5, ea.STATE_SET),
845
852
  exposes.numeric('boost_timeset_countdown', ea.STATE_SET).withUnit('second').withDescription('Setting '+
846
853
  'minimum 0 - maximum 465 seconds boost time. The boost (♨) function is activated. The remaining '+
@@ -939,7 +946,7 @@ module.exports = [
939
946
  exposes.binary('heating', ea.STATE, 'ON', 'OFF').withDescription('Device valve is open or closed (heating or not)'),
940
947
  exposes.climate()
941
948
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
942
- .withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET).withPreset(['auto', 'manual', 'off', 'on'],
949
+ .withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET).withPreset(['auto', 'manual', 'off', 'on'],
943
950
  'MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. ' +
944
951
  'When the set temperature is lower than the "minimum temperature", the valve is closed (forced closed). ' +
945
952
  'AUTO MODE ⏱ - In this mode, the device executes a preset week programming temperature time and temperature. ' +
@@ -970,12 +977,13 @@ module.exports = [
970
977
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
971
978
  configure: async (device, coordinatorEndpoint, logger) => {
972
979
  const endpoint = device.getEndpoint(1);
973
- await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
980
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
974
981
  endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
975
982
  endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {
976
983
  acVoltageMultiplier: 1, acVoltageDivisor: 1, acCurrentMultiplier: 1, acCurrentDivisor: 1000, acPowerMultiplier: 1,
977
984
  acPowerDivisor: 1,
978
985
  });
986
+ await reporting.currentSummDelivered(endpoint);
979
987
  },
980
988
  // This device doesn't support reporting correctly.
981
989
  // https://github.com/Koenkk/zigbee-herdsman-converters/pull/1270
@@ -1021,7 +1029,8 @@ module.exports = [
1021
1029
  model: 'TS011F_plug_1',
1022
1030
  description: 'Smart plug (with power monitoring)',
1023
1031
  vendor: 'TuYa',
1024
- whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}, {vendor: 'NEO', model: 'NAS-WR01B'}],
1032
+ whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}, {vendor: 'NEO', model: 'NAS-WR01B'},
1033
+ {vendor: 'BlitzWolf', model: 'BW-SHP15'}],
1025
1034
  fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
1026
1035
  toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
1027
1036
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -1071,6 +1080,7 @@ module.exports = [
1071
1080
  {modelID: 'TS011F', manufacturerName: '_TZ3000_nfnmi125', applicationVersion: 69},
1072
1081
  {modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato', applicationVersion: 68},
1073
1082
  {modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato', applicationVersion: 69},
1083
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 64},
1074
1084
  {modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 68},
1075
1085
  {modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 69},
1076
1086
  ],
@@ -1482,7 +1492,7 @@ module.exports = [
1482
1492
  exposes: [exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 30, 0.5).withLocalTemperature()
1483
1493
  .withSystemMode(['off', 'auto', 'heat'], ea.ALL)
1484
1494
  .withRunningState(['idle', 'heat', 'cool'], ea.STATE)
1485
- .withLocalTemperatureCalibration(-20, 20, 1, ea.ALL).withPiHeatingDemand()],
1495
+ .withLocalTemperatureCalibration(-30, 30, 0.1, ea.ALL).withPiHeatingDemand()],
1486
1496
  configure: async (device, coordinatorEndpoint, logger) => {
1487
1497
  const endpoint = device.getEndpoint(9);
1488
1498
  await reporting.bind(endpoint, coordinatorEndpoint, ['hvacThermostat', 'hvacFanCtrl']);
package/devices/xiaomi.js CHANGED
@@ -1654,6 +1654,7 @@ module.exports = [
1654
1654
  configure: async (device, coordinatorEndpoint, logger) => {
1655
1655
  await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
1656
1656
  },
1657
+ ota: ota.zigbeeOTA,
1657
1658
  },
1658
1659
  {
1659
1660
  zigbeeModel: ['lumi.switch.b1nc01'],
@@ -1719,7 +1720,7 @@ module.exports = [
1719
1720
  e.current(), e.power_outage_memory(), e.led_disabled_night(), e.button_lock(),
1720
1721
  exposes.enum('button_switch_mode', exposes.access.ALL, ['relay', 'relay_and_usb'])
1721
1722
  .withDescription('Control both relay and usb or only the relay with the physical switch button'),
1722
- exposes.numeric('overload_protection', exposes.access.ALL).withValueMin(100).withValueMax(2200).withUnit('W')
1723
+ exposes.numeric('overload_protection', exposes.access.ALL).withValueMin(100).withValueMax(2500).withUnit('W')
1723
1724
  .withDescription('Maximum allowed load, turns off if exceeded')],
1724
1725
  configure: async (device, coordinatorEndpoint, logger) => {
1725
1726
  await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
@@ -1752,11 +1753,12 @@ module.exports = [
1752
1753
  e.switch(), e.power().withAccess(ea.STATE), e.energy(),
1753
1754
  e.temperature().withAccess(ea.STATE), e.voltage().withAccess(ea.STATE),
1754
1755
  e.current(), e.power_outage_memory(), e.led_disabled_night(), e.button_lock(),
1755
- exposes.numeric('overload_protection', exposes.access.ALL).withValueMin(100).withValueMax(2200).withUnit('W')
1756
+ exposes.numeric('overload_protection', exposes.access.ALL).withValueMin(100).withValueMax(2500).withUnit('W')
1756
1757
  .withDescription('Maximum allowed load, turns off if exceeded')],
1757
1758
  configure: async (device, coordinatorEndpoint, logger) => {
1758
1759
  await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
1759
1760
  },
1761
+ ota: ota.zigbeeOTA,
1760
1762
  },
1761
1763
  {
1762
1764
  zigbeeModel: ['lumi.remote.rkba01'],
package/devices/zen.js CHANGED
@@ -17,7 +17,7 @@ module.exports = [
17
17
  tz.thermostat_weekly_schedule, tz.thermostat_clear_weekly_schedule, tz.thermostat_relay_status_log],
18
18
  exposes: [exposes.climate().withSetpoint('occupied_heating_setpoint', 10, 30, 0.5).withLocalTemperature()
19
19
  .withSystemMode(['off', 'auto', 'heat', 'cool']).withRunningState(['idle', 'heat', 'cool'])
20
- .withLocalTemperatureCalibration(-20, 20, 1).withPiHeatingDemand()],
20
+ .withLocalTemperatureCalibration(-30, 30, 0.1).withPiHeatingDemand()],
21
21
  configure: async (device, coordinatorEndpoint, logger) => {
22
22
  const endpoint = device.getEndpoint(3) || device.getEndpoint(1);
23
23
  const binds = ['genBasic', 'genIdentify', 'genPowerCfg', 'genTime', 'hvacThermostat', 'hvacUserInterfaceCfg'];
package/lib/tuya.js CHANGED
@@ -475,6 +475,15 @@ const dataPoints = {
475
475
  hochTotalReverseActivePower: 117,
476
476
  hochHistoricalVoltage: 118,
477
477
  hochHistoricalCurrent: 119,
478
+ // NOUS SMart LCD Temperature and Humidity Sensor E6
479
+ nousTemperature: 1,
480
+ nousHumidity: 2,
481
+ nousBattery: 4,
482
+ nousTempUnitConvert: 9,
483
+ nousMaxTemp: 10,
484
+ nousMinTemp: 11,
485
+ nousTempAlarm: 14,
486
+ nousTempSensitivity: 19,
478
487
 
479
488
  // TUYA / HUMIDITY/ILLUMINANCE/TEMPERATURE SENSOR
480
489
  thitBatteryPercentage: 3,