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