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.
@@ -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 :(
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
- 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
  },
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
- 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
@@ -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.*$/g, '').trim() : null;
39
+ zigbeeModel = zigbeeModel ? zigbeeModel.replace(/\0(.|\n)*$/g, '').trim() : null;
40
40
  return lookup.get(zigbeeModel);
41
41
  }
42
42
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "15.0.48",
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": [