zigbee-herdsman-converters 14.0.283 → 14.0.287

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.
@@ -4132,6 +4132,8 @@ const converters = {
4132
4132
  return {battery_low: value === 0};
4133
4133
  case tuya.dataPoints.state:
4134
4134
  return {smoke: value === 0};
4135
+ case tuya.dataPoints.wooxSmokeTest:
4136
+ return {smoke: value};
4135
4137
  default:
4136
4138
  meta.logger.warn(`zigbee-herdsman-converters:tuya_smoke: Unrecognized DP #${ dp} with data ${JSON.stringify(msg.data)}`);
4137
4139
  }
@@ -6738,6 +6740,70 @@ const converters = {
6738
6740
  }
6739
6741
  },
6740
6742
  },
6743
+ moes_thermostat_tv: {
6744
+ cluster: 'manuSpecificTuya',
6745
+ type: ['commandGetData', 'commandSetDataResponse', 'raw'],
6746
+ convert: (model, msg, publish, options, meta) => {
6747
+ const dp = msg.data.dp;
6748
+ let value = tuya.getDataValue(msg.data.datatype, msg.data.data);
6749
+ let result = null;
6750
+ switch (dp) {
6751
+ case tuya.dataPoints.tvMode:
6752
+ result = {system_mode: tuya.tvThermostatMode[value]};
6753
+ break;
6754
+ case tuya.dataPoints.tvWindowDetection:
6755
+ result = {window_detection: {1: false, 0: true}[value]};
6756
+ break;
6757
+ case tuya.dataPoints.tvFrostDetection:
6758
+ result = {frost_detection: {1: false, 0: true}[value]};
6759
+ break;
6760
+ case tuya.dataPoints.tvHeatingSetpoint:
6761
+ result = {current_heating_setpoint: (value / 10).toFixed(1)};
6762
+ break;
6763
+ case tuya.dataPoints.tvLocalTemp:
6764
+ result = {local_temperature: (value / 10).toFixed(1)};
6765
+ break;
6766
+ case tuya.dataPoints.tvTempCalibration:
6767
+ value = value > 0x7FFFFFFF ? 0xFFFFFFFF - value : value;
6768
+ result = {local_temperature_calibration: (value / 10).toFixed(1)};
6769
+ break;
6770
+ case tuya.dataPoints.tvHolidayTemp:
6771
+ result = {holiday_temperature: (value / 10).toFixed(1)};
6772
+ break;
6773
+ case tuya.dataPoints.tvBattery:
6774
+ result = {battery: value};
6775
+ break;
6776
+ case tuya.dataPoints.tvChildLock:
6777
+ result = {child_lock: {1: 'LOCK', 0: 'UNLOCK'}[value]};
6778
+ break;
6779
+ case tuya.dataPoints.tvErrorStatus:
6780
+ result = {error: value};
6781
+ break;
6782
+ case tuya.dataPoints.tvHolidayMode:
6783
+ result = {holiday_mode: value};
6784
+ break;
6785
+ // case tuya.dataPoints.tvBoostMode:
6786
+ // result = {boost_mode: {1: false, 0: true}[value]};
6787
+ // break;
6788
+ case tuya.dataPoints.tvBoostTime:
6789
+ result = {boost_heating_countdown: value};
6790
+ break;
6791
+ case tuya.dataPoints.tvOpenWindowTemp:
6792
+ result = {open_window_temperature: (value / 10).toFixed(1)};
6793
+ break;
6794
+ case tuya.dataPoints.tvComfortTemp:
6795
+ result = {comfort_temperature: (value / 10).toFixed(1)};
6796
+ break;
6797
+ case tuya.dataPoints.tvEcoTemp:
6798
+ result = {eco_temperature: (value / 10).toFixed(1)};
6799
+ break;
6800
+ default:
6801
+ meta.logger.warn(`fromZigbee.moes_thermostat_tv: NOT RECOGNIZED DP ${dp} with data ${JSON.stringify(msg.data)}`);
6802
+ }
6803
+
6804
+ return result;
6805
+ },
6806
+ },
6741
6807
  sihas_people_cnt: {
6742
6808
  cluster: 'genAnalogInput',
6743
6809
  type: ['attributeReport', 'readResponse'],
@@ -1912,7 +1912,7 @@ const converters = {
1912
1912
  key: ['power_outage_memory'],
1913
1913
  convertSet: async (entity, key, value, meta) => {
1914
1914
  if (['ZNCZ04LM', 'QBKG25LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'QBKG39LM', 'QBKG41LM', 'ZNCZ15LM',
1915
- 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG31LM', 'QBCZ15LM', 'QBKG20LM',
1915
+ 'WS-EUK01', 'WS-EUK02', 'WS-EUK03', 'WS-EUK04', 'QBKG31LM', 'QBCZ15LM', 'QBKG20LM', 'QBKG38LM',
1916
1916
  'QBCZ14LM'].includes(meta.mapped.model)) {
1917
1917
  await entity.write('aqaraOpple', {0x0201: {value: value ? 1 : 0, type: 0x10}}, manufacturerOptions.xiaomi);
1918
1918
  } else if (['ZNCZ02LM', 'QBCZ11LM'].includes(meta.mapped.model)) {
@@ -1935,7 +1935,8 @@ const converters = {
1935
1935
  },
1936
1936
  convertGet: async (entity, key, meta) => {
1937
1937
  if (['ZNCZ04LM', 'QBKG25LM', 'SSM-U01', 'SSM-U02', 'DLKZMK11LM', 'QBKG39LM', 'QBKG41LM', 'ZNCZ15LM',
1938
- 'WS-EUK02', 'WS-EUK01', 'QBKG31LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM'].includes(meta.mapped.model)) {
1938
+ 'WS-EUK02', 'WS-EUK01', 'QBKG31LM', 'QBCZ15LM', 'QBCZ14LM', 'QBKG20LM',
1939
+ 'QBKG38LM'].includes(meta.mapped.model)) {
1939
1940
  await entity.read('aqaraOpple', [0x0201]);
1940
1941
  } else if (['ZNCZ02LM', 'QBCZ11LM', 'ZNCZ11LM'].includes(meta.mapped.model)) {
1941
1942
  await entity.read('aqaraOpple', [0xFFF0]);
@@ -5836,6 +5837,61 @@ const converters = {
5836
5837
  }
5837
5838
  },
5838
5839
  },
5840
+ moes_thermostat_tv: {
5841
+ key: [
5842
+ 'system_mode', 'window_detection', 'frost_detection', 'child_lock',
5843
+ 'current_heating_setpoint', 'local_temperature_calibration',
5844
+ 'holiday_temperature', 'comfort_temperature', 'eco_temperature', 'boost_mode', 'open_window_temperature',
5845
+ ],
5846
+ convertSet: async (entity, key, value, meta) => {
5847
+ switch (key) {
5848
+ case 'system_mode':
5849
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvMode, utils.getKey(tuya.tvThermostatMode, value));
5850
+ break;
5851
+ case 'window_detection':
5852
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvWindowDetection, (value) ? 0 : 1);
5853
+ break;
5854
+ case 'frost_detection':
5855
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvFrostDetection, (value) ? 0 : 1);
5856
+ break;
5857
+ case 'child_lock':
5858
+ await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvChildLock, {'unlock': 0, 'lock': 1}[value.toLowerCase()]);
5859
+ break;
5860
+ case 'local_temperature_calibration':
5861
+ value = Math.round(value * 10);
5862
+ value = (value < 0) ? 0xFFFFFFFF + value + 1 : value;
5863
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvTempCalibration, value);
5864
+ break;
5865
+ case 'current_heating_setpoint':
5866
+ value = Math.round(value * 10);
5867
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvHeatingSetpoint, value);
5868
+ break;
5869
+ case 'holiday_temperature':
5870
+ value = Math.round(value * 10);
5871
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvHolidayTemp, value);
5872
+ break;
5873
+ case 'comfort_temperature':
5874
+ value = Math.round(value * 10);
5875
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvComfortTemp, value);
5876
+ break;
5877
+ case 'eco_temperature':
5878
+ value = Math.round(value * 10);
5879
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvEcoTemp, value);
5880
+ break;
5881
+ // case 'boost_mode':
5882
+ // // set 300sec boost time
5883
+ // await tuya.sendDataPointValue(entity, tuya.dataPoints.tvBoostTime, 300);
5884
+ // await tuya.sendDataPointEnum(entity, tuya.dataPoints.tvBoostMode, (value) ? 0 : 1);
5885
+ // break;
5886
+ case 'open_window_temperature':
5887
+ value = Math.round(value * 10);
5888
+ await tuya.sendDataPointValue(entity, tuya.dataPoints.tvOpenWindowTemp, value);
5889
+ break;
5890
+ default: // Unknown key
5891
+ meta.logger.warn(`toZigbee.moes_thermostat_tv: Unhandled key ${key}`);
5892
+ }
5893
+ },
5894
+ },
5839
5895
  sihas_set_people: {
5840
5896
  key: ['people'],
5841
5897
  convertSet: async (entity, key, value, meta) => {
package/devices/moes.js CHANGED
@@ -287,4 +287,27 @@ module.exports = [
287
287
  exposes: [e.cover_position(), exposes.numeric('calibration_time', ea.ALL), exposes.enum('moving', ea.STATE, ['UP', 'STOP', 'DOWN']),
288
288
  exposes.binary('motor_reversal', ea.ALL, 'ON', 'OFF')],
289
289
  },
290
+ {
291
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_e9ba97vf'}],
292
+ model: 'TV01-ZB',
293
+ vendor: 'Moes',
294
+ description: 'Thermostat radiator valve',
295
+ fromZigbee: [fz.moes_thermostat_tv, fz.ignore_tuya_set_time],
296
+ toZigbee: [tz.moes_thermostat_tv],
297
+ exposes: [
298
+ e.battery(), e.child_lock(), e.window_detection(),
299
+ exposes.binary('frost_detection', ea.STATE_SET, true, false).withDescription('Enables/disables frost detection on the device'),
300
+ exposes.numeric('holiday_temperature', ea.STATE_SET).withDescription('Holiday mode temperature'),
301
+ exposes.numeric('comfort_temperature', ea.STATE_SET).withDescription('Comfort mode temperature'),
302
+ exposes.numeric('eco_temperature', ea.STATE_SET).withDescription('Eco mode temperature'),
303
+ exposes.numeric('open_window_temperature', ea.STATE_SET).withDescription('Open window mode temperature'),
304
+ exposes.numeric('boost_heating_countdown', ea.STATE).withDescription('Boost heating countdown'),
305
+ exposes.numeric('error_status', ea.STATE).withDescription('Error status'),
306
+ // exposes.binary('boost_mode', ea.STATE_SET).withDescription('Enables/disables boost mode'),
307
+ exposes.climate().withSetpoint('current_heating_setpoint', 5, 30, 1, ea.STATE_SET)
308
+ .withLocalTemperature(ea.STATE).withLocalTemperatureCalibration(ea.STATE_SET),
309
+ exposes.enum('system_mode', ea.STATE_SET, Object.values(tuya.tvThermostatMode)).withDescription('Mode of this device'),
310
+ ],
311
+ onEvent: tuya.onEventSetLocalTime,
312
+ },
290
313
  ];
@@ -0,0 +1,21 @@
1
+ const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
2
+ const exposes = require('zigbee-herdsman-converters/lib/exposes');
3
+ const reporting = require('zigbee-herdsman-converters/lib/reporting');
4
+ const e = exposes.presets;
5
+
6
+ module.exports = [
7
+ {
8
+ zigbeeModel: ['PECLS01'],
9
+ model: 'PECLS01',
10
+ vendor: 'Perenio',
11
+ description: 'Flood alarm device',
12
+ fromZigbee: [fz.ias_water_leak_alarm_1, fz.ignore_basic_report, fz.battery],
13
+ toZigbee: [],
14
+ configure: async (device, coordinatorEndpoint, logger) => {
15
+ const endpoint = device.getEndpoint(1);
16
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
17
+ await reporting.batteryPercentageRemaining(endpoint);
18
+ },
19
+ exposes: [e.water_leak(), e.battery_low(), e.tamper(), e.battery()],
20
+ },
21
+ ];
@@ -47,6 +47,15 @@ module.exports = [
47
47
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
48
48
  ota: ota.zigbeeOTA,
49
49
  },
50
+ {
51
+ zigbeeModel: ['929002376301'],
52
+ model: '929002376301',
53
+ vendor: 'Philips',
54
+ description: 'Hue Iris rose limited edition (generation 4) ',
55
+ meta: {turnsOffAtBrightness1: true},
56
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
57
+ ota: ota.zigbeeOTA,
58
+ },
50
59
  {
51
60
  zigbeeModel: ['5063130P7'],
52
61
  model: '5063130P7',
@@ -543,7 +552,7 @@ module.exports = [
543
552
  vendor: 'Philips',
544
553
  description: 'Hue white ambiance E27 1100lm with Bluetooth',
545
554
  meta: {turnsOffAtBrightness1: true},
546
- extend: hueExtend.light_onoff_brightness_colortemp(),
555
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
547
556
  ota: ota.zigbeeOTA,
548
557
  },
549
558
  {
@@ -663,6 +672,15 @@ module.exports = [
663
672
  extend: hueExtend.light_onoff_brightness_colortemp_color(),
664
673
  ota: ota.zigbeeOTA,
665
674
  },
675
+ {
676
+ zigbeeModel: ['LCA008'],
677
+ model: '929002471601',
678
+ vendor: 'Philips',
679
+ description: 'Hue white and color ambiance E26/E27 1600lm',
680
+ meta: {turnsOffAtBrightness1: true},
681
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
682
+ ota: ota.zigbeeOTA,
683
+ },
666
684
  {
667
685
  zigbeeModel: ['LCT001', 'LCT007', 'LCT010', 'LCT012', 'LCT014', 'LCT015', 'LCT016', 'LCT021'],
668
686
  model: '9290012573A',
package/devices/xiaomi.js CHANGED
@@ -694,7 +694,7 @@ module.exports = [
694
694
  vendor: 'Xiaomi',
695
695
  description: 'Aqara smart wall switch T1 (with neutral, double rocker)',
696
696
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_multistate_action, fz.xiaomi_switch_opple_basic],
697
- toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
697
+ toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
698
698
  tz.xiaomi_led_disabled_night],
699
699
  meta: {multiEndpoint: true},
700
700
  endpoint: (device) => {
@@ -702,7 +702,7 @@ module.exports = [
702
702
  },
703
703
  exposes: [
704
704
  e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
705
- e.power().withAccess(ea.STATE_GET), e.energy(), e.voltage().withAccess(ea.STATE),
705
+ e.power().withAccess(ea.STATE), e.energy(), e.voltage().withAccess(ea.STATE),
706
706
  e.power_outage_memory(), e.led_disabled_night(), e.temperature().withAccess(ea.STATE),
707
707
  e.action([
708
708
  'single_left', 'double_left', 'single_right', 'double_right', 'single_both', 'double_both']),
@@ -1472,10 +1472,7 @@ module.exports = [
1472
1472
  'Quick mode makes the device respond faster.')],
1473
1473
  onEvent: preventReset,
1474
1474
  configure: async (device, coordinatorEndpoint, logger) => {
1475
- const endpoint1 = device.getEndpoint(1);
1476
- // set "event" mode
1477
- await endpoint1.write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f,
1478
- disableDefaultResponse: true, disableResponse: true});
1475
+ await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
1479
1476
  },
1480
1477
  },
1481
1478
  {
@@ -1506,10 +1503,7 @@ module.exports = [
1506
1503
  ],
1507
1504
  onEvent: preventReset,
1508
1505
  configure: async (device, coordinatorEndpoint, logger) => {
1509
- const endpoint1 = device.getEndpoint(1);
1510
- // set "event" mode
1511
- await endpoint1.write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f,
1512
- disableDefaultResponse: true, disableResponse: true});
1506
+ await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
1513
1507
  },
