zigbee-herdsman-converters 14.0.316 → 14.0.317

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.
@@ -4295,6 +4295,33 @@ const converters = {
4295
4295
  }
4296
4296
  },
4297
4297
  },
4298
+ ikea_pm25: {
4299
+ cluster: 'manuSpecificIkeaPM25Measurement',
4300
+ type: ['attributeReport', 'readResponse'],
4301
+ options: [exposes.options.precision('pm25'), exposes.options.calibration('pm25')],
4302
+ convert: (model, msg, publish, options, meta) => {
4303
+ if (msg.data['measuredValue']) {
4304
+ const pm25 = parseFloat(msg.data['measuredValue']) / 100.0;
4305
+ const pm25Property = postfixWithEndpointName('pm25', msg, model);
4306
+
4307
+ // Air Quality Scale (ikea app):
4308
+ // 0-35=Good, 35-80=OK, 80+=Not Good
4309
+ let airQuality;
4310
+ const airQualityProperty = postfixWithEndpointName('air_quality', msg, model);
4311
+ if (pm25 <= 35) {
4312
+ airQuality = 'good';
4313
+ } else if (pm25 <= 80) {
4314
+ airQuality = 'ok';
4315
+ } else if (pm25 < 65535) {
4316
+ airQuality = 'not_good';
4317
+ } else {
4318
+ airQuality = 'unknown';
4319
+ }
4320
+
4321
+ return {[pm25Property]: calibrateAndPrecisionRoundOptions(pm25, options, 'pm25'), [airQualityProperty]: airQuality};
4322
+ }
4323
+ },
4324
+ },
4298
4325
  E1524_E1810_levelctrl: {
4299
4326
  cluster: 'genLevelCtrl',
4300
4327
  type: [
@@ -1911,6 +1911,12 @@ const converters = {
1911
1911
  await entity.read('genBasic', [0x0033], manufacturerOptions.hue);
1912
1912
  },
1913
1913
  },
1914
+ ikea_pm25: {
1915
+ key: ['pm25', 'air_quality'],
1916
+ convertGet: async (entity, key, meta) => {
1917
+ await entity.read('manuSpecificIkeaPM25Measurement', ['measuredValue']);
1918
+ },
1919
+ },
1914
1920
  RTCGQ13LM_motion_sensitivity: {
1915
1921
  key: ['motion_sensitivity'],
1916
1922
  convertSet: async (entity, key, value, meta) => {
@@ -5293,8 +5299,6 @@ const converters = {
5293
5299
  saswell_thermostat_calibration: {
5294
5300
  key: ['local_temperature_calibration'],
5295
5301
  convertSet: async (entity, key, value, meta) => {
5296
- if (value > 6) value = 6;
5297
- if (value < -6) value = -6;
5298
5302
  if (value < 0) value = 0xFFFFFFFF + value + 1;
5299
5303
  await tuya.sendDataPointValue(entity, tuya.dataPoints.saswellTempCalibration, value);
5300
5304
  },
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(), e.keypad_lockout()],
193
+ .withLocalTemperatureCalibration(-20, 20, 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);
@@ -154,7 +154,8 @@ module.exports = [
154
154
  exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 10, 30, 1).withLocalTemperature()
155
155
  .withSystemMode(['off', 'heat', 'cool', 'emergency_heating'])
156
156
  .withRunningState(['idle', 'heat', 'cool', 'fan_only']).withFanMode(['auto', 'on'])
157
- .withSetpoint('occupied_cooling_setpoint', 10, 30, 1).withLocalTemperatureCalibration()],
157
+ .withSetpoint('occupied_cooling_setpoint', 10, 30, 1)
158
+ .withLocalTemperatureCalibration(-20, 20, 1)],
158
159
  meta: {battery: {voltageToPercentage: '3V_1500_2800'}},
159
160
  configure: async (device, coordinatorEndpoint, logger) => {
160
161
  const endpoint = device.getEndpoint(1);
@@ -179,7 +180,8 @@ module.exports = [
179
180
  exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 10, 30, 1).withLocalTemperature()
180
181
  .withSystemMode(['off', 'heat', 'cool', 'emergency_heating'])
181
182
  .withRunningState(['idle', 'heat', 'cool', 'fan_only']).withFanMode(['auto', 'on'])
182
- .withSetpoint('occupied_cooling_setpoint', 10, 30, 1).withLocalTemperatureCalibration()],
183
+ .withSetpoint('occupied_cooling_setpoint', 10, 30, 1)
184
+ .withLocalTemperatureCalibration(-20, 20, 1)],
183
185
  meta: {battery: {voltageToPercentage: '3V_1500_2800'}},
184
186
  configure: async (device, coordinatorEndpoint, logger) => {
185
187
  const endpoint = device.getEndpoint(1);
package/devices/ecozy.js CHANGED
@@ -18,7 +18,8 @@ module.exports = [
18
18
  tz.thermostat_weekly_schedule, tz.thermostat_clear_weekly_schedule, tz.thermostat_relay_status_log,
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
- .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat']).withLocalTemperatureCalibration()
21
+ .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat'])
22
+ .withLocalTemperatureCalibration(-20, 20, 1)
22
23
  .withPiHeatingDemand(ea.STATE_GET)],
23
24
  configure: async (device, coordinatorEndpoint, logger) => {
24
25
  const endpoint = device.getEndpoint(3);
package/devices/elko.js CHANGED
@@ -41,7 +41,7 @@ module.exports = [
41
41
  '(quick) wooden floors.'),
42
42
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 50, 1)
43
43
  .withLocalTemperature(ea.STATE)
44
- .withLocalTemperatureCalibration()
44
+ .withLocalTemperatureCalibration(-20, 20, 1)
45
45
  .withSystemMode(['off', 'heat']).withRunningState(['idle', 'heat'])
46
46
  .withSensor(['air', 'floor', 'supervisor_floor']),
47
47
  exposes.numeric('floor_temp', ea.STATE_GET).withUnit('°C')
@@ -19,7 +19,8 @@ module.exports = [
19
19
  tz.thermostat_remote_sensing, tz.thermostat_local_temperature, tz.thermostat_running_state,
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
- .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat']).withLocalTemperatureCalibration()
22
+ .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat'])
23
+ .withLocalTemperatureCalibration(-20, 20, 1)
23
24
  .withPiHeatingDemand(),
24
25
  exposes.enum('trv_mode', exposes.access.ALL, [1, 2])
25
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(ea.STATE_SET)
20
+ .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-20, 20, 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/ikea.js CHANGED
@@ -625,10 +625,16 @@ module.exports = [
625
625
  model: 'E2007',
626
626
  vendor: 'IKEA',
627
627
  description: 'STARKVIND air purifier',
628
- exposes: [e.fan().withModes(['off', 'low', 'medium', 'high', 'auto'])],
628
+ exposes: [
629
+ e.fan().withModes(['off', 'low', 'medium', 'high', 'auto']),
630
+ e.pm25().withAccess(ea.STATE_GET),
631
+ exposes.enum('air_quality', ea.STATE_GET, [
632
+ 'good', 'ok', 'not_good', 'unknown',
633
+ ]).withDescription('Measured air quality'),
634
+ ],
629
635
  meta: {fanStateOn: 'auto'},
630
- fromZigbee: [fz.fan],
631
- toZigbee: [tz.fan_mode],
636
+ fromZigbee: [fz.fan, fz.ikea_pm25],
637
+ toZigbee: [tz.fan_mode, tz.ikea_pm25],
632
638
  configure: async (device, coordinatorEndpoint, logger) => {
633
639
  const endpoint = device.getEndpoint(1);
634
640
  await reporting.bind(endpoint, coordinatorEndpoint, ['hvacFanCtrl']);
@@ -80,6 +80,7 @@ module.exports = [
80
80
  exposes: [
81
81
  exposes.climate().withSetpoint('occupied_heating_setpoint', 10, 30, 1).withLocalTemperature()
82
82
  .withSystemMode(['off', 'auto', 'heat', 'cool']).withFanMode(['auto', 'on', 'smart'])
83
- .withSetpoint('occupied_cooling_setpoint', 10, 30, 1).withLocalTemperatureCalibration().withPiHeatingDemand()],
83
+ .withSetpoint('occupied_cooling_setpoint', 10, 30, 1)
84
+ .withLocalTemperatureCalibration(-20, 20, 1).withPiHeatingDemand()],
84
85
  },
85
86
  ];
package/devices/moes.js CHANGED
@@ -86,7 +86,7 @@ module.exports = [
86
86
  tz.moes_thermostat_deadzone_temperature, tz.moes_thermostat_max_temperature_limit],
87
87
  exposes: [e.child_lock(), e.deadzone_temperature(), e.max_temperature_limit(),
88
88
  exposes.climate().withSetpoint('current_heating_setpoint', 5, 30, 1, ea.STATE_SET)
89
- .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(ea.STATE_SET)
89
+ .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
90
90
  .withSystemMode(['off', 'heat'], ea.STATE_SET).withRunningState(['idle', 'heat', 'cool'], ea.STATE)
91
91
  .withPreset(['hold', 'program']).withSensor(['IN', 'AL', 'OU'], ea.STATE_SET)],
92
92
  onEvent: tuya.onEventSetLocalTime,
@@ -209,7 +209,8 @@ module.exports = [
209
209
  exposes.binary('window', ea.STATE, 'CLOSED', 'OPEN').withDescription('Window status closed or open '),
210
210
  exposes.climate()
211
211
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
212
- .withLocalTemperatureCalibration(ea.STATE_SET).withPreset(['programming', 'manual', 'temporary_manual', 'holiday'],
212
+ .withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
213
+ .withPreset(['programming', 'manual', 'temporary_manual', 'holiday'],
213
214
  'MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. '+
214
215
  'When the set temperature is lower than the "minimum temperature", the valve is closed (forced closed). ' +
215
216
  'PROGRAMMING MODE ⏱ - In this mode, the device executes a preset week programming temperature time and temperature. ' +
@@ -308,7 +309,7 @@ module.exports = [
308
309
  exposes.numeric('error_status', ea.STATE).withDescription('Error status'),
309
310
  // exposes.binary('boost_mode', ea.STATE_SET).withDescription('Enables/disables boost mode'),
310
311
  exposes.climate().withSetpoint('current_heating_setpoint', 5, 29.5, 1, ea.STATE_SET)
311
- .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(ea.STATE_SET)
312
+ .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
312
313
  .withSystemMode(Object.values(tuya.tvThermostatMode), ea.STATE_SET)
313
314
  .withPreset(Object.values(tuya.tvThermostatPreset)),
314
315
  ],
@@ -1175,6 +1175,15 @@ module.exports = [
1175
1175
  extend: hueExtend.light_onoff_brightness_colortemp(),
1176
1176
  ota: ota.zigbeeOTA,
1177
1177
  },
1178
+ {
1179
+ zigbeeModel: ['4096730U9'],
1180
+ model: '046677803087',
1181
+ vendor: 'Philips',
1182
+ description: 'Hue White ambiance Cher ceiling light',
1183
+ meta: {turnsOffAtBrightness1: true},
1184
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
1185
+ ota: ota.zigbeeOTA,
1186
+ },
1178
1187
  {
1179
1188
  zigbeeModel: ['LTC013'],
1180
1189
  model: '3216131P5',
@@ -1390,6 +1399,15 @@ module.exports = [
1390
1399
  extend: hueExtend.light_onoff_brightness_colortemp_color(),
1391
1400
  ota: ota.zigbeeOTA,
1392
1401
  },
1402
+ {
1403
+ zigbeeModel: ['4080248U9'],
1404
+ model: '4080248U9',
1405
+ vendor: 'Philips',
1406
+ description: 'Hue White and color ambiance Signe floor light',
1407
+ meta: {turnsOffAtBrightness1: true},
1408
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1409
+ ota: ota.zigbeeOTA,
1410
+ },
1393
1411
  {
1394
1412
  zigbeeModel: ['4080148P9'],
1395
1413
  model: '4080148P9',
@@ -1399,6 +1417,15 @@ module.exports = [
1399
1417
  extend: hueExtend.light_onoff_brightness_colortemp_color(),
1400
1418
  ota: ota.zigbeeOTA,
1401
1419
  },
1420
+ {
1421
+ zigbeeModel: ['4080148U9'],
1422
+ model: '4080148U9',
1423
+ vendor: 'Philips',
1424
+ description: 'Hue White and color ambiance Signe table light',
1425
+ meta: {turnsOffAtBrightness1: true},
1426
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1427
+ ota: ota.zigbeeOTA,
1428
+ },
1402
1429
  {
1403
1430
  zigbeeModel: ['5060730P7_01', '5060730P7_02', '5060730P7_03', '5060730P7_04', '5060730P7_05'],
1404
1431
  model: '5060730P7',
@@ -1909,6 +1936,15 @@ module.exports = [
1909
1936
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1910
1937
  ota: ota.zigbeeOTA,
1911
1938
  },
1939
+ {
1940
+ zigbeeModel: ['1746730V7'],
1941
+ model: '1746730V7',
1942
+ vendor: 'Philips',
1943
+ description: 'Hue Lily outdoor spot light',
1944
+ meta: {turnsOffAtBrightness1: true},
1945
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1946
+ ota: ota.zigbeeOTA,
1947
+ },
1912
1948
  {
1913
1949
  zigbeeModel: ['1746230V7', '1746230P7'],
1914
1950
  model: '1746230V7',
@@ -1954,6 +1990,15 @@ module.exports = [
1954
1990
  meta: {turnsOffAtBrightness1: true},
1955
1991
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [222, 454]}),
1956
1992
  },
1993
+ {
1994
+ zigbeeModel: ['LTO004'],
1995
+ model: '9290024785',
1996
+ vendor: 'Philips',
1997
+ description: 'Hue White Ambinance G25 E26 Edison Filament Globe',
1998
+ meta: {turnsOffAtBrightness1: true},
1999
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [222, 454]}),
2000
+ ota: ota.zigbeeOTA,
2001
+ },
1957
2002
  {
1958
2003
  zigbeeModel: ['LWV002'],
1959
2004
  model: '046677551780',
@@ -42,7 +42,8 @@ module.exports = [
42
42
  },
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
- .withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET).withLocalTemperatureCalibration(ea.STATE_SET)
45
+ .withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET)
46
+ .withLocalTemperatureCalibration(-6, 6, 1, ea.STATE_SET)
46
47
  .withAwayMode()],
47
48
  },
48
49
  ];
@@ -443,7 +443,7 @@ module.exports = [
443
443
  exposes.climate()
444
444
  .withSetpoint('occupied_heating_setpoint', 7, 30, 0.5, ea.STATE_SET)
445
445
  .withLocalTemperature(ea.STATE)
446
- .withLocalTemperatureCalibration(ea.STATE_SET)
446
+ .withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
447
447
  .withPiHeatingDemand()],
448
448
  meta: {battery: {voltageToPercentage: '3V_2500'}},
449
449
  configure: async (device, coordinatorEndpoint, logger) => {
package/devices/tuya.js CHANGED
@@ -782,7 +782,7 @@ module.exports = [
782
782
  e.child_lock(), e.window_detection(), e.battery_low(), e.valve_detection(), e.position(),
783
783
  exposes.climate().withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
784
784
  .withLocalTemperature(ea.STATE).withSystemMode(['heat', 'auto', 'off'], ea.STATE_SET)
785
- .withLocalTemperatureCalibration(ea.STATE_SET)
785
+ .withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
786
786
  .withAwayMode().withPreset(['schedule', 'manual', 'boost', 'complex', 'comfort', 'eco']),
787
787
  e.auto_lock(), e.away_mode(), e.away_preset_days(), e.boost_time(), e.comfort_temperature(), e.eco_temperature(), e.force(),
788
788
  e.max_temperature(), e.min_temperature(), e.away_preset_temperature(),
@@ -805,7 +805,7 @@ module.exports = [
805
805
  exposes: [
806
806
  e.battery_low(), e.window_detection(), e.child_lock(), e.comfort_temperature(), e.eco_temperature(),
807
807
  e.open_window_temperature(), e.holiday_temperature(),
808
- exposes.climate().withPreset(['auto', 'manual', 'holiday']).withLocalTemperatureCalibration(ea.STATE_SET)
808
+ exposes.climate().withPreset(['auto', 'manual', 'holiday']).withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET)
809
809
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 0, 30, 0.5, ea.STATE_SET),
810
810
  exposes.numeric('boost_timeset_countdown', ea.STATE_SET).withUnit('second').withDescription('Setting '+
811
811
  'minimum 0 - maximum 465 seconds boost time. The boost (♨) function is activated. The remaining '+
@@ -903,7 +903,7 @@ module.exports = [
903
903
  exposes.binary('heating', ea.STATE, 'ON', 'OFF').withDescription('Device valve is open or closed (heating or not)'),
904
904
  exposes.climate()
905
905
  .withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
906
- .withLocalTemperatureCalibration(ea.STATE_SET).withPreset(['auto', 'manual', 'off', 'on'],
906
+ .withLocalTemperatureCalibration(-20, 20, 1, ea.STATE_SET).withPreset(['auto', 'manual', 'off', 'on'],
907
907
  'MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. ' +
908
908
  'When the set temperature is lower than the "minimum temperature", the valve is closed (forced closed). ' +
909
909
  'AUTO MODE ⏱ - In this mode, the device executes a preset week programming temperature time and temperature. ' +
@@ -1418,7 +1418,7 @@ module.exports = [
1418
1418
  exposes: [exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 30, 0.5).withLocalTemperature()
1419
1419
  .withSystemMode(['off', 'auto', 'heat'], ea.ALL)
1420
1420
  .withRunningState(['idle', 'heat', 'cool'], ea.STATE)
1421
- .withLocalTemperatureCalibration(ea.ALL).withPiHeatingDemand()],
1421
+ .withLocalTemperatureCalibration(-20, 20, 1, ea.ALL).withPiHeatingDemand()],
1422
1422
  configure: async (device, coordinatorEndpoint, logger) => {
1423
1423
  const endpoint = device.getEndpoint(9);
1424
1424
  await reporting.bind(endpoint, coordinatorEndpoint, ['hvacThermostat', 'hvacFanCtrl']);
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().withPiHeatingDemand()],
20
+ .withLocalTemperatureCalibration(-20, 20, 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/exposes.js CHANGED
@@ -371,9 +371,10 @@ class Climate extends Base {
371
371
  return this;
372
372
  }
373
373
 
374
- withLocalTemperatureCalibration(access=a.ALL) {
374
+ withLocalTemperatureCalibration(min, max, step, access=a.ALL) {
375
375
  assert(!this.endpoint, 'Cannot add feature after adding endpoint');
376
- this.features.push(new Numeric('local_temperature_calibration', access).withUnit('°C').withDescription('Offset to be used in the local_temperature'));
376
+ this.features.push(new Numeric('local_temperature_calibration', access)
377
+ .withValueMin(min).withValueMax(max).withValueStep(step).withUnit('°C').withDescription('Offset to be used in the local_temperature'));
377
378
  return this;
378
379
  }
379
380
 
package/lib/utils.js CHANGED
@@ -72,7 +72,7 @@ function hasAlreadyProcessedMessage(msg, ID=null, key=null) {
72
72
  return false;
73
73
  }
74
74
 
75
- const defaultPrecision = {temperature: 2, humidity: 2, pressure: 1};
75
+ const defaultPrecision = {temperature: 2, humidity: 2, pressure: 1, pm25: 2};
76
76
  function calibrateAndPrecisionRoundOptions(number, options, type) {
77
77
  // Calibrate
78
78
  const calibrateKey = `${type}_calibration`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.316",
3
+ "version": "14.0.317",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.316",
3
+ "version": "14.0.317",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [