zigbee-herdsman-converters 14.0.255 → 14.0.259
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 +46 -0
- package/converters/toZigbee.js +2 -2
- package/devices/centralite.js +38 -0
- package/devices/ikea.js +2 -2
- package/devices/paulmann.js +7 -0
- package/devices/philips.js +9 -0
- package/devices/sonoff.js +7 -0
- package/devices/tuya.js +22 -0
- package/devices/xiaomi.js +70 -1
- package/npm-shrinkwrap.json +287 -284
- package/package.json +2 -2
package/converters/fromZigbee.js
CHANGED
|
@@ -1681,6 +1681,35 @@ const converters = {
|
|
|
1681
1681
|
}
|
|
1682
1682
|
},
|
|
1683
1683
|
},
|
|
1684
|
+
ts0201_temperature_humidity_alarm: {
|
|
1685
|
+
cluster: 'manuSpecificTuya_2',
|
|
1686
|
+
type: ['attributeReport', 'readResponse'],
|
|
1687
|
+
convert: (model, msg, publish, options, meta) => {
|
|
1688
|
+
const result = {};
|
|
1689
|
+
if (msg.data.hasOwnProperty('alarm_temperature_max')) {
|
|
1690
|
+
result.alarm_temperature_max = msg.data['alarm_temperature_max'];
|
|
1691
|
+
}
|
|
1692
|
+
if (msg.data.hasOwnProperty('alarm_temperature_min')) {
|
|
1693
|
+
result.alarm_temperature_min = msg.data['alarm_temperature_min'];
|
|
1694
|
+
}
|
|
1695
|
+
if (msg.data.hasOwnProperty('alarm_humidity_max')) {
|
|
1696
|
+
result.alarm_humidity_max = msg.data['alarm_humidity_max'];
|
|
1697
|
+
}
|
|
1698
|
+
if (msg.data.hasOwnProperty('alarm_humidity_min')) {
|
|
1699
|
+
result.alarm_humidity_min = msg.data['alarm_humidity_min'];
|
|
1700
|
+
}
|
|
1701
|
+
if (msg.data.hasOwnProperty('alarm_humidity')) {
|
|
1702
|
+
const sensorAlarmLookup = {'0': 'below_min_humdity', '1': 'over_humidity', '2': 'off'};
|
|
1703
|
+
result.alarm_humidity = sensorAlarmLookup[msg.data['alarm_humidity']];
|
|
1704
|
+
}
|
|
1705
|
+
if (msg.data.hasOwnProperty('alarm_temperature')) {
|
|
1706
|
+
const sensorAlarmLookup = {'0': 'below_min_temperature', '1': 'over_temperature', '2': 'off'};
|
|
1707
|
+
result.alarm_temperature = sensorAlarmLookup[msg.data['alarm_temperature']];
|
|
1708
|
+
}
|
|
1709
|
+
return result;
|
|
1710
|
+
},
|
|
1711
|
+
|
|
1712
|
+
},
|
|
1684
1713
|
tuya_thermostat_weekly_schedule: {
|
|
1685
1714
|
cluster: 'manuSpecificTuya',
|
|
1686
1715
|
type: ['commandGetData', 'commandSetDataResponse'],
|
|
@@ -6521,6 +6550,23 @@ const converters = {
|
|
|
6521
6550
|
};
|
|
6522
6551
|
},
|
|
6523
6552
|
},
|
|
6553
|
+
aqara_knob_rotation: {
|
|
6554
|
+
cluster: 'aqaraOpple',
|
|
6555
|
+
type: ['attributeReport', 'readResponse'],
|
|
6556
|
+
convert: (model, msg, publish, options, meta) => {
|
|
6557
|
+
if (msg.data.hasOwnProperty(570)) {
|
|
6558
|
+
const act = {1: 'start_rotating', 2: 'rotation', 3: 'stop_rotating'};
|
|
6559
|
+
return {
|
|
6560
|
+
action: act[msg.data[570]],
|
|
6561
|
+
action_rotation_angle: msg.data[558],
|
|
6562
|
+
action_rotation_angle_speed: msg.data[560],
|
|
6563
|
+
action_rotation_percent: msg.data[563],
|
|
6564
|
+
action_rotation_percent_speed: msg.data[562],
|
|
6565
|
+
action_rotation_time: msg.data[561],
|
|
6566
|
+
};
|
|
6567
|
+
}
|
|
6568
|
+
},
|
|
6569
|
+
},
|
|
6524
6570
|
// #endregion
|
|
6525
6571
|
|
|
6526
6572
|
// #region Ignore converters (these message dont need parsing).
|
package/converters/toZigbee.js
CHANGED
|
@@ -1902,7 +1902,7 @@ const converters = {
|
|
|
1902
1902
|
xiaomi_switch_power_outage_memory: {
|
|
1903
1903
|
key: ['power_outage_memory'],
|
|
1904
1904
|
convertSet: async (entity, key, value, meta) => {
|
|
1905
|
-
if (['ZNCZ04LM', 'QBKG25LM', 'SSM-U01', 'QBKG39LM', 'QBKG41LM', 'ZNCZ15LM',
|
|
1905
|
+
if (['ZNCZ04LM', 'QBKG25LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'QBKG39LM', 'QBKG41LM', 'ZNCZ15LM',
|
|
1906
1906
|
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG31LM', 'QBCZ15LM',
|
|
1907
1907
|
'QBCZ14LM'].includes(meta.mapped.model)) {
|
|
1908
1908
|
await entity.write('aqaraOpple', {0x0201: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
|
|
@@ -1925,7 +1925,7 @@ const converters = {
|
|
|
1925
1925
|
return {state: {power_outage_memory: value}};
|
|
1926
1926
|
},
|
|
1927
1927
|
convertGet: async (entity, key, meta) => {
|
|
1928
|
-
if (['ZNCZ04LM', 'QBKG25LM', 'SSM-U01', 'QBKG39LM', 'QBKG41LM', 'ZNCZ15LM',
|
|
1928
|
+
if (['ZNCZ04LM', 'QBKG25LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'QBKG39LM', 'QBKG41LM', 'ZNCZ15LM',
|
|
1929
1929
|
'WS-EUK02', 'WS-EUK01', 'QBKG31LM', 'QBCZ15LM', 'QBCZ14LM'].includes(meta.mapped.model)) {
|
|
1930
1930
|
await entity.read('aqaraOpple', [0x0201]);
|
|
1931
1931
|
} else if (['ZNCZ02LM', 'QBCZ11LM', 'ZNCZ11LM'].includes(meta.mapped.model)) {
|
package/devices/centralite.js
CHANGED
|
@@ -202,4 +202,42 @@ module.exports = [
|
|
|
202
202
|
await reporting.batteryVoltage(endpoint);
|
|
203
203
|
},
|
|
204
204
|
},
|
|
205
|
+
{
|
|
206
|
+
zigbeeModel: ['3200-fr'],
|
|
207
|
+
model: '3200-fr',
|
|
208
|
+
vendor: 'Centralite',
|
|
209
|
+
description: 'Smart outlet',
|
|
210
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement],
|
|
211
|
+
toZigbee: [tz.on_off],
|
|
212
|
+
exposes: [e.switch(), e.power(), e.voltage(), e.current()],
|
|
213
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
214
|
+
const endpoint = device.getEndpoint(1);
|
|
215
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
216
|
+
await reporting.onOff(endpoint);
|
|
217
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentMultiplier', 'acCurrentDivisor']);
|
|
218
|
+
await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
|
|
219
|
+
await reporting.rmsVoltage(endpoint, {change: 2});
|
|
220
|
+
await reporting.rmsCurrent(endpoint, {change: 10});
|
|
221
|
+
await reporting.activePower(endpoint, {change: 2});
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
zigbeeModel: ['3200-de'],
|
|
226
|
+
model: '3200-de',
|
|
227
|
+
vendor: 'Centralite',
|
|
228
|
+
description: 'Smart outlet',
|
|
229
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement],
|
|
230
|
+
toZigbee: [tz.on_off],
|
|
231
|
+
exposes: [e.switch(), e.power(), e.voltage(), e.current()],
|
|
232
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
233
|
+
const endpoint = device.getEndpoint(1);
|
|
234
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
235
|
+
await reporting.onOff(endpoint);
|
|
236
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentMultiplier', 'acCurrentDivisor']);
|
|
237
|
+
await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
|
|
238
|
+
await reporting.rmsVoltage(endpoint, {change: 2});
|
|
239
|
+
await reporting.rmsCurrent(endpoint, {change: 10});
|
|
240
|
+
await reporting.activePower(endpoint, {change: 2});
|
|
241
|
+
},
|
|
242
|
+
},
|
|
205
243
|
];
|
package/devices/ikea.js
CHANGED
|
@@ -614,7 +614,7 @@ module.exports = [
|
|
|
614
614
|
extend: tradfriExtend.light_onoff_brightness(),
|
|
615
615
|
},
|
|
616
616
|
{
|
|
617
|
-
zigbeeModel: ['TRADFRIbulbGU10WS345lm'],
|
|
617
|
+
zigbeeModel: ['TRADFRIbulbGU10WS345lm', 'TRADFRI bulb GU10 WW 345lm'],
|
|
618
618
|
model: 'LED2005R5',
|
|
619
619
|
vendor: 'IKEA',
|
|
620
620
|
description: 'TRADFRI LED bulb GU10 345 lumen, dimmable, white spectrum',
|
|
@@ -622,7 +622,7 @@ module.exports = [
|
|
|
622
622
|
},
|
|
623
623
|
{
|
|
624
624
|
zigbeeModel: ['STARKVIND Air purifier'],
|
|
625
|
-
model: '
|
|
625
|
+
model: 'E2007',
|
|
626
626
|
vendor: 'IKEA',
|
|
627
627
|
description: 'STARKVIND air purifier',
|
|
628
628
|
exposes: [e.fan().withModes(['off', 'low', 'medium', 'high', 'on', 'auto'])],
|
package/devices/paulmann.js
CHANGED
|
@@ -18,6 +18,13 @@ module.exports = [
|
|
|
18
18
|
description: 'SmartHome Zigbee Cephei Switch Controller',
|
|
19
19
|
extend: extend.switch(),
|
|
20
20
|
},
|
|
21
|
+
{
|
|
22
|
+
zigbeeModel: ['50131'],
|
|
23
|
+
model: '501.31',
|
|
24
|
+
vendor: 'Paulmann',
|
|
25
|
+
description: 'Smart plug for Euro- and Schuko-sockets',
|
|
26
|
+
extend: extend.switch(),
|
|
27
|
+
},
|
|
21
28
|
{
|
|
22
29
|
zigbeeModel: ['Dimmablelight '],
|
|
23
30
|
model: '50044/50045',
|
package/devices/philips.js
CHANGED
|
@@ -2011,4 +2011,13 @@ module.exports = [
|
|
|
2011
2011
|
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2012
2012
|
ota: ota.zigbeeOTA,
|
|
2013
2013
|
},
|
|
2014
|
+
{
|
|
2015
|
+
zigbeeModel: ['1745430P7'],
|
|
2016
|
+
model: '1745430P7',
|
|
2017
|
+
vendor: 'Philips',
|
|
2018
|
+
description: 'Hue Impress outdoor Pedestal',
|
|
2019
|
+
meta: {turnsOffAtBrightness1: true},
|
|
2020
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2021
|
+
ota: ota.zigbeeOTA,
|
|
2022
|
+
},
|
|
2014
2023
|
];
|
package/devices/sonoff.js
CHANGED
|
@@ -135,4 +135,11 @@ module.exports = [
|
|
|
135
135
|
},
|
|
136
136
|
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
|
|
137
137
|
},
|
|
138
|
+
{
|
|
139
|
+
zigbeeModel: ['S26R2ZB'],
|
|
140
|
+
model: 'S26R2ZB',
|
|
141
|
+
vendor: 'SONOFF',
|
|
142
|
+
description: 'Zigbee smart plug',
|
|
143
|
+
extend: extend.switch(),
|
|
144
|
+
},
|
|
138
145
|
];
|
package/devices/tuya.js
CHANGED
|
@@ -1180,4 +1180,26 @@ module.exports = [
|
|
|
1180
1180
|
e.energy(), exposes.enum('power_outage_memory', ea.STATE_SET, ['on', 'off', 'restore'])
|
|
1181
1181
|
.withDescription('Recover state after power outage')],
|
|
1182
1182
|
},
|
|
1183
|
+
{
|
|
1184
|
+
fingerprint: [{modelID: 'TS0201', manufacturerName: '_TZ3000_qaaysllp'}],
|
|
1185
|
+
model: 'LCZ030',
|
|
1186
|
+
vendor: 'TuYa',
|
|
1187
|
+
description: 'Temperature & humidity & illuminance sensor with display',
|
|
1188
|
+
fromZigbee: [fz.battery, fz.illuminance, fz.temperature, fz.humidity, fz.ts0201_temperature_humidity_alarm],
|
|
1189
|
+
toZigbee: [],
|
|
1190
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1191
|
+
const endpoint = device.getEndpoint(1);
|
|
1192
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genBasic', 'genPowerCfg']);
|
|
1193
|
+
},
|
|
1194
|
+
exposes: [e.temperature(), e.humidity(), e.battery(), e.illuminance(), e.illuminance_lux(),
|
|
1195
|
+
exposes.numeric('alarm_temperature_max', ea.STATE).withUnit('°C').withDescription('Alarm temperature max'),
|
|
1196
|
+
exposes.numeric('alarm_temperature_min', ea.STATE).withUnit('°C').withDescription('Alarm temperature min'),
|
|
1197
|
+
exposes.numeric('alarm_humidity_max', ea.STATE).withUnit('%').withDescription('Alarm huminity max'),
|
|
1198
|
+
exposes.numeric('alarm_humidity_min', ea.STATE).withUnit('%').withDescription('Alarm huminity min'),
|
|
1199
|
+
exposes.enum('alarm_humidity', ea.STATE, ['below_min_humdity', 'over_humidity', 'off'])
|
|
1200
|
+
.withDescription('Alarm humidity status'),
|
|
1201
|
+
exposes.enum('alarm_temperature', ea.STATE, ['below_min_temperature', 'over_temperature', 'off'])
|
|
1202
|
+
.withDescription('Alarm temperature status'),
|
|
1203
|
+
],
|
|
1204
|
+
},
|
|
1183
1205
|
];
|
package/devices/xiaomi.js
CHANGED
|
@@ -40,6 +40,24 @@ const preventReset = async (type, data, device) => {
|
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
module.exports = [
|
|
43
|
+
{
|
|
44
|
+
zigbeeModel: ['lumi.dimmer.rcbac1'],
|
|
45
|
+
model: 'ZNDDMK11LM',
|
|
46
|
+
vendor: 'Xiaomi',
|
|
47
|
+
description: 'Aqara smart lightstrip driver',
|
|
48
|
+
exposes: [e.light_brightness_colortemp({colorTempRange: [153, 370], noConfigure: true}).withEndpoint('l1'),
|
|
49
|
+
e.light_brightness_colortemp({colorTempRange: [153, 370], noConfigure: true}).withEndpoint('l2')],
|
|
50
|
+
endpoint: (device) => {
|
|
51
|
+
return {l1: 1, l2: 2};
|
|
52
|
+
},
|
|
53
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
54
|
+
const endpoint1 = device.getEndpoint(1);
|
|
55
|
+
await extend.light_onoff_brightness_colortemp().configure(device, coordinatorEndpoint, logger);
|
|
56
|
+
await endpoint1.write('aqaraOpple', {0x0509: {value: 1, type: 0x23}}, {manufacturerCode: 0x115f, disableResponse: true});
|
|
57
|
+
await endpoint1.write('aqaraOpple', {0x050f: {value: 3, type: 0x23}}, {manufacturerCode: 0x115f, disableResponse: true});
|
|
58
|
+
},
|
|
59
|
+
extend: extend.light_onoff_brightness_colortemp_color({supportsHS: true}),
|
|
60
|
+
},
|
|
43
61
|
{
|
|
44
62
|
zigbeeModel: ['lumi.light.aqcn02'],
|
|
45
63
|
model: 'ZNLDP12LM',
|
|
@@ -1273,16 +1291,43 @@ module.exports = [
|
|
|
1273
1291
|
device.save();
|
|
1274
1292
|
},
|
|
1275
1293
|
},
|
|
1294
|
+
{
|
|
1295
|
+
zigbeeModel: ['lumi.switch.n0acn2'],
|
|
1296
|
+
model: 'DLKZMK11LM',
|
|
1297
|
+
vendor: 'Xiaomi',
|
|
1298
|
+
description: 'Aqara single switch module T1 (with neutral)',
|
|
1299
|
+
fromZigbee: [fz.on_off, fz.metering, fz.electrical_measurement, fz.device_temperature, fz.xiaomi_switch_type,
|
|
1300
|
+
fz.xiaomi_switch_power_outage_memory],
|
|
1301
|
+
exposes: [e.switch(), e.energy(), e.power(), e.device_temperature(), e.power_outage_memory(), e.switch_type()],
|
|
1302
|
+
toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory],
|
|
1303
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1304
|
+
const endpoint = device.getEndpoint(1);
|
|
1305
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering', 'genDeviceTempCfg']);
|
|
1306
|
+
await reporting.onOff(endpoint);
|
|
1307
|
+
// Gives UNSUPPORTED_ATTRIBUTE on reporting.readEletricalMeasurementMultiplierDivisors.
|
|
1308
|
+
await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
|
|
1309
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
1310
|
+
await reporting.currentSummDelivered(endpoint);
|
|
1311
|
+
await reporting.activePower(endpoint, {min: 5, max: 600, change: 10});
|
|
1312
|
+
await reporting.deviceTemperature(endpoint);
|
|
1313
|
+
device.powerSource = 'Mains (single phase)';
|
|
1314
|
+
device.save();
|
|
1315
|
+
},
|
|
1316
|
+
},
|
|
1276
1317
|
{
|
|
1277
1318
|
zigbeeModel: ['lumi.switch.l0agl1'],
|
|
1278
1319
|
model: 'SSM-U02',
|
|
1279
1320
|
vendor: 'Xiaomi',
|
|
1280
1321
|
description: 'Aqara single switch module T1 (without neutral). Doesn\'t work as a router and doesn\'t support power meter',
|
|
1281
|
-
|
|
1322
|
+
fromZigbee: [fz.on_off, fz.xiaomi_switch_type, fz.xiaomi_switch_power_outage_memory],
|
|
1323
|
+
exposes: [e.switch(), e.power_outage_memory(), e.switch_type()],
|
|
1324
|
+
toZigbee: [tz.xiaomi_switch_type, tz.on_off, tz.xiaomi_switch_power_outage_memory],
|
|
1282
1325
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1283
1326
|
const endpoint = device.getEndpoint(1);
|
|
1284
1327
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
1285
1328
|
await reporting.onOff(endpoint);
|
|
1329
|
+
device.powerSource = 'Mains (single phase)';
|
|
1330
|
+
device.save();
|
|
1286
1331
|
},
|
|
1287
1332
|
},
|
|
1288
1333
|
{
|
|
@@ -1593,4 +1638,28 @@ module.exports = [
|
|
|
1593
1638
|
await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
|
|
1594
1639
|
},
|
|
1595
1640
|
},
|
|
1641
|
+
{
|
|
1642
|
+
zigbeeModel: ['lumi.remote.rkba01'],
|
|
1643
|
+
model: 'ZNXNKG02LM',
|
|
1644
|
+
vendor: 'Xiaomi',
|
|
1645
|
+
description: 'Aqara knob H1 (wireless)',
|
|
1646
|
+
meta: {battery: {voltageToPercentage: '3V_2100'}},
|
|
1647
|
+
exposes: [e.battery(), e.battery_voltage(),
|
|
1648
|
+
e.action(['single', 'double', 'hold', 'release', 'start_rotating', 'rotation', 'stop_rotating']),
|
|
1649
|
+
exposes.enum('operation_mode', ea.ALL, ['event', 'command']).withDescription('Button mode'),
|
|
1650
|
+
exposes.numeric('action_rotation_angle', ea.STATE).withUnit('*').withDescription('Rotation angle'),
|
|
1651
|
+
exposes.numeric('action_rotation_angle_speed', ea.STATE).withUnit('*').withDescription('Rotation angle speed'),
|
|
1652
|
+
exposes.numeric('action_rotation_percent', ea.STATE).withUnit('%').withDescription('Rotation percent'),
|
|
1653
|
+
exposes.numeric('action_rotation_percent_speed', ea.STATE).withUnit('%').withDescription('Rotation percent speed'),
|
|
1654
|
+
exposes.numeric('action_rotation_time', ea.STATE).withUnit('ms').withDescription('Rotation time'),
|
|
1655
|
+
],
|
|
1656
|
+
fromZigbee: [fz.xiaomi_on_off_action, fz.xiaomi_multistate_action, fz.xiaomi_battery, fz.aqara_opple_report,
|
|
1657
|
+
fz.aqara_knob_rotation],
|
|
1658
|
+
toZigbee: [tz.aqara_opple_operation_mode],
|
|
1659
|
+
onEvent: preventReset,
|
|
1660
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1661
|
+
const endpoint1 = device.getEndpoint(1);
|
|
1662
|
+
await endpoint1.write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
|
|
1663
|
+
},
|
|
1664
|
+
},
|
|
1596
1665
|
];
|