1514
1508
  },
1515
1509
  {
package/lib/tuya.js CHANGED
@@ -356,6 +356,7 @@ const dataPoints = {
356
356
  // Woox
357
357
  wooxSwitch: 102,
358
358
  wooxBattery: 14,
359
+ wooxSmokeTest: 8,
359
360
  // FrankEver
360
361
  frankEverTimer: 9,
361
362
  frankEverTreshold: 101,
@@ -395,6 +396,33 @@ const dataPoints = {
395
396
  msLightOffLuminancePrefer: 108,
396
397
  msLuminanceLevel: 109,
397
398
  msLedStatus: 110,
399
+ // TV01 Moes Thermostat
400
+ tvMode: 2,
401
+ tvWindowDetection: 8,
402
+ tvFrostDetection: 10,
403
+ tvHeatingSetpoint: 16,
404
+ tvLocalTemp: 24,
405
+ tvTempCalibration: 27,
406
+ tvWorkingDay: 31,
407
+ tvHolidayTemp: 32,
408
+ tvBattery: 35,
409
+ tvChildLock: 40,
410
+ tvErrorStatus: 45,
411
+ tvHolidayMode: 46,
412
+ tvBoostTime: 101,
413
+ tvOpenWindowTemp: 102,
414
+ tvComfortTemp: 104,
415
+ tvEcoTemp: 105,
416
+ tvWeekSchedule: 106,
417
+ tvHeatingStop: 107,
418
+ tvMondaySchedule: 108,
419
+ tvWednesdaySchedule: 109,
420
+ tvFridaySchedule: 110,
421
+ tvSundaySchedule: 111,
422
+ tvTuesdaySchedule: 112,
423
+ tvThursdaySchedule: 113,
424
+ tvSaturdaySchedule: 114,
425
+ tvBoostMode: 115,
398
426
  };
399
427
 
400
428
  const thermostatWeekFormat = {
@@ -478,6 +506,12 @@ const msLookups = {
478
506
  },
479
507
  };
480
508
 
509
+ const tvThermostatMode = {
510
+ 0: 'auto',
511
+ 1: 'manual',
512
+ 3: 'holiday',
513
+ };
514
+
481
515
  async function sendDataPoint(entity, datatype, dp, data, cmd, transid) {
482
516
  if (transid === undefined) {
483
517
  if (sendDataPoint.transId === undefined) {
@@ -590,4 +624,5 @@ module.exports = {
590
624
  silvercrestEffects,
591
625
  fanModes,
592
626
  msLookups,
627
+ tvThermostatMode,
593
628
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.283",
3
+ "version": "14.0.287",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.283",
3
+ "version": "14.0.287",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [