zigbee-herdsman-converters 15.0.45 → 15.0.46

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/devices/candeo.js CHANGED
@@ -6,7 +6,7 @@ const e = exposes.presets;
6
6
 
7
7
  module.exports = [
8
8
  {
9
- zigbeeModel: ['HK-DIM-A'],
9
+ zigbeeModel: ['HK-DIM-A', 'Candeo Zigbee Dimmer'],
10
10
  model: 'HK-DIM-A',
11
11
  vendor: 'Candeo',
12
12
  description: 'Zigbee LED dimmer smart switch',
@@ -129,7 +129,7 @@ module.exports = [
129
129
  // For some this fails so set manually
130
130
  // https://github.com/Koenkk/zigbee2mqtt/issues/3575
131
131
  endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {
132
- acCurrentDivisor: 1000, acCurrentMultiplier: 1, powerMultiplier: 1, powerDivisor: 10});
132
+ acCurrentDivisor: 1000, acCurrentMultiplier: 1, acPowerMultiplier: 1, acPowerDivisor: 10});
133
133
  }
134
134
  await reporting.rmsVoltage(endpoint, {change: 2}); // Voltage reports in V
135
135
  await reporting.rmsCurrent(endpoint, {change: 10}); // Current reports in mA
@@ -2,6 +2,7 @@ const exposes = require('../lib/exposes');
2
2
  const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
3
  const tz = require('../converters/toZigbee');
4
4
  const reporting = require('../lib/reporting');
5
+ const ota = require('../lib/ota');
5
6
  const e = exposes.presets;
6
7
 
7
8
  module.exports = [
@@ -13,6 +14,7 @@ module.exports = [
13
14
  fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery, fz.lock_programming_event, fz.lock_pin_code_response],
14
15
  toZigbee: [tz.lock, tz.pincode_lock, tz.lock_userstatus],
15
16
  meta: {pinCodeCount: 20},
17
+ ota: ota.zigbeeOTA,
16
18
  configure: async (device, coordinatorEndpoint, logger) => {
17
19
  const endpoint = device.getEndpoint(1);
18
20
  await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
package/devices/ikea.js CHANGED
@@ -12,7 +12,7 @@ const e = exposes.presets;
12
12
  const ea = exposes.access;
13
13
  const herdsman = require('zigbee-herdsman');
14
14
  const {
15
- calibrateAndPrecisionRoundOptions, postfixWithEndpointName, getMetaValue,
15
+ calibrateAndPrecisionRoundOptions, postfixWithEndpointName, getMetaValue, precisionRound,
16
16
  } = require('../lib/utils');
17
17
 
18
18
  const bulbOnEvent = async (type, data, device, options, state) => {
@@ -72,39 +72,6 @@ const configureRemote = async (device, coordinatorEndpoint, logger) => {
72
72
  await reporting.batteryPercentageRemaining(endpoint);
73
73
  };
74
74
 
75
- const fzLocal = {
76
- // The STYRBAR sends an on +- 500ms after the arrow release. We don't want to send the ON action in this case.
77
- // https://github.com/Koenkk/zigbee2mqtt/issues/13335
78
- STYRBAR_on: {
79
- cluster: 'genOnOff',
80
- type: 'commandOn',
81
- convert: (model, msg, publish, options, meta) => {
82
- if (utils.hasAlreadyProcessedMessage(msg, model)) return;
83
- const arrowReleaseAgo = Date.now() - globalStore.getValue(msg.endpoint, 'arrow_release', 0);
84
- if (arrowReleaseAgo > 700) {
85
- return {action: 'on'};
86
- }
87
- },
88
- },
89
- STYRBAR_arrow_release: {
90
- cluster: 'genScenes',
91
- type: 'commandTradfriArrowRelease',
92
- options: [exposes.options.legacy()],
93
- convert: (model, msg, publish, options, meta) => {
94
- if (utils.hasAlreadyProcessedMessage(msg, model)) return;
95
- globalStore.putValue(msg.endpoint, 'arrow_release', Date.now());
96
- const direction = globalStore.getValue(msg.endpoint, 'direction');
97
- if (direction) {
98
- globalStore.clearValue(msg.endpoint, 'direction');
99
- const duration = msg.data.value / 1000;
100
- const result = {action: `arrow_${direction}_release`, duration, action_duration: duration};
101
- if (!utils.isLegacyEnabled(options)) delete result.duration;
102
- return result;
103
- }
104
- },
105
- },
106
- };
107
-
108
75
  const tradfriExtend = {
109
76
  light_onoff_brightness: (options = {}) => ({
110
77
  ...extend.light_onoff_brightness(options),
@@ -214,6 +181,61 @@ const ikea = {
214
181
  return state;
215
182
  },
216
183
  },
184
+ remote_battery: {
185
+ cluster: 'genPowerCfg',
186
+ type: ['attributeReport', 'readResponse'],
187
+ convert: (model, msg, publish, options, meta) => {
188
+ const payload = {};
189
+ if (msg.data.hasOwnProperty('batteryPercentageRemaining')) {
190
+ // Some devices do not comply to the ZCL and report a
191
+ // batteryPercentageRemaining of 100 when the battery is full (should be 200).
192
+ //
193
+ // IKEA corrected this on newer remote fw version, but many people are still
194
+ // 2.2.010 which is the last version supporting group bindings. We try to be
195
+ // smart and pick the correct one for IKEA remotes.
196
+ let dontDividePercentage = false;
197
+ let percentage = msg.data['batteryPercentageRemaining'];
198
+ const fwVer = meta.device.softwareBuildID.split('.');
199
+ if ((fwVer[0] < 2) || (fwVer[0] == 2 && fwVer[1] <= 3)) {
200
+ dontDividePercentage = true;
201
+ }
202
+ percentage = dontDividePercentage ? percentage : percentage / 2;
203
+ payload.battery = precisionRound(percentage, 2);
204
+ }
205
+
206
+ return payload;
207
+ },
208
+ },
209
+ // The STYRBAR sends an on +- 500ms after the arrow release. We don't want to send the ON action in this case.
210
+ // https://github.com/Koenkk/zigbee2mqtt/issues/13335
211
+ styrbar_on: {
212
+ cluster: 'genOnOff',
213
+ type: 'commandOn',
214
+ convert: (model, msg, publish, options, meta) => {
215
+ if (utils.hasAlreadyProcessedMessage(msg, model)) return;
216
+ const arrowReleaseAgo = Date.now() - globalStore.getValue(msg.endpoint, 'arrow_release', 0);
217
+ if (arrowReleaseAgo > 700) {
218
+ return {action: 'on'};
219
+ }
220
+ },
221
+ },
222
+ styrbar_arrow_release: {
223
+ cluster: 'genScenes',
224
+ type: 'commandTradfriArrowRelease',
225
+ options: [exposes.options.legacy()],
226
+ convert: (model, msg, publish, options, meta) => {
227
+ if (utils.hasAlreadyProcessedMessage(msg, model)) return;
228
+ globalStore.putValue(msg.endpoint, 'arrow_release', Date.now());
229
+ const direction = globalStore.getValue(msg.endpoint, 'direction');
230
+ if (direction) {
231
+ globalStore.clearValue(msg.endpoint, 'direction');
232
+ const duration = msg.data.value / 1000;
233
+ const result = {action: `arrow_${direction}_release`, duration, action_duration: duration};
234
+ if (!utils.isLegacyEnabled(options)) delete result.duration;
235
+ return result;
236
+ }
237
+ },
238
+ },
217
239
  },
218
240
  tz: {
219
241
  air_purifier_fan_mode: {
@@ -623,12 +645,12 @@ module.exports = [
623
645
  model: 'E1524/E1810',
624
646
  description: 'TRADFRI remote control',
625
647
  vendor: 'IKEA',
626
- fromZigbee: [fz.battery, fz.E1524_E1810_toggle, fz.E1524_E1810_levelctrl, fz.ikea_arrow_click, fz.ikea_arrow_hold,
648
+ fromZigbee: [ikea.fz.remote_battery, fz.E1524_E1810_toggle, fz.E1524_E1810_levelctrl, fz.ikea_arrow_click, fz.ikea_arrow_hold,
627
649
  fz.ikea_arrow_release],
628
- exposes: [e.battery(), e.action(['arrow_left_click', 'arrow_left_hold', 'arrow_left_release', 'arrow_right_click',
629
- 'arrow_right_hold', 'arrow_right_release', 'brightness_down_click', 'brightness_down_hold', 'brightness_down_release',
630
- 'brightness_up_click', 'brightness_up_hold', 'brightness_up_release', 'toggle'])],
631
- toZigbee: [],
650
+ exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['arrow_left_click', 'arrow_left_hold', 'arrow_left_release',
651
+ 'arrow_right_click', 'arrow_right_hold', 'arrow_right_release', 'brightness_down_click', 'brightness_down_hold',
652
+ 'brightness_down_release', 'brightness_up_click', 'brightness_up_hold', 'brightness_up_release', 'toggle'])],
653
+ toZigbee: [tz.battery_percentage_remaining],
632
654
  ota: ota.tradfri,
633
655
  // dontDividePercentage: true not needed with latest firmware
634
656
  // https://github.com/Koenkk/zigbee2mqtt/issues/16412
@@ -639,12 +661,12 @@ module.exports = [
639
661
  model: 'E2001/E2002',
640
662
  vendor: 'IKEA',
641
663
  description: 'STYRBAR remote control',
642
- fromZigbee: [fz.battery, fzLocal.STYRBAR_on, fz.command_off, fz.command_move, fz.command_stop, fz.ikea_arrow_click,
643
- fz.ikea_arrow_hold, fzLocal.STYRBAR_arrow_release],
644
- exposes: [e.battery(), e.action(['on', 'off', 'brightness_move_up', 'brightness_move_down',
664
+ fromZigbee: [ikea.fz.remote_battery, ikea.fz.styrbar_on, fz.command_off, fz.command_move, fz.command_stop, fz.ikea_arrow_click,
665
+ fz.ikea_arrow_hold, ikea.fz.styrbar_arrow_release],
666
+ exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off', 'brightness_move_up', 'brightness_move_down',
645
667
  'brightness_stop', 'arrow_left_click', 'arrow_right_click', 'arrow_left_hold',
646
668
  'arrow_right_hold', 'arrow_left_release', 'arrow_right_release'])],
647
- toZigbee: [],
669
+ toZigbee: [tz.battery_percentage_remaining],
648
670
  ota: ota.tradfri,
649
671
  meta: {battery: {dontDividePercentage: true}},
650
672
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -659,10 +681,14 @@ module.exports = [
659
681
  model: 'E1743',
660
682
  vendor: 'IKEA',
661
683
  description: 'TRADFRI ON/OFF switch',
662
- fromZigbee: [fz.command_on, fz.legacy.genOnOff_cmdOn, fz.command_off, fz.legacy.genOnOff_cmdOff, fz.command_move, fz.battery,
663
- fz.legacy.E1743_brightness_up, fz.legacy.E1743_brightness_down, fz.command_stop, fz.legacy.E1743_brightness_stop],
664
- exposes: [e.battery(), e.action(['on', 'off', 'brightness_move_down', 'brightness_move_up', 'brightness_stop'])],
665
- toZigbee: [],
684
+ fromZigbee: [fz.command_on, fz.legacy.genOnOff_cmdOn, fz.command_off, fz.legacy.genOnOff_cmdOff, fz.command_move,
685
+ ikea.fz.remote_battery, fz.legacy.E1743_brightness_up, fz.legacy.E1743_brightness_down, fz.command_stop,
686
+ fz.legacy.E1743_brightness_stop],
687
+ exposes: [
688
+ e.battery().withAccess(ea.STATE_GET),
689
+ e.action(['on', 'off', 'brightness_move_down', 'brightness_move_up', 'brightness_stop']),
690
+ ],
691
+ toZigbee: [tz.battery_percentage_remaining],
666
692
  ota: ota.tradfri,
667
693
  meta: {disableActionGroup: true, battery: {dontDividePercentage: true}},
668
694
  configure: configureRemote,
@@ -672,9 +698,9 @@ module.exports = [
672
698
  model: 'E1841',
673
699
  vendor: 'IKEA',
674
700
  description: 'KNYCKLAN open/close remote water valve',
675
- fromZigbee: [fz.command_on, fz.command_off, fz.battery],
676
- exposes: [e.battery(), e.action(['on', 'off'])],
677
- toZigbee: [],
701
+ fromZigbee: [fz.command_on, fz.command_off, ikea.fz.remote_battery],
702
+ exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off'])],
703
+ toZigbee: [tz.battery_percentage_remaining],
678
704
  ota: ota.tradfri,
679
705
  meta: {disableActionGroup: true, battery: {dontDividePercentage: true}},
680
706
  configure: configureRemote,
@@ -699,9 +725,9 @@ module.exports = [
699
725
  model: 'E1812',
700
726
  vendor: 'IKEA',
701
727
  description: 'TRADFRI shortcut button',
702
- fromZigbee: [fz.command_on, fz.command_off, fz.command_move, fz.command_stop, fz.battery],
703
- exposes: [e.battery(), e.action(['on', 'off', 'brightness_move_up', 'brightness_stop'])],
704
- toZigbee: [],
728
+ fromZigbee: [fz.command_on, fz.command_off, fz.command_move, fz.command_stop, ikea.fz.remote_battery],
729
+ exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['on', 'off', 'brightness_move_up', 'brightness_stop'])],
730
+ toZigbee: [tz.battery_percentage_remaining],
705
731
  ota: ota.tradfri,
706
732
  meta: {disableActionGroup: true, battery: {dontDividePercentage: true}},
707
733
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -838,10 +864,10 @@ module.exports = [
838
864
  model: 'E1766',
839
865
  vendor: 'IKEA',
840
866
  description: 'TRADFRI open/close remote',
841
- fromZigbee: [fz.battery, fz.command_cover_close, fz.legacy.cover_close, fz.command_cover_open, fz.legacy.cover_open,
867
+ fromZigbee: [ikea.fz.remote_battery, fz.command_cover_close, fz.legacy.cover_close, fz.command_cover_open, fz.legacy.cover_open,
842
868
  fz.command_cover_stop, fz.legacy.cover_stop],
843
- exposes: [e.battery(), e.action(['close', 'open', 'stop'])],
844
- toZigbee: [],
869
+ exposes: [e.battery().withAccess(ea.STATE_GET), e.action(['close', 'open', 'stop'])],
870
+ toZigbee: [tz.battery_percentage_remaining],
845
871
  meta: {battery: {dontDividePercentage: true}},
846
872
  ota: ota.tradfri,
847
873
  configure: configureRemote,
@@ -979,6 +1005,13 @@ module.exports = [
979
1005
  description: 'STOFTMOLN ceiling/wall lamp 24 warm light dimmable',
980
1006
  extend: tradfriExtend.light_onoff_brightness(),
981
1007
  },
1008
+ {
1009
+ zigbeeModel: ['STOFTMOLN ceiling/wall lamp WW10'],
1010
+ model: 'T2105',
1011
+ vendor: 'IKEA',
1012
+ description: 'STOFTMOLN ceiling/wall lamp 10 warm light dimmable',
1013
+ extend: tradfriExtend.light_onoff_brightness(),
1014
+ },
982
1015
  {
983
1016
  zigbeeModel: ['TRADFRIbulbPAR38WS900lm'],
984
1017
  model: 'LED2006R9',
@@ -28,6 +28,22 @@ const tzLocal = {
28
28
  };
29
29
 
30
30
  module.exports = [
31
+ {
32
+ zigbeeModel: [' Pocket remote\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'+
33
+ '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
34
+ model: '067755',
35
+ vendor: 'Legrand',
36
+ description: 'Wireless and batteryless 4 scenes control',
37
+ fromZigbee: [fz.identify, fz.battery, fz.command_recall],
38
+ exposes: [e.battery(), e.action(['identify', 'recall_1_1'])],
39
+ toZigbee: [],
40
+ meta: {multiEndpoint: true, battery: {voltageToPercentage: '3V_2500'}, publishDuplicateTransaction: true},
41
+ onEvent: readInitialBatteryState,
42
+ configure: async (device, coordinatorEndpoint, logger) => {
43
+ const endpoint = device.getEndpoint(1);
44
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'genOnOff', 'genLevelCtrl']);
45
+ },
46
+ },
31
47
  {
32
48
  zigbeeModel: [' Dry contact\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'+
33
49
  '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
@@ -43,6 +43,24 @@ module.exports = [
43
43
  },
44
44
  ota: ota.salus,
45
45
  },
46
+ {
47
+ zigbeeModel: ['SX885ZB'],
48
+ model: 'SX885ZB',
49
+ vendor: 'Salus Controls',
50
+ description: 'miniSmartPlug',
51
+ fromZigbee: [fz.on_off, fz.metering],
52
+ toZigbee: [tz.on_off],
53
+ configure: async (device, coordinatorEndpoint, logger) => {
54
+ const endpoint = device.getEndpoint(9);
55
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
56
+ await reporting.onOff(endpoint);
57
+ await reporting.instantaneousDemand(endpoint, {min: 5, change: 10});
58
+ await reporting.currentSummDelivered(endpoint, {min: 5, change: [0, 10]});
59
+ await endpoint.read('seMetering', ['multiplier', 'divisor']);
60
+ },
61
+ ota: ota.salus,
62
+ exposes: [e.switch(), e.power(), e.energy()],
63
+ },
46
64
  {
47
65
  zigbeeModel: ['SR600'],
48
66
  model: 'SR600',
package/devices/tuya.js CHANGED
@@ -899,7 +899,7 @@ module.exports = [
899
899
  ],
900
900
  meta: {
901
901
  tuyaDatapoints: [
902
- [1, 'gas', tuya.valueConverterBasic.lookup({true: tuya.enum(0), false: tuya.enum(1)})],
902
+ [1, 'gas', tuya.valueConverter.trueFalseEnum0],
903
903
  [2, 'gas_value', tuya.valueConverter.divideBy10],
904
904
  [6, 'alarm_ringtone', tuya.valueConverterBasic.lookup({'1': 0, '2': 1, '3': 2, '4': 3, '5': 4})],
905
905
  [7, 'alarm_time', tuya.valueConverter.raw],
@@ -2177,7 +2177,6 @@ module.exports = [
2177
2177
  {modelID: 'TS0601', manufacturerName: '_TZE200_8whxpsiw'}, // EVOLVEO
2178
2178
  {modelID: 'TS0601', manufacturerName: '_TZE200_xby0s3ta'}, // Sandy Beach HY367
2179
2179
  {modelID: 'TS0601', manufacturerName: '_TZE200_7fqkphoq'}, // AFINTEK
2180
- {modelID: 'TS0601', manufacturerName: '_TZE200_gd4rvykv'}, // Sanico
2181
2180
  ],
2182
2181
  model: 'TS0601_thermostat',
2183
2182
  vendor: 'TuYa',
@@ -2372,6 +2371,7 @@ module.exports = [
2372
2371
  fingerprint: tuya.fingerprint('TS0601', [
2373
2372
  '_TZE200_bvu2wnxz', /* model: 'ME167', vendor: 'Avatto' */
2374
2373
  '_TZE200_6rdj8dzm', /* model: 'ME167', vendor: 'Avatto' */
2374
+ '_TZE200_gd4rvykv', // Sanico
2375
2375
  ]),
2376
2376
  model: 'TS0601_thermostat_3',
2377
2377
  vendor: 'TuYa',
@@ -2541,7 +2541,13 @@ module.exports = [
2541
2541
  zigbeeModel: ['TS0121'],
2542
2542
  model: 'TS0121_plug',
2543
2543
  description: '10A UK or 16A EU smart plug',
2544
- whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-SHP13'}],
2544
+ whiteLabel: [
2545
+ {vendor: 'BlitzWolf', model: 'BW-SHP13'},
2546
+ {vendor: 'Connecte', model: '4500990'},
2547
+ {vendor: 'Connecte', model: '4500991'},
2548
+ {vendor: 'Connecte', model: '4500992'},
2549
+ {vendor: 'Connecte', model: '4500993'},
2550
+ ],
2545
2551
  vendor: 'TuYa',
2546
2552
  fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, tuya.fz.power_outage_memory,
2547
2553
  tuya.fz.indicator_mode],
@@ -2558,6 +2564,9 @@ module.exports = [
2558
2564
  await reporting.currentSummDelivered(endpoint);
2559
2565
  } catch (error) {/* fails for some https://github.com/Koenkk/zigbee2mqtt/issues/11179 */}
2560
2566
  await endpoint.read('genOnOff', ['onOff', 'moesStartUpOnOff', 'tuyaBacklightMode']);
2567
+ await reporting.rmsVoltage(endpoint, {change: 5});
2568
+ await reporting.rmsCurrent(endpoint, {change: 50});
2569
+ await reporting.activePower(endpoint, {change: 10});
2561
2570
  },
2562
2571
  options: [exposes.options.measurement_poll_interval()],
2563
2572
  // This device doesn't support reporting correctly.
@@ -2809,6 +2818,55 @@ module.exports = [
2809
2818
  ],
2810
2819
  },
2811
2820
  },
2821
+ {
2822
+ fingerprint: tuya.fingerprint('TS0601', ['_TZE200_rhblgy0z']),
2823
+ model: 'TS0601_din_3',
2824
+ vendor: 'TuYa',
2825
+ description: 'Zigbee DIN energy meter',
2826
+ fromZigbee: [tuya.fz.datapoints],
2827
+ toZigbee: [tuya.tz.datapoints],
2828
+ configure: tuya.configureMagicPacket,
2829
+ whiteLabel: [{vendor: 'XOCA', model: 'DAC2161C'}],
2830
+ exposes: [tuya.exposes.switch(), e.energy(), e.produced_energy(), e.power(), e.voltage(), e.current(),
2831
+ exposes.enum('fault', ea.STATE, ['clear', 'over_current_threshold', 'over_power_threshold',
2832
+ 'over_voltage threshold', 'wrong_frequency_threshold']).withDescription('Fault status of the device (clear = nothing)'),
2833
+ exposes.enum('threshold_1', ea.STATE, ['not_set', 'over_current_threshold', 'over_voltage_threshold'])
2834
+ .withDescription('State of threshold_1'),
2835
+ exposes.binary('threshold_1_protection', ea.STATE, 'ON', 'OFF')
2836
+ .withDescription('OFF - alarm only, ON - relay will be off when threshold reached'),
2837
+ exposes.numeric('threshold_1_value', ea.STATE)
2838
+ .withDescription('Can be in Volt or Ampere depending on threshold setting. Setup the value on the device'),
2839
+ exposes.enum('threshold_2', ea.STATE, ['not_set', 'over_current_threshold', 'over_voltage_threshold'])
2840
+ .withDescription('State of threshold_2'),
2841
+ exposes.binary('threshold_2_protection', ea.STATE, 'ON', 'OFF')
2842
+ .withDescription('OFF - alarm only, ON - relay will be off when threshold reached'),
2843
+ exposes.numeric('threshold_2_value', ea.STATE)
2844
+ .withDescription('Setup value on the device'),
2845
+ exposes.binary('clear_fault', ea.STATE_SET, 'ON', 'OFF')
2846
+ .withDescription('Turn ON to clear last the fault'),
2847
+ exposes.text('meter_id', ea.STATE).withDescription('Meter ID (ID of device)'),
2848
+ ],
2849
+ meta: {
2850
+ tuyaDatapoints: [
2851
+ [1, 'energy', tuya.valueConverter.divideBy100],
2852
+ [2, 'produced_energy', tuya.valueConverter.divideBy100],
2853
+ [3, null, null], // Monthly, but sends data only after request
2854
+ [4, null, null], // Dayly, but sends data only after request
2855
+ [6, null, tuya.valueConverter.phaseVariant2], // voltage and current
2856
+ [10, 'fault', tuya.valueConverterBasic.lookup({'clear': 0, 'over_current_threshold': 1,
2857
+ 'over_power_threshold': 2, 'over_voltage_threshold': 4, 'wrong_frequency_threshold': 8})],
2858
+ [11, null, null], // Frozen - strange function, in native app - nothing is clear
2859
+ [16, 'state', tuya.valueConverter.onOff],
2860
+ [17, null, tuya.valueConverter.threshold], // It's settable, but can't write converter
2861
+ [18, 'meter_id', tuya.valueConverter.raw],
2862
+ [20, 'clear_fault', tuya.valueConverter.onOff], // Clear fault
2863
+ [21, null, null], // Forward Energy T1 - don't know what this
2864
+ [22, null, null], // Forward Energy T2 - don't know what this
2865
+ [23, null, null], // Forward Energy T3 - don't know what this
2866
+ [24, null, null], // Forward Energy T4 - don't know what this
2867
+ ],
2868
+ },
2869
+ },
2812
2870
  {
2813
2871
  fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_byzdayie'},
2814
2872
  {modelID: 'TS0601', manufacturerName: '_TZE200_fsb6zw01'},
package/lib/tuya.js CHANGED
@@ -1233,6 +1233,7 @@ const valueConverter = {
1233
1233
  trueFalse0: valueConverterBasic.trueFalse(0),
1234
1234
  trueFalse1: valueConverterBasic.trueFalse(1),
1235
1235
  trueFalse2: valueConverterBasic.trueFalse(2),
1236
+ trueFalseEnum0: valueConverterBasic.trueFalse(new Enum(0)),
1236
1237
  onOff: valueConverterBasic.lookup({'ON': true, 'OFF': false}),
1237
1238
  powerOnBehavior: valueConverterBasic.lookup({'off': 0, 'on': 1, 'previous': 2}),
1238
1239
  lightType: valueConverterBasic.lookup({'led': 0, 'incandescent': 1, 'halogen': 2}),
@@ -1614,7 +1615,7 @@ const tuyaTz = {
1614
1615
  'week_schedule_programming', 'online', 'holiday_mode_date', 'schedule', 'schedule_monday', 'schedule_tuesday',
1615
1616
  'schedule_wednesday', 'schedule_thursday', 'schedule_friday', 'schedule_saturday', 'schedule_sunday', 'clear_fault',
1616
1617
  'scale_protection', 'error', 'radar_scene', 'radar_sensitivity', 'tumble_alarm_time', 'tumble_switch', 'fall_sensitivity',
1617
- 'min_temperature', 'max_temperature', 'window_detection', 'boost_heating',
1618
+ 'min_temperature', 'max_temperature', 'window_detection', 'boost_heating', 'alarm_ringtone', 'alarm_time',
1618
1619
  ],
1619
1620
  convertSet: async (entity, key, value, meta) => {
1620
1621
  // A set converter is only called once; therefore we need to loop
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "15.0.45",
3
+ "version": "15.0.46",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -38,7 +38,7 @@
38
38
  "buffer-crc32": "^0.2.13",
39
39
  "https-proxy-agent": "^5.0.1",
40
40
  "tar-stream": "^3.0.0",
41
- "zigbee-herdsman": "^0.14.90"
41
+ "zigbee-herdsman": "^0.14.92"
42
42
  },
43
43
  "devDependencies": {
44
44
  "eslint": "*",