zigbee-herdsman-converters 14.0.308 → 14.0.313

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.
@@ -3539,6 +3539,157 @@ const converters = {
3539
3539
  }
3540
3540
  },
3541
3541
  },
3542
+ tvtwo_thermostat: {
3543
+ cluster: 'manuSpecificTuya',
3544
+ type: ['commandGetData', 'commandSetDataResponse'],
3545
+ convert: (model, msg, publish, options, meta) => {
3546
+ const dp = msg.data.dp;
3547
+ const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
3548
+ const presetLookup = {0: 'auto', 1: 'manual', 2: 'holiday'};
3549
+ switch (dp) {
3550
+ case tuya.dataPoints.tvMode:
3551
+ return {preset: presetLookup[value]};
3552
+ case tuya.dataPoints.tvChildLock:
3553
+ return {child_lock: value ? 'LOCK' : 'UNLOCK'};
3554
+ case tuya.dataPoints.tvHolidayTemp:
3555
+ return {holiday_temperature: (value / 10).toFixed(1)};
3556
+ case tuya.dataPoints.tvHeatingSetpoint:
3557
+ return {current_heating_setpoint: (value / 10).toFixed(1)};
3558
+ case tuya.dataPoints.tvFrostDetection:
3559
+ return {frost_protection: value ? 'ON' : 'OFF'};
3560
+ case tuya.dataPoints.tvWindowDetection:
3561
+ return {window_detection: value ? 'ON' : 'OFF'};
3562
+ case tuya.dataPoints.tvHeatingStop:
3563
+ return {heating_stop: value ? 'ON' : 'OFF'};
3564
+ case tuya.dataPoints.tvLocalTemp:
3565
+ return {local_temperature: (value / 10).toFixed(1)};
3566
+ case tuya.dataPoints.tvBattery:
3567
+ return {battery_low: value === 0 ? true : false};
3568
+ case tuya.dataPoints.tvTempCalibration:
3569
+ return {local_temperature_calibration: value > 55 ?
3570
+ ((value - 0x100000000)/10).toFixed(1): (value/ 10).toFixed(1)};
3571
+ case tuya.dataPoints.tvBoostTime:
3572
+ // Setting minimum 0 - maximum 465 seconds
3573
+ return {boost_timeset_countdown: value};
3574
+ case tuya.dataPoints.tvComfortTemp:
3575
+ return {comfort_temperature: (value / 10).toFixed(1)};
3576
+ case tuya.dataPoints.tvEcoTemp:
3577
+ return {eco_temperature: (value / 10).toFixed(1)};
3578
+ case tuya.dataPoints.tvOpenWindowTemp:
3579
+ return {open_window_temperature: (value / 10).toFixed(1)};
3580
+ case tuya.dataPoints.tvErrorStatus:
3581
+ return {fault_alarm: value};
3582
+ case tuya.dataPoints.tvHolidayMode:
3583
+ return {holiday_mode_date: value};
3584
+
3585
+ case tuya.dataPoints.tvBoostMode:
3586
+ // Online ?
3587
+ return {online: value ? 'ON' : 'OFF'};
3588
+ case tuya.dataPoints.tvWorkingDay:
3589
+ // tvWorkingDay: 31,
3590
+ return {working_day: value};
3591
+ case tuya.dataPoints.tvWeekSchedule:
3592
+ // tvWeekSchedule: 106, Week select 0 - 5 days, 1 - 6 days, 2 - 7 days
3593
+ return {week_schedule: value};
3594
+
3595
+ case tuya.dataPoints.tvMondaySchedule:
3596
+ return {schedule_monday:
3597
+ ' ' + value[0] / 6 + 'h:' + value[1] + 'm ' + value[2] / 10 + '°C' +
3598
+ ', ' + value[3] / 6 + 'h:' + value[4] + 'm ' + value[5] / 10 + '°C' +
3599
+ ', ' + value[6] / 6 + 'h:' + value[7] + 'm ' + value[8] / 10 + '°C' +
3600
+ ', ' + value[9] / 6 + 'h:' + value[10] + 'm ' + value[11] / 10 + '°C' +
3601
+ ', ' + value[12] / 6 + 'h:' + value[13] + 'm ' + value[14] / 10 + '°C ' +
3602
+ ', ' + value[15] / 6 + 'h:' + value[16] + 'm ' + value[17] / 10 + '°C ' +
3603
+ ', ' + value[18] / 6 + 'h:' + value[19] + 'm ' + value[20] / 10 + '°C ' +
3604
+ ', ' + value[21] / 6 + 'h:' + value[22] + 'm ' + value[23] / 10 + '°C ' +
3605
+ ', ' + value[24] / 6 + 'h:' + value[25] + 'm ' + value[26] / 10 + '°C ' +
3606
+ ', ' + value[27] / 6 + 'h:' + value[28] + 'm ' + value[29] / 10 + '°C ',
3607
+ };
3608
+ case tuya.dataPoints.tvTuesdaySchedule:
3609
+ return {schedule_tuesday:
3610
+ ' ' + value[0] / 6 + 'h:' + value[1] + 'm ' + value[2] / 10 + '°C' +
3611
+ ', ' + value[3] / 6 + 'h:' + value[4] + 'm ' + value[5] / 10 + '°C' +
3612
+ ', ' + value[6] / 6 + 'h:' + value[7] + 'm ' + value[8] / 10 + '°C' +
3613
+ ', ' + value[9] / 6 + 'h:' + value[10] + 'm ' + value[11] / 10 + '°C' +
3614
+ ', ' + value[12] / 6 + 'h:' + value[13] + 'm ' + value[14] / 10 + '°C ' +
3615
+ ', ' + value[15] / 6 + 'h:' + value[16] + 'm ' + value[17] / 10 + '°C ' +
3616
+ ', ' + value[18] / 6 + 'h:' + value[19] + 'm ' + value[20] / 10 + '°C ' +
3617
+ ', ' + value[21] / 6 + 'h:' + value[22] + 'm ' + value[23] / 10 + '°C ' +
3618
+ ', ' + value[24] / 6 + 'h:' + value[25] + 'm ' + value[26] / 10 + '°C ' +
3619
+ ', ' + value[27] / 6 + 'h:' + value[28] + 'm ' + value[29] / 10 + '°C ',
3620
+ };
3621
+ case tuya.dataPoints.tvWednesdaySchedule:
3622
+ return {schedule_wednesday:
3623
+ ' ' + value[0] / 6 + 'h:' + value[1] + 'm ' + value[2] / 10 + '°C' +
3624
+ ', ' + value[3] / 6 + 'h:' + value[4] + 'm ' + value[5] / 10 + '°C' +
3625
+ ', ' + value[6] / 6 + 'h:' + value[7] + 'm ' + value[8] / 10 + '°C' +
3626
+ ', ' + value[9] / 6 + 'h:' + value[10] + 'm ' + value[11] / 10 + '°C' +
3627
+ ', ' + value[12] / 6 + 'h:' + value[13] + 'm ' + value[14] / 10 + '°C ' +
3628
+ ', ' + value[15] / 6 + 'h:' + value[16] + 'm ' + value[17] / 10 + '°C ' +
3629
+ ', ' + value[18] / 6 + 'h:' + value[19] + 'm ' + value[20] / 10 + '°C ' +
3630
+ ', ' + value[21] / 6 + 'h:' + value[22] + 'm ' + value[23] / 10 + '°C ' +
3631
+ ', ' + value[24] / 6 + 'h:' + value[25] + 'm ' + value[26] / 10 + '°C ' +
3632
+ ', ' + value[27] / 6 + 'h:' + value[28] + 'm ' + value[29] / 10 + '°C ',
3633
+ };
3634
+ case tuya.dataPoints.tvThursdaySchedule:
3635
+ return {schedule_thursday:
3636
+ ' ' + value[0] / 6 + 'h:' + value[1] + 'm ' + value[2] / 10 + '°C' +
3637
+ ', ' + value[3] / 6 + 'h:' + value[4] + 'm ' + value[5] / 10 + '°C' +
3638
+ ', ' + value[6] / 6 + 'h:' + value[7] + 'm ' + value[8] / 10 + '°C' +
3639
+ ', ' + value[9] / 6 + 'h:' + value[10] + 'm ' + value[11] / 10 + '°C' +
3640
+ ', ' + value[12] / 6 + 'h:' + value[13] + 'm ' + value[14] / 10 + '°C ' +
3641
+ ', ' + value[15] / 6 + 'h:' + value[16] + 'm ' + value[17] / 10 + '°C ' +
3642
+ ', ' + value[18] / 6 + 'h:' + value[19] + 'm ' + value[20] / 10 + '°C ' +
3643
+ ', ' + value[21] / 6 + 'h:' + value[22] + 'm ' + value[23] / 10 + '°C ' +
3644
+ ', ' + value[24] / 6 + 'h:' + value[25] + 'm ' + value[26] / 10 + '°C ' +
3645
+ ', ' + value[27] / 6 + 'h:' + value[28] + 'm ' + value[29] / 10 + '°C ',
3646
+ };
3647
+ case tuya.dataPoints.tvFridaySchedule:
3648
+ return {schedule_friday:
3649
+ ' ' + value[0] / 6 + 'h:' + value[1] + 'm ' + value[2] / 10 + '°C' +
3650
+ ', ' + value[3] / 6 + 'h:' + value[4] + 'm ' + value[5] / 10 + '°C' +
3651
+ ', ' + value[6] / 6 + 'h:' + value[7] + 'm ' + value[8] / 10 + '°C' +
3652
+ ', ' + value[9] / 6 + 'h:' + value[10] + 'm ' + value[11] / 10 + '°C' +
3653
+ ', ' + value[12] / 6 + 'h:' + value[13] + 'm ' + value[14] / 10 + '°C ' +
3654
+ ', ' + value[15] / 6 + 'h:' + value[16] + 'm ' + value[17] / 10 + '°C ' +
3655
+ ', ' + value[18] / 6 + 'h:' + value[19] + 'm ' + value[20] / 10 + '°C ' +
3656
+ ', ' + value[21] / 6 + 'h:' + value[22] + 'm ' + value[23] / 10 + '°C ' +
3657
+ ', ' + value[24] / 6 + 'h:' + value[25] + 'm ' + value[26] / 10 + '°C ' +
3658
+ ', ' + value[27] / 6 + 'h:' + value[28] + 'm ' + value[29] / 10 + '°C ',
3659
+ };
3660
+ case tuya.dataPoints.tvSaturdaySchedule:
3661
+ return {schedule_saturday:
3662
+ ' ' + value[0] / 6 + 'h:' + value[1] + 'm ' + value[2] / 10 + '°C' +
3663
+ ', ' + value[3] / 6 + 'h:' + value[4] + 'm ' + value[5] / 10 + '°C' +
3664
+ ', ' + value[6] / 6 + 'h:' + value[7] + 'm ' + value[8] / 10 + '°C' +
3665
+ ', ' + value[9] / 6 + 'h:' + value[10] + 'm ' + value[11] / 10 + '°C' +
3666
+ ', ' + value[12] / 6 + 'h:' + value[13] + 'm ' + value[14] / 10 + '°C ' +
3667
+ ', ' + value[15] / 6 + 'h:' + value[16] + 'm ' + value[17] / 10 + '°C ' +
3668
+ ', ' + value[18] / 6 + 'h:' + value[19] + 'm ' + value[20] / 10 + '°C ' +
3669
+ ', ' + value[21] / 6 + 'h:' + value[22] + 'm ' + value[23] / 10 + '°C ' +
3670
+ ', ' + value[24] / 6 + 'h:' + value[25] + 'm ' + value[26] / 10 + '°C ' +
3671
+ ', ' + value[27] / 6 + 'h:' + value[28] + 'm ' + value[29] / 10 + '°C ',
3672
+ };
3673
+ case tuya.dataPoints.tvSundaySchedule:
3674
+ return {schedule_sunday:
3675
+ ' ' + value[0] / 6 + 'h:' + value[1] + 'm ' + value[2] / 10 + '°C' +
3676
+ ', ' + value[3] / 6 + 'h:' + value[4] + 'm ' + value[5] / 10 + '°C' +
3677
+ ', ' + value[6] / 6 + 'h:' + value[7] + 'm ' + value[8] / 10 + '°C' +
3678
+ ', ' + value[9] / 6 + 'h:' + value[10] + 'm ' + value[11] / 10 + '°C' +
3679
+ ', ' + value[12] / 6 + 'h:' + value[13] + 'm ' + value[14] / 10 + '°C ' +
3680
+ ', ' + value[15] / 6 + 'h:' + value[16] + 'm ' + value[17] / 10 + '°C ' +
3681
+ ', ' + value[18] / 6 + 'h:' + value[19] + 'm ' + value[20] / 10 + '°C ' +
3682
+ ', ' + value[21] / 6 + 'h:' + value[22] + 'm ' + value[23] / 10 + '°C ' +
3683
+ ', ' + value[24] / 6 + 'h:' + value[25] + 'm ' + value[26] / 10 + '°C ' +
3684
+ ', ' + value[27] / 6 + 'h:' + value[28] + 'm ' + value[29] / 10 + '°C ',
3685
+ };
3686
+
3687
+ default:
3688
+ meta.logger.warn(`zigbee-herdsman-converters:tvtwo_thermostat: NOT RECOGNIZED DP #${
3689
+ dp} with data ${JSON.stringify(msg.data)}`);
3690
+ }
3691
+ },
3692
+ },
3542
3693
  haozee_thermostat: {
3543
3694
  cluster: 'manuSpecificTuya',
3544
3695
  type: ['commandGetData', 'commandSetDataResponse'],
@@ -4752,6 +4903,10 @@ const converters = {
4752
4903
  const lookup = {4: 'anti_flicker_mode', 1: 'quick_mode'};
4753
4904
  payload.mode_switch = lookup[msg.data['4']];
4754
4905
  }
4906
+ if (msg.data.hasOwnProperty('10')) {
4907
+ const lookup = {1: 'toggle', 2: 'momentary'};
4908
+ payload.switch_type = lookup[msg.data['10']];
4909
+ }
4755
4910
  if (msg.data.hasOwnProperty('512')) {
4756
4911
  if (['ZNCZ15LM', 'QBCZ14LM', 'QBCZ15LM'].includes(model.model)) {
4757
4912
  payload.button_lock = msg.data['512'] === 1 ? 'OFF' : 'ON';
@@ -4986,15 +5141,6 @@ const converters = {
4986
5141
  }
4987
5142
  },
4988
5143
  },
4989
- WSDCGQ11LM_pressure: {
4990
- cluster: 'msPressureMeasurement',
4991
- type: ['attributeReport', 'readResponse'],
4992
- options: [exposes.options.precision('pressure'), exposes.options.calibration('pressure')],
4993
- convert: (model, msg, publish, options, meta) => {
4994
- const pressure = msg.data.hasOwnProperty('16') ? parseFloat(msg.data['16']) / 10 : parseFloat(msg.data['measuredValue']);
4995
- return {pressure: calibrateAndPrecisionRoundOptions(pressure, options, 'pressure')};
4996
- },
4997
- },
4998
5144
  W2_module_carbon_monoxide: {
4999
5145
  cluster: 'ssIasZone',
5000
5146
  type: 'commandStatusChangeNotification',
@@ -7179,10 +7325,10 @@ const converters = {
7179
7325
  result.voltage_rms = (value[1] | value[0] << 8) / 10;
7180
7326
  }
7181
7327
  if (dp === tuya.dataPoints.hochCurrent) {
7182
- result.current = value[2] | value[1] << 8;
7328
+ result.current = (value[2] | value[1] << 8) / 1000;
7183
7329
  }
7184
7330
  if (dp === tuya.dataPoints.hochHistoricalCurrent) {
7185
- result.current_average = value[2] | value[1] << 8;
7331
+ result.current_average = (value[2] | value[1] << 8) / 1000;
7186
7332
  }
7187
7333
  if (dp === tuya.dataPoints.hochActivePower) {
7188
7334
  result.power = (value[2] | value[1] << 8) / 10;
@@ -2078,7 +2078,7 @@ const converters = {
2078
2078
  xiaomi_led_disabled_night: {
2079
2079
  key: ['led_disabled_night'],
2080
2080
  convertSet: async (entity, key, value, meta) => {
2081
- if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM', 'QBKG25LM', 'QBKG19LM',
2081
+ if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM', 'QBKG25LM', 'QBKG19LM', 'DLKZMK11LM',
2082
2082
  'QBKG34LM'].includes(meta.mapped.model)) {
2083
2083
  await entity.write('aqaraOpple', {0x0203: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
2084
2084
  } else if (['ZNCZ11LM'].includes(meta.mapped.model)) {
@@ -2093,7 +2093,7 @@ const converters = {
2093
2093
  return {state: {led_disabled_night: value}};
2094
2094
  },
2095
2095
  convertGet: async (entity, key, meta) => {
2096
- if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM', 'QBKG25LM', 'QBKG19LM',
2096
+ if (['ZNCZ04LM', 'ZNCZ15LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM', 'QBKG25LM', 'QBKG19LM', 'DLKZMK11LM',
2097
2097
  'QBKG34LM'].includes(meta.mapped.model)) {
2098
2098
  await entity.read('aqaraOpple', [0x0203], manufacturerOptions.xiaomi);
2099
2099
  } else {
@@ -2735,6 +2735,75 @@ const converters = {
2735
2735
  await tuya.sendDataPointValue(entity, tuya.dataPoints.moesSminTempSet, temp);
2736
2736
  },
2737
2737
  },
2738
+ tvtwo_thermostat: {
2739
+ key: [
2740
+ 'window_detection', 'frost_protection', 'child_lock',
2741
+ 'current_heating_setpoint', 'local_temperature_calibration',
2742
+ 'holiday_temperature', 'comfort_temperature', 'eco_temperature',
2743
+ 'open_window_temperature', 'heating_stop', 'preset', 'boost_timeset_countdown',
2744
+ 'holiday_mode_date', 'working_day', 'week_schedule', 'week', 'online',
2745
+ ],
2746
+ convertSet: async (entity, key, value, meta) => {
2747
+ switch (key) {
2748
+ case 'preset': {
2749
+ const presetLookup = {'auto': 0, 'manual': 1, 'holiday': 3};
2750
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvMode, presetLookup[value]);
2751
+ return {state: {preset: value}};}
2752
+ case 'frost_protection':
2753
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvFrostDetection, value === 'ON');
2754
+ break;
2755
+ case 'heating_stop':
2756
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvHeatingStop, value === 'ON');
2757
+ break;
2758
+ case 'window_detection':
2759
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvWindowDetection, value === 'ON');
2760
+ break;
2761
+ case 'child_lock':
2762
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvChildLock, value === 'LOCK');
2763
+ break;
2764
+ case 'local_temperature_calibration':
2765
+ // value = Math.round(value);
2766
+ value = (value < 0) ? 0xFFFFFFFF + value + 1 : value;
2767
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvTempCalibration, value * 10);
2768
+ break;
2769
+ case 'current_heating_setpoint':
2770
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvHeatingSetpoint, value * 10);
2771
+ break;
2772
+ case 'holiday_temperature':
2773
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvHolidayTemp, value * 10);
2774
+ break;
2775
+ case 'comfort_temperature':
2776
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvComfortTemp, value * 10);
2777
+ break;
2778
+ case 'eco_temperature':
2779
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvEcoTemp, value * 10);
2780
+ break;
2781
+ case 'boost_timeset_countdown':
2782
+ // set min 0 - max 465 sec boost time
2783
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvBoostTime, value);
2784
+ break;
2785
+ case 'open_window_temperature':
2786
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvOpenWindowTemp, value * 10);
2787
+ break;
2788
+ case 'holiday_mode_date':
2789
+ await tuya.sendDataPointBitmap(entity, tuya.dataPoints.tvWorkingDayTimetvHolidayMode, value);
2790
+ break;
2791
+
2792
+ case 'online':
2793
+ // 115 ????? online
2794
+ await tuya.sendDataPointBool(entity, tuya.dataPoints.tvBoostMode, value === 'ON');
2795
+ break;
2796
+ case 'week': {
2797
+ const weekLookup = {'5+2': 0, '6+1': 1, '7': 2};
2798
+ const week = weekLookup[value];
2799
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvWorkingDay, week);
2800
+ return {state: {week: value}};}
2801
+
2802
+ default: // Unknown key
2803
+ meta.logger.warn(`toZigbee.tvtwo_thermostat: Unhandled key ${key}`);
2804
+ }
2805
+ },
2806
+ },
2738
2807
  haozee_thermostat_system_mode: {
2739
2808
  key: ['preset'],
2740
2809
  convertSet: async (entity, key, value, meta) => {
package/devices/bitron.js CHANGED
@@ -1,7 +1,6 @@
1
1
  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
- const constants = require('../lib/constants');
5
4
  const reporting = require('../lib/reporting');
6
5
  const extend = require('../lib/extend');
7
6
  const e = exposes.presets;
@@ -199,7 +198,7 @@ module.exports = [
199
198
  'genBasic', 'genPowerCfg', 'genIdentify', 'genPollCtrl', 'hvacThermostat', 'hvacUserInterfaceCfg',
200
199
  ];
201
200
  await reporting.bind(endpoint, coordinatorEndpoint, binds);
202
- await reporting.thermostatTemperature(endpoint, {min: 900, max: constants.repInterval.HOUR, change: 1});
201
+ await reporting.thermostatTemperature(endpoint);
203
202
  await reporting.thermostatTemperatureCalibration(endpoint);
204
203
  await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
205
204
  await reporting.thermostatRunningState(endpoint);
package/devices/candeo.js CHANGED
@@ -13,7 +13,7 @@ module.exports = [
13
13
  const endpoint = device.getEndpoint(1);
14
14
  await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
15
15
  await reporting.onOff(endpoint);
16
- await reporting.brightness(endpoint, {min: 1});
16
+ await reporting.brightness(endpoint);
17
17
  },
18
18
  },
19
19
  ];
@@ -73,15 +73,15 @@ module.exports = [
73
73
 
74
74
  // standard ZCL attributes
75
75
  await reporting.batteryPercentageRemaining(endpoint);
76
- await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
76
+ await reporting.thermostatTemperature(endpoint);
77
77
  await reporting.thermostatPIHeatingDemand(endpoint);
78
- await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
78
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
79
79
 
80
80
  // danfoss attributes
81
81
  await endpoint.configureReporting('hvacThermostat', [{
82
82
  attribute: 'danfossMountedModeActive',
83
83
  minimumReportInterval: constants.repInterval.MINUTE,
84
- maximumReportInterval: 43200,
84
+ maximumReportInterval: constants.repInterval.MAX,
85
85
  reportableChange: 1,
86
86
  }], options);
87
87
  await endpoint.configureReporting('hvacThermostat', [{
@@ -93,7 +93,7 @@ module.exports = [
93
93
  await endpoint.configureReporting('hvacThermostat', [{
94
94
  attribute: 'danfossHeatRequired',
95
95
  minimumReportInterval: constants.repInterval.MINUTE,
96
- maximumReportInterval: constants.repInterval.MINUTES_10,
96
+ maximumReportInterval: constants.repInterval.HOUR,
97
97
  reportableChange: 1,
98
98
  }], options);
99
99
  await endpoint.configureReporting('hvacThermostat', [{
@@ -1,6 +1,6 @@
1
1
  const reporting = require('../lib/reporting');
2
2
  const extend = require('../lib/extend');
3
- const exposes = require('zigbee-herdsman-converters/lib/exposes');
3
+ const exposes = require('../lib/exposes');
4
4
  const e = exposes.presets;
5
5
 
6
6
  module.exports = [
@@ -34,12 +34,12 @@ module.exports = [
34
34
  const endpoint = device.getEndpoint(1);
35
35
  const options = {manufacturerCode: 4151};
36
36
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
37
- await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 25});
38
- await reporting.thermostatPIHeatingDemand(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 1});
39
- await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 25});
40
- await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.MINUTES_10, change: 25});
37
+ await reporting.thermostatTemperature(endpoint);
38
+ await reporting.thermostatPIHeatingDemand(endpoint);
39
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
40
+ await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
41
41
  await endpoint.configureReporting('hvacThermostat', [{attribute: {ID: 0x4003, type: 41}, minimumReportInterval: 0,
42
- maximumReportInterval: constants.repInterval.MINUTES_10, reportableChange: 25}], options);
42
+ maximumReportInterval: constants.repInterval.HOUR, reportableChange: 25}], options);
43
43
  await endpoint.configureReporting('hvacThermostat', [{attribute: {ID: 0x4008, type: 34}, minimumReportInterval: 0,
44
44
  maximumReportInterval: constants.repInterval.HOUR, reportableChange: 1}], options);
45
45
  },
package/devices/heiman.js CHANGED
@@ -149,7 +149,7 @@ module.exports = [
149
149
  configure: async (device, coordinatorEndpoint, logger) => {
150
150
  const endpoint = device.getEndpoint(1);
151
151
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
152
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
152
+ await reporting.batteryPercentageRemaining(endpoint);
153
153
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
154
154
  },
155
155
  exposes: [e.contact(), e.battery(), e.battery_low(), e.tamper()],
@@ -164,7 +164,7 @@ module.exports = [
164
164
  configure: async (device, coordinatorEndpoint, logger) => {
165
165
  const endpoint = device.getEndpoint(1);
166
166
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
167
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
167
+ await reporting.batteryPercentageRemaining(endpoint);
168
168
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
169
169
  },
170
170
  exposes: [e.contact(), e.battery_low(), e.tamper(), e.battery()],
@@ -188,7 +188,7 @@ module.exports = [
188
188
  configure: async (device, coordinatorEndpoint, logger) => {
189
189
  const endpoint = device.getEndpoint(1);
190
190
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
191
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
191
+ await reporting.batteryPercentageRemaining(endpoint);
192
192
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
193
193
  },
194
194
  exposes: [e.water_leak(), e.battery_low(), e.tamper(), e.battery()],
@@ -204,7 +204,7 @@ module.exports = [
204
204
  configure: async (device, coordinatorEndpoint, logger) => {
205
205
  const endpoint = device.getEndpoint(1);
206
206
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
207
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
207
+ await reporting.batteryPercentageRemaining(endpoint);
208
208
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
209
209
  },
210
210
  },
@@ -219,7 +219,7 @@ module.exports = [
219
219
  configure: async (device, coordinatorEndpoint, logger) => {
220
220
  const endpoint = device.getEndpoint(1);
221
221
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
222
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
222
+ await reporting.batteryPercentageRemaining(endpoint);
223
223
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
224
224
  },
225
225
  onEvent: async (type, data, device) => {
@@ -241,7 +241,7 @@ module.exports = [
241
241
  configure: async (device, coordinatorEndpoint, logger) => {
242
242
  const endpoint = device.getEndpoint(1);
243
243
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
244
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
244
+ await reporting.batteryPercentageRemaining(endpoint);
245
245
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
246
246
  },
247
247
  },
@@ -334,7 +334,7 @@ module.exports = [
334
334
  const endpoint1 = device.getEndpoint(1);
335
335
  await reporting.bind(endpoint1, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
336
336
  await reporting.temperature(endpoint1);
337
- await reporting.batteryPercentageRemaining(endpoint1, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
337
+ await reporting.batteryPercentageRemaining(endpoint1);
338
338
  await endpoint1.read('genPowerCfg', ['batteryPercentageRemaining']);
339
339
 
340
340
  const endpoint2 = device.getEndpoint(2);
@@ -405,7 +405,7 @@ module.exports = [
405
405
  const bindClusters = ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg'];
406
406
  await reporting.bind(endpoint, coordinatorEndpoint, bindClusters);
407
407
  await reporting.temperature(endpoint);
408
- await reporting.humidity(endpoint, {min: 0, change: 25});
408
+ await reporting.humidity(endpoint);
409
409
  await reporting.batteryVoltage(endpoint);
410
410
  },
411
411
  exposes: [e.temperature(), e.humidity(), e.battery()],
@@ -421,7 +421,7 @@ module.exports = [
421
421
  configure: async (device, coordinatorEndpoint, logger) => {
422
422
  const endpoint = device.getEndpoint(1);
423
423
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
424
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
424
+ await reporting.batteryPercentageRemaining(endpoint);
425
425
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
426
426
  },
427
427
  },
@@ -436,7 +436,7 @@ module.exports = [
436
436
  configure: async (device, coordinatorEndpoint, logger) => {
437
437
  const endpoint = device.getEndpoint(1);
438
438
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'heimanSpecificScenes']);
439
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
439
+ await reporting.batteryPercentageRemaining(endpoint);
440
440
  },
441
441
  },
442
442
  {
@@ -468,7 +468,7 @@ module.exports = [
468
468
  configure: async (device, coordinatorEndpoint, logger) => {
469
469
  const endpoint = device.getEndpoint(1);
470
470
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
471
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
471
+ await reporting.batteryPercentageRemaining(endpoint);
472
472
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
473
473
  },
474
474
  exposes: [e.vibration(), e.battery_low(), e.tamper(), e.battery()],
@@ -483,7 +483,7 @@ module.exports = [
483
483
  configure: async (device, coordinatorEndpoint, logger) => {
484
484
  const endpoint = device.getEndpoint(1);
485
485
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
486
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
486
+ await reporting.batteryPercentageRemaining(endpoint);
487
487
  await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
488
488
  },
489
489
  exposes: [e.vibration(), e.battery_low(), e.tamper(), e.battery()],
@@ -564,7 +564,7 @@ module.exports = [
564
564
  configure: async (device, coordinatorEndpoint, logger) => {
565
565
  const endpoint = device.getEndpoint(1);
566
566
  await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'heimanSpecificInfraRedRemote']);
567
- await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
567
+ await reporting.batteryPercentageRemaining(endpoint);
568
568
  },
569
569
  },
570
570
  {
package/devices/hive.js CHANGED
@@ -213,15 +213,15 @@ module.exports = [
213
213
 
214
214
  // standard ZCL attributes
215
215
  await reporting.batteryPercentageRemaining(endpoint);
216
- await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
216
+ await reporting.thermostatTemperature(endpoint);
217
217
  await reporting.thermostatPIHeatingDemand(endpoint);
218
- await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
218
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
219
219
 
220
220
  // danfoss attributes
221
221
  await endpoint.configureReporting('hvacThermostat', [{
222
222
  attribute: 'danfossMountedModeActive',
223
223
  minimumReportInterval: constants.repInterval.MINUTE,
224
- maximumReportInterval: 43200,
224
+ maximumReportInterval: constants.repInterval.MAX,
225
225
  reportableChange: 1,
226
226
  }], options);
227
227
  await endpoint.configureReporting('hvacThermostat', [{
@@ -233,7 +233,7 @@ module.exports = [
233
233
  await endpoint.configureReporting('hvacThermostat', [{
234
234
  attribute: 'danfossHeatRequired',
235
235
  minimumReportInterval: constants.repInterval.MINUTE,
236
- maximumReportInterval: constants.repInterval.MINUTES_10,
236
+ maximumReportInterval: constants.repInterval.HOUR,
237
237
  reportableChange: 1,
238
238
  }], options);
239
239
  await endpoint.configureReporting('hvacThermostat', [{
@@ -293,12 +293,12 @@ module.exports = [
293
293
  const endpoint = device.getEndpoint(5);
294
294
  const binds = ['genBasic', 'genIdentify', 'genAlarms', 'genTime', 'hvacThermostat'];
295
295
  await reporting.bind(endpoint, coordinatorEndpoint, binds);
296
- await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
297
- await reporting.thermostatRunningState(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
298
- await reporting.thermostatSystemMode(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
299
- await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
300
- await reporting.thermostatTemperatureSetpointHold(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
301
- await reporting.thermostatTemperatureSetpointHoldDuration(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
296
+ await reporting.thermostatTemperature(endpoint);
297
+ await reporting.thermostatRunningState(endpoint);
298
+ await reporting.thermostatSystemMode(endpoint);
299
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
300
+ await reporting.thermostatTemperatureSetpointHold(endpoint);
301
+ await reporting.thermostatTemperatureSetpointHoldDuration(endpoint);
302
302
  },
303
303
  },
304
304
  {
@@ -324,12 +324,12 @@ module.exports = [
324
324
  const endpoint = device.getEndpoint(5);
325
325
  const binds = ['genBasic', 'genIdentify', 'genAlarms', 'genTime', 'hvacThermostat'];
326
326
  await reporting.bind(endpoint, coordinatorEndpoint, binds);
327
- await reporting.thermostatTemperature(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
328
- await reporting.thermostatRunningState(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
329
- await reporting.thermostatSystemMode(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
330
- await reporting.thermostatOccupiedHeatingSetpoint(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
331
- await reporting.thermostatTemperatureSetpointHold(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
332
- await reporting.thermostatTemperatureSetpointHoldDuration(endpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
327
+ await reporting.thermostatTemperature(endpoint);
328
+ await reporting.thermostatRunningState(endpoint);
329
+ await reporting.thermostatSystemMode(endpoint);
330
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
331
+ await reporting.thermostatTemperatureSetpointHold(endpoint);
332
+ await reporting.thermostatTemperatureSetpointHoldDuration(endpoint);
333
333
  },
334
334
  },
335
335
  {
@@ -352,18 +352,18 @@ module.exports = [
352
352
  'genBasic', 'genIdentify', 'genAlarms', 'genTime', 'hvacThermostat',
353
353
  ];
354
354
  await reporting.bind(heatEndpoint, coordinatorEndpoint, binds);
355
- await reporting.thermostatTemperature(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
356
- await reporting.thermostatRunningState(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
357
- await reporting.thermostatSystemMode(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
358
- await reporting.thermostatOccupiedHeatingSetpoint(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
359
- await reporting.thermostatTemperatureSetpointHold(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
360
- await reporting.thermostatTemperatureSetpointHoldDuration(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
355
+ await reporting.thermostatTemperature(heatEndpoint);
356
+ await reporting.thermostatRunningState(heatEndpoint);
357
+ await reporting.thermostatSystemMode(heatEndpoint);
358
+ await reporting.thermostatOccupiedHeatingSetpoint(heatEndpoint);
359
+ await reporting.thermostatTemperatureSetpointHold(heatEndpoint);
360
+ await reporting.thermostatTemperatureSetpointHoldDuration(heatEndpoint);
361
361
  await reporting.bind(waterEndpoint, coordinatorEndpoint, binds);
362
- await reporting.thermostatRunningState(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
363
- await reporting.thermostatSystemMode(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
364
- await reporting.thermostatOccupiedHeatingSetpoint(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
365
- await reporting.thermostatTemperatureSetpointHold(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
366
- await reporting.thermostatTemperatureSetpointHoldDuration(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
362
+ await reporting.thermostatRunningState(waterEndpoint);
363
+ await reporting.thermostatSystemMode(waterEndpoint);
364
+ await reporting.thermostatOccupiedHeatingSetpoint(waterEndpoint);
365
+ await reporting.thermostatTemperatureSetpointHold(waterEndpoint);
366
+ await reporting.thermostatTemperatureSetpointHoldDuration(waterEndpoint);
367
367
  },
368
368
  exposes: [
369
369
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature()
@@ -403,18 +403,18 @@ module.exports = [
403
403
  'genBasic', 'genIdentify', 'genAlarms', 'genTime', 'hvacThermostat',
404
404
  ];
405
405
  await reporting.bind(heatEndpoint, coordinatorEndpoint, binds);
406
- await reporting.thermostatTemperature(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
407
- await reporting.thermostatRunningState(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
408
- await reporting.thermostatSystemMode(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
409
- await reporting.thermostatOccupiedHeatingSetpoint(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
410
- await reporting.thermostatTemperatureSetpointHold(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
411
- await reporting.thermostatTemperatureSetpointHoldDuration(heatEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
406
+ await reporting.thermostatTemperature(heatEndpoint);
407
+ await reporting.thermostatRunningState(heatEndpoint);
408
+ await reporting.thermostatSystemMode(heatEndpoint);
409
+ await reporting.thermostatOccupiedHeatingSetpoint(heatEndpoint);
410
+ await reporting.thermostatTemperatureSetpointHold(heatEndpoint);
411
+ await reporting.thermostatTemperatureSetpointHoldDuration(heatEndpoint);
412
412
  await reporting.bind(waterEndpoint, coordinatorEndpoint, binds);
413
- await reporting.thermostatRunningState(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
414
- await reporting.thermostatSystemMode(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
415
- await reporting.thermostatOccupiedHeatingSetpoint(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 5});
416
- await reporting.thermostatTemperatureSetpointHold(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
417
- await reporting.thermostatTemperatureSetpointHoldDuration(waterEndpoint, {min: 0, max: constants.repInterval.HOUR, change: 1});
413
+ await reporting.thermostatRunningState(waterEndpoint);
414
+ await reporting.thermostatSystemMode(waterEndpoint);
415
+ await reporting.thermostatOccupiedHeatingSetpoint(waterEndpoint);
416
+ await reporting.thermostatTemperatureSetpointHold(waterEndpoint);
417
+ await reporting.thermostatTemperatureSetpointHoldDuration(waterEndpoint);
418
418
  },
419
419
  exposes: [
420
420
  exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature()