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.
@@ -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)) {
@@ -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 :(
@@ -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
- remote_battery: {
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.remote_battery, fz.E1524_E1810_toggle, fz.E1524_E1810_levelctrl, fz.ikea_arrow_click, fz.ikea_arrow_hold,
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.remote_battery, ikea.fz.styrbar_on, fz.command_off, fz.command_move, fz.command_stop, fz.ikea_arrow_click,
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
- await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
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.remote_battery, fz.legacy.E1743_brightness_up, fz.legacy.E1743_brightness_down, fz.command_stop,
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.remote_battery],
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.remote_battery],
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.remote_battery, fz.command_cover_close, fz.legacy.cover_close, fz.command_cover_open, fz.legacy.cover_open,
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
  {
@@ -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
- extend: extend.light_onoff_brightness({noConfigure: true}),
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',
@@ -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
@@ -37,7 +37,7 @@ module.exports = [
37
37
  model: 'BASICZBR3',
38
38
  vendor: 'SONOFF',
39
39
  description: 'Zigbee smart switch',
40
- extend: extend.switch(),
40
+ extend: extend.switch({disablePowerOnBehavior: true}),
41
41
  fromZigbee: [fz.on_off_skip_duplicate_transaction],
42
42
  },
43
43
  {
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.SET)
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.*$/g, '').trim() : null;
39
+ zigbeeModel = zigbeeModel ? zigbeeModel.replace(/\0(.|\n)*$/g, '').trim() : null;
40
40
  return lookup.get(zigbeeModel);
41
41
  }
42
42
 
@@ -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "15.0.47",
3
+ "version": "15.0.49",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [