zigbee-herdsman-converters 14.0.337 → 14.0.341

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.
@@ -2318,20 +2318,20 @@ const converters = {
2318
2318
  exposes.options.precision('humidity'), exposes.options.calibration('humidity')],
2319
2319
  convert: (model, msg, publish, options, meta) => {
2320
2320
  const dp = msg.data.dp;
2321
- if (dp === 101) return {occupancy: msg.data.data[0] > 0};
2321
+ const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
2322
+
2323
+ if (dp === 101) return {occupancy: value > 0 ? true : false};
2322
2324
  else if (dp === 102) {
2323
- const value = msg.data.data[0];
2324
2325
  return {
2325
2326
  power_type: {0: 'battery_full', 1: 'battery_high', 2: 'battery_medium', 3: 'battery_low', 4: 'usb'}[value],
2326
2327
  battery_low: value === 3,
2327
2328
  };
2328
2329
  } else if (dp === 103) {
2329
- return {tamper: msg.data.data[0] > 0 ? true : false};
2330
+ return {tamper: value > 0 ? true : false};
2330
2331
  } else if (dp === 104) {
2331
- const temperature = parseFloat(msg.data.data[3]) / 10.0;
2332
- return {temperature: calibrateAndPrecisionRoundOptions(temperature, options, 'temperature')};
2332
+ return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
2333
2333
  } else if (dp === 105) {
2334
- return {humidity: calibrateAndPrecisionRoundOptions(msg.data.data[3], options, 'humidity')};
2334
+ return {humidity: calibrateAndPrecisionRoundOptions(value, options, 'humidity')};
2335
2335
  } else {
2336
2336
  meta.logger.warn(`zigbee-herdsman-converters:NEO-PD07: NOT RECOGNIZED DP #${dp} with data ${JSON.stringify(msg.data)}`);
2337
2337
  }
@@ -2735,7 +2735,7 @@ const converters = {
2735
2735
  const currentTime = new Date().getTime();
2736
2736
  const utcTime = Math.round((currentTime - OneJanuary2000) / 1000);
2737
2737
  const localTime = Math.round(currentTime / 1000) - (new Date()).getTimezoneOffset() * 60;
2738
- const endpoint = msg.device.getEndpoint(1);
2738
+ const endpoint = msg.endpoint;
2739
2739
  const payload = {
2740
2740
  payloadSize: 8,
2741
2741
  payload: [
@@ -4927,6 +4927,11 @@ const converters = {
4927
4927
  value = data.readUInt32LE(i+2);
4928
4928
  i += 5;
4929
4929
  break;
4930
+ case 36:
4931
+ // 0x24 Zcl40BitUint
4932
+ value = [data.readUInt32LE(i+2), data.readUInt8(i+6)];
4933
+ i += 6;
4934
+ break;
4930
4935
  case 39:
4931
4936
  // 0x27 Zcl64BitUint
4932
4937
  value = data.readBigUInt64BE(i+2);
@@ -252,4 +252,21 @@ module.exports = [
252
252
  },
253
253
  exposes: [e.battery(), e.temperature(), e.humidity()],
254
254
  },
255
+ {
256
+ zigbeeModel: ['EFEKTA_miniPWS'],
257
+ model: 'EFEKTA_miniPWS',
258
+ vendor: 'Custom devices (DiY)',
259
+ description: '[Mini plant wattering sensor](http://efektalab.com/miniPWS)',
260
+ fromZigbee: [fz.soil_moisture, fz.battery],
261
+ toZigbee: [tz.factory_reset],
262
+ configure: async (device, coordinatorEndpoint, logger) => {
263
+ const firstEndpoint = device.getEndpoint(1);
264
+ await reporting.bind(firstEndpoint, coordinatorEndpoint, ['genPowerCfg', 'msSoilMoisture']);
265
+ const overides = {min: 0, max: 21600, change: 0};
266
+ await reporting.batteryVoltage(firstEndpoint, overides);
267
+ await reporting.batteryPercentageRemaining(firstEndpoint, overides);
268
+ await reporting.soil_moisture(firstEndpoint, overides);
269
+ },
270
+ exposes: [e.soil_moisture(), e.battery()],
271
+ },
255
272
  ];
@@ -45,7 +45,8 @@ module.exports = [
45
45
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
46
46
  exposes.numeric('external_measured_room_sensor', ea.ALL)
47
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).'),
48
+ 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).')
49
+ .withValueMin(-8000).withValueMax(3500),
49
50
  exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
50
51
  .withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
51
52
  '3=Open window detected, 4=In window open state from external but detected closed locally'),
@@ -64,7 +65,8 @@ module.exports = [
64
65
  .withDescription('Whether or not the thermostat acts as standalone thermostat or shares load with other ' +
65
66
  'thermostats in the room. The gateway must update load_room_mean if enabled.'),
66
67
  exposes.numeric('load_room_mean', ea.ALL)
67
- .withDescription('Mean radiator load for room calculated by gateway for load balancing purposes'),
68
+ .withDescription('Mean radiator load for room calculated by gateway for load balancing purposes (-8000=undefined)')
69
+ .withValueMin(-8000).withValueMax(100),
68
70
  exposes.numeric('load_estimate', ea.STATE_GET)
69
71
  .withDescription('Load estimate on this radiator')],
70
72
  ota: ota.zigbeeOTA,
@@ -318,7 +318,7 @@ module.exports = [
318
318
  ['electricity', 'gas', 'water', 'kamstrup-kmp', 'linky', 'IEC62056-21', 'DSMR-2.3', 'DSMR-4.0'])
319
319
  .withDescription('Operating mode/probe'),
320
320
  exposes.numeric('current_summation', ea.SET)
321
- .withDescription('Current summation value sent to the display. e.g. 570 = 0,570 kWh'),
321
+ .withDescription('Current summation value sent to the display. e.g. 570 = 0,570 kWh').withValueMin(0).withValueMax(10000),
322
322
  exposes.binary('check_meter', ea.STATE, true, false)
323
323
  .withDescription('Is true if communication problem with meter is experienced'),
324
324
  ],
package/devices/diyruz.js CHANGED
@@ -150,11 +150,13 @@ module.exports = [
150
150
  exposes.numeric('radiation_dose_per_hour', ea.STATE).withUnit('μR/h').withDescription('Current radiation level'),
151
151
  exposes.binary('led_feedback', ea.ALL, 'ON', 'OFF').withDescription('Enable LED feedback'),
152
152
  exposes.binary('buzzer_feedback', ea.ALL, 'ON', 'OFF').withDescription('Enable buzzer feedback'),
153
- exposes.numeric('alert_threshold', ea.ALL).withUnit('μR/h').withDescription('Critical radiation level'),
153
+ exposes.numeric('alert_threshold', ea.ALL).withUnit('μR/h').withDescription('Critical radiation level')
154
+ .withValueMin(0).withValueMax(10000),
154
155
  exposes.enum('sensors_type', ea.ALL, ['СБМ-20/СТС-5/BOI-33', 'СБМ-19/СТС-6', 'Others'])
155
156
  .withDescription('Type of installed tubes'),
156
- exposes.numeric('sensors_count', ea.ALL).withDescription('Count of installed tubes'),
157
- exposes.numeric('sensitivity', ea.ALL).withDescription('This is applicable if tubes type is set to other')],
157
+ exposes.numeric('sensors_count', ea.ALL).withDescription('Count of installed tubes').withValueMin(0).withValueMax(50),
158
+ exposes.numeric('sensitivity', ea.ALL).withDescription('This is applicable if tubes type is set to other')
159
+ .withValueMin(0).withValueMax(100)],
158
160
  toZigbee: [tz.diyruz_geiger_config, tz.factory_reset],
159
161
  configure: async (device, coordinatorEndpoint, logger) => {
160
162
  const endpoint = device.getEndpoint(1);
@@ -250,11 +252,16 @@ module.exports = [
250
252
  exposes: [e.co2(), e.temperature(), e.humidity(), e.pressure(),
251
253
  exposes.binary('led_feedback', ea.ALL, 'ON', 'OFF').withDescription('Enable LEDs feedback'),
252
254
  exposes.binary('enable_abc', ea.ALL, 'ON', 'OFF').withDescription('Enable ABC (Automatic Baseline Correction)'),
253
- exposes.numeric('threshold1', ea.ALL).withUnit('ppm').withDescription('Warning (LED2) CO2 level'),
254
- exposes.numeric('threshold2', ea.ALL).withUnit('ppm').withDescription('Critical (LED3) CO2 level'),
255
- exposes.numeric('temperature_offset', ea.ALL).withUnit('°C').withDescription('Adjust temperature'),
256
- exposes.numeric('humidity_offset', ea.ALL).withUnit('%').withDescription('Adjust humidity'),
257
- exposes.numeric('pressure_offset', ea.ALL).withUnit('hPa').withDescription('Adjust pressure')],
255
+ exposes.numeric('threshold1', ea.ALL).withUnit('ppm').withDescription('Warning (LED2) CO2 level')
256
+ .withValueMin(0).withValueMax(50000),
257
+ exposes.numeric('threshold2', ea.ALL).withUnit('ppm').withDescription('Critical (LED3) CO2 level')
258
+ .withValueMin(0).withValueMax(50000),
259
+ exposes.numeric('temperature_offset', ea.ALL).withUnit('°C').withDescription('Adjust temperature')
260
+ .withValueMin(-20).withValueMax(20),
261
+ exposes.numeric('humidity_offset', ea.ALL).withUnit('%').withDescription('Adjust humidity')
262
+ .withValueMin(-50).withValueMax(50),
263
+ exposes.numeric('pressure_offset', ea.ALL).withUnit('hPa').withDescription('Adjust pressure')
264
+ .withValueMin(-1000).withValueMax(1000)],
258
265
  },
259
266
  {
260
267
  zigbeeModel: ['DIY_Zintercom'],
@@ -282,15 +289,15 @@ module.exports = [
282
289
  exposes.binary('sound', ea.ALL, 'ON', 'OFF').withProperty('sound')
283
290
  .withDescription('Enable or disable sound'),
284
291
  exposes.numeric('time_ring', ea.ALL).withUnit('sec')
285
- .withDescription('Time to ring before answer'),
292
+ .withDescription('Time to ring before answer').withValueMin(0).withValueMax(600),
286
293
  exposes.numeric('time_talk', ea.ALL).withUnit('sec')
287
- .withDescription('Time to hold before open'),
294
+ .withDescription('Time to hold before open').withValueMin(0).withValueMax(600),
288
295
  exposes.numeric('time_open', ea.ALL).withUnit('sec')
289
- .withDescription('Time to open before end'),
296
+ .withDescription('Time to open before end').withValueMin(0).withValueMax(600),
290
297
  exposes.numeric('time_bell', ea.ALL).withUnit('sec')
291
- .withDescription('Time after last bell to finish ring'),
298
+ .withDescription('Time after last bell to finish ring').withValueMin(0).withValueMax(600),
292
299
  exposes.numeric('time_report', ea.ALL).withUnit('min')
293
- .withDescription('Reporting interval'),
300
+ .withDescription('Reporting interval').withValueMin(0).withValueMax(1440),
294
301
  e.battery(),
295
302
  ],
296
303
  },
