zigbee-herdsman-converters 15.0.48 → 15.0.49
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 +1 -1
- package/converters/toZigbee.js +4 -4
- package/devices/calex.js +1 -1
- package/devices/ikea.js +5 -1
- package/devices/nue_3a.js +1 -1
- package/devices/robb.js +13 -2
- package/devices/salus_controls.js +1 -0
- package/devices/scanproducts.js +12 -0
- package/devices/sinope.js +6 -3
- package/devices/sonoff.js +1 -1
- package/devices/tuya.js +1 -1
- package/devices/xiaomi.js +25 -0
- package/index.js +1 -1
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -5355,7 +5355,7 @@ const converters = {
|
|
|
5355
5355
|
buttonLookup = {1: 'left', 2: 'right', 3: 'both'};
|
|
5356
5356
|
}
|
|
5357
5357
|
if (['QBKG12LM', 'QBKG24LM'].includes(model.model)) buttonLookup = {5: 'left', 6: 'right', 7: 'both'};
|
|
5358
|
-
if (['QBKG39LM', 'QBKG41LM', 'WS-EUK02', 'WS-EUK04', 'QBKG20LM', 'QBKG31LM'].includes(model.model)) {
|
|
5358
|
+
if (['QBKG39LM', 'QBKG41LM', 'WS-EUK02', 'WS-EUK04', 'QBKG20LM', 'QBKG28LM', 'QBKG31LM'].includes(model.model)) {
|
|
5359
5359
|
buttonLookup = {41: 'left', 42: 'right', 51: 'both'};
|
|
5360
5360
|
}
|
|
5361
5361
|
if (['QBKG25LM', 'QBKG26LM', 'QBKG34LM', 'ZNQBKG31LM'].includes(model.model)) {
|
package/converters/toZigbee.js
CHANGED
|
@@ -2154,7 +2154,7 @@ const converters = {
|
|
|
2154
2154
|
key: ['power_outage_memory'],
|
|
2155
2155
|
convertSet: async (entity, key, value, meta) => {
|
|
2156
2156
|
if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
|
|
2157
|
-
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2157
|
+
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM', 'QBKG28LM',
|
|
2158
2158
|
'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
|
|
2159
2159
|
'WS-USC02', 'WS-USC04', 'ZNQBKG31LM',
|
|
2160
2160
|
].includes(meta.mapped.model)) {
|
|
@@ -2179,7 +2179,7 @@ const converters = {
|
|
|
2179
2179
|
},
|
|
2180
2180
|
convertGet: async (entity, key, meta) => {
|
|
2181
2181
|
if (['SP-EUC01', 'ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'DLKZMK12LM',
|
|
2182
|
-
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2182
|
+
'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM', 'QBKG28LM',
|
|
2183
2183
|
'QBKG31LM', 'QBKG34LM', 'QBKG38LM', 'QBKG39LM', 'QBKG40LM', 'QBKG41LM', 'ZNDDMK11LM', 'ZNLDP13LM',
|
|
2184
2184
|
'WS-USC02', 'WS-USC04', 'ZNQBKG31LM',
|
|
2185
2185
|
].includes(meta.mapped.model)) {
|
|
@@ -2292,7 +2292,7 @@ const converters = {
|
|
|
2292
2292
|
key: ['led_disabled_night'],
|
|
2293
2293
|
convertSet: async (entity, key, value, meta) => {
|
|
2294
2294
|
if (['ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2295
|
-
'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
|
|
2295
|
+
'QBKG28LM', 'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
|
|
2296
2296
|
'WS-EUK03', 'WS-EUK04'].includes(meta.mapped.model)) {
|
|
2297
2297
|
await entity.write('aqaraOpple', {0x0203: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
|
|
2298
2298
|
} else if (['ZNCZ11LM'].includes(meta.mapped.model)) {
|
|
@@ -2308,7 +2308,7 @@ const converters = {
|
|
|
2308
2308
|
},
|
|
2309
2309
|
convertGet: async (entity, key, meta) => {
|
|
2310
2310
|
if (['ZNCZ04LM', 'ZNCZ12LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG19LM', 'QBKG20LM', 'QBKG25LM', 'QBKG26LM',
|
|
2311
|
-
'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
|
|
2311
|
+
'QBKG28LM', 'QBKG31LM', 'QBKG34LM', 'DLKZMK11LM', 'SSM-U01', 'WS-EUK01', 'WS-EUK02',
|
|
2312
2312
|
'WS-EUK03', 'WS-EUK04'].includes(meta.mapped.model)) {
|
|
2313
2313
|
await entity.read('aqaraOpple', [0x0203], manufacturerOptions.xiaomi);
|
|
2314
2314
|
} else {
|
package/devices/calex.js
CHANGED
|
@@ -16,7 +16,7 @@ module.exports = [
|
|
|
16
16
|
model: '421792',
|
|
17
17
|
vendor: 'Calex',
|
|
18
18
|
description: 'LED A60 Zigbee RGB lamp',
|
|
19
|
-
extend: extend.light_onoff_brightness_colortemp_color(),
|
|
19
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
zigbeeModel: ['Smart Wall Switch '], // Yes, it has a space at the end :(
|
package/devices/ikea.js
CHANGED
|
@@ -671,7 +671,11 @@ module.exports = [
|
|
|
671
671
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
672
672
|
// Binding genOnOff is not required to make device send events.
|
|
673
673
|
const endpoint = device.getEndpoint(1);
|
|
674
|
-
|
|
674
|
+
const version = device.softwareBuildID.split('.').map((n) => Number(n));
|
|
675
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/15725
|
|
676
|
+
const v245OrLater = version[0] > 2 || (version[0] == 2 && version[1] >= 4);
|
|
677
|
+
const binds = v245OrLater ? ['genPowerCfg', 'genOnOff', 'genLevelCtrl', 'genScenes'] : ['genPowerCfg'];
|
|
678
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
675
679
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
676
680
|
},
|
|
677
681
|
},
|
package/devices/nue_3a.js
CHANGED
|
@@ -103,7 +103,7 @@ module.exports = [
|
|
|
103
103
|
model: 'LXZB-02A',
|
|
104
104
|
vendor: 'Nue / 3A',
|
|
105
105
|
description: 'Smart light controller',
|
|
106
|
-
extend: extend.light_onoff_brightness(),
|
|
106
|
+
extend: extend.light_onoff_brightness({disablePowerOnBehavior: true}),
|
|
107
107
|
},
|
|
108
108
|
{
|
|
109
109
|
zigbeeModel: ['FNB56-ZSW03LX2.0', 'LXN-3S27LX1.0'],
|
package/devices/robb.js
CHANGED
|
@@ -75,12 +75,23 @@ module.exports = [
|
|
|
75
75
|
model: 'ROB_200-011-0',
|
|
76
76
|
vendor: 'ROBB',
|
|
77
77
|
description: 'ZigBee AC phase-cut dimmer',
|
|
78
|
-
|
|
78
|
+
fromZigbee: extend.light_onoff_brightness().fromZigbee.concat([fz.electrical_measurement, fz.metering, fz.ignore_genOta]),
|
|
79
|
+
toZigbee: extend.light_onoff_brightness().toZigbee,
|
|
80
|
+
exposes: [...extend.light_onoff_brightness({noConfigure: true}).exposes, e.power(), e.voltage(), e.energy(), e.current()],
|
|
79
81
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
80
82
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
81
83
|
const endpoint = device.getEndpoint(1);
|
|
82
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
84
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'haElectricalMeasurement', 'seMetering']);
|
|
83
85
|
await reporting.onOff(endpoint);
|
|
86
|
+
await reporting.activePower(endpoint);
|
|
87
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
88
|
+
await reporting.rmsVoltage(endpoint);
|
|
89
|
+
await reporting.rmsCurrent(endpoint);
|
|
90
|
+
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {
|
|
91
|
+
acVoltageMultiplier: 1, acVoltageDivisor: 10,
|
|
92
|
+
acCurrentMultiplier: 1, acCurrentDivisor: 1000,
|
|
93
|
+
acPowerMultiplier: 1, acPowerDivisor: 10,
|
|
94
|
+
});
|
|
84
95
|
},
|
|
85
96
|
},
|
|
86
97
|
{
|
|
@@ -107,6 +107,7 @@ module.exports = [
|
|
|
107
107
|
{
|
|
108
108
|
zigbeeModel: [
|
|
109
109
|
'SS909ZB',
|
|
110
|
+
'PS600',
|
|
110
111
|
'PS600\u0000\u0000 �\u0001 ��\u0000\u0000\t\u0001@\u0011�u\u0000\u0000\u0018&\n\u0005\u0000B',
|
|
111
112
|
'PS600\u0000\u0000 �\u0001 ��\u0000\u0000\t\u0001@\u0011�u\u0000\u0000\u0018\u0006\n\u0005\u0000',
|
|
112
113
|
'PS600\u0000\u0000 �\u0001 ��\u0000\u0000\t\u0001@\u0011�u\u0000\u0000\u0018\u0006\n\u0005\u0000B',
|
package/devices/scanproducts.js
CHANGED
|
@@ -17,4 +17,16 @@ module.exports = [
|
|
|
17
17
|
await reporting.onOff(endpoint);
|
|
18
18
|
},
|
|
19
19
|
},
|
|
20
|
+
{
|
|
21
|
+
zigbeeModel: ['12502'],
|
|
22
|
+
model: '12502',
|
|
23
|
+
vendor: 'Scan Products',
|
|
24
|
+
description: 'Zigbee 3.0 switch',
|
|
25
|
+
extend: extend.switch(),
|
|
26
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
27
|
+
const endpoint = device.getEndpoint(1) || device.getEndpoint(3);
|
|
28
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
29
|
+
await reporting.onOff(endpoint);
|
|
30
|
+
},
|
|
31
|
+
},
|
|
20
32
|
];
|
package/devices/sinope.js
CHANGED
|
@@ -766,7 +766,7 @@ module.exports = [
|
|
|
766
766
|
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tzLocal.backlight_autodim,
|
|
767
767
|
tzLocal.thermostat_time, tzLocal.time_format, tzLocal.enable_outdoor_temperature, tzLocal.outdoor_temperature,
|
|
768
768
|
tzLocal.thermostat_occupancy, tzLocal.floor_control_mode, tzLocal.ambiant_max_heat_setpoint, tzLocal.floor_min_heat_setpoint,
|
|
769
|
-
tzLocal.floor_max_heat_setpoint, tzLocal.temperature_sensor],
|
|
769
|
+
tzLocal.floor_max_heat_setpoint, tzLocal.temperature_sensor, tz.electrical_measurement_power],
|
|
770
770
|
exposes: [
|
|
771
771
|
exposes.climate()
|
|
772
772
|
.withSetpoint('occupied_heating_setpoint', 5, 36, 0.5)
|
|
@@ -787,17 +787,20 @@ module.exports = [
|
|
|
787
787
|
.withDescription('Control backlight dimming behavior'),
|
|
788
788
|
exposes.enum('keypad_lockout', ea.ALL, ['unlock', 'lock1'])
|
|
789
789
|
.withDescription('Enables or disables the device’s buttons'),
|
|
790
|
-
e.power(), e.current(), e.voltage()],
|
|
790
|
+
e.power().withAccess(ea.STATE_GET), e.current(), e.voltage(), e.energy()],
|
|
791
791
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
792
792
|
const endpoint = device.getEndpoint(1);
|
|
793
793
|
const binds = [
|
|
794
794
|
'genBasic', 'genIdentify', 'genGroups', 'hvacThermostat', 'hvacUserInterfaceCfg',
|
|
795
|
-
'haElectricalMeasurement', 'msTemperatureMeasurement', 'manuSpecificSinope'];
|
|
795
|
+
'haElectricalMeasurement', 'msTemperatureMeasurement', 'seMetering', 'manuSpecificSinope'];
|
|
796
796
|
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
797
797
|
await reporting.thermostatTemperature(endpoint);
|
|
798
798
|
await reporting.thermostatPIHeatingDemand(endpoint);
|
|
799
799
|
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
800
800
|
|
|
801
|
+
try {
|
|
802
|
+
await reporting.currentSummDelivered(endpoint, {min: 10, max: 303, change: [1, 1]});
|
|
803
|
+
} catch (error) {/* Do nothing*/}
|
|
801
804
|
try {
|
|
802
805
|
await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
|
|
803
806
|
await reporting.activePower(endpoint, {min: 10, max: 305, change: 1}); // divider 1: 1W
|
package/devices/sonoff.js
CHANGED
package/devices/tuya.js
CHANGED
|
@@ -2596,7 +2596,7 @@ module.exports = [
|
|
|
2596
2596
|
whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}, {vendor: 'NEO', model: 'NAS-WR01B'},
|
|
2597
2597
|
{vendor: 'BlitzWolf', model: 'BW-SHP15'}, {vendor: 'Nous', model: 'A1Z'}, {vendor: 'BlitzWolf', model: 'BW-SHP13'},
|
|
2598
2598
|
{vendor: 'MatSee Plus', model: 'PJ-ZSW01'}, {vendor: 'MODEMIX', model: 'MOD037'}, {vendor: 'MODEMIX', model: 'MOD048'},
|
|
2599
|
-
{vendor: 'Coswall', model: 'CS-AJ-DE2U-ZG-11'}],
|
|
2599
|
+
{vendor: 'Coswall', model: 'CS-AJ-DE2U-ZG-11'}, {vendor: 'Aubess', model: 'TS011F_plug_1'}],
|
|
2600
2600
|
ota: ota.zigbeeOTA,
|
|
2601
2601
|
extend: tuya.extend.switch({electricalMeasurements: true, powerOutageMemory: true, indicatorMode: true, childLock: true}),
|
|
2602
2602
|
configure: async (device, coordinatorEndpoint, logger) => {
|
package/devices/xiaomi.js
CHANGED
|
@@ -1068,6 +1068,31 @@ module.exports = [
|
|
|
1068
1068
|
},
|
|
1069
1069
|
ota: ota.zigbeeOTA,
|
|
1070
1070
|
},
|
|
1071
|
+
{
|
|
1072
|
+
zigbeeModel: ['lumi.switch.l2acn1'],
|
|
1073
|
+
model: 'QBKG28LM',
|
|
1074
|
+
vendor: 'Xiaomi',
|
|
1075
|
+
description: 'Aqara smart wall switch H1 Pro (no neutral, double rocker)',
|
|
1076
|
+
fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
|
|
1077
|
+
toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
|
|
1078
|
+
tz.xiaomi_flip_indicator_light, tz.xiaomi_led_disabled_night],
|
|
1079
|
+
meta: {multiEndpoint: true},
|
|
1080
|
+
endpoint: (device) => {
|
|
1081
|
+
return {'left': 1, 'right': 2};
|
|
1082
|
+
},
|
|
1083
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'), e.device_temperature(),
|
|
1084
|
+
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
|
|
1085
|
+
.withDescription('Decoupled mode for left button').withEndpoint('left'),
|
|
1086
|
+
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
|
|
1087
|
+
.withDescription('Decoupled mode for right button').withEndpoint('right'),
|
|
1088
|
+
e.action(['single_left', 'double_left', 'single_right', 'double_right', 'single_both', 'double_both']),
|
|
1089
|
+
e.power_outage_memory(), e.flip_indicator_light(), e.led_disabled_night()],
|
|
1090
|
+
onEvent: preventReset,
|
|
1091
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1092
|
+
await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
|
|
1093
|
+
},
|
|
1094
|
+
ota: ota.zigbeeOTA,
|
|
1095
|
+
},
|
|
1071
1096
|
{
|
|
1072
1097
|
zigbeeModel: ['lumi.switch.n2acn1'],
|
|
1073
1098
|
model: 'QBKG31LM',
|
package/index.js
CHANGED
|
@@ -36,7 +36,7 @@ function getFromLookup(zigbeeModel) {
|
|
|
36
36
|
return lookup.get(zigbeeModel);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
zigbeeModel = zigbeeModel ? zigbeeModel.replace(/\0
|
|
39
|
+
zigbeeModel = zigbeeModel ? zigbeeModel.replace(/\0(.|\n)*$/g, '').trim() : null;
|
|
40
40
|
return lookup.get(zigbeeModel);
|
|
41
41
|
}
|
|
42
42
|
|