zigbee-herdsman-converters 14.0.669 → 14.0.671

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/acova.js CHANGED
@@ -5,7 +5,7 @@ const reporting = require('../lib/reporting');
5
5
 
6
6
  module.exports = [
7
7
  {
8
- zigbeeModel: ['PERCALE2 D1.00P1.01Z1.00', 'PERCALE2 D1.00P1.02Z1.00'],
8
+ zigbeeModel: ['PERCALE2 D1.00P1.01Z1.00', 'PERCALE2 D1.00P1.02Z1.00', 'PERCALE2 D1.00P1.03Z1.00'],
9
9
  model: 'PERCALE2',
10
10
  vendor: 'Acova',
11
11
  description: 'Percale 2 heater',
@@ -21,6 +21,7 @@ module.exports = [
21
21
  exposes: [
22
22
  exposes.climate()
23
23
  .withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
24
+ .withSetpoint('unoccupied_heating_setpoint', 7, 28, 0.5)
24
25
  .withLocalTemperature()
25
26
  .withSystemMode(['off', 'heat', 'auto'])
26
27
  .withRunningState(['idle', 'heat']),
@@ -50,6 +51,7 @@ module.exports = [
50
51
  exposes: [
51
52
  exposes.climate()
52
53
  .withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
54
+ .withSetpoint('unoccupied_heating_setpoint', 7, 28, 0.5)
53
55
  .withLocalTemperature()
54
56
  .withSystemMode(['off', 'heat', 'auto'])
55
57
  .withRunningState(['idle', 'heat']),
@@ -81,6 +83,7 @@ module.exports = [
81
83
  exposes: [
82
84
  exposes.climate()
83
85
  .withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
86
+ .withSetpoint('unoccupied_heating_setpoint', 7, 28, 0.5)
84
87
  .withLocalTemperature()
85
88
  .withSystemMode(['off', 'heat', 'auto'])
86
89
  .withRunningState(['idle', 'heat']),
package/devices/bosch.js CHANGED
@@ -1,5 +1,6 @@
1
1
  const exposes = require('../lib/exposes');
2
- const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
2
+ const fz = require('../converters/fromZigbee');
3
+ const tz = require('../converters/toZigbee');
3
4
  const reporting = require('../lib/reporting');
4
5
  const e = exposes.presets;
5
6
 
@@ -38,4 +39,26 @@ module.exports = [
38
39
  },
39
40
  exposes: [e.temperature(), e.battery(), e.occupancy(), e.battery_low(), e.tamper()],
40
41
  },
42
+ {
43
+ zigbeeModel: ['RBSH-TRV0-ZB-EU'],
44
+ model: 'BTH-RA',
45
+ vendor: 'Bosch',
46
+ description: 'Radiator thermostat II',
47
+ fromZigbee: [fz.thermostat, fz.battery],
48
+ toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature],
49
+ exposes: [
50
+ e.battery(),
51
+ exposes.climate()
52
+ .withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
53
+ .withLocalTemperature()
54
+ .withLocalTemperatureCalibration(-30, 30, 0.1),
55
+ ],
56
+ configure: async (device, coordinatorEndpoint, logger) => {
57
+ const endpoint = device.getEndpoint(1);
58
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
59
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
60
+ await reporting.thermostatTemperature(endpoint);
61
+ await reporting.batteryPercentageRemaining(endpoint);
62
+ },
63
+ },
41
64
  ];
package/devices/datek.js CHANGED
@@ -84,6 +84,15 @@ module.exports = [
84
84
  exposes: [e.power(), e.energy(), e.current(), e.voltage(), e.current_phase_b(), e.voltage_phase_b(), e.current_phase_c(),
85
85
  e.voltage_phase_c(), e.temperature()],
86
86
  },
87
+ {
88
+ fingerprint: [{modelID: 'Motion Sensor', manufacturerName: 'Eva'}],
89
+ model: 'HSE2927E',
90
+ vendor: 'Datek',
91
+ description: 'Eva Zigbee motion sensor',
92
+ fromZigbee: [fz.ias_occupancy_alarm_1, fz.ias_occupancy_alarm_1_with_timeout, fz.illuminance, fz.temperature],
93
+ toZigbee: [],
94
+ exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.illuminance(), e.illuminance_lux(), e.temperature()],
95
+ },
87
96
  {
88
97
  zigbeeModel: ['ID Lock 150'],
89
98
  model: '0402946',
@@ -49,7 +49,7 @@ const develco = {
49
49
  },
50
50
  },
51
51
  fz: {
52
- // SPLZB-134 and SPLZB-131 reports strange values sometimes
52
+ // Some Develco devices report strange values sometimes
53
53
  // https://github.com/Koenkk/zigbee2mqtt/issues/13329
54
54
  electrical_measurement: {
55
55
  ...fz.electrical_measurement,
@@ -67,6 +67,14 @@ const develco = {
67
67
  }
68
68
  },
69
69
  },
70
+ temperature: {
71
+ ...fz.temperature,
72
+ convert: (model, msg, publish, options, meta) => {
73
+ if (msg.data.measuredValue !== -0x8000 && msg.data.measuredValue !== 0xFFFF) {
74
+ return fz.temperature.convert(model, msg, publish, options, meta);
75
+ }
76
+ },
77
+ },
70
78
  metering: {
71
79
  ...fz.metering,
72
80
  convert: (model, msg, publish, options, meta) => {
@@ -299,7 +307,7 @@ module.exports = [
299
307
  model: 'SPLZB-132',
300
308
  vendor: 'Develco',
301
309
  description: 'Power plug',
302
- fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.device_temperature],
310
+ fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering, develco.fz.device_temperature],
303
311
  toZigbee: [tz.on_off],
304
312
  exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature(), e.ac_frequency()],
305
313
  options: [exposes.options.precision(`ac_frequency`)],
@@ -352,7 +360,7 @@ module.exports = [
352
360
  model: 'SMRZB-143',
353
361
  vendor: 'Develco',
354
362
  description: 'Smart cable',
355
- fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.device_temperature],
363
+ fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering, develco.fz.device_temperature],
356
364
  toZigbee: [tz.on_off],
357
365
  exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature()],
358
366
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -417,7 +425,7 @@ module.exports = [
417
425
  model: 'SMSZB-120',
418
426
  vendor: 'Develco',
419
427
  description: 'Smoke detector with siren',
420
- fromZigbee: [fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
428
+ fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
421
429
  fz.ias_enroll, fz.ias_wd, develco.fz.fault_status],
422
430
  toZigbee: [tz.warning, tz.ias_max_duration, tz.warning_simple],
423
431
  ota: ota.zigbeeOTA,
@@ -452,7 +460,7 @@ module.exports = [
452
460
  model: 'HESZB-120',
453
461
  vendor: 'Develco',
454
462
  description: 'Fire detector with siren',
455
- fromZigbee: [fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
463
+ fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
456
464
  fz.ias_enroll, fz.ias_wd, develco.fz.fault_status],
457
465
  toZigbee: [tz.warning, tz.ias_max_duration, tz.warning_simple],
458
466
  meta: {battery: {voltageToPercentage: '3V_2500'}},
@@ -486,7 +494,7 @@ module.exports = [
486
494
  model: 'WISZB-120',
487
495
  vendor: 'Develco',
488
496
  description: 'Window sensor',
489
- fromZigbee: [fz.ias_contact_alarm_1, fz.battery, fz.temperature],
497
+ fromZigbee: [fz.ias_contact_alarm_1, fz.battery, develco.fz.temperature],
490
498
  toZigbee: [],
491
499
  exposes: [e.contact(), e.battery(), e.battery_low(), e.tamper(), e.temperature()],
492
500
  meta: {battery: {voltageToPercentage: '3V_2500'}},
@@ -525,7 +533,7 @@ module.exports = [
525
533
  vendor: 'Develco',
526
534
  description: 'Motion sensor',
527
535
  fromZigbee: [
528
- fz.temperature, fz.illuminance, fz.ias_occupancy_alarm_1, fz.battery,
536
+ develco.fz.temperature, fz.illuminance, fz.ias_occupancy_alarm_1, fz.battery,
529
537
  develco.fz.led_control, develco.fz.ias_occupancy_timeout,
530
538
  ],
531
539
  toZigbee: [develco.tz.led_control, develco.tz.ias_occupancy_timeout],
@@ -591,7 +599,7 @@ module.exports = [
591
599
  model: 'HMSZB-110',
592
600
  vendor: 'Develco',
593
601
  description: 'Temperature & humidity sensor',
594
- fromZigbee: [fz.battery, fz.temperature, fz.humidity],
602
+ fromZigbee: [fz.battery, develco.fz.temperature, fz.humidity],
595
603
  toZigbee: [],
596
604
  exposes: [e.battery(), e.battery_low(), e.temperature(), e.humidity()],
597
605
  meta: {battery: {voltageToPercentage: '3V_2500_3200'}},
@@ -609,7 +617,7 @@ module.exports = [
609
617
  model: 'ZHEMI101',
610
618
  vendor: 'Develco',
611
619
  description: 'Energy meter',
612
- fromZigbee: [fz.metering, develco.fz.pulse_configuration, develco.fz.interface_mode],
620
+ fromZigbee: [develco.fz.metering, develco.fz.pulse_configuration, develco.fz.interface_mode],
613
621
  toZigbee: [develco.tz.pulse_configuration, develco.tz.interface_mode, develco.tz.current_summation],
614
622
  endpoint: (device) => {
615
623
  return {'default': 2};
@@ -640,7 +648,7 @@ module.exports = [
640
648
  model: 'SMRZB-332',
641
649
  vendor: 'Develco',
642
650
  description: 'Smart relay DIN',
643
- fromZigbee: [fz.on_off, fz.metering],
651
+ fromZigbee: [fz.on_off, develco.fz.metering],
644
652
  toZigbee: [tz.on_off],
645
653
  exposes: [e.power(), e.energy(), e.switch()],
646
654
  endpoint: (device) => {
@@ -658,7 +666,7 @@ module.exports = [
658
666
  model: 'FLSZB-110',
659
667
  vendor: 'Develco',
660
668
  description: 'Flood alarm device ',
661
- fromZigbee: [fz.ias_water_leak_alarm_1, fz.temperature, fz.battery],
669
+ fromZigbee: [fz.ias_water_leak_alarm_1, develco.fz.temperature, fz.battery],
662
670
  toZigbee: [],
663
671
  exposes: [e.battery_low(), e.tamper(), e.water_leak(), e.temperature(), e.battery_voltage()],
664
672
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -673,7 +681,7 @@ module.exports = [
673
681
  model: 'AQSZB-110',
674
682
  vendor: 'Develco',
675
683
  description: 'Air quality sensor',
676
- fromZigbee: [develco.fz.voc, develco.fz.voc_battery, fz.temperature, fz.humidity],
684
+ fromZigbee: [develco.fz.voc, develco.fz.voc_battery, develco.fz.temperature, fz.humidity],
677
685
  toZigbee: [],
678
686
  ota: ota.zigbeeOTA,
679
687
  exposes: [
@@ -703,7 +711,7 @@ module.exports = [
703
711
  model: 'SIRZB-110',
704
712
  vendor: 'Develco',
705
713
  description: 'Customizable siren',
706
- fromZigbee: [fz.temperature, fz.battery, fz.ias_enroll, fz.ias_wd, fz.ias_siren],
714
+ fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_enroll, fz.ias_wd, fz.ias_siren],
707
715
  toZigbee: [tz.warning, tz.warning_simple, tz.ias_max_duration, tz.squawk],
708
716
  meta: {battery: {voltageToPercentage: '3V_2500'}},
709
717
  configure: async (device, coordinatorEndpoint, logger) => {
package/devices/ge.js CHANGED
@@ -67,6 +67,7 @@ module.exports = [
67
67
  configure: async (device, coordinatorEndpoint, logger) => {
68
68
  const endpoint = device.getEndpoint(1);
69
69
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
70
+ await reporting.onOff(endpoint);
70
71
  await reporting.instantaneousDemand(endpoint);
71
72
  await reporting.currentSummDelivered(endpoint);
72
73
  endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 10000, multiplier: 1});
package/devices/innr.js CHANGED
@@ -572,6 +572,7 @@ module.exports = [
572
572
  vendor: 'Innr',
573
573
  description: 'Smart plug',
574
574
  extend: extend.switch(),
575
+ ota: ota.zigbeeOTA,
575
576
  configure: async (device, coordinatorEndpoint, logger) => {
576
577
  const endpoint = device.getEndpoint(1);
577
578
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
package/devices/namron.js CHANGED
@@ -280,9 +280,11 @@ module.exports = [
280
280
  vendor: 'Namron',
281
281
  description: 'Remote control',
282
282
  fromZigbee: [fz.command_on, fz.command_off, fz.command_step, fz.command_step_color_temperature, fz.command_recall,
283
- fz.command_move_to_color_temp, fz.battery],
284
- exposes: [e.battery(), e.action(['on', 'off', 'brightness_step_up', 'brightness_step_down', 'color_temperature_step_up',
285
- 'color_temperature_step_down', 'recall_*', 'color_temperature_move'])],
283
+ fz.command_move_to_color_temp, fz.battery, fz.command_move_to_hue],
284
+ exposes: [e.battery(), e.action([
285
+ 'on', 'off', 'brightness_step_up', 'brightness_step_down', 'color_temperature_step_up',
286
+ 'color_temperature_step_down', 'recall_*', 'color_temperature_move',
287
+ 'move_to_hue_l1', 'move_to_hue_l2', 'move_to_hue_l3', 'move_to_hue_l4'])],
286
288
  toZigbee: [],
287
289
  meta: {multiEndpoint: true},
288
290
  endpoint: (device) => {
@@ -211,7 +211,7 @@ module.exports = [
211
211
  extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
212
212
  },
213
213
  {
214
- zigbeeModel: ['LWA018'],
214
+ zigbeeModel: ['LWA018', 'LWA028'],
215
215
  model: '9290024693',
216
216
  vendor: 'Philips',
217
217
  description: 'Hue white A60 bulb B22 1055lm with Bluetooth',
@@ -561,7 +561,7 @@ module.exports = [
561
561
  extend: hueExtend.light_onoff_brightness(),
562
562
  },
563
563
  {
564
- zigbeeModel: ['LCT026', '7602031P7', '7602031U7', '7602031PU'],
564
+ zigbeeModel: ['LCT026', '7602031P7', '7602031U7', '7602031PU', '7602031J6'],
565
565
  model: '7602031P7',
566
566
  vendor: 'Philips',
567
567
  description: 'Hue Go with Bluetooth',
@@ -30,7 +30,7 @@ module.exports = [
30
30
  {vendor: 'TuYa', description: 'Głowica termostatyczna', model: 'GTZ02'},
31
31
  {vendor: 'Revolt', description: 'Thermostatic Radiator Valve Controller', model: 'NX-4911'},
32
32
  {vendor: 'Unitec', description: 'Thermostatic Radiator Valve Controller', model: '30946'},
33
- {vendor: 'Tesla', description: 'Thermostatic Radiator Valve Controller', model: 'TSL-TRV-GS361A'},
33
+ {vendor: 'Tesla Smart', description: 'Thermostatic Radiator Valve Controller', model: 'TSL-TRV-GS361A'},
34
34
  {vendor: 'Nedis', description: 'Thermostatic Radiator Valve Controller', model: 'ZBHTR10WT'},
35
35
  {vendor: 'TCP Smart', description: 'Smart Thermostatic Radiator Valve', model: 'TBUWTRV'},
36
36
  {vendor: 'Brennenstuhl', description: 'Radiator Thermostat', model: 'HT CZ 01'}],
@@ -41,11 +41,11 @@ const fzLocal = {
41
41
  },
42
42
  };
43
43
 
44
- function syncTime(endpoint) {
44
+ async function syncTime(endpoint) {
45
45
  try {
46
46
  const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000 + ((new Date()).getTimezoneOffset() * -1) * 60);
47
47
  const values = {time: time};
48
- endpoint.write('genTime', values);
48
+ await endpoint.write('genTime', values);
49
49
  } catch (error) {/* Do nothing*/}
50
50
  }
51
51
 
@@ -462,7 +462,13 @@ module.exports = [
462
462
  await reporting.thermostatTemperature(endpoint);
463
463
  await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
464
464
  await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
465
- await reporting.thermostatKeypadLockMode(endpoint);
465
+ try {
466
+ await reporting.thermostatKeypadLockMode(endpoint);
467
+ } catch (error) {
468
+ // Fails for some
469
+ // https://github.com/Koenkk/zigbee2mqtt/issues/15025
470
+ logger.debug(`Failed to setup keypadLockout reporting`);
471
+ }
466
472
 
467
473
  await endpoint.configureReporting('hvacThermostat', [{
468
474
  attribute: 'occupancy',
package/devices/tuya.js CHANGED
@@ -22,7 +22,7 @@ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak',
22
22
  '_TZ3000_zloso4jk', '_TZ3000_r6buo8ba', '_TZ3000_iksasdbv', '_TZ3000_idrffznf', '_TZ3000_okaz9tjs', '_TZ3210_q7oryllx',
23
23
  '_TZ3000_ss98ec5d', '_TZ3000_gznh2xla', '_TZ3000_hdopuwv6', '_TZ3000_gvn91tmx', '_TZ3000_dksbtrzs', '_TZ3000_b28wrpvx',
24
24
  '_TZ3000_aim0ztek', '_TZ3000_mlswgkc3', '_TZ3000_7dndcnnb', '_TZ3000_waho4jtj', '_TZ3000_nmsciidq', '_TZ3000_jtgxgmks',
25
- '_TZ3000_rdfh8cfs', '_TZ3000_yujkchbz', '_TZ3000_fgwhjm9j', '_TZ3000_qeuvnohg'];
25
+ '_TZ3000_rdfh8cfs', '_TZ3000_yujkchbz', '_TZ3000_fgwhjm9j', '_TZ3000_qeuvnohg', '_TZ3000_rul9yxcc'];
26
26
 
27
27
  const tzLocal = {
28
28
  SA12IZL_silence_siren: {
@@ -813,13 +813,14 @@ module.exports = [
813
813
  {modelID: 'TS0001', manufacturerName: '_TZ3000_5ng23zjs'},
814
814
  {modelID: 'TS0001', manufacturerName: '_TZ3000_rmjr4ufz'},
815
815
  {modelID: 'TS0001', manufacturerName: '_TZ3000_v7gnj3ad'},
816
+ {modelID: 'TS0001', manufacturerName: '_TZ3000_3a9beq8a'},
816
817
  {modelID: 'TS0001', manufacturerName: '_TZ3000_ark8nv4y'},
817
818
  {modelID: 'TS0001', manufacturerName: '_TZ3000_mx3vgyea'},
818
819
  {modelID: 'TS0001', manufacturerName: '_TZ3000_qsp2pwtf'},
819
820
  {modelID: 'TS0001', manufacturerName: '_TZ3000_46t1rvdu'}],
820
821
  model: 'WHD02',
821
822
  vendor: 'TuYa',
822
- whiteLabel: [{vendor: 'TuYa', model: 'iHSW02'}],
823
+ whiteLabel: [{vendor: 'TuYa', model: 'iHSW02'}, {vendor: 'Aubess', model: 'TMZ02'}],
823
824
  description: 'Wall switch module',
824
825
  toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.tuya_switch_type]),
825
826
  fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.tuya_switch_type]),
@@ -881,54 +882,7 @@ module.exports = [
881
882
  whiteLabel: [{vendor: 'KTNNKG', model: 'ZB1248-10A'}],
882
883
  },
883
884
  {
884
- fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3000_qqjaziws'},
885
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_jtmhndw2'},
886
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_ezlg0pht'},
887
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_3lbtuxgp'},
888
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_5snkkrxw'},
889
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_12sxjap4'},
890
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_x2fqbdun'},
891
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_589kq4ul'},
892
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_1mtktxdk'},
893
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_remypqqm'},
894
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_kohbva1f'},
895
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_luit1t00'},
896
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_r5afgmkl'},
897
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_wslkvrau'},
898
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_0rn9qhnu'},
899
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_ejctepku'},
900
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_bicjqpg4'},
901
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_jmiuubkz'},
902
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_cmaky9gq'},
903
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_tza2vjxx'},
904
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_it1u8ahz'},
905
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_k1pe6ibm'},
906
- {modelID: 'TS0505B', manufacturerName: '_TZB210_1ecortg6'},
907
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_e020aaaj'},
908
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_bfwvfyx1'},
909
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_leyz4rju'},
910
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_jd3z4yig'},
911
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_dgdjiw1c'},
912
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_mzdax7ha'},
913
- {modelID: 'TS0505B', manufacturerName: '_TZB210_tmi0rihb'},
914
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_a4s41wm4'},
915
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_awrucboq'},
916
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_ijczzg9h'},
917
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_qxenlrin'},
918
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_vaiyrvd1'},
919
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_iwbaamgh'},
920
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_klv2wul0'},
921
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_s6zec0of'},
922
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_y5fjkn7x'},
923
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_cuqkfz2q'},
924
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'},
925
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_xr5m6kfg'},
926
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_xr5m6kfg'},
927
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_bf175wi4'},
928
- {modelID: 'TS0505B', manufacturerName: '_TZB210_3zfp8mki'},
929
- {modelID: 'TS0505B', manufacturerName: '_TZ3000_y1vbo44x'},
930
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_mny0zvkm'},
931
- {modelID: 'TS0505B', manufacturerName: '_TZ3210_pfupy2pg'}],
885
+ zigbeeModel: ['TS0505B'],
932
886
  model: 'TS0505B',
933
887
  vendor: 'TuYa',
934
888
  description: 'Zigbee RGB+CCT light',
@@ -943,31 +897,17 @@ module.exports = [
943
897
  meta: {applyRedFix: true, enhancedHue: false},
944
898
  },
945
899
  {
946
- fingerprint: [{modelID: 'TS0503B', manufacturerName: '_TZ3000_i8l0nqdu'},
947
- {modelID: 'TS0503B', manufacturerName: '_TZ3210_a5fxguxr'},
948
- {modelID: 'TS0503B', manufacturerName: '_TZ3210_778drfdt'},
949
- {modelID: 'TS0503B', manufacturerName: '_TZ3000_g5xawfcq'},
950
- {modelID: 'TS0503B', manufacturerName: '_TZ3210_trm3l2aw'},
951
- {modelID: 'TS0503B', manufacturerName: '_TZ3210_95txyzbx'},
952
- {modelID: 'TS0503B', manufacturerName: '_TZ3210_odlghna1'},
953
- {modelID: 'TS0503B', manufacturerName: '_TZB210_nfzrlz29'},
954
- {modelID: 'TS0503B', manufacturerName: '_TZ3220_wp1k8xws'},
955
- {modelID: 'TS0503B', manufacturerName: '_TZ3210_wp1k8xws'}],
900
+ zigbeeModel: ['TS0503B'],
956
901
  model: 'TS0503B',
957
902
  vendor: 'TuYa',
958
903
  description: 'Zigbee RGB light',
904
+ whiteLabel: [{vendor: 'BTF-Lighting', model: 'C03Z'}],
959
905
  extend: extend.light_onoff_brightness_color(),
960
906
  // Requires red fix: https://github.com/Koenkk/zigbee2mqtt/issues/5962#issue-796462106
961
907
  meta: {applyRedFix: true, enhancedHue: false},
962
908
  },
963
909
  {
964
- fingerprint: [{modelID: 'TS0504B', manufacturerName: '_TZ3000_ukuvyhaa'},
965
- {modelID: 'TS0504B', manufacturerName: '_TZ3210_bfvybixd'},
966
- {modelID: 'TS0504B', manufacturerName: '_TZ3210_i2i0bsnv'},
967
- {modelID: 'TS0504B', manufacturerName: '_TZ3210_elzv6aia'},
968
- {modelID: 'TS0504B', manufacturerName: '_TZ3210_1elppmba'},
969
- {modelID: 'TS0504B', manufacturerName: '_TZB210_5jn6an2y'},
970
- {modelID: 'TS0504B', manufacturerName: '_TZ3210_onejz0gt'}],
910
+ zigbeeModel: ['TS0504B'],
971
911
  model: 'TS0504B',
972
912
  vendor: 'TuYa',
973
913
  description: 'Zigbee RGBW light',
@@ -976,25 +916,14 @@ module.exports = [
976
916
  meta: {applyRedFix: true},
977
917
  },
978
918
  {
979
- fingerprint: [{modelID: 'TS0501A', manufacturerName: '_TZ3000_yeg1e5eh'}],
919
+ zigbeeModel: ['TS0501A'],
980
920
  model: 'TS0501A',
981
921
  description: 'Zigbee light',
982
922
  vendor: 'TuYa',
983
923
  extend: extend.light_onoff_brightness(),
984
924
  },
985
925
  {
986
- fingerprint: [{modelID: 'TS0501B', manufacturerName: '_TZ3000_4whigl8i'},
987
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_4whigl8i'},
988
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_9q49basr'},
989
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_i680rtja'},
990
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_grnwgegn'},
991
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_nehayyhx'},
992
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_wuheofsg'},
993
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_e5t9bfdv'},
994
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_19qb27da'},
995
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_aurnbfv4'},
996
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_4zinq6io'},
997
- {modelID: 'TS0501B', manufacturerName: '_TZ3210_93gnbdgz'}],
926
+ zigbeeModel: ['TS0501B'],
998
927
  model: 'TS0501B',
999
928
  description: 'Zigbee light',
1000
929
  vendor: 'TuYa',
@@ -1145,11 +1074,11 @@ module.exports = [
1145
1074
  exposes: [e.water_leak(), e.battery_low(), e.battery()],
1146
1075
  },
1147
1076
  {
1148
- fingerprint: [{modelID: 'TS0101', manufacturerName: '_TYZB01_ijihzffk'}],
1077
+ fingerprint: tuya.fingerprint('TS0101', ['_TYZB01_ijihzffk', '_TZ3210_tfxwxklq']),
1149
1078
  model: 'TS0101',
1150
1079
  vendor: 'TuYa',
1151
1080
  description: 'Zigbee Socket',
1152
- whiteLabel: [{vendor: 'Larkkey', model: 'PS080'}],
1081
+ whiteLabel: [{vendor: 'Larkkey', model: 'PS080'}, {vendor: 'Mercator', model: 'SPBS01G'}],
1153
1082
  extend: extend.switch(),
1154
1083
  meta: {disableDefaultResponse: true},
1155
1084
  },
@@ -1524,31 +1453,7 @@ module.exports = [
1524
1453
  extend: extend.light_onoff_brightness_colortemp(),
1525
1454
  },
1526
1455
  {
1527
- fingerprint: [
1528
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_s1x7gcq0'},
1529
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_hi1ym4bl'},
1530
- {modelID: 'TS0502B', manufacturerName: '_TZ3000_muqovqv0'},
1531
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_qjdimezy'},
1532
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_psgq7ysz'},
1533
- {modelID: 'TS0502B', manufacturerName: '_TZ3000_zw7wr5uo'},
1534
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_ok08rifa'},
1535
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_pz9zmxjj'},
1536
- {modelID: 'TS0502B', manufacturerName: '_TZ3000_fzwhym79'},
1537
- {modelID: 'TS0502B', manufacturerName: '_TZ3000_ogceypug'},
1538
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_rm0hthdo'},
1539
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_zwqnazkb'},
1540
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_ijsj2evj'},
1541
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_pgq2qvyv'},
1542
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_nvaik6gk'},
1543
- {modelID: 'TS0502B', manufacturerName: '_TZB210_rkgngb5o'},
1544
- {modelID: 'TS0502B', manufacturerName: '_TZ3000_armwcncd'},
1545
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_2p6wbry3'},
1546
- {modelID: 'TS0502B', manufacturerName: '_TZB210_nfzrlz29'},
1547
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_qamcypen'},
1548
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_zdrhqmo0'},
1549
- {modelID: 'TS0502B', manufacturerName: '_TZ3210_2cjfbpy0'},
1550
- {modelID: 'TS0502B', manufacturerName: '_TZ3000_bujv0r9b'},
1551
- ],
1456
+ zigbeeModel: ['TS0502B'],
1552
1457
  model: 'TS0502B',
1553
1458
  vendor: 'TuYa',
1554
1459
  description: 'Light controller',
@@ -1559,7 +1464,7 @@ module.exports = [
1559
1464
  extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
1560
1465
  },
1561
1466
  {
1562
- fingerprint: [{modelID: 'TS0504A', manufacturerName: '_TZ3000_nzbm4ad4'}],
1467
+ zigbeeModel: ['TS0504A'],
1563
1468
  model: 'TS0504A',
1564
1469
  vendor: 'TuYa',
1565
1470
  description: 'RGBW LED controller',
@@ -1807,14 +1712,13 @@ module.exports = [
1807
1712
  configure: async (device, coordinatorEndpoint, logger) => {
1808
1713
  const endpoint = device.getEndpoint(1);
1809
1714
  await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
1810
- await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
1715
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
1811
1716
  await reporting.rmsVoltage(endpoint, {change: 5});
1812
- await reporting.activePower(endpoint, {change: 10});
1717
+ await reporting.rmsCurrent(endpoint, {change: 50});
1718
+ await reporting.currentSummDelivered(endpoint);
1813
1719
  endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
1814
1720
  device.save();
1815
1721
  },
1816
- options: [exposes.options.measurement_poll_interval().withDescription('Only the energy value is polled for this device.')],
1817
- onEvent: (type, data, device, options) => tuya.onEventMeasurementPoll(type, data, device, options, false, true),
1818
1722
  whiteLabel: [{vendor: 'Aubess', model: 'WDH02'}],
1819
1723
  exposes: [e.switch(), e.power(), e.voltage().withAccess(ea.STATE), e.energy(), e.power_on_behavior(), e.switch_type_2()],
1820
1724
  },
@@ -2394,7 +2298,8 @@ module.exports = [
2394
2298
  vendor: 'TuYa',
2395
2299
  whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}, {vendor: 'NEO', model: 'NAS-WR01B'},
2396
2300
  {vendor: 'BlitzWolf', model: 'BW-SHP15'}, {vendor: 'Nous', model: 'A1Z'}, {vendor: 'BlitzWolf', model: 'BW-SHP13'},
2397
- {vendor: 'MatSee Plus', model: 'PJ-ZSW01'}, {vendor: 'MODEMIX', model: 'MOD037'}, {vendor: 'MODEMIX', model: 'MOD048'}],
2301
+ {vendor: 'MatSee Plus', model: 'PJ-ZSW01'}, {vendor: 'MODEMIX', model: 'MOD037'}, {vendor: 'MODEMIX', model: 'MOD048'},
2302
+ {vendor: 'Coswall', model: 'CS-AJ-DE2U-ZG-11'}],
2398
2303
  ota: ota.zigbeeOTA,
2399
2304
  fromZigbee: [fz.on_off, fzLocal.electrical_measurement_skip_duplicate, fzLocal.metering_skip_duplicate, fz.ignore_basic_report,
2400
2305
  fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
package/devices/ubisys.js CHANGED
@@ -825,7 +825,7 @@ module.exports = [
825
825
  await reporting.thermostatOccupiedHeatingSetpoint(endpoint,
826
826
  {min: 0, max: constants.repInterval.HOUR, change: 50});
827
827
  await reporting.thermostatPIHeatingDemand(endpoint);
828
- await reporting.thermostatOcupancy(endpoint);
828
+ await reporting.thermostatOccupancy(endpoint);
829
829
  await reporting.batteryPercentageRemaining(endpoint,
830
830
  {min: constants.repInterval.HOUR, max: 43200, change: 1});
831
831
 
package/devices/xiaomi.js CHANGED
@@ -9,6 +9,7 @@ const e = exposes.presets;
9
9
  const ea = exposes.access;
10
10
  const globalStore = require('../lib/store');
11
11
  const xiaomi = require('../lib/xiaomi');
12
+ const utils = require('../lib/utils');
12
13
 
13
14
  const xiaomiExtend = {
14
15
  light_onoff_brightness_colortemp: (options={disableColorTempStartup: true}) => ({
@@ -40,6 +41,21 @@ const preventReset = async (type, data, device) => {
40
41
  await device.getEndpoint(1).write('genBasic', payload, options);
41
42
  };
42
43
 
44
+ const daysLookup = {
45
+ 0x7f: 'everyday',
46
+ 0x1f: 'workdays',
47
+ 0x60: 'weekend',
48
+ 0x01: 'mon',
49
+ 0x02: 'tue',
50
+ 0x04: 'wed',
51
+ 0x08: 'thu',
52
+ 0x10: 'fri',
53
+ 0x20: 'sat',
54
+ 0x40: 'sun',
55
+ 0x55: 'mon-wed-fri-sun',
56
+ 0x2a: 'tue-thu-sat',
57
+ };
58
+
43
59
 
44
60
  const fzLocal = {
45
61
  aqara_trv: {
@@ -98,6 +114,87 @@ const fzLocal = {
98
114
  return result;
99
115
  },
100
116
  },
117
+ aqara_feeder: {
118
+ cluster: 'aqaraOpple',
119
+ type: ['attributeReport', 'readResponse'],
120
+ convert: (model, msg, publish, options, meta) => {
121
+ const result = {};
122
+ Object.entries(msg.data).forEach(([key, value]) => {
123
+ switch (parseInt(key)) {
124
+ case 0xfff1: {
125
+ const attr = value.slice(3, 7);
126
+ const len = value.slice(7, 8).readUInt8();
127
+ const val = value.slice(8, 8 + len);
128
+ switch (attr.readInt32BE()) {
129
+ case 0x04150055: // feeding
130
+ result['feed'] = '';
131
+ break;
132
+ case 0x041502bc: { // feeding report
133
+ const report = val.toString();
134
+ result['feeding_source'] = {1: 'manual', 2: 'remote'}[parseInt(report.slice(0, 2))];
135
+ result['feeding_size'] = parseInt(report.slice(3, 4));
136
+ break;
137
+ }
138
+ case 0x0d680055: // portions per day
139
+ result['portions_per_day'] = val.readUInt16BE();
140
+ break;
141
+ case 0x0d690055: // weight per day
142
+ result['weight_per_day'] = val.readUInt32BE();
143
+ break;
144
+ case 0x0d0b0055: // error ?
145
+ result['error'] = {1: true, 0: false}[val.readUInt8()];
146
+ break;
147
+ case 0x080008c8: { // schedule string
148
+ const schlist = val.toString().split(',');
149
+ const schedule = [];
150
+ schlist.forEach((str) => { // 7f13000100
151
+ const feedtime = Buffer.from(str, 'hex');
152
+ schedule.push({
153
+ 'days': daysLookup[feedtime[0]],
154
+ 'hour': feedtime[1],
155
+ 'minute': feedtime[2],
156
+ 'size': feedtime[3],
157
+ });
158
+ });
159
+ result['schedule'] = schedule;
160
+ break;
161
+ }
162
+ case 0x04170055: // indicator
163
+ result['led_indicator'] = {1: 'ON', 0: 'OFF'}[val.readUInt8()];
164
+ break;
165
+ case 0x04160055: // child lock
166
+ result['child_lock'] = {1: 'LOCK', 0: 'UNLOCK'}[val.readUInt8()];
167
+ break;
168
+ case 0x04180055: // mode
169
+ result['mode'] = {1: 'schedule', 0: 'manual'}[val.readUInt8()];
170
+ break;
171
+ case 0x0e5c0055: // serving size
172
+ result['serving_size'] = val.readUInt8();
173
+ break;
174
+ case 0x0e5f0055: // portion weight
175
+ result['portion_weight'] = val.readUInt8();
176
+ break;
177
+ case 0x080007d1: // ? 64
178
+ case 0x0d090055: // ? 00
179
+ meta.logger.warn(`zigbee-herdsman-converters:aqara_feeder: Unhandled attribute ${attr} = ${val}`);
180
+ break;
181
+ default:
182
+ meta.logger.warn(`zigbee-herdsman-converters:aqara_feeder: Unknown attribute ${attr} = ${val}`);
183
+ }
184
+ break;
185
+ }
186
+ case 0x00ff: // 80:13:58:91:24:33:20:24:58:53:44:07:05:97:75:17
187
+ case 0x0007: // 00:00:00:00:1d:b5:a6:ed
188
+ case 0x00f7: // 05:21:14:00:0d:23:21:25:00:00:09:21:00:01
189
+ meta.logger.debug(`zigbee-herdsman-converters:aqara_feeder: Unhandled key ${key} = ${value}`);
190
+ break;
191
+ default:
192
+ meta.logger.warn(`zigbee-herdsman-converters:aqara_feeder: Unknown key ${key} = ${value}`);
193
+ }
194
+ });
195
+ return result;
196
+ },
197
+ },
101
198
  };
102
199
 
103
200
  const tzLocal = {
@@ -235,6 +332,73 @@ const tzLocal = {
235
332
  await entity.read('aqaraOpple', [0x0114], {manufacturerCode: 0x115F, disableDefaultResponse: true});
236
333
  },
237
334
  },
335
+ aqara_feeder: {
336
+ key: ['feed', 'schedule', 'led_indicator', 'child_lock', 'mode', 'serving_size', 'portion_weight'],
337
+ convertSet: async (entity, key, value, meta) => {
338
+ const sendAttr = async (attrCode, value, length) => {
339
+ entity.sendSeq = ((entity.sendSeq || 0)+1) % 256;
340
+ const val = Buffer.from([0x00, 0x02, entity.sendSeq, 0, 0, 0, 0, 0]);
341
+ entity.sendSeq += 1;
342
+ val.writeInt32BE(attrCode, 3);
343
+ val.writeUInt8(length, 7);
344
+ let v = Buffer.alloc(length);
345
+ switch (length) {
346
+ case 1:
347
+ v.writeUInt8(value);
348
+ break;
349
+ case 2:
350
+ v.writeUInt16BE(value);
351
+ break;
352
+ case 4:
353
+ v.writeUInt32BE(value);
354
+ break;
355
+ default:
356
+ v = value;
357
+ }
358
+ await entity.write('aqaraOpple', {0xfff1: {value: Buffer.concat([val, v]), type: 0x41}},
359
+ {manufacturerCode: 0x115f});
360
+ };
361
+ switch (key) {
362
+ case 'feed':
363
+ sendAttr(0x04150055, 1, 1);
364
+ break;
365
+ case 'schedule': {
366
+ const schedule = [];
367
+ value.forEach((item) => {
368
+ const schedItem = Buffer.from([
369
+ utils.getKey(daysLookup, item.days, 0x7f),
370
+ item.hour,
371
+ item.minute,
372
+ item.size,
373
+ 0,
374
+ ]);
375
+ schedule.push(schedItem.toString('hex'));
376
+ });
377
+ const val = Buffer.concat([Buffer.from(schedule.join(',')), Buffer.from([0])]);
378
+ sendAttr(0x080008c8, val, val.length);
379
+ break;
380
+ }
381
+ case 'led_indicator':
382
+ sendAttr(0x04170055, {'OFF': 0, 'ON': 1}[value], 1);
383
+ break;
384
+ case 'child_lock':
385
+ sendAttr(0x04160055, {'UNLOCK': 0, 'LOCK': 1}[value], 1);
386
+ break;
387
+ case 'mode':
388
+ sendAttr(0x04180055, {'manual': 0, 'schedule': 1}[value], 1);
389
+ break;
390
+ case 'serving_size':
391
+ sendAttr(0x0e5c0055, value, 4);
392
+ break;
393
+ case 'portion_weight':
394
+ sendAttr(0x0e5f0055, value, 4);
395
+ break;
396
+ default: // Unknown key
397
+ meta.logger.warn(`zigbee-herdsman-converters:aqara_feeder: Unhandled key ${key}`);
398
+ }
399
+ return {state: {[key]: value}};
400
+ },
401
+ },
238
402
  };
239
403
 
240
404
  module.exports = [
@@ -2409,6 +2573,38 @@ module.exports = [
2409
2573
  await endpoint.read('aqaraOpple', [0x040a], {manufacturerCode: 0x115f});
2410
2574
  },
2411
2575
  },
2576
+ {
2577
+ zigbeeModel: ['aqara.feeder.acn001'],
2578
+ model: 'ZNCWWSQ01LM',
2579
+ vendor: 'Xiaomi',
2580
+ description: 'Aqara pet feeder C1',
2581
+ fromZigbee: [fzLocal.aqara_feeder],
2582
+ toZigbee: [tzLocal.aqara_feeder],
2583
+ exposes: [
2584
+ exposes.enum('feed', ea.STATE_SET, ['START']).withDescription('Start feeding'),
2585
+ exposes.enum('feeding_source', ea.STATE, ['manual', 'remote']).withDescription('Feeding source'),
2586
+ exposes.numeric('feeding_size', ea.STATE).withDescription('Feeding size').withUnit('portion'),
2587
+ exposes.numeric('portions_per_day', ea.STATE).withDescription('Portions per day'),
2588
+ exposes.numeric('weight_per_day', ea.STATE).withDescription('Weight per day').withUnit('g'),
2589
+ exposes.binary('error', ea.STATE, true, false)
2590
+ .withDescription('Indicates wether there is an error with the feeder'),
2591
+ exposes.list('schedule', ea.STATE_SET, exposes.composite('dayTime', exposes.access.STATE_SET)
2592
+ .withFeature(exposes.enum('days', exposes.access.STATE_SET, [
2593
+ 'everyday', 'workdays', 'weekend', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun',
2594
+ 'mon-wed-fri-sun', 'tue-thu-sat']))
2595
+ .withFeature(exposes.numeric('hour', exposes.access.STATE_SET))
2596
+ .withFeature(exposes.numeric('minute', exposes.access.STATE_SET))
2597
+ .withFeature(exposes.numeric('size', exposes.access.STATE_SET)),
2598
+ ).withDescription('Feeding schedule'),
2599
+ exposes.switch().withState('led_indicator', true, 'Led indicator', ea.STATE_SET, 'ON', 'OFF'),
2600
+ e.child_lock(),
2601
+ exposes.enum('mode', ea.STATE_SET, ['schedule', 'manual']).withDescription('Feeding mode'),
2602
+ exposes.numeric('serving_size', ea.STATE_SET).withValueMin(1).withValueMax(10).withDescription('One serving size')
2603
+ .withUnit('portion'),
2604
+ exposes.numeric('portion_weight', ea.STATE_SET).withValueMin(1).withValueMax(20).withDescription('Portion weight')
2605
+ .withUnit('g'),
2606
+ ],
2607
+ },
2412
2608
  {
2413
2609
  zigbeeModel: ['lumi.remote.acn007'],
2414
2610
  model: 'WXKG20LM',
package/lib/exposes.js CHANGED
@@ -115,13 +115,14 @@ class Binary extends Base {
115
115
  }
116
116
 
117
117
  class List extends Base {
118
- constructor(name, access) {
118
+ constructor(name, access, itemType) {
119
119
  super();
120
120
  this.type = 'list';
121
121
  this.name = name;
122
122
  this.property = name;
123
123
  this.access = access;
124
- this.item_type = 'number';
124
+ this.item_type = itemType;
125
+ delete this.item_type.property;
125
126
  }
126
127
  }
127
128
 
@@ -487,6 +488,7 @@ module.exports = {
487
488
  numeric: (name, access) => new Numeric(name, access),
488
489
  switch: () => new Switch(),
489
490
  text: (name, access) => new Text(name, access),
491
+ list: (name, access, itemType) => new List(name, access, itemType),
490
492
  options: {
491
493
  calibration: (name, type='absolute') => new Numeric(`${name}_calibration`, access.SET).withDescription(`Calibrates the ${name} value (${type} offset), takes into effect on next report of device.`),
492
494
  precision: (name) => new Numeric(`${name}_precision`, access.SET).withValueMin(0).withValueMax(3).withDescription(`Number of digits after decimal point for ${name}, takes into effect on next report of device.`),
@@ -501,8 +503,8 @@ module.exports = {
501
503
  .withDescription(`Simulate a brightness value. If this device provides a brightness_move_up or brightness_move_down action it is possible to specify the update interval and delta. The action_brightness_delta indicates the delta for each interval. ${extraNote}`)
502
504
  .withFeature(new Numeric('delta', access.SET).withValueMin(0).withDescription('Delta per interval, 20 by default'))
503
505
  .withFeature(new Numeric('interval', access.SET).withValueMin(0).withUnit('ms').withDescription('Interval duration')),
504
- no_occupancy_since_true: () => new List(`no_occupancy_since`, access.SET).withDescription('Sends a message the last time occupancy (occupancy: true) was detected. When setting this for example to [10, 60] a `{"no_occupancy_since": 10}` will be send after 10 seconds and a `{"no_occupancy_since": 60}` after 60 seconds.'),
505
- no_occupancy_since_false: () => new List(`no_occupancy_since`, access.SET).withDescription('Sends a message after the last time no occupancy (occupancy: false) was detected. When setting this for example to [10, 60] a `{"no_occupancy_since": 10}` will be send after 10 seconds and a `{"no_occupancy_since": 60}` after 60 seconds.'),
506
+ no_occupancy_since_true: () => new List(`no_occupancy_since`, access.SET, new Numeric('time', access.STATE_SET)).withDescription('Sends a message the last time occupancy (occupancy: true) was detected. When setting this for example to [10, 60] a `{"no_occupancy_since": 10}` will be send after 10 seconds and a `{"no_occupancy_since": 60}` after 60 seconds.'),
507
+ no_occupancy_since_false: () => new List(`no_occupancy_since`, access.SET, new Numeric('time', access.STATE_SET)).withDescription('Sends a message after the last time no occupancy (occupancy: false) was detected. When setting this for example to [10, 60] a `{"no_occupancy_since": 10}` will be send after 10 seconds and a `{"no_occupancy_since": 60}` after 60 seconds.'),
506
508
  presence_timeout: () => new Numeric(`presence_timeout`).withValueMin(0).withDescription('Time in seconds after which presence is cleared after detecting it (default 100 seconds).'),
507
509
  no_position_support: () => new Binary('no_position_support', access.SET, true, false).withDescription('Set to true when your device only reports position 0, 100 and 50 (in this case your device has an older firmware) (default false).'),
508
510
  transition: () => new Numeric(`transition`, access.SET).withValueMin(0).withDescription('Controls the transition time (in seconds) of on/off, brightness, color temperature (if applicable) and color (if applicable) changes. Defaults to `0` (no transition).'),
package/lib/reporting.js CHANGED
@@ -178,7 +178,7 @@ module.exports = {
178
178
  const p = payload('runningMode', 10, repInterval.HOUR, null, overrides);
179
179
  await endpoint.configureReporting('hvacThermostat', p);
180
180
  },
181
- thermostatOcupancy: async (endpoint, overrides) => {
181
+ thermostatOccupancy: async (endpoint, overrides) => {
182
182
  const p = payload('occupancy', 0, repInterval.HOUR, 0, overrides);
183
183
  await endpoint.configureReporting('hvacThermostat', p);
184
184
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.669",
3
+ "version": "14.0.671",
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": "^2.2.0",
41
- "zigbee-herdsman": "^0.14.71"
41
+ "zigbee-herdsman": "^0.14.73"
42
42
  },
43
43
  "devDependencies": {
44
44
  "eslint": "*",