package/devices/fantem.js CHANGED
@@ -29,10 +29,14 @@ module.exports = [
29
29
  fromZigbee: [fz.battery, fz.ignore_basic_report, fz.illuminance, fz.ZB003X, fz.ZB003X_attr, fz.ZB003X_occupancy],
30
30
  toZigbee: [tz.ZB003X],
31
31
  exposes: [e.occupancy(), e.tamper(), e.battery(), e.illuminance(), e.illuminance_lux().withUnit('lx'), e.temperature(),
32
- e.humidity(), exposes.numeric('reporting_time', ea.STATE_SET).withDescription('Reporting interval in minutes'),
33
- exposes.numeric('temperature_calibration', ea.STATE_SET).withDescription('Temperature calibration'),
34
- exposes.numeric('humidity_calibration', ea.STATE_SET).withDescription('Humidity calibration'),
35
- exposes.numeric('illuminance_calibration', ea.STATE_SET).withDescription('Illuminance calibration'),
32
+ e.humidity(), exposes.numeric('reporting_time', ea.STATE_SET).withDescription('Reporting interval in minutes')
33
+ .withValueMin(0).withValueMax(1440),
34
+ exposes.numeric('temperature_calibration', ea.STATE_SET).withDescription('Temperature calibration')
35
+ .withValueMin(-20).withValueMax(20),
36
+ exposes.numeric('humidity_calibration', ea.STATE_SET).withDescription('Humidity calibration')
37
+ .withValueMin(-50).withValueMax(50),
38
+ exposes.numeric('illuminance_calibration', ea.STATE_SET).withDescription('Illuminance calibration')
39
+ .withValueMin(-10000).withValueMax(10000),
36
40
  exposes.binary('pir_enable', ea.STATE_SET, true, false).withDescription('Enable PIR sensor'),
37
41
  exposes.binary('led_enable', ea.STATE_SET, true, false).withDescription('Enabled LED'),
38
42
  exposes.binary('reporting_enable', ea.STATE_SET, true, false).withDescription('Enabled reporting'),
package/devices/heiman.js CHANGED
@@ -73,6 +73,7 @@ module.exports = [
73
73
  globalStore.clearValue(device, 'interval');
74
74
  } else if (!globalStore.hasValue(device, 'interval')) {
75
75
  const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 60;
76
+ if (seconds === -1) return;
76
77
  const interval = setInterval(async () => {
77
78
  try {
78
79
  await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
@@ -85,7 +86,8 @@ module.exports = [
85
86
  },
86
87
  {
87
88
  zigbeeModel: ['SMOK_V16', 'SMOK_V15', 'b5db59bfd81e4f1f95dc57fdbba17931', '98293058552c49f38ad0748541ee96ba', 'SMOK_YDLV10',
88
- 'FB56-SMF02HM1.4', 'SmokeSensor-N-3.0', '319fa36e7384414a9ea62cba8f6e7626', 'c3442b4ac59b4ba1a83119d938f283ab'],
89
+ 'FB56-SMF02HM1.4', 'SmokeSensor-N-3.0', '319fa36e7384414a9ea62cba8f6e7626', 'c3442b4ac59b4ba1a83119d938f283ab',
90
+ 'SmokeSensor-EF-3.0'],
89
91
  model: 'HS1SA',
90
92
  vendor: 'HEIMAN',
91
93
  description: 'Smoke detector',
@@ -99,7 +101,7 @@ module.exports = [
99
101
  exposes: [e.smoke(), e.battery_low(), e.battery()],
100
102
  },
101
103
  {
102
- zigbeeModel: ['SmokeSensor-N', 'SmokeSensor-EF-3.0', 'SmokeSensor-EM'],
104
+ zigbeeModel: ['SmokeSensor-N', 'SmokeSensor-EM'],
103
105
  model: 'HS3SA',
104
106
  vendor: 'HEIMAN',
105
107
  description: 'Smoke detector',
package/devices/hive.js CHANGED
@@ -184,7 +184,8 @@ module.exports = [
184
184
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
185
185
  exposes.numeric('external_measured_room_sensor', ea.ALL)
186
186
  .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
187
- 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
187
+ 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).')
188
+ .withValueMin(-8000).withValueMax(3500),
188
189
  exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
189
190
  .withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
190
191
  '3=Open window detected, 4=In window open state from external but detected closed locally'),
@@ -203,7 +204,8 @@ module.exports = [
203
204
  .withDescription('Whether or not the thermostat acts as standalone thermostat or shares load with other ' +
204
205
  'thermostats in the room. The gateway must update load_room_mean if enabled.'),
205
206
  exposes.numeric('load_room_mean', ea.ALL)
206
- .withDescription('Mean radiator load for room calculated by gateway for load balancing purposes'),
207
+ .withDescription('Mean radiator load for room calculated by gateway for load balancing purposes (-8000=undefined)')
208
+ .withValueMin(-8000).withValueMax(100),
207
209
  exposes.numeric('load_estimate', ea.STATE_GET)
208
210
  .withDescription('Load estimate on this radiator')],
209
211
  configure: async (device, coordinatorEndpoint, logger) => {
package/devices/ikea.js CHANGED
@@ -302,10 +302,10 @@ module.exports = [
302
302
  extend: tradfriExtend.light_onoff_brightness_colortemp(),
303
303
  },
304
304
  {
305
- zigbeeModel: ['TRADFRI bulb E14 WS 470lm', 'TRADFRI bulb E12 WS 450lm'],
305
+ zigbeeModel: ['TRADFRI bulb E14 WS 470lm', 'TRADFRI bulb E12 WS 450lm', 'TRADFRI bulb E17 WS 440lm'],
306
306
  model: 'LED1903C5/LED1835C6',
307
307
  vendor: 'IKEA',
308
- description: 'TRADFRI bulb E12/E14 WS 450/470 lumen, dimmable, white spectrum, opal white',
308
+ description: 'TRADFRI bulb E12/E14/E17 WS 450/470/440 lumen, dimmable, white spectrum, opal white',
309
309
  extend: tradfriExtend.light_onoff_brightness_colortemp(),
310
310
  },
311
311
  {
package/devices/immax.js CHANGED
@@ -148,10 +148,14 @@ module.exports = [
148
148
  fromZigbee: [fz.battery, fz.ignore_basic_report, fz.illuminance, fz.ZB003X, fz.ZB003X_attr, fz.ZB003X_occupancy],
149
149
  toZigbee: [tz.ZB003X],
150
150
  exposes: [e.occupancy(), e.tamper(), e.battery(), e.illuminance(), e.illuminance_lux().withUnit('lx'), e.temperature(),
151
- e.humidity(), exposes.numeric('reporting_time', ea.STATE_SET).withDescription('Reporting interval in minutes'),
152
- exposes.numeric('temperature_calibration', ea.STATE_SET).withDescription('Temperature calibration'),
153
- exposes.numeric('humidity_calibration', ea.STATE_SET).withDescription('Humidity calibration'),
154
- exposes.numeric('illuminance_calibration', ea.STATE_SET).withDescription('Illuminance calibration'),
151
+ e.humidity(), exposes.numeric('reporting_time', ea.STATE_SET).withDescription('Reporting interval in minutes')
152
+ .withValueMin(0).withValueMax(1440),
153
+ exposes.numeric('temperature_calibration', ea.STATE_SET).withDescription('Temperature calibration')
154
+ .withValueMin(-20).withValueMax(20),
155
+ exposes.numeric('humidity_calibration', ea.STATE_SET).withDescription('Humidity calibration')
156
+ .withValueMin(-50).withValueMax(50),
157
+ exposes.numeric('illuminance_calibration', ea.STATE_SET).withDescription('Illuminance calibration')
158
+ .withValueMin(-10000).withValueMax(10000),
155
159
  exposes.binary('pir_enable', ea.STATE_SET, true, false).withDescription('Enable PIR sensor'),
156
160
  exposes.binary('led_enable', ea.STATE_SET, true, false).withDescription('Enabled LED'),
157
161
  exposes.binary('reporting_enable', ea.STATE_SET, true, false).withDescription('Enabled reporting'),
package/devices/javis.js CHANGED
@@ -31,6 +31,7 @@ module.exports = [
31
31
  exposes.enum('keep_time', ea.STATE_SET, ['0', '1', '2', '3', '4', '5', '6', '7'])
32
32
  .withDescription('PIR keep time 0:5s|1:30s|2:60s|3:180s|4:300s|5:600s|6:1200s|7:1800s'),
33
33
  exposes.enum('sensitivity', ea.STATE_SET, ['25', '50', '75', '100']),
34
- exposes.numeric('illuminance_calibration', ea.STATE_SET).withDescription('Illuminance calibration')],
34
+ exposes.numeric('illuminance_calibration', ea.STATE_SET).withDescription('Illuminance calibration')
35
+ .withValueMin(-10000).withValueMax(10000)],
35
36
  },
36
37
  ];
package/devices/lidl.js CHANGED
@@ -610,7 +610,7 @@ module.exports = [
610
610
  toZigbee: [tz.on_off, tz.lidl_watering_timer],
611
611
  onEvent: tuya.onEventSetTime,
612
612
  configure: async (device, coordinatorEndpoint, logger) => {},
613
- exposes: [e.switch(), exposes.numeric('timer', ea.SET).withValueMin(1)
613
+ exposes: [e.switch(), exposes.numeric('timer', ea.SET).withValueMin(1).withValueMax(10000)
614
614
  .withUnit('min').withDescription('Auto off after specific time.')],
615
615
  },
616
616
  {
@@ -677,8 +677,10 @@ module.exports = [
677
677
  .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
678
678
  .withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET)
679
679
  .withPreset(['schedule', 'manual', 'holiday', 'boost']),
680
- exposes.numeric('detectwindow_temperature', ea.STATE_SET).withUnit('°C').withDescription('Open window detection temperature'),
681
- exposes.numeric('detectwindow_timeminute', ea.STATE_SET).withUnit('min').withDescription('Open window time in minute'),
680
+ exposes.numeric('detectwindow_temperature', ea.STATE_SET).withUnit('°C').withDescription('Open window detection temperature')
681
+ .withValueMin(-10).withValueMax(35),
682
+ exposes.numeric('detectwindow_timeminute', ea.STATE_SET).withUnit('min').withDescription('Open window time in minute')
683
+ .withValueMin(0).withValueMax(1000),
682
684
  exposes.binary('binary_one', ea.STATE_SET, 'ON', 'OFF').withDescription('Unknown binary one'),
683
685
  exposes.binary('binary_two', ea.STATE_SET, 'ON', 'OFF').withDescription('Unknown binary two'),
684
686
  exposes.binary('away_mode', ea.STATE, 'ON', 'OFF').withDescription('Away mode'),
package/devices/moes.js CHANGED
@@ -225,9 +225,10 @@ module.exports = [
225
225
  'You can set up to 4 stages of temperature every for WEEKDAY ➀➁➂➃➄, SATURDAY ➅ and SUNDAY ➆.'),
226
226
  exposes.binary('boost_heating', ea.STATE_SET, 'ON', 'OFF').withDescription('Boost Heating: press and hold "+" for 3 seconds, ' +
227
227
  'the device will enter the boost heating mode, and the ▷╵◁ will flash. The countdown will be displayed in the APP'),
228
- exposes.numeric('boost_heating_countdown', ea.STATE_SET).withUnit('min').withDescription('Countdown in minutes'),
228
+ exposes.numeric('boost_heating_countdown', ea.STATE_SET).withUnit('min').withDescription('Countdown in minutes')
229
+ .withValueMin(0).withValueMax(15),
229
230
  exposes.numeric('boost_heating_countdown_time_set', ea.STATE_SET).withUnit('second')
230
- .withDescription('Boost Time Setting 100 sec - 900 sec, (default = 300 sec)')],
231
+ .withDescription('Boost Time Setting 100 sec - 900 sec, (default = 300 sec)').withValueMin(100).withValueMax(900)],
231
232
  },
232
233
  {
233
234
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_la2c2uo9'}],
@@ -285,34 +286,7 @@ module.exports = [
285
286
  supports: 'open, close, stop, position',
286
287
  fromZigbee: [fz.tuya_cover_options, fz.cover_position_tilt],
287
288
  toZigbee: [tz.cover_state, tz.moes_cover_calibration, tz.cover_position_tilt, tz.tuya_cover_reversal],
288
- exposes: [e.cover_position(), exposes.numeric('calibration_time', ea.ALL), exposes.enum('moving', ea.STATE, ['UP', 'STOP', 'DOWN']),
289
- exposes.binary('motor_reversal', ea.ALL, 'ON', 'OFF')],
290
- },
291
- {
292
- fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_e9ba97vf'},
293
- {modelID: 'TS0601', manufacturerName: '_TZE200_husqqvux'}],
294
- model: 'TV01-ZB',
295
- vendor: 'Moes',
296
- description: 'Thermostat radiator valve',
297
- fromZigbee: [fz.moes_thermostat_tv, fz.ignore_tuya_set_time],
298
- whiteLabel: [{vendor: 'Tesla Smart', model: 'TSL-TRV-TV01ZG'}],
299
- toZigbee: [tz.moes_thermostat_tv],
300
- exposes: [
301
- e.battery(), e.child_lock(), e.window_detection(),
302
- exposes.binary('frost_detection', ea.STATE_SET, true, false).withDescription('Enables/disables frost detection on the device'),
303
- exposes.binary('heating_stop', ea.STATE_SET, true, false).withDescription('Stop heating'),
304
- exposes.numeric('holiday_temperature', ea.STATE_SET).withDescription('Holiday mode temperature'),
305
- exposes.numeric('comfort_temperature', ea.STATE_SET).withDescription('Comfort mode temperature'),
306
- exposes.numeric('eco_temperature', ea.STATE_SET).withDescription('Eco mode temperature'),
307
- exposes.numeric('open_window_temperature', ea.STATE_SET).withDescription('Open window mode temperature'),
308
- exposes.numeric('boost_heating_countdown', ea.STATE).withDescription('Boost heating countdown'),
309
- exposes.numeric('error_status', ea.STATE).withDescription('Error status'),
310
- // exposes.binary('boost_mode', ea.STATE_SET).withDescription('Enables/disables boost mode'),
311
- exposes.climate().withSetpoint('current_heating_setpoint', 5, 29.5, 1, ea.STATE_SET)
312
- .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
313
- .withSystemMode(Object.values(tuya.tvThermostatMode), ea.STATE_SET)
314
- .withPreset(Object.values(tuya.tvThermostatPreset)),
315
- ],
316
- onEvent: tuya.onEventSetLocalTime,
289
+ exposes: [e.cover_position(), exposes.numeric('calibration_time', ea.ALL).withValueMin(0).withValueMax(100),
290
+ exposes.enum('moving', ea.STATE, ['UP', 'STOP', 'DOWN']), exposes.binary('motor_reversal', ea.ALL, 'ON', 'OFF')],
317
291
  },
318
292
  ];
package/devices/namron.js CHANGED
@@ -184,6 +184,13 @@ module.exports = [
184
184
  return {l1: 1, l2: 2, l3: 3, l4: 4};
185
185
  },
186
186
  },
187
+ {
188
+ zigbeeModel: ['3802961'],
189
+ model: '3802961',
190
+ vendor: 'Namron',
191
+ description: 'LED 9W CCT E27',
192
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
193
+ },
187
194
  {
188
195
  zigbeeModel: ['3802962'],
189
196
  model: '3802962',
package/devices/neo.js CHANGED
@@ -19,11 +19,11 @@ module.exports = [
19
19
  exposes.binary('temperature_alarm', ea.STATE_SET, true, false),
20
20
  exposes.binary('alarm', ea.STATE_SET, true, false),
21
21
  exposes.enum('melody', ea.STATE_SET, Array.from(Array(18).keys()).map((x)=>(x+1).toString())),
22
- exposes.numeric('duration', ea.STATE_SET).withUnit('second'),
23
- exposes.numeric('temperature_min', ea.STATE_SET).withUnit('°C'),
24
- exposes.numeric('temperature_max', ea.STATE_SET).withUnit('°C'),
25
- exposes.numeric('humidity_min', ea.STATE_SET).withUnit('%'),
26
- exposes.numeric('humidity_max', ea.STATE_SET).withUnit('%'),
22
+ exposes.numeric('duration', ea.STATE_SET).withUnit('second').withValueMin(0).withValueMax(1000),
23
+ exposes.numeric('temperature_min', ea.STATE_SET).withUnit('°C').withValueMin(-10).withValueMax(35),
24
+ exposes.numeric('temperature_max', ea.STATE_SET).withUnit('°C').withValueMin(-10).withValueMax(35),
25
+ exposes.numeric('humidity_min', ea.STATE_SET).withUnit('%').withValueMin(0).withValueMax(100),
26
+ exposes.numeric('humidity_max', ea.STATE_SET).withUnit('%').withValueMin(0).withValueMax(100),
27
27
  exposes.enum('volume', ea.STATE_SET, ['low', 'medium', 'high']),
28
28
  exposes.enum('power_type', ea.STATE, ['battery_full', 'battery_high', 'battery_medium', 'battery_low', 'usb']),
29
29
  ],
@@ -243,12 +243,12 @@ module.exports = [
243
243
  ota: ota.zigbeeOTA,
244
244
  },
245
245
  {
246
- zigbeeModel: ['LCP001', 'LCP002', '4090331P9_01', '4090331P9_02'],
246
+ zigbeeModel: ['LCP001', 'LCP002', '4090331P9_01', '4090331P9_02', '929003053301_01', '929003053301_02'],
247
247
  model: '4090331P9',
248
248
  vendor: 'Philips',
249
- description: 'Hue Ensis',
249
+ description: 'Hue Ensis (white)',
250
250
  meta: {turnsOffAtBrightness1: true},
251
- extend: hueExtend.light_onoff_brightness_colortemp_color(),
251
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
252
252
  ota: ota.zigbeeOTA,
253
253
  },
254
254
  {
package/devices/popp.js CHANGED
@@ -43,7 +43,8 @@ module.exports = [
43
43
  .withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
44
44
  exposes.numeric('external_measured_room_sensor', ea.ALL)
45
45
  .withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
46
- 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
46
+ 'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).')
47
+ .withValueMin(-8000).withValueMax(3500),
47
48
  exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
48
49
  .withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
49
50
  '3=Open window detected, 4=In window open state from external but detected closed locally'),
@@ -62,7 +63,8 @@ module.exports = [
62
63
  .withDescription('Whether or not the thermostat acts as standalone thermostat or shares load with other ' +
63
64
  'thermostats in the room. The gateway must update load_room_mean if enabled.'),
64
65
  exposes.numeric('load_room_mean', ea.ALL)
65
- .withDescription('Mean radiator load for room calculated by gateway for load balancing purposes'),
66
+ .withDescription('Mean radiator load for room calculated by gateway for load balancing purposes (-8000=undefined)')
67
+ .withValueMin(-8000).withValueMax(100),
66
68
  exposes.numeric('load_estimate', ea.STATE_GET)
67
69
  .withDescription('Load estimate on this radiator')],
68
70
  ota: ota.zigbeeOTA,
package/devices/tuya.js CHANGED
@@ -80,12 +80,16 @@ module.exports = [
80
80
  },
81
81
  {
82
82
  fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_mvn6jl7x'},
83
- {modelID: 'TS011F', manufacturerName: '_TZ3000_raviyuvk'}, {modelID: 'TS011F', manufacturerName: '_TYZB01_hlla45kx'}],
83
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_raviyuvk'}, {modelID: 'TS011F', manufacturerName: '_TYZB01_hlla45kx'},
84
+ {modelID: 'TS011F', manufacturerName: '_TZ3000_92qd4sqa'}],
84
85
  model: 'TS011F_2_gang_wall',
85
86
  vendor: 'TuYa',
86
87
  description: '2 gang wall outlet',
87
- extend: extend.switch(),
88
- exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2')],
88
+ toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.tuya_backlight_mode]),
89
+ fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.tuya_backlight_mode]),
90
+ exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
91
+ exposes.enum('power_on_behavior', ea.ALL, ['on', 'off', 'previous']),
92
+ exposes.enum('backlight_mode', ea.ALL, ['LOW', 'MEDIUM', 'HIGH'])],
89
93
  whiteLabel: [{vendor: 'ClickSmart+', model: 'CMA30036'}],
90
94
  endpoint: (device) => {
91
95
  return {'l1': 1, 'l2': 2};
@@ -816,22 +820,30 @@ module.exports = [
816
820
  },
817
821
  {
818
822
  fingerprint: [
819
- {/* model: 'TV02-Zigbee', vendor: 'TuYa', */modelID: 'TS0601', manufacturerName: '_TZE200_hue3yfsn'}],
823
+ {modelID: 'TS0601', manufacturerName: '_TZE200_hue3yfsn'}, /* model: 'TV02-Zigbee', vendor: 'TuYa' */
824
+ {modelID: 'TS0601', manufacturerName: '_TZE200_e9ba97vf'}, /* model: 'TV01-ZB', vendor: 'Moes' */
825
+ {modelID: 'TS0601', manufacturerName: '_TZE200_husqqvux'}, /* model: 'TSL-TRV-TV01ZG', vendor: 'Tesla Smart' */
826
+ ],
820
827
  model: 'TV02-Zigbee',
821
828
  vendor: 'TuYa',
822
829
  description: 'Thermostat radiator valve',
830
+ whiteLabel: [
831
+ {vendor: 'Moes', model: 'TV01-ZB'},
832
+ {vendor: 'Tesla Smart', model: 'TSL-TRV-TV01ZG'},
833
+ ],
823
834
  ota: ota.zigbeeOTA,
824
835
  fromZigbee: [fz.ignore_basic_report, fz.ignore_tuya_set_time, fz.tvtwo_thermostat],
825
836
  toZigbee: [tz.tvtwo_thermostat],
826
837
  onEvent: tuya.onEventSetLocalTime,
827
838
  exposes: [
828
- e.battery_low(), e.child_lock(), e.open_window(), e.open_window_temperature(), e.holiday_temperature(),
829
- e.comfort_temperature(), e.eco_temperature(),
839
+ e.battery_low(), e.child_lock(), e.open_window(), e.open_window_temperature().withValueMin(0).withValueMax(30),
840
+ e.holiday_temperature().withValueMin(0).withValueMax(30), e.comfort_temperature().withValueMin(0).withValueMax(30),
841
+ e.eco_temperature().withValueMin(0).withValueMax(30),
830
842
  exposes.climate().withPreset(['auto', 'manual', 'holiday']).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
831
843
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 0, 30, 0.5, ea.STATE_SET),
832
844
  exposes.numeric('boost_timeset_countdown', ea.STATE_SET).withUnit('second').withDescription('Setting '+
833
845
  'minimum 0 - maximum 465 seconds boost time. The boost (♨) function is activated. The remaining '+
834
- 'time for the function will be counted down in seconds ( 465 to 0 ).'),
846
+ 'time for the function will be counted down in seconds ( 465 to 0 ).').withValueMin(0).withValueMax(465),
835
847
  exposes.binary('frost_protection', ea.STATE_SET, 'ON', 'OFF').withDescription('When Anti-Freezing function'+
836
848
  ' is activated, the temperature in the house is kept at 8 °C ‚the device display "AF".press the '+
837
849
  'pair button to cancel.'),
@@ -840,7 +852,8 @@ module.exports = [
840
852
  'heating stop, the device display "HS" ‚press the pair button to cancel.'),
841
853
  exposes.binary('online', ea.STATE_SET, 'ON', 'OFF').withDescription('Is the device online'),
842
854
  exposes.numeric('holiday_mode_date', ea.STATE_SET).withDescription('The holiday mode( ⛱ ) will '+
843
- 'automatically start at the set time starting point and run the holiday temperature.'),
855
+ 'automatically start at the set time starting point and run the holiday temperature.')
856
+ .withValueMin(0).withValueMax(1000),
844
857
  exposes.composite('programming').withDescription('Auto Mode ⏱ - In this mode,'+
845
858
  ' the device executes a preset week programming temperature time and temperature. ')
846
859
  .withFeature(exposes.text('schedule_monday', ea.STATE))
@@ -942,7 +955,8 @@ module.exports = [
942
955
  .withFeature(exposes.text('sunday_schedule', ea.STATE)),
943
956
  exposes.binary('boost_heating', ea.STATE_SET, 'ON', 'OFF').withDescription('Boost Heating: press and hold "+" for 3 seconds, ' +
944
957
  'the device will enter the boost heating mode, and the ▷╵◁ will flash. The countdown will be displayed in the APP'),
945
- exposes.numeric('boost_heating_countdown', ea.STATE_SET).withUnit('min').withDescription('Countdown in minutes'),
958
+ exposes.numeric('boost_heating_countdown', ea.STATE_SET).withUnit('min').withDescription('Countdown in minutes')
959
+ .withValueMin(0).withValueMax(1000),
946
960
  ],
