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