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.
- package/converters/fromZigbee.js +27 -0
- package/converters/toZigbee.js +6 -2
- package/devices/bitron.js +1 -1
- package/devices/centralite.js +4 -2
- package/devices/ecozy.js +2 -1
- package/devices/elko.js +1 -1
- package/devices/eurotronic.js +2 -1
- package/devices/hgkg.js +1 -1
- package/devices/ikea.js +9 -3
- package/devices/leviton.js +2 -1
- package/devices/moes.js +4 -3
- package/devices/philips.js +45 -0
- package/devices/saswell.js +2 -1
- package/devices/schneider_electric.js +1 -1
- package/devices/tuya.js +4 -4
- package/devices/zen.js +1 -1
- package/lib/exposes.js +3 -2
- package/lib/utils.js +1 -1
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -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: [
|
package/converters/toZigbee.js
CHANGED
|
@@ -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);
|
package/devices/centralite.js
CHANGED
|
@@ -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)
|
|
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)
|
|
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'])
|
|
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')
|
package/devices/eurotronic.js
CHANGED
|
@@ -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'])
|
|
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: [
|
|
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']);
|
package/devices/leviton.js
CHANGED
|
@@ -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)
|
|
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(
|
|
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
|
],
|
package/devices/philips.js
CHANGED
|
@@ -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',
|
package/devices/saswell.js
CHANGED
|
@@ -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)
|
|
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)
|
|
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`;
|
package/npm-shrinkwrap.json
CHANGED