zigbee-herdsman-converters 15.0.47 → 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/essentialb.js +20 -0
- package/devices/ikea.js +22 -21
- package/devices/nue_3a.js +1 -1
- package/devices/osram.js +1 -1
- package/devices/philips.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 +4 -3
- package/devices/xiaomi.js +25 -0
- package/index.js +1 -1
- package/lib/ota/OTA_URLs.md +4 -4
- 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/essentialb.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const reporting = require('../lib/reporting');
|
|
1
4
|
const extend = require('../lib/extend');
|
|
5
|
+
const e = exposes.presets;
|
|
2
6
|
|
|
3
7
|
module.exports = [
|
|
4
8
|
{
|
|
@@ -64,4 +68,20 @@ module.exports = [
|
|
|
64
68
|
description: 'GU10 MR16 RGBW light bulb',
|
|
65
69
|
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
|
|
66
70
|
},
|
|
71
|
+
{
|
|
72
|
+
zigbeeModel: ['EB-SB-1B'],
|
|
73
|
+
model: 'EB-SB-1B',
|
|
74
|
+
vendor: 'EssentielB',
|
|
75
|
+
description: 'Smart button',
|
|
76
|
+
fromZigbee: [fz.battery, fz.command_on, fz.command_off, fz.command_step, fz.command_stop, fz.command_step_color_temperature],
|
|
77
|
+
toZigbee: [],
|
|
78
|
+
exposes: [e.battery(), e.action(['on', 'off', 'color_temperature_step_up', 'color_temperature_step_down',
|
|
79
|
+
'brightness_step_up', 'brightness_step_down', 'brightness_stop'])],
|
|
80
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
81
|
+
const endpoint = device.getEndpoint(1);
|
|
82
|
+
const binds = ['genBasic', 'genOnOff', 'genPowerCfg', 'lightingColorCtrl', 'genLevelCtrl'];
|
|
83
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
84
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
85
|
+
},
|
|
86
|
+
},
|
|
67
87
|
];
|
package/devices/ikea.js
CHANGED
|
@@ -181,7 +181,7 @@ const ikea = {
|
|
|
181
181
|
return state;
|
|
182
182
|
},
|
|
183
183
|
},
|
|
184
|
-
|
|
184
|
+
battery: {
|
|
185
185
|
cluster: 'genPowerCfg',
|
|
186
186
|
type: ['attributeReport', 'readResponse'],
|
|
187
187
|
convert: (model, msg, publish, options, meta) => {
|
|
@@ -645,7 +645,7 @@ module.exports = [
|
|
|
645
645
|
model: 'E1524/E1810',
|
|
646
646
|
description: 'TRADFRI remote control',
|
|
647
647
|
vendor: 'IKEA',
|
|
648
|
-
fromZigbee: [ikea.fz.
|
|
648
|
+
fromZigbee: [ikea.fz.battery, fz.E1524_E1810_toggle, fz.E1524_E1810_levelctrl, fz.ikea_arrow_click, fz.ikea_arrow_hold,
|
|
649
649
|
fz.ikea_arrow_release],
|
|
650
650
|
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['arrow_left_click', 'arrow_left_hold', 'arrow_left_release',
|
|
651
651
|
'arrow_right_click', 'arrow_right_hold', 'arrow_right_release', 'brightness_down_click', 'brightness_down_hold',
|
|
@@ -661,7 +661,7 @@ module.exports = [
|
|
|
661
661
|
model: 'E2001/E2002',
|
|
662
662
|
vendor: 'IKEA',
|
|
663
663
|
description: 'STYRBAR remote control',
|
|
664
|
-
fromZigbee: [ikea.fz.
|
|
664
|
+
fromZigbee: [ikea.fz.battery, ikea.fz.styrbar_on, fz.command_off, fz.command_move, fz.command_stop, fz.ikea_arrow_click,
|
|
665
665
|
fz.ikea_arrow_hold, ikea.fz.styrbar_arrow_release],
|
|
666
666
|
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off', 'brightness_move_up', 'brightness_move_down',
|
|
667
667
|
'brightness_stop', 'arrow_left_click', 'arrow_right_click', 'arrow_left_hold',
|
|
@@ -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
|
},
|
|
@@ -681,7 +685,7 @@ module.exports = [
|
|
|
681
685
|
vendor: 'IKEA',
|
|
682
686
|
description: 'TRADFRI ON/OFF switch',
|
|
683
687
|
fromZigbee: [fz.command_on, fz.legacy.genOnOff_cmdOn, fz.command_off, fz.legacy.genOnOff_cmdOff, fz.command_move,
|
|
684
|
-
ikea.fz.
|
|
688
|
+
ikea.fz.battery, fz.legacy.E1743_brightness_up, fz.legacy.E1743_brightness_down, fz.command_stop,
|
|
685
689
|
fz.legacy.E1743_brightness_stop],
|
|
686
690
|
exposes: [
|
|
687
691
|
e.battery().withAccess(ea.STATE_GET),
|
|
@@ -697,7 +701,7 @@ module.exports = [
|
|
|
697
701
|
model: 'E1841',
|
|
698
702
|
vendor: 'IKEA',
|
|
699
703
|
description: 'KNYCKLAN open/close remote water valve',
|
|
700
|
-
fromZigbee: [fz.command_on, fz.command_off, ikea.fz.
|
|
704
|
+
fromZigbee: [fz.command_on, fz.command_off, ikea.fz.battery],
|
|
701
705
|
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off'])],
|
|
702
706
|
toZigbee: [tz.battery_percentage_remaining],
|
|
703
707
|
ota: ota.tradfri,
|
|
@@ -724,7 +728,7 @@ module.exports = [
|
|
|
724
728
|
model: 'E1812',
|
|
725
729
|
vendor: 'IKEA',
|
|
726
730
|
description: 'TRADFRI shortcut button',
|
|
727
|
-
fromZigbee: [fz.command_on, fz.command_off, fz.command_move, fz.command_stop, ikea.fz.
|
|
731
|
+
fromZigbee: [fz.command_on, fz.command_off, fz.command_move, fz.command_stop, ikea.fz.battery],
|
|
728
732
|
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off', 'brightness_move_up', 'brightness_stop'])],
|
|
729
733
|
toZigbee: [tz.battery_percentage_remaining],
|
|
730
734
|
ota: ota.tradfri,
|
|
@@ -758,7 +762,7 @@ module.exports = [
|
|
|
758
762
|
model: 'E1525/E1745',
|
|
759
763
|
vendor: 'IKEA',
|
|
760
764
|
description: 'TRADFRI motion sensor',
|
|
761
|
-
fromZigbee: [fz.battery, fz.tradfri_occupancy, fz.E1745_requested_brightness],
|
|
765
|
+
fromZigbee: [ikea.fz.battery, fz.tradfri_occupancy, fz.E1745_requested_brightness],
|
|
762
766
|
toZigbee: [],
|
|
763
767
|
exposes: [e.battery(), e.occupancy(),
|
|
764
768
|
exposes.numeric('requested_brightness_level', ea.STATE).withValueMin(76).withValueMax(254),
|
|
@@ -795,9 +799,8 @@ module.exports = [
|
|
|
795
799
|
model: 'E1757',
|
|
796
800
|
vendor: 'IKEA',
|
|
797
801
|
description: 'FYRTUR roller blind',
|
|
798
|
-
fromZigbee: [fz.cover_position_tilt, fz.battery],
|
|
799
|
-
toZigbee: [tz.cover_state, tz.cover_position_tilt],
|
|
800
|
-
meta: {battery: {dontDividePercentage: true}},
|
|
802
|
+
fromZigbee: [fz.cover_position_tilt, ikea.fz.battery],
|
|
803
|
+
toZigbee: [tz.cover_state, tz.cover_position_tilt, tz.battery_percentage_remaining],
|
|
801
804
|
ota: ota.tradfri,
|
|
802
805
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
803
806
|
const endpoint = device.getEndpoint(1);
|
|
@@ -805,16 +808,15 @@ module.exports = [
|
|
|
805
808
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
806
809
|
await reporting.currentPositionLiftPercentage(endpoint);
|
|
807
810
|
},
|
|
808
|
-
exposes: [e.cover_position(), e.battery()],
|
|
811
|
+
exposes: [e.cover_position(), e.battery().withAccess(ea.STATE_GET)],
|
|
809
812
|
},
|
|
810
813
|
{
|
|
811
814
|
zigbeeModel: ['KADRILJ roller blind'],
|
|
812
815
|
model: 'E1926',
|
|
813
816
|
vendor: 'IKEA',
|
|
814
817
|
description: 'KADRILJ roller blind',
|
|
815
|
-
fromZigbee: [fz.cover_position_tilt, fz.battery],
|
|
816
|
-
toZigbee: [tz.cover_state, tz.cover_position_tilt],
|
|
817
|
-
meta: {battery: {dontDividePercentage: true}},
|
|
818
|
+
fromZigbee: [fz.cover_position_tilt, ikea.fz.battery],
|
|
819
|
+
toZigbee: [tz.cover_state, tz.cover_position_tilt, tz.battery_percentage_remaining],
|
|
818
820
|
ota: ota.tradfri,
|
|
819
821
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
820
822
|
const endpoint = device.getEndpoint(1);
|
|
@@ -822,16 +824,15 @@ module.exports = [
|
|
|
822
824
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
823
825
|
await reporting.currentPositionLiftPercentage(endpoint);
|
|
824
826
|
},
|
|
825
|
-
exposes: [e.cover_position(), e.battery()],
|
|
827
|
+
exposes: [e.cover_position(), e.battery().withAccess(ea.STATE_GET)],
|
|
826
828
|
},
|
|
827
829
|
{
|
|
828
830
|
zigbeeModel: ['PRAKTLYSING cellular blind'],
|
|
829
831
|
model: 'E2102',
|
|
830
832
|
vendor: 'IKEA',
|
|
831
833
|
description: 'PRAKTLYSING cellular blind',
|
|
832
|
-
fromZigbee: [fz.cover_position_tilt, fz.battery],
|
|
833
|
-
toZigbee: [tz.cover_state, tz.cover_position_tilt],
|
|
834
|
-
meta: {battery: {dontDividePercentage: true}},
|
|
834
|
+
fromZigbee: [fz.cover_position_tilt, ikea.fz.battery],
|
|
835
|
+
toZigbee: [tz.cover_state, tz.cover_position_tilt, tz.battery_percentage_remaining],
|
|
835
836
|
ota: ota.tradfri,
|
|
836
837
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
837
838
|
const endpoint = device.getEndpoint(1);
|
|
@@ -839,7 +840,7 @@ module.exports = [
|
|
|
839
840
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
840
841
|
await reporting.currentPositionLiftPercentage(endpoint);
|
|
841
842
|
},
|
|
842
|
-
exposes: [e.cover_position(), e.battery()],
|
|
843
|
+
exposes: [e.cover_position(), e.battery().withAccess(ea.STATE_GET)],
|
|
843
844
|
},
|
|
844
845
|
{
|
|
845
846
|
zigbeeModel: ['TREDANSEN block-out cellul blind'],
|
|
@@ -863,7 +864,7 @@ module.exports = [
|
|
|
863
864
|
model: 'E1766',
|
|
864
865
|
vendor: 'IKEA',
|
|
865
866
|
description: 'TRADFRI open/close remote',
|
|
866
|
-
fromZigbee: [ikea.fz.
|
|
867
|
+
fromZigbee: [ikea.fz.battery, fz.command_cover_close, fz.legacy.cover_close, fz.command_cover_open, fz.legacy.cover_open,
|
|
867
868
|
fz.command_cover_stop, fz.legacy.cover_stop],
|
|
868
869
|
exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['close', 'open', 'stop'])],
|
|
869
870
|
toZigbee: [tz.battery_percentage_remaining],
|
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/osram.js
CHANGED
|
@@ -335,7 +335,7 @@ module.exports = [
|
|
|
335
335
|
model: 'AC03648',
|
|
336
336
|
vendor: 'OSRAM',
|
|
337
337
|
description: 'SMART+ spot GU5.3 tunable white',
|
|
338
|
-
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
338
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370], disablePowerOnBehavior: true}),
|
|
339
339
|
ota: ota.ledvance,
|
|
340
340
|
},
|
|
341
341
|
{
|
package/devices/philips.js
CHANGED
|
@@ -592,7 +592,7 @@ module.exports = [
|
|
|
592
592
|
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
593
593
|
},
|
|
594
594
|
{
|
|
595
|
-
zigbeeModel: ['LCG002', '929003047701', '929003047701'],
|
|
595
|
+
zigbeeModel: ['LCG002', '929003047701', '929003047701', '929003526202_01', ' 929003526202_02', '929003526202_03'],
|
|
596
596
|
model: '929001953101',
|
|
597
597
|
vendor: 'Philips',
|
|
598
598
|
description: 'Hue White and Color Ambiance GU10',
|
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
|
@@ -1074,6 +1074,7 @@ module.exports = [
|
|
|
1074
1074
|
{
|
|
1075
1075
|
fingerprint: [{modelID: 'TS0202', manufacturerName: '_TYZB01_jytabjkb'},
|
|
1076
1076
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_lltemgsf'},
|
|
1077
|
+
{modelID: 'TS0202', manufacturerName: '_TYZB01_5nr7ncpl'},
|
|
1077
1078
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_mg4dy6z6'}],
|
|
1078
1079
|
model: 'TS0202_1',
|
|
1079
1080
|
vendor: 'TuYa',
|
|
@@ -1285,7 +1286,7 @@ module.exports = [
|
|
|
1285
1286
|
},
|
|
1286
1287
|
{
|
|
1287
1288
|
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ip2akl4w', '_TZE200_1agwnems', '_TZE200_la2c2uo9', '_TZE200_579lguh2',
|
|
1288
|
-
'_TZE200_vucankjx']),
|
|
1289
|
+
'_TZE200_vucankjx', '_TZE200_4mh6tyyo']),
|
|
1289
1290
|
model: 'TS0601_dimmer_1',
|
|
1290
1291
|
vendor: 'TuYa',
|
|
1291
1292
|
description: '1 gang smart dimmer',
|
|
@@ -2250,7 +2251,7 @@ module.exports = [
|
|
|
2250
2251
|
e.battery_low(), e.child_lock(), e.open_window(), e.open_window_temperature().withValueMin(5).withValueMax(30),
|
|
2251
2252
|
e.comfort_temperature().withValueMin(5).withValueMax(30), e.eco_temperature().withValueMin(5).withValueMax(30),
|
|
2252
2253
|
exposes.climate().withPreset(['auto', 'manual', 'holiday']).withLocalTemperatureCalibration(-5, 5, 0.1, ea.STATE_SET)
|
|
2253
|
-
.withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 30, 0.5, ea.
|
|
2254
|
+
.withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 30, 0.5, ea.STATE_SET)
|
|
2254
2255
|
.withSystemMode(['off', 'heat'], ea.STATE_SET, 'Only for Homeassistant'),
|
|
2255
2256
|
exposes.binary('heating_stop', ea.STATE_SET, 'ON', 'OFF').withDescription('Battery life can be prolonged'+
|
|
2256
2257
|
' by switching the heating off. To achieve this, the valve is closed fully. To activate the '+
|
|
@@ -2595,7 +2596,7 @@ module.exports = [
|
|
|
2595
2596
|
whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}, {vendor: 'NEO', model: 'NAS-WR01B'},
|
|
2596
2597
|
{vendor: 'BlitzWolf', model: 'BW-SHP15'}, {vendor: 'Nous', model: 'A1Z'}, {vendor: 'BlitzWolf', model: 'BW-SHP13'},
|
|
2597
2598
|
{vendor: 'MatSee Plus', model: 'PJ-ZSW01'}, {vendor: 'MODEMIX', model: 'MOD037'}, {vendor: 'MODEMIX', model: 'MOD048'},
|
|
2598
|
-
{vendor: 'Coswall', model: 'CS-AJ-DE2U-ZG-11'}],
|
|
2599
|
+
{vendor: 'Coswall', model: 'CS-AJ-DE2U-ZG-11'}, {vendor: 'Aubess', model: 'TS011F_plug_1'}],
|
|
2599
2600
|
ota: ota.zigbeeOTA,
|
|
2600
2601
|
extend: tuya.extend.switch({electricalMeasurements: true, powerOutageMemory: true, indicatorMode: true, childLock: true}),
|
|
2601
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
|
|
package/lib/ota/OTA_URLs.md
CHANGED
|
@@ -26,6 +26,10 @@ https://files.inovelli.com/firmware/firmware.json
|
|
|
26
26
|
|
|
27
27
|
https://files.inovelli.com/firmware
|
|
28
28
|
|
|
29
|
+
Experimental Inovelli OTA URL for zigpy:
|
|
30
|
+
|
|
31
|
+
https://files.inovelli.com/firmware/firmware-zha.json
|
|
32
|
+
|
|
29
33
|
### Sonoff OTA Firmware provider
|
|
30
34
|
|
|
31
35
|
Sonoff Zigbee OTA firmware images are made publicly available by Sonoff (first-party) at the following URLs:
|
|
@@ -46,10 +50,6 @@ Download-URL:
|
|
|
46
50
|
|
|
47
51
|
http://fw.ota.homesmart.ikea.net/feed/version_info.json
|
|
48
52
|
|
|
49
|
-
Download-URL (Test/Beta-Version):
|
|
50
|
-
|
|
51
|
-
http://fw.test.ota.homesmart.ikea.net/feed/version_info.json
|
|
52
|
-
|
|
53
53
|
Release changelogs
|
|
54
54
|
|
|
55
55
|
https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html
|