zigbee-herdsman-converters 14.0.344 → 14.0.348

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.
@@ -652,6 +652,18 @@ const converters = {
652
652
  return payload;
653
653
  },
654
654
  },
655
+ EKO09738_metering: {
656
+ /**
657
+ * Elko EKO09738 and EKO09716 reports power in mW, scale to W
658
+ */
659
+ cluster: 'seMetering',
660
+ type: ['attributeReport', 'readResponse'],
661
+ convert: (model, msg, publish, options, meta) => {
662
+ const result = converters.metering.convert(model, msg, publish, options, meta);
663
+ result.power /= 1000;
664
+ return result;
665
+ },
666
+ },
655
667
  develco_metering: {
656
668
  cluster: 'seMetering',
657
669
  type: ['attributeReport', 'readResponse'],
@@ -1757,6 +1769,37 @@ const converters = {
1757
1769
  }
1758
1770
  },
1759
1771
  },
1772
+ nous_lcd_temperature_humidity_sensor: {
1773
+ cluster: 'manuSpecificTuya',
1774
+ type: ['commandGetData'],
1775
+ options: [exposes.options.precision('temperature'), exposes.options.calibration('temperature'),
1776
+ exposes.options.precision('humidity'), exposes.options.calibration('humidity')],
1777
+ convert: (model, msg, publish, options, meta) => {
1778
+ const dp = msg.data.dp;
1779
+ const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
1780
+ switch (dp) {
1781
+ case tuya.dataPoints.nousTemperature:
1782
+ return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1783
+ case tuya.dataPoints.nousHumidity:
1784
+ return {humidity: calibrateAndPrecisionRoundOptions(value, options, 'humidity')};
1785
+ case tuya.dataPoints.nousBattery:
1786
+ return {battery: value};
1787
+ case tuya.dataPoints.nousTempUnitConvert:
1788
+ return {temperature_unit_convert: {0x00: '°C', 0x01: '°F'}[value]};
1789
+ case tuya.dataPoints.nousMaxTemp:
1790
+ return {max_temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1791
+ case tuya.dataPoints.nousMinTemp:
1792
+ return {min_temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1793
+ case tuya.dataPoints.nousTempAlarm:
1794
+ return {temperature_alarm: {0x00: 'canceled', 0x01: 'lower_alarm', 0x02: 'upper_alarm'}[value]};
1795
+ case tuya.dataPoints.nousTempSensitivity:
1796
+ return {temperature_sensitivity: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
1797
+ default:
1798
+ meta.logger.warn(`zigbee-herdsman-converters:nous_lcd_temperature_humidity_sensor: NOT RECOGNIZED ` +
1799
+ `DP #${dp} with data ${JSON.stringify(msg.data)}`);
1800
+ }
1801
+ },
1802
+ },
1760
1803
  tuya_illuminance_temperature_humidity_sensor: {
1761
1804
  cluster: 'manuSpecificTuya',
1762
1805
  type: ['commandDataReport', 'commandDataResponse'],
@@ -3073,6 +3116,9 @@ const converters = {
3073
3116
  result[postfixWithEndpointName('external_measured_room_sensor', msg, model)] =
3074
3117
  msg.data['danfossExternalMeasuredRoomSensor'];
3075
3118
  }
3119
+ if (msg.data.hasOwnProperty('danfossRadiatorCovered')) {
3120
+ result[postfixWithEndpointName('radiator_covered', msg, model)] = (msg.data['danfossRadiatorCovered'] === 1);
3121
+ }
3076
3122
  if (msg.data.hasOwnProperty('danfossViewingDirection')) {
3077
3123
  result[postfixWithEndpointName('viewing_direction', msg, model)] = (msg.data['danfossViewingDirection'] === 1);
3078
3124
  }
@@ -4955,8 +5001,19 @@ const converters = {
4955
5001
  payload.voltage = value;
4956
5002
  payload.battery = batteryVoltageToPercentage(value, '3V_2100');
4957
5003
  } 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) {
5004
+ else if (index === 100) {
5005
+ if (['QBKG19LM', 'QBKG20LM', 'QBKG39LM', 'QBKG41LM', 'QBCZ15LM'].includes(model.model)) {
5006
+ const mapping = model.model === 'QBCZ15LM' ? 'relay' : 'left';
5007
+ payload[`state_${mapping}`] = value === 1 ? 'ON' : 'OFF';
5008
+ } else {
5009
+ payload.state = value === 1 ? 'ON' : 'OFF';
5010
+ }
5011
+ } else if (index === 101) {
5012
+ if (['QBKG19LM', 'QBKG20LM', 'QBKG39LM', 'QBKG41LM', 'QBCZ15LM'].includes(model.model)) {
5013
+ const mapping = model.model === 'QBCZ15LM' ? 'usb' : 'right';
5014
+ payload[`state_${mapping}`] = value === 1 ? 'ON' : 'OFF';
5015
+ }
5016
+ } else if (index === 149) {
4960
5017
  payload.energy = precisionRound(value, 2); // 0x95
4961
5018
  // Consumption is deprecated
4962
5019
  payload.consumption = payload.energy;
@@ -7255,9 +7312,9 @@ const converters = {
7255
7312
  const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
7256
7313
  switch (dp) {
7257
7314
  case tuya.dataPoints.trsPresenceState:
7258
- return {presence: {0: 'false', 1: 'true'}[value]};
7315
+ return {presence: {0: false, 1: true}[value]};
7259
7316
  case tuya.dataPoints.trsMotionState:
7260
- return {motion: {1: 'false', 2: 'true'}[value]};
7317
+ return {motion: {1: false, 2: true}[value]};
7261
7318
  case tuya.dataPoints.trsMotionSpeed:
7262
7319
  return {motion_speed: value};
7263
7320
  case tuya.dataPoints.trsMotionDirection:
@@ -2467,6 +2467,16 @@ const converters = {
2467
2467
  await entity.read('hvacThermostat', ['danfossExternalMeasuredRoomSensor'], manufacturerOptions.danfoss);
2468
2468
  },
2469
2469
  },
2470
+ danfoss_radiator_covered: {
2471
+ key: ['radiator_covered'],
2472
+ convertSet: async (entity, key, value, meta) => {
2473
+ await entity.write('hvacThermostat', {'danfossRadiatorCovered': value}, manufacturerOptions.danfoss);
2474
+ return {readAfterWriteTime: 200, state: {'radiator_covered': value}};
2475
+ },
2476
+ convertGet: async (entity, key, meta) => {
2477
+ await entity.read('hvacThermostat', ['danfossRadiatorCovered'], manufacturerOptions.danfoss);
2478
+ },
2479
+ },
2470
2480
  danfoss_viewing_direction: {
2471
2481
  key: ['viewing_direction'],
2472
2482
  convertSet: async (entity, key, value, meta) => {
@@ -4973,6 +4983,27 @@ const converters = {
4973
4983
  }
4974
4984
  },
4975
4985
  },
4986
+ nous_lcd_temperature_humidity_sensor: {
4987
+ key: ['min_temperature', 'max_temperature', 'temperature_sensitivity', 'temperature_unit_convert'],
4988
+ convertSet: async (entity, key, value, meta) => {
4989
+ switch (key) {
4990
+ case 'temperature_unit_convert':
4991
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.nousTempUnitConvert, ['°C', '°F'].indexOf(value));
4992
+ break;
4993
+ case 'min_temperature':
4994
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMinTemp, Math.round(value * 10));
4995
+ break;
4996
+ case 'max_temperature':
4997
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousMaxTemp, Math.round(value * 10));
4998
+ break;
4999
+ case 'temperature_sensitivity':
5000
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.nousTempSensitivity, Math.round(value * 10));
5001
+ break;
5002
+ default: // Unknown key
5003
+ meta.logger.warn(`Unhandled key ${key}`);
5004
+ }
5005
+ },
5006
+ },
4976
5007
  heiman_ir_remote: {
4977
5008
  key: ['send_key', 'create', 'learn', 'delete', 'get_list'],
4978
5009
  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,46 @@ 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
+ },
314
+ {
315
+ zigbeeModel: ['EFEKTA_PWS_Max'],
316
+ model: 'EFEKTA_PWS_Max',
317
+ vendor: 'Custom devices (DiY)',
318
+ description: '[Plant watering sensor EFEKTA PWS max](http://efektalab.com/PWS_Max)',
319
+ fromZigbee: [fz.temperature, fz.humidity, fz.illuminance, fz.soil_moisture, fz.battery],
320
+ toZigbee: [tz.factory_reset],
321
+ configure: async (device, coordinatorEndpoint, logger) => {
322
+ const firstEndpoint = device.getEndpoint(1);
323
+ await reporting.bind(firstEndpoint, coordinatorEndpoint, [
324
+ 'genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity', 'msIlluminanceMeasurement', 'msSoilMoisture']);
325
+ const overides = {min: 0, max: 21600, change: 0};
326
+ await reporting.batteryVoltage(firstEndpoint, overides);
327
+ await reporting.batteryPercentageRemaining(firstEndpoint, overides);
328
+ await reporting.temperature(firstEndpoint, overides);
329
+ await reporting.humidity(firstEndpoint, overides);
330
+ await reporting.illuminance(firstEndpoint, overides);
331
+ await reporting.soil_moisture(firstEndpoint, overides);
332
+ },
333
+ exposes: [e.soil_moisture(), e.battery(), e.illuminance(), e.temperature(), e.humidity()],
334
+ },
293
335
  ];
@@ -20,8 +20,8 @@ module.exports = [
20
20
  tz.danfoss_mounted_mode_control, tz.danfoss_thermostat_vertical_orientation, tz.danfoss_algorithm_scale_factor,
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
- tz.danfoss_viewing_direction, tz.danfoss_external_measured_room_sensor, tz.thermostat_keypad_lockout,
24
- tz.thermostat_system_mode, tz.danfoss_load_balancing_enable, tz.danfoss_load_room_mean],
23
+ tz.danfoss_viewing_direction, tz.danfoss_external_measured_room_sensor, tz.danfoss_radiator_covered,
24
+ tz.thermostat_keypad_lockout, 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 ' +
@@ -44,9 +44,14 @@ module.exports = [
44
44
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
45
45
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
46
46
  exposes.numeric('external_measured_room_sensor', ea.ALL)
47
- .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
48
- 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).')
47
+ .withDescription('If `radiator_covered` is `true`: Set at maximum 30 minutes interval but not more often than every ' +
48
+ '5 minutes and 0.1 degrees difference. Resets every 35 minutes to standard. If `radiator_covered` is `false`: ' +
49
+ 'Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 degrees difference. ' +
50
+ 'Resets every 3 hours to standard. Value 21C = 2100 (-8000=undefined).')
49
51
  .withValueMin(-8000).withValueMax(3500),
52
+ exposes.binary('radiator_covered', ea.ALL, true, false)
53
+ .withDescription('Set if the TRV should solely rely on external_measured_room_sensor or operate in offset mode. ' +
54
+ '`false` = Auto Offset Mode or `true` = Room Sensor Mode'),
50
55
  exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
51
56
  .withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
52
57
  '3=Open window detected, 4=In window open state from external but detected closed locally'),
@@ -116,6 +121,7 @@ module.exports = [
116
121
  'danfossMountedModeControl',
117
122
  'danfossMountedModeActive',
118
123
  'danfossExternalMeasuredRoomSensor',
124
+ 'danfossRadiatorCovered',
119
125
  'danfossLoadBalancingEnable',
120
126
  'danfossLoadRoomMean',
121
127
  ], options);
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
+ ];
package/devices/osram.js CHANGED
@@ -391,14 +391,68 @@ module.exports = [
391
391
  },
392
392
  {
393
393
  zigbeeModel: ['Zigbee 3.0 DALI CONV LI'],
394
- model: '4062172044776',
394
+ model: '4062172044776_1',
395
395
  vendor: 'OSRAM',
396
- description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires',
396
+ description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (only one device)',
397
397
  extend: extend.ledvance.light_onoff_brightness(),
398
+ },
399
+ {
400
+ fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 25}, {ID: 242}]}],
401
+ model: '4062172044776_2',
402
+ vendor: 'OSRAM',
403
+ description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (one device and pushbutton)',
404
+ extend: extend.ledvance.light_onoff_brightness(),
405
+ onEvent: async (type, data, device) => {
406
+ if (type === 'deviceInterview') {
407
+ device.getEndpoint(25).addBinding('genOnOff', device.getEndpoint(10));
408
+ device.getEndpoint(25).addBinding('genLevelCtrl', device.getEndpoint(10));
409
+ }
410
+ },
411
+ },
412
+ {
413
+ fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 242}]}],
414
+ model: '4062172044776_3',
415
+ vendor: 'OSRAM',
416
+ description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (with two devices)',
417
+ extend: extend.ledvance.light_onoff_brightness({noConfigure: true}),
398
418
  exposes: [e.light_brightness().withEndpoint('l1'), e.light_brightness().withEndpoint('l2')],
399
419
  endpoint: (device) => {
400
420
  return {'l1': 10, 'l2': 11};
401
421
  },
402
422
  meta: {multiEndpoint: true},
423
+ configure: async (device, coordinatorEndpoint, logger) => {
424
+ await reporting.bind(device.getEndpoint(10), coordinatorEndpoint, ['genLevelCtrl', 'genOnOff']);
425
+ await reporting.bind(device.getEndpoint(11), coordinatorEndpoint, ['genLevelCtrl', 'genOnOff']);
426
+ await reporting.onOff(device.getEndpoint(10));
427
+ await reporting.brightness(device.getEndpoint(10));
428
+ await reporting.onOff(device.getEndpoint(11));
429
+ await reporting.brightness(device.getEndpoint(11));
430
+ },
431
+ },
432
+ {
433
+ fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 25}, {ID: 242}]}],
434
+ model: '4062172044776_4',
435
+ vendor: 'OSRAM',
436
+ description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (with two devices and pushbutton)',
437
+ extend: extend.ledvance.light_onoff_brightness({noConfigure: true}),
438
+ exposes: [e.light_brightness().withEndpoint('l1'), e.light_brightness().withEndpoint('l2')],
439
+ endpoint: (device) => {
440
+ return {'l1': 10, 'l2': 11};
441
+ },
442
+ meta: {multiEndpoint: true},
443
+ configure: async (device, coordinatorEndpoint, logger) => {
444
+ await reporting.bind(device.getEndpoint(10), coordinatorEndpoint, ['genLevelCtrl', 'genOnOff']);
445
+ await reporting.bind(device.getEndpoint(11), coordinatorEndpoint, ['genLevelCtrl', 'genOnOff']);
446
+ await reporting.onOff(device.getEndpoint(10));
447
+ await reporting.brightness(device.getEndpoint(10));
448
+ await reporting.onOff(device.getEndpoint(11));
449
+ await reporting.brightness(device.getEndpoint(11));
450
+ },
451
+ onEvent: async (type, data, device) => {
452
+ if (type === 'deviceInterview') {
453
+ device.getEndpoint(25).addBinding('genOnOff', device.getEndpoint(10));
454
+ device.getEndpoint(25).addBinding('genLevelCtrl', device.getEndpoint(10));
455
+ }
456
+ },
403
457
  },
404
458
  ];
@@ -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',
package/devices/robb.js CHANGED
@@ -162,4 +162,26 @@ module.exports = [
162
162
  },
163
163
  exposes: [e.power(), e.current(), e.voltage().withAccess(ea.STATE), e.switch(), e.energy()],
164
164
  },
165
+ {
166
+ zigbeeModel: ['ROB_200-017-1'],
167
+ model: 'ROB_200-017-1',
168
+ vendor: 'ROBB',
169
+ description: 'Zigbee smart plug',
170
+ fromZigbee: [fz.electrical_measurement, fz.on_off, fz.ignore_genLevelCtrl_report, fz.metering, fz.temperature],
171
+ toZigbee: [tz.on_off],
172
+ configure: async (device, coordinatorEndpoint, logger) => {
173
+ const endpoint = device.getEndpoint(1);
174
+ await reporting.bind(endpoint, coordinatorEndpoint,
175
+ ['genOnOff', 'haElectricalMeasurement', 'seMetering', 'msTemperatureMeasurement']);
176
+ await reporting.onOff(endpoint);
177
+ await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
178
+ await reporting.readMeteringMultiplierDivisor(endpoint);
179
+ await reporting.rmsVoltage(endpoint);
180
+ await reporting.rmsCurrent(endpoint);
181
+ await reporting.activePower(endpoint);
182
+ await reporting.temperature(endpoint);
183
+ await reporting.currentSummDelivered(endpoint);
184
+ },
185
+ exposes: [e.power(), e.current(), e.voltage().withAccess(ea.STATE), e.switch(), e.energy(), e.temperature()],
186
+ },
165
187
  ];
@@ -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
  ];