947
961
  },
948
962
  {
@@ -974,6 +988,7 @@ module.exports = [
974
988
  globalStore.clearValue(device, 'interval');
975
989
  } else if (!globalStore.hasValue(device, 'interval')) {
976
990
  const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 60;
991
+ if (seconds === -1) return;
977
992
  const interval = setInterval(async () => {
978
993
  try {
979
994
  await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
@@ -1070,6 +1085,7 @@ module.exports = [
1070
1085
  globalStore.clearValue(device, 'interval');
1071
1086
  } else if (!globalStore.hasValue(device, 'interval')) {
1072
1087
  const seconds = options && options.measurement_poll_interval ? options.measurement_poll_interval : 60;
1088
+ if (seconds === -1) return;
1073
1089
  const interval = setInterval(async () => {
1074
1090
  try {
1075
1091
  await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
@@ -1216,7 +1232,8 @@ module.exports = [
1216
1232
  },
1217
1233
  },
1218
1234
  {
1219
- fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'}],
1235
+ fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'},
1236
+ {modelID: 'TS0011', manufacturerName: '_TZ3000_txpirhfq'}],
1220
1237
  model: 'TS0011_switch_module',
1221
1238
  vendor: 'TuYa',
1222
1239
  description: '1 gang switch module - (without neutral)',
@@ -1227,7 +1244,7 @@ module.exports = [
1227
1244
  exposes.presets.power_on_behavior(),
1228
1245
  exposes.presets.switch_type_2(),
1229
1246
  ],
1230
- whiteLabel: [{vendor: 'AVATTO', model: '1gang N-ZLWSM01'}],
1247
+ whiteLabel: [{vendor: 'AVATTO', model: '1gang N-ZLWSM01'}, {vendor: 'SMATRUL', model: 'TMZ02L-16A-W'}],
1231
1248
  configure: async (device, coordinatorEndpoint, logger) => {
1232
1249
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
1233
1250
  device.powerSource = 'Mains (single phase)';
@@ -1604,9 +1621,12 @@ module.exports = [
1604
1621
  exposes.enum('o_sensitivity', ea.STATE_SET, Object.values(tuya.msLookups.OSensitivity)).withDescription('O-Sensitivity mode'),
1605
1622
  exposes.enum('v_sensitivity', ea.STATE_SET, Object.values(tuya.msLookups.VSensitivity)).withDescription('V-Sensitivity mode'),
1606
1623
  exposes.enum('led_status', ea.STATE_SET, ['ON', 'OFF']).withDescription('Led status switch'),
1607
- exposes.numeric('vacancy_delay', ea.STATE_SET).withUnit('sec').withDescription('Vacancy delay'),
1608
- exposes.numeric('light_on_luminance_prefer', ea.STATE_SET).withDescription('Light-On luminance prefer'),
1609
- exposes.numeric('light_off_luminance_prefer', ea.STATE_SET).withDescription('Light-Off luminance prefer'),
1624
+ exposes.numeric('vacancy_delay', ea.STATE_SET).withUnit('sec').withDescription('Vacancy delay').withValueMin(0)
1625
+ .withValueMax(1000),
1626
+ exposes.numeric('light_on_luminance_prefer', ea.STATE_SET).withDescription('Light-On luminance prefer')
1627
+ .withValueMin(0).withValueMax(10000),
1628
+ exposes.numeric('light_off_luminance_prefer', ea.STATE_SET).withDescription('Light-Off luminance prefer')
1629
+ .withValueMin(0).withValueMax(10000),
1610
1630
  exposes.enum('mode', ea.STATE_SET, Object.values(tuya.msLookups.Mode)).withDescription('Working mode'),
1611
1631
  exposes.numeric('luminance_level', ea.STATE).withDescription('Luminance level'),
1612
1632
  exposes.numeric('reference_luminance', ea.STATE).withDescription('Reference luminance'),
package/lib/exposes.js CHANGED
@@ -495,7 +495,7 @@ module.exports = {
495
495
  no_position_support: () => new Binary('no_position_support', access.SET, true, false).withDescription('Set to true when your device only reports position 0, 100 and 50 (in this case your device has an older firmware) (default false).'),
496
496
  transition: () => new Numeric(`transition`, access.SET).withValueMin(0).withDescription('Controls the transition time (in seconds) of on/off, brightness, color temperature (if applicable) and color (if applicable) changes. Defaults to `0` (no transition).'),
497
497
  legacy: () => new Binary(`legacy`, access.SET, true, false).withDescription(`Set to false to disable the legacy integration (highly recommended), will change structure of the published payload (default true).`),
498
- measurement_poll_interval: () => new Numeric(`measurement_poll_interval`, access.SET).withValueMin(0).withDescription(`This device does not support reporting electric measurements so it is polled instead. The default poll interval is 60 seconds.`),
498
+ measurement_poll_interval: () => new Numeric(`measurement_poll_interval`, access.SET).withValueMin(-1).withDescription(`This device does not support reporting electric measurements so it is polled instead. The default poll interval is 60 seconds, set to -1 to disable.`),
499
499
  illuminance_below_threshold_check: () => new Binary(`illuminance_below_threshold_check`, access.SET, true, false).withDescription(`Set to false to also send messages when illuminance is above threshold in night mode (default true).`),
500
500
  },
501
501
  presets: {
@@ -506,8 +506,8 @@ module.exports = {
506
506
  auto_lock: () => new Switch().withState('auto_lock', false, 'Enable/disable auto lock', access.STATE_SET, 'AUTO', 'MANUAL'),
507
507
  auto_relock_time: () => new Numeric('auto_relock_time', access.ALL).withValueMin(0).withUnit('s').withDescription('The number of seconds to wait after unlocking a lock before it automatically locks again. 0=disabled'),
508
508
  away_mode: () => new Switch().withState('away_mode', false, 'Enable/disable away mode', access.STATE_SET),
509
- away_preset_days: () => new Numeric('away_preset_days', access.STATE_SET).withDescription('Away preset days'),
510
- away_preset_temperature: () => new Numeric('away_preset_temperature', access.STATE_SET).withUnit('°C').withDescription('Away preset temperature'),
509
+ away_preset_days: () => new Numeric('away_preset_days', access.STATE_SET).withDescription('Away preset days').withValueMin(0).withValueMax(100),
510
+ away_preset_temperature: () => new Numeric('away_preset_temperature', access.STATE_SET).withUnit('°C').withDescription('Away preset temperature').withValueMin(-10).withValueMax(35),
511
511
  battery: () => new Numeric('battery', access.STATE).withUnit('%').withDescription('Remaining battery in %').withValueMin(0).withValueMax(100),
512
512
  battery_low: () => new Binary('battery_low', access.STATE, true, false).withDescription('Indicates if the battery of this device is almost empty'),
513
513
  battery_voltage: () => new Numeric('voltage', access.STATE).withUnit('mV').withDescription('Voltage of the battery in millivolts'),
@@ -516,7 +516,7 @@ module.exports = {
516
516
  carbon_monoxide: () => new Binary('carbon_monoxide', access.STATE, true, false).withDescription('Indicates if CO (carbon monoxide) is detected'),
517
517
  child_lock: () => new Lock().withState('child_lock', 'LOCK', 'UNLOCK', 'Enables/disables physical input on the device', access.STATE_SET),
518
518
  co2: () => new Numeric('co2', access.STATE).withUnit('ppm').withDescription('The measured CO2 (carbon dioxide) value'),
519
- comfort_temperature: () => new Numeric('comfort_temperature', access.STATE_SET).withUnit('°C').withDescription('Comfort temperature'),
519
+ comfort_temperature: () => new Numeric('comfort_temperature', access.STATE_SET).withUnit('°C').withDescription('Comfort temperature').withValueMin(-10).withValueMax(35),
520
520
  consumer_connected: () => new Binary('consumer_connected', access.STATE, true, false).withDescription('Indicates whether a plug is physically attached. Device does not have to pull power or even be connected electrically (state of this binary switch can be ON even if main power switch is OFF)'),
521
521
  contact: () => new Binary('contact', access.STATE, false, true).withDescription('Indicates if the contact is closed (= true) or open (= false)'),
522
522
  cover_position: () => new Cover().withPosition(),
@@ -527,11 +527,11 @@ module.exports = {
527
527
  current: () => new Numeric('current', access.STATE).withUnit('A').withDescription('Instantaneous measured electrical current'),
528
528
  current_phase_b: () => new Numeric('current_phase_b', access.STATE).withUnit('A').withDescription('Instantaneous measured electrical current on phase B'),
529
529
  current_phase_c: () => new Numeric('current_phase_c', access.STATE).withUnit('A').withDescription('Instantaneous measured electrical current on phase C'),
530
- deadzone_temperature: () => new Numeric('deadzone_temperature', access.STATE_SET).withUnit('°C').withDescription('The delta between local_temperature and current_heating_setpoint to trigger Heat. 1-5'),
530
+ deadzone_temperature: () => new Numeric('deadzone_temperature', access.STATE_SET).withUnit('°C').withDescription('The delta between local_temperature and current_heating_setpoint to trigger Heat').withValueMin(1).withValueMax(5),
531
531
  device_temperature: () => new Numeric('device_temperature', access.STATE).withUnit('°C').withDescription('Temperature of the device'),
532
532
  eco2: () => new Numeric('eco2', access.STATE).withUnit('ppm').withDescription('Measured eCO2 value'),
533
533
  eco_mode: () => new Binary('eco_mode', access.STATE_SET, 'ON', 'OFF').withDescription('ECO mode (energy saving mode)'),
534
- eco_temperature: () => new Numeric('eco_temperature', access.STATE_SET).withUnit('°C').withDescription('Eco temperature'),
534
+ eco_temperature: () => new Numeric('eco_temperature', access.STATE_SET).withUnit('°C').withDescription('Eco temperature').withValueMin(-10).withValueMax(35),
535
535
  effect: () => new Enum('effect', access.SET, ['blink', 'breathe', 'okay', 'channel_change', 'finish_effect', 'stop_effect']).withDescription('Triggers an effect on the light (e.g. make light blink for a few seconds)'),
536
536
  energy: () => new Numeric('energy', access.STATE).withUnit('kWh').withDescription('Sum of consumed energy'),
537
537
  fan: () => new Fan(),
@@ -539,7 +539,7 @@ module.exports = {
539
539
  formaldehyd: () => new Numeric('formaldehyd', access.STATE).withDescription('The measured formaldehyd value'),
540
540
  gas: () => new Binary('gas', access.STATE, true, false).withDescription('Indicates whether the device detected gas'),
541
541
  hcho: () => new Numeric('hcho', access.STATE).withUnit('mg/m³').withDescription('Measured Hcho value'),
542
- holiday_temperature: () => new Numeric('holiday_temperature', access.STATE_SET).withUnit('°C').withDescription('Holiday temperature'),
542
+ holiday_temperature: () => new Numeric('holiday_temperature', access.STATE_SET).withUnit('°C').withDescription('Holiday temperature').withValueMin(-10).withValueMax(35),
543
543
  humidity: () => new Numeric('humidity', access.STATE).withUnit('%').withDescription('Measured relative humidity'),
544
544
  illuminance: () => new Numeric('illuminance', access.STATE).withDescription('Raw measured illuminance'),
545
545
  illuminance_lux: () => new Numeric('illuminance_lux', access.STATE).withUnit('lx').withDescription('Measured illuminance in lux'),
@@ -557,12 +557,12 @@ module.exports = {
557
557
  linkquality: () => new Numeric('linkquality', access.STATE).withUnit('lqi').withDescription('Link quality (signal strength)').withValueMin(0).withValueMax(255),
558
558
  local_temperature: () => new Numeric('local_temperature', access.STATE_GET).withUnit('°C').withDescription('Current temperature measured on the device'),
559
559
  lock: () => new Lock().withState('state', 'LOCK', 'UNLOCK', 'State of the lock').withLockState('lock_state', 'Actual state of the lock'),
560
- max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature'),
561
- max_temperature_limit: () => new Numeric('max_temperature_limit', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature limit'),
562
- min_temperature: () => new Numeric('min_temperature', access.STATE_SET).withUnit('°C').withDescription('Minimum temperature'),
560
+ max_temperature: () => new Numeric('max_temperature', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature').withValueMin(-10).withValueMax(35),
561
+ max_temperature_limit: () => new Numeric('max_temperature_limit', access.STATE_SET).withUnit('°C').withDescription('Maximum temperature limit').withValueMin(-10).withValueMax(35),
562
+ min_temperature: () => new Numeric('min_temperature', access.STATE_SET).withUnit('°C').withDescription('Minimum temperature').withValueMin(-10).withValueMax(35),
563
563
  occupancy: () => new Binary('occupancy', access.STATE, true, false).withDescription('Indicates whether the device detected occupancy'),
564
564
  open_window: () => new Binary('open_window', access.STATE_SET, 'ON', 'OFF').withDescription('Enables/disables the status on the device'),
565
- open_window_temperature: () => new Numeric('open_window_temperature', access.STATE_SET).withUnit('°C').withDescription('Open window temperature'),
565
+ open_window_temperature: () => new Numeric('open_window_temperature', access.STATE_SET).withUnit('°C').withDescription('Open window temperature').withValueMin(-10).withValueMax(35),
566
566
  pm10: () => new Numeric('pm10', access.STATE).withUnit('µg/m³').withDescription('Measured PM10 (particulate matter) concentration'),
567
567
  pm25: () => new Numeric('pm25', access.STATE).withUnit('µg/m³').withDescription('Measured PM2.5 (particulate matter) concentration'),
568
568
  position: () => new Numeric('position', access.STATE).withUnit('%').withDescription('Position'),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.337",
3
+ "version": "14.0.341",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -471,14 +471,14 @@
471
471
  "dev": true
472
472
  },
473
473
  "@eslint/eslintrc": {
474
- "version": "1.0.4",
475
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz",
476
- "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==",
474
+ "version": "1.0.5",
475
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
476
+ "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
477
477
  "dev": true,
478
478
  "requires": {
479
479
  "ajv": "^6.12.4",
480
480
  "debug": "^4.3.2",
481
- "espree": "^9.0.0",
481
+ "espree": "^9.2.0",
482
482
  "globals": "^13.9.0",
483
483
  "ignore": "^4.0.6",
484
484
  "import-fresh": "^3.2.1",
@@ -488,12 +488,12 @@
488
488
  }
489
489
  },
490
490
  "@humanwhocodes/config-array": {
491
- "version": "0.6.0",
492
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
493
- "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
491
+ "version": "0.9.2",
492
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
493
+ "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
494
494
  "dev": true,
495
495
  "requires": {
496
- "@humanwhocodes/object-schema": "^1.2.0",
496
+ "@humanwhocodes/object-schema": "^1.2.1",
497
497
  "debug": "^4.1.1",
498
498
  "minimatch": "^3.0.4"
499
499
  }
@@ -1306,9 +1306,9 @@
1306
1306
  "dev": true
1307
1307
  },
1308
1308
  "caniuse-lite": {
1309
- "version": "1.0.30001283",
1310
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz",
1311
- "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==",
1309
+ "version": "1.0.30001284",
1310
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001284.tgz",
1311
+ "integrity": "sha512-t28SKa7g6kiIQi6NHeOcKrOrGMzCRrXvlasPwWC26TH2QNdglgzQIRUuJ0cR3NeQPH+5jpuveeeSFDLm2zbkEw==",
1312
1312
  "dev": true
1313
1313
  },
1314
1314
  "chalk": {
@@ -1540,9 +1540,9 @@
1540
1540
  }
1541
1541
  },
1542
1542
  "electron-to-chromium": {
1543
- "version": "1.4.7",
1544
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.7.tgz",
1545
- "integrity": "sha512-UPy2MsQw1OdcbxR7fvwWZH/rXcv+V26+uvQVHx0fGa1kqRfydtfOw+NMGAvZJ63hyaH4aEBxbhSEtqbpliSNWA==",
1543
+ "version": "1.4.11",
1544
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz",
1545
+ "integrity": "sha512-2OhsaYgsWGhWjx2et8kaUcdktPbBGjKM2X0BReUCKcSCPttEY+hz2zie820JLbttU8jwL92+JJysWwkut3wZgA==",
1546
1546
  "dev": true
1547
1547
  },
1548
1548
  "emittery": {
@@ -1641,13 +1641,13 @@
1641
1641
  }
1642
1642
  },
1643
1643
  "eslint": {
1644
- "version": "8.3.0",
1645
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz",
1646
- "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==",
1644
+ "version": "8.4.0",
1645
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.4.0.tgz",
1646
+ "integrity": "sha512-kv0XQcAQJL/VD9THQKhTQZVqkJKA+tIj/v2ZKNaIHRAADcJWFb+B/BAewUYuF6UVg1s2xC5qXVoDk0G8sKGeTA==",
1647
1647
  "dev": true,
1648
1648
  "requires": {
1649
- "@eslint/eslintrc": "^1.0.4",
1650
- "@humanwhocodes/config-array": "^0.6.0",
1649
+ "@eslint/eslintrc": "^1.0.5",
1650
+ "@humanwhocodes/config-array": "^0.9.2",
1651
1651
  "ajv": "^6.10.0",
1652
1652
  "chalk": "^4.0.0",
1653
1653
  "cross-spawn": "^7.0.2",
@@ -1658,7 +1658,7 @@
1658
1658
  "eslint-scope": "^7.1.0",
1659
1659
  "eslint-utils": "^3.0.0",
1660
1660
  "eslint-visitor-keys": "^3.1.0",
1661
- "espree": "^9.1.0",
1661
+ "espree": "^9.2.0",
1662
1662
  "esquery": "^1.4.0",
1663
1663
  "esutils": "^2.0.2",
1664
1664
  "fast-deep-equal": "^3.1.3",
@@ -1735,9 +1735,9 @@
1735
1735
  "dev": true
1736
1736
  },
1737
1737
  "espree": {
1738
- "version": "9.1.0",
1739
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz",
1740
- "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==",
1738
+ "version": "9.2.0",
1739
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz",
1740
+ "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==",
1741
1741
  "dev": true,
1742
1742
  "requires": {
1743
1743
  "acorn": "^8.6.0",
@@ -2292,9 +2292,9 @@
2292
2292
  }
2293
2293
  },
2294
2294
  "istanbul-reports": {
2295
- "version": "3.1.0",
2296
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.0.tgz",
2297
- "integrity": "sha512-rgeP8yMlXeH4mfd9K/sQXZv1lvcS7xo379zntcotPDdMwkcGYwMxGHGZYo0/+YW5B/nor2YGKz2BH5ume405ow==",
2295
+ "version": "3.1.1",
2296
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.1.tgz",
2297
+ "integrity": "sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw==",
2298
2298
  "dev": true,
2299
2299
  "requires": {
2300
2300
  "html-escaper": "^2.0.0",
@@ -3843,9 +3843,9 @@
3843
3843
  "dev": true
3844
3844
  },
3845
3845
  "zigbee-herdsman": {
3846
- "version": "0.13.176",
3847
- "resolved": "https://registry.npmjs.org/zigbee-herdsman/-/zigbee-herdsman-0.13.176.tgz",
3848
- "integrity": "sha512-gDRj4AEMzE6wmyCR38a06F1hjks7wFUVEqRACZ6c5+8nhHLfR+C06c4nUjN61L9mCDx8pVIV1kuac6mlLbhjkQ==",
3846
+ "version": "0.13.177",
3847
+ "resolved": "https://registry.npmjs.org/zigbee-herdsman/-/zigbee-herdsman-0.13.177.tgz",
3848
+ "integrity": "sha512-pefcK2eaGL2LoeOkhrb4ZMErCe2ic1cUkCA6cfdxWs1t8XIWpZixWtGmV0dAUck0tjLfiEvs2M/zNEhWTWfrzw==",
3849
3849
  "requires": {
3850
3850
  "debounce": "^1.2.1",
3851
3851
  "debug": "^4.3.3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.337",
3
+ "version": "14.0.341",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -38,7 +38,7 @@
38
38
  "buffer-crc32": "^0.2.13",
39
39
  "https-proxy-agent": "^5.0.0",
40
40
  "tar-stream": "^2.2.0",
41
- "zigbee-herdsman": "^0.13.176"
41
+ "zigbee-herdsman": "^0.13.177"
42
42
  },
43
43
  "devDependencies": {
44
44
  "eslint": "*",