zigbee-herdsman-converters 21.3.0 → 21.4.0

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.
@@ -378,23 +378,6 @@ const COMMON_ATTRIBUTES = {
378
378
  "A setting of 'instant' turns the light immediately off. Increasing the value slows down the transition speed. " +
379
379
  'Every number represents 100ms. Default = 127 - Keep in sync with rampRateOffToOnLocal setting.',
380
380
  },
381
- minimumLevel: {
382
- ID: 9,
383
- dataType: zigbee_herdsman_1.Zcl.DataType.UINT8,
384
- min: 1,
385
- max: 254,
386
- description: 'The minimum level that the dimmer allows the bulb to be dimmed to. ' +
387
- 'Useful when the user has an LED bulb that does not turn on or flickers at a lower level.',
388
- },
389
- maximumLevel: {
390
- ID: 10,
391
- dataType: zigbee_herdsman_1.Zcl.DataType.UINT8,
392
- min: 2,
393
- max: 255,
394
- description: 'The maximum level that the dimmer allows the bulb to be dimmed to.' +
395
- 'Useful when the user has an LED bulb that reaches its maximum level before the ' +
396
- 'dimmer value of 99 or when the user wants to limit the maximum brightness.',
397
- },
398
381
  invertSwitch: {
399
382
  ID: 11,
400
383
  dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
@@ -461,16 +444,6 @@ const COMMON_ATTRIBUTES = {
461
444
  min: 0,
462
445
  max: 11,
463
446
  },
464
- powerType: {
465
- ID: 21,
466
- dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
467
- displayType: 'enum',
468
- values: { 'Non Neutral': 0, Neutral: 1 },
469
- min: 0,
470
- max: 1,
471
- readOnly: true,
472
- description: 'Set the power type for the device.',
473
- },
474
447
  switchType: {
475
448
  ID: 22,
476
449
  dataType: zigbee_herdsman_1.Zcl.DataType.UINT8,
@@ -487,6 +460,8 @@ const COMMON_ATTRIBUTES = {
487
460
  max: 127,
488
461
  readOnly: true,
489
462
  description: 'The temperature measured by the temperature sensor inside the chip, in degrees Celsius',
463
+ category: 'diagnostic',
464
+ unit: '°C',
490
465
  },
491
466
  overheat: {
492
467
  ID: 33,
@@ -905,15 +880,6 @@ const COMMON_ATTRIBUTES = {
905
880
  max: 101,
906
881
  description: 'Intesity of LED strip when off. 101 = Synchronized with default all LED strip intensity parameter.',
907
882
  },
908
- outputMode: {
909
- ID: 258,
910
- min: 0,
911
- max: 1,
912
- values: { Dimmer: 0, 'On/Off': 1 },
913
- dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
914
- description: 'Use device as a Dimmer or an On/Off switch.',
915
- displayType: 'enum',
916
- },
917
883
  doubleTapClearNotifications: {
918
884
  ID: 262,
919
885
  dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
@@ -932,8 +898,53 @@ const COMMON_ATTRIBUTES = {
932
898
  description: 'Level display of the LED Strip',
933
899
  },
934
900
  };
935
- const VZM31_ATTRIBUTES = {
901
+ const COMMON_DIMMER_ATTRIBUTES = {
936
902
  ...COMMON_ATTRIBUTES,
903
+ minimumLevel: {
904
+ ID: 9,
905
+ dataType: zigbee_herdsman_1.Zcl.DataType.UINT8,
906
+ min: 1,
907
+ max: 254,
908
+ description: 'The minimum level that the dimmer allows the bulb to be dimmed to. ' +
909
+ 'Useful when the user has an LED bulb that does not turn on or flickers at a lower level.',
910
+ },
911
+ maximumLevel: {
912
+ ID: 10,
913
+ dataType: zigbee_herdsman_1.Zcl.DataType.UINT8,
914
+ min: 2,
915
+ max: 255,
916
+ description: 'The maximum level that the dimmer allows the bulb to be dimmed to.' +
917
+ 'Useful when the user has an LED bulb that reaches its maximum level before the ' +
918
+ 'dimmer value of 99 or when the user wants to limit the maximum brightness.',
919
+ },
920
+ powerType: {
921
+ ID: 21,
922
+ dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
923
+ displayType: 'enum',
924
+ values: { 'Non Neutral': 0, Neutral: 1 },
925
+ min: 0,
926
+ max: 1,
927
+ readOnly: true,
928
+ description: 'Set the power type for the device.',
929
+ },
930
+ outputMode: {
931
+ ID: 258,
932
+ min: 0,
933
+ max: 1,
934
+ values: { Dimmer: 0, 'On/Off': 1 },
935
+ dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
936
+ description: 'Use device as a Dimmer or an On/Off switch.',
937
+ displayType: 'enum',
938
+ },
939
+ };
940
+ const COMMON_DIMMER_ON_OFF_ATTRIBUTES = {
941
+ ledBarScaling: {
942
+ ID: 100,
943
+ dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
944
+ displayType: 'enum',
945
+ values: { 'Gen3 method (VZM-style)': 0, 'Gen2 method (LZW-style)': 1 },
946
+ description: 'Method used for scaling.',
947
+ },
937
948
  activePowerReports: {
938
949
  ID: 18,
939
950
  dataType: zigbee_herdsman_1.Zcl.DataType.UINT8,
@@ -956,6 +967,19 @@ const VZM31_ATTRIBUTES = {
956
967
  description: 'Energy reports Energy level change which will result in sending a new energy report.' +
957
968
  '0 = disabled, 1-32767 = 0.01kWh-327.67kWh. Default setting: 10 (0.1 kWh)',
958
969
  },
970
+ };
971
+ const VZM30_ATTRIBUTES = {
972
+ ...COMMON_ATTRIBUTES,
973
+ ...COMMON_DIMMER_ON_OFF_ATTRIBUTES,
974
+ switchType: {
975
+ ...COMMON_ATTRIBUTES.switchType,
976
+ values: { 'Single Pole': 0, 'Aux Switch': 1 },
977
+ max: 1,
978
+ },
979
+ };
980
+ const VZM31_ATTRIBUTES = {
981
+ ...COMMON_DIMMER_ATTRIBUTES,
982
+ ...COMMON_DIMMER_ON_OFF_ATTRIBUTES,
959
983
  quickStartTime: {
960
984
  ID: 23,
961
985
  dataType: zigbee_herdsman_1.Zcl.DataType.UINT8,
@@ -979,13 +1003,6 @@ const VZM31_ATTRIBUTES = {
979
1003
  max: 1,
980
1004
  description: 'Increase level in non-neutral mode',
981
1005
  },
982
- ledBarScaling: {
983
- ID: 100,
984
- dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
985
- displayType: 'enum',
986
- values: { 'Gen3 method (VZM-style)': 0, 'Gen2 method (LZW-style)': 1 },
987
- description: 'Method used for scaling.',
988
- },
989
1006
  relayClick: {
990
1007
  ID: 261,
991
1008
  dataType: zigbee_herdsman_1.Zcl.DataType.BOOLEAN,
@@ -999,15 +1016,15 @@ const VZM31_ATTRIBUTES = {
999
1016
  },
1000
1017
  };
1001
1018
  const VZM35_ATTRIBUTES = {
1002
- ...COMMON_ATTRIBUTES,
1019
+ ...COMMON_DIMMER_ATTRIBUTES,
1003
1020
  minimumLevel: {
1004
- ...COMMON_ATTRIBUTES.minimumLevel,
1021
+ ...COMMON_DIMMER_ATTRIBUTES.minimumLevel,
1005
1022
  description: '1-84: The level corresponding to the fan is Low, Medium, High. ' +
1006
1023
  '85-170: The level corresponding to the fan is Medium, Medium, High. ' +
1007
1024
  '170-254: The level corresponding to the fan is High, High, High ',
1008
1025
  },
1009
1026
  maximumLevel: {
1010
- ...COMMON_ATTRIBUTES.maximumLevel,
1027
+ ...COMMON_DIMMER_ATTRIBUTES.maximumLevel,
1011
1028
  description: '2-84: The level corresponding to the fan is Low, Medium, High.',
1012
1029
  },
1013
1030
  switchType: {
@@ -1042,7 +1059,7 @@ const VZM35_ATTRIBUTES = {
1042
1059
  description: 'Identification value in Non-nuetral, low gear, aux switch',
1043
1060
  },
1044
1061
  outputMode: {
1045
- ...COMMON_ATTRIBUTES.outputMode,
1062
+ ...COMMON_DIMMER_ATTRIBUTES.outputMode,
1046
1063
  values: { 'Ceiling Fan (3-Speed)': 0, 'Exhaust Fan (On/Off)': 1 },
1047
1064
  description: 'Use device in ceiling fan (3-Speed) or in exhaust fan (On/Off) mode.',
1048
1065
  },
@@ -1059,8 +1076,8 @@ const VZM36_ATTRIBUTES = {
1059
1076
  rampRateOffToOnRemote_1: { ...COMMON_ATTRIBUTES.rampRateOffToOnRemote },
1060
1077
  dimmingSpeedDownRemote_1: { ...COMMON_ATTRIBUTES.dimmingSpeedDownRemote },
1061
1078
  rampRateOnToOffRemote_1: { ...COMMON_ATTRIBUTES.rampRateOnToOffRemote },
1062
- minimumLevel_1: { ...COMMON_ATTRIBUTES.minimumLevel },
1063
- maximumLevel_1: { ...COMMON_ATTRIBUTES.maximumLevel },
1079
+ minimumLevel_1: { ...COMMON_DIMMER_ATTRIBUTES.minimumLevel },
1080
+ maximumLevel_1: { ...COMMON_DIMMER_ATTRIBUTES.maximumLevel },
1064
1081
  autoTimerOff_1: {
1065
1082
  ...COMMON_ATTRIBUTES.autoTimerOff,
1066
1083
  description: 'Automatically turns the light off after this many seconds.' +
@@ -1114,7 +1131,7 @@ const VZM36_ATTRIBUTES = {
1114
1131
  ledColorWhenOn_1: { ...COMMON_ATTRIBUTES.ledColorWhenOn },
1115
1132
  ledIntensityWhenOn_1: { ...COMMON_ATTRIBUTES.ledIntensityWhenOn },
1116
1133
  // remote protection is readonly...
1117
- outputMode_1: { ...COMMON_ATTRIBUTES.outputMode },
1134
+ outputMode_1: { ...COMMON_DIMMER_ATTRIBUTES.outputMode },
1118
1135
  // Endpoint 2 (Fan)
1119
1136
  dimmingSpeedUpRemote_2: {
1120
1137
  ...COMMON_ATTRIBUTES.dimmingSpeedUpRemote,
@@ -1141,11 +1158,11 @@ const VZM36_ATTRIBUTES = {
1141
1158
  'Every number represents 100ms. Default = 127 - Keep in sync with rampRateOffToOnRemote setting.',
1142
1159
  },
1143
1160
  minimumLevel_2: {
1144
- ...COMMON_ATTRIBUTES.minimumLevel,
1161
+ ...COMMON_DIMMER_ATTRIBUTES.minimumLevel,
1145
1162
  description: 'The minimum level that the fan can be set to.',
1146
1163
  },
1147
1164
  maximumLevel_2: {
1148
- ...COMMON_ATTRIBUTES.maximumLevel,
1165
+ ...COMMON_DIMMER_ATTRIBUTES.maximumLevel,
1149
1166
  description: 'The maximum level that the fan can be set to.',
1150
1167
  },
1151
1168
  autoTimerOff_2: {
@@ -1173,13 +1190,13 @@ const VZM36_ATTRIBUTES = {
1173
1190
  // internal temp readonly
1174
1191
  // overheat readonly
1175
1192
  smartBulbMode_2: {
1176
- ...COMMON_ATTRIBUTES.smartBulbMode,
1193
+ ...COMMON_DIMMER_ATTRIBUTES.smartBulbMode,
1177
1194
  values: { Disabled: 0, 'Smart Fan Mode': 1 },
1178
1195
  description: 'For use with Smart Fans that need constant power and are controlled via commands rather than power.',
1179
1196
  },
1180
1197
  // remote protection readonly..
1181
1198
  outputMode_2: {
1182
- ...COMMON_ATTRIBUTES.outputMode,
1199
+ ...COMMON_DIMMER_ATTRIBUTES.outputMode,
1183
1200
  values: { 'Ceiling Fan (3-Speed)': 0, 'Exhaust Fan (On/Off)': 1 },
1184
1201
  description: 'Use device in ceiling fan (3-Speed) or in exhaust fan (On/Off) mode.',
1185
1202
  },
@@ -1376,13 +1393,15 @@ const tzLocal = {
1376
1393
  }
1377
1394
  },
1378
1395
  },
1379
- fan_mode: {
1396
+ fan_mode: (endpointId) => ({
1380
1397
  key: ['fan_mode'],
1381
1398
  convertSet: async (entity, key, value, meta) => {
1382
- await entity.command('genLevelCtrl', 'moveToLevelWithOnOff', {
1399
+ const endpoint = meta.device.getEndpoint(endpointId);
1400
+ await endpoint.command('genLevelCtrl', 'moveToLevelWithOnOff', {
1383
1401
  level: fanModes[value],
1384
1402
  transtime: 0xffff,
1385
1403
  }, utils.getOptions(meta.mapped, entity));
1404
+ meta.state[key] = value;
1386
1405
  return {
1387
1406
  state: {
1388
1407
  [key]: value,
@@ -1391,9 +1410,10 @@ const tzLocal = {
1391
1410
  };
1392
1411
  },
1393
1412
  convertGet: async (entity, key, meta) => {
1394
- await entity.read('genLevelCtrl', ['currentLevel']);
1413
+ const endpoint = meta.device.getEndpoint(endpointId);
1414
+ await endpoint.read('genLevelCtrl', ['currentLevel']);
1395
1415
  },
1396
- },
1416
+ }),
1397
1417
  fan_state: {
1398
1418
  key: ['fan_state'],
1399
1419
  convertSet: async (entity, key, value, meta) => {
@@ -1412,27 +1432,6 @@ const tzLocal = {
1412
1432
  await entity.read('genOnOff', ['onOff']);
1413
1433
  },
1414
1434
  },
1415
- vzm36_fan_mode: {
1416
- key: ['fan_mode'],
1417
- convertSet: async (entity, key, value, meta) => {
1418
- const endpoint = meta.device.getEndpoint(2);
1419
- await endpoint.command('genLevelCtrl', 'moveToLevelWithOnOff', {
1420
- level: fanModes[value],
1421
- transtime: 0xffff,
1422
- }, utils.getOptions(meta.mapped, entity));
1423
- meta.state[key] = value;
1424
- return {
1425
- state: {
1426
- [key]: value,
1427
- fan_state: 'ON',
1428
- },
1429
- };
1430
- },
1431
- convertGet: async (entity, key, meta) => {
1432
- const endpoint = meta.device.getEndpoint(2);
1433
- await endpoint.read('genLevelCtrl', ['currentLevel']);
1434
- },
1435
- },
1436
1435
  /**
1437
1436
  * On the VZM36, When turning the fan on and off, we must ensure that we are sending these
1438
1437
  * commands to endpoint 2 on the canopy module.
@@ -1644,24 +1643,11 @@ const fzLocal = {
1644
1643
  }
1645
1644
  },
1646
1645
  }),
1647
- fan_mode: {
1648
- cluster: 'genLevelCtrl',
1649
- type: ['attributeReport', 'readResponse'],
1650
- convert: (model, msg, publish, options, meta) => {
1651
- if (msg.data.currentLevel !== undefined) {
1652
- const mode = intToFanMode(msg.data['currentLevel'] || 1);
1653
- return {
1654
- fan_mode: mode,
1655
- };
1656
- }
1657
- return msg.data;
1658
- },
1659
- },
1660
- vzm36_fan_mode: {
1646
+ fan_mode: (endpointId) => ({
1661
1647
  cluster: 'genLevelCtrl',
1662
1648
  type: ['attributeReport', 'readResponse'],
1663
1649
  convert: (model, msg, publish, options, meta) => {
1664
- if (msg.endpoint.ID == 2) {
1650
+ if (msg.endpoint.ID == endpointId) {
1665
1651
  if (msg.data.currentLevel !== undefined) {
1666
1652
  const mode = intToFanMode(msg.data['currentLevel'] || 1);
1667
1653
  return {
@@ -1671,7 +1657,7 @@ const fzLocal = {
1671
1657
  }
1672
1658
  return msg.data;
1673
1659
  },
1674
- },
1660
+ }),
1675
1661
  fan_state: {
1676
1662
  cluster: 'genOnOff',
1677
1663
  type: ['attributeReport', 'readResponse'],
@@ -1761,37 +1747,10 @@ const fzLocal = {
1761
1747
  },
1762
1748
  },
1763
1749
  };
1764
- const exposesListVZM31 = [
1765
- e.light_brightness(),
1766
- e.power(),
1767
- e.energy(),
1768
- e
1750
+ const exposeLedEffects = () => {
1751
+ return e
1769
1752
  .composite('led_effect', 'led_effect', ea.STATE_SET)
1770
- .withFeature(e
1771
- .enum('effect', ea.STATE_SET, [
1772
- 'off',
1773
- 'solid',
1774
- 'fast_blink',
1775
- 'slow_blink',
1776
- 'pulse',
1777
- 'chase',
1778
- 'open_close',
1779
- 'small_to_big',
1780
- 'aurora',
1781
- 'slow_falling',
1782
- 'medium_falling',
1783
- 'fast_falling',
1784
- 'slow_rising',
1785
- 'medium_rising',
1786
- 'fast_rising',
1787
- 'medium_blink',
1788
- 'slow_chase',
1789
- 'fast_chase',
1790
- 'fast_siren',
1791
- 'slow_siren',
1792
- 'clear_effect',
1793
- ])
1794
- .withDescription('Animation Effect to use for the LEDs'))
1753
+ .withFeature(e.enum('effect', ea.STATE_SET, Object.keys(ledEffects)).withDescription('Animation Effect to use for the LEDs'))
1795
1754
  .withFeature(e
1796
1755
  .numeric('color', ea.STATE_SET)
1797
1756
  .withValueMin(0)
@@ -1805,98 +1764,13 @@ const exposesListVZM31 = [
1805
1764
  .withDescription('1-60 is in seconds calculated 61-120 is in minutes calculated by(value-60) ' +
1806
1765
  'Example a value of 65 would be 65-60 = 5 minutes - 120-254 Is in hours calculated by(value-120) ' +
1807
1766
  'Example a value of 132 would be 132-120 would be 12 hours. - 255 Indefinitely'))
1808
- .withCategory('config'),
1809
- e
1810
- .composite('individual_led_effect', 'individual_led_effect', ea.STATE_SET)
1811
- .withFeature(e.enum('led', ea.STATE_SET, ['1', '2', '3', '4', '5', '6', '7']).withDescription('Individual LED to target.'))
1812
- .withFeature(e
1813
- .enum('effect', ea.STATE_SET, [
1814
- 'off',
1815
- 'solid',
1816
- 'fast_blink',
1817
- 'slow_blink',
1818
- 'pulse',
1819
- 'chase',
1820
- 'falling',
1821
- 'rising',
1822
- 'aurora',
1823
- 'clear_effect',
1824
- ])
1825
- .withDescription('Animation Effect to use for the LED'))
1826
- .withFeature(e
1827
- .numeric('color', ea.STATE_SET)
1828
- .withValueMin(0)
1829
- .withValueMax(255)
1830
- .withDescription('Calculated by using a hue color circle(value/255*360) If color = 255 display white'))
1831
- .withFeature(e.numeric('level', ea.STATE_SET).withValueMin(0).withValueMax(100).withDescription('Brightness of the LED'))
1832
- .withFeature(e
1833
- .numeric('duration', ea.STATE_SET)
1834
- .withValueMin(0)
1835
- .withValueMax(255)
1836
- .withDescription('1-60 is in seconds calculated 61-120 is in minutes calculated by(value-60) ' +
1837
- 'Example a value of 65 would be 65-60 = 5 minutes - 120-254 Is in hours calculated by(value-120) ' +
1838
- ' Example a value of 132 would be 132-120 would be 12 hours. - 255 Indefinitely'))
1839
- .withCategory('config'),
1840
- ];
1841
- const exposesListVZM35 = [
1842
- e.fan().withModes(Object.keys(fanModes)),
1843
- e
1844
- .composite('led_effect', 'led_effect', ea.STATE_SET)
1845
- .withFeature(e
1846
- .enum('effect', ea.STATE_SET, [
1847
- 'off',
1848
- 'solid',
1849
- 'fast_blink',
1850
- 'slow_blink',
1851
- 'pulse',
1852
- 'chase',
1853
- 'open_close',
1854
- 'small_to_big',
1855
- 'aurora',
1856
- 'slow_falling',
1857
- 'medium_falling',
1858
- 'fast_falling',
1859
- 'slow_rising',
1860
- 'medium_rising',
1861
- 'fast_rising',
1862
- 'medium_blink',
1863
- 'slow_chase',
1864
- 'fast_chase',
1865
- 'fast_siren',
1866
- 'slow_siren',
1867
- 'clear_effect',
1868
- ])
1869
- .withDescription('Animation Effect to use for the LEDs'))
1870
- .withFeature(e
1871
- .numeric('color', ea.STATE_SET)
1872
- .withValueMin(0)
1873
- .withValueMax(255)
1874
- .withDescription('Calculated by using a hue color circle(value/255*360) If color = 255 display white'))
1875
- .withFeature(e.numeric('level', ea.STATE_SET).withValueMin(0).withValueMax(100).withDescription('Brightness of the LEDs'))
1876
- .withFeature(e
1877
- .numeric('duration', ea.STATE_SET)
1878
- .withValueMin(0)
1879
- .withValueMax(255)
1880
- .withDescription('1-60 is in seconds calculated 61-120 is in minutes calculated by(value-60) ' +
1881
- 'Example a value of 65 would be 65-60 = 5 minutes - 120-254 Is in hours calculated by(value-120) ' +
1882
- 'Example a value of 132 would be 132-120 would be 12 hours. - 255 Indefinitely')),
1883
- e
1767
+ .withCategory('config');
1768
+ };
1769
+ const exposeIndividualLedEffects = () => {
1770
+ return e
1884
1771
  .composite('individual_led_effect', 'individual_led_effect', ea.STATE_SET)
1885
1772
  .withFeature(e.enum('led', ea.STATE_SET, ['1', '2', '3', '4', '5', '6', '7']).withDescription('Individual LED to target.'))
1886
- .withFeature(e
1887
- .enum('effect', ea.STATE_SET, [
1888
- 'off',
1889
- 'solid',
1890
- 'fast_blink',
1891
- 'slow_blink',
1892
- 'pulse',
1893
- 'chase',
1894
- 'falling',
1895
- 'rising',
1896
- 'aurora',
1897
- 'clear_effect',
1898
- ])
1899
- .withDescription('Animation Effect to use for the LED'))
1773
+ .withFeature(e.enum('effect', ea.STATE_SET, Object.keys(individualLedEffects)).withDescription('Animation Effect to use for the LED'))
1900
1774
  .withFeature(e
1901
1775
  .numeric('color', ea.STATE_SET)
1902
1776
  .withValueMin(0)
@@ -1910,26 +1784,10 @@ const exposesListVZM35 = [
1910
1784
  .withDescription('1-60 is in seconds calculated 61-120 is in minutes calculated by(value-60) ' +
1911
1785
  'Example a value of 65 would be 65-60 = 5 minutes - 120-254 Is in hours calculated by(value-120) ' +
1912
1786
  ' Example a value of 132 would be 132-120 would be 12 hours. - 255 Indefinitely'))
1913
- .withCategory('config'),
1914
- e
1915
- .composite('breeze mode', 'breezeMode', ea.STATE_SET)
1916
- .withFeature(e.enum('speed1', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('Step 1 Speed'))
1917
- .withFeature(e.numeric('time1', ea.STATE_SET).withValueMin(1).withValueMax(80).withDescription('Duration (s) for fan in Step 1 '))
1918
- .withFeature(e.enum('speed2', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('Step 2 Speed'))
1919
- .withFeature(e.numeric('time2', ea.STATE_SET).withValueMin(1).withValueMax(80).withDescription('Duration (s) for fan in Step 2 '))
1920
- .withFeature(e.enum('speed3', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('Step 3 Speed'))
1921
- .withFeature(e.numeric('time3', ea.STATE_SET).withValueMin(1).withValueMax(80).withDescription('Duration (s) for fan in Step 3 '))
1922
- .withFeature(e.enum('speed4', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('Step 4 Speed'))
1923
- .withFeature(e.numeric('time4', ea.STATE_SET).withValueMin(1).withValueMax(80).withDescription('Duration (s) for fan in Step 4 '))
1924
- .withFeature(e.enum('speed5', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('Step 5 Speed'))
1925
- .withFeature(e.numeric('time5', ea.STATE_SET).withValueMin(1).withValueMax(80).withDescription('Duration (s) for fan in Step 5 '))
1926
- .withCategory('config'),
1927
- ];
1928
- const exposesListVZM36 = [
1929
- e.light_brightness(),
1930
- e.fan().withModes(Object.keys(fanModes)),
1931
- // Breezee
1932
- e
1787
+ .withCategory('config');
1788
+ };
1789
+ const exposeBreezeMode = () => {
1790
+ return e
1933
1791
  .composite('breeze mode', 'breezeMode', ea.STATE_SET)
1934
1792
  .withFeature(e.enum('speed1', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('Step 1 Speed'))
1935
1793
  .withFeature(e.numeric('time1', ea.STATE_SET).withValueMin(1).withValueMax(80).withDescription('Duration (s) for fan in Step 1 '))
@@ -1941,37 +1799,19 @@ const exposesListVZM36 = [
1941
1799
  .withFeature(e.numeric('time4', ea.STATE_SET).withValueMin(1).withValueMax(80).withDescription('Duration (s) for fan in Step 4 '))
1942
1800
  .withFeature(e.enum('speed5', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('Step 5 Speed'))
1943
1801
  .withFeature(e.numeric('time5', ea.STATE_SET).withValueMin(1).withValueMax(80).withDescription('Duration (s) for fan in Step 5 '))
1944
- .withCategory('config'),
1945
- ];
1802
+ .withCategory('config');
1803
+ };
1804
+ const exposesListVZM30 = [e.light_brightness(), exposeLedEffects(), exposeIndividualLedEffects()];
1805
+ const exposesListVZM31 = [e.light_brightness(), exposeLedEffects(), exposeIndividualLedEffects()];
1806
+ const exposesListVZM35 = [e.fan().withModes(Object.keys(fanModes)), exposeLedEffects(), exposeIndividualLedEffects(), exposeBreezeMode()];
1807
+ const exposesListVZM36 = [e.light_brightness(), e.fan().withModes(Object.keys(fanModes)), exposeBreezeMode()];
1946
1808
  // Populate exposes list from the attributes description
1809
+ attributesToExposeList(VZM30_ATTRIBUTES, exposesListVZM30);
1947
1810
  attributesToExposeList(VZM31_ATTRIBUTES, exposesListVZM31);
1948
1811
  attributesToExposeList(VZM35_ATTRIBUTES, exposesListVZM35);
1949
1812
  attributesToExposeList(VZM36_ATTRIBUTES, exposesListVZM36);
1950
1813
  // Put actions at the bottom of ui
1951
- exposesListVZM31.push(e.action([
1952
- 'down_single',
1953
- 'up_single',
1954
- 'config_single',
1955
- 'down_release',
1956
- 'up_release',
1957
- 'config_release',
1958
- 'down_held',
1959
- 'up_held',
1960
- 'config_held',
1961
- 'down_double',
1962
- 'up_double',
1963
- 'config_double',
1964
- 'down_triple',
1965
- 'up_triple',
1966
- 'config_triple',
1967
- 'down_quadruple',
1968
- 'up_quadruple',
1969
- 'config_quadruple',
1970
- 'down_quintuple',
1971
- 'up_quintuple',
1972
- 'config_quintuple',
1973
- ]));
1974
- exposesListVZM35.push(e.action([
1814
+ const buttonTapSequences = [
1975
1815
  'down_single',
1976
1816
  'up_single',
1977
1817
  'config_single',
@@ -1993,15 +1833,67 @@ exposesListVZM35.push(e.action([
1993
1833
  'down_quintuple',
1994
1834
  'up_quintuple',
1995
1835
  'config_quintuple',
1996
- ]));
1836
+ ];
1837
+ exposesListVZM30.push(e.action(buttonTapSequences));
1838
+ exposesListVZM31.push(e.action(buttonTapSequences));
1839
+ exposesListVZM35.push(e.action(buttonTapSequences));
1997
1840
  const definitions = [
1841
+ {
1842
+ zigbeeModel: ['VZM30-SN'],
1843
+ model: 'VZM30-SN',
1844
+ vendor: 'Inovelli',
1845
+ description: 'On/off switch',
1846
+ exposes: exposesListVZM30.concat((0, modernExtend_1.identify)().exposes),
1847
+ extend: [
1848
+ (0, modernExtend_1.deviceEndpoints)({
1849
+ endpoints: { '1': 1, '2': 2, '3': 3, '4': 4 },
1850
+ multiEndpointSkip: ['state', 'voltage', 'power', 'current', 'energy', 'brightness', 'temperature', 'humidity'],
1851
+ }),
1852
+ inovelliExtend.addCustomClusterInovelli(),
1853
+ (0, modernExtend_1.temperature)(),
1854
+ (0, modernExtend_1.humidity)(),
1855
+ (0, modernExtend_1.electricityMeter)(),
1856
+ ],
1857
+ toZigbee: [
1858
+ tzLocal.light_onoff_brightness_inovelli,
1859
+ toZigbee_1.default.power_on_behavior,
1860
+ toZigbee_1.default.ignore_transition,
1861
+ toZigbee_1.default.identify,
1862
+ tzLocal.inovelli_led_effect,
1863
+ tzLocal.inovelli_individual_led_effect,
1864
+ tzLocal.inovelli_parameters(VZM30_ATTRIBUTES),
1865
+ tzLocal.inovelli_parameters_readOnly(VZM30_ATTRIBUTES),
1866
+ ],
1867
+ fromZigbee: [fromZigbee_1.default.on_off, fromZigbee_1.default.brightness, fromZigbee_1.default.level_config, fromZigbee_1.default.power_on_behavior, fromZigbee_1.default.ignore_basic_report, fzLocal.inovelli(VZM30_ATTRIBUTES)],
1868
+ ota: true,
1869
+ configure: async (device, coordinatorEndpoint) => {
1870
+ const endpoint = device.getEndpoint(1);
1871
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
1872
+ await reporting.onOff(endpoint);
1873
+ // Bind for Button Event Reporting
1874
+ const endpoint2 = device.getEndpoint(2);
1875
+ await reporting.bind(endpoint2, coordinatorEndpoint, ['manuSpecificInovelli']);
1876
+ },
1877
+ },
1998
1878
  {
1999
1879
  zigbeeModel: ['VZM31-SN'],
2000
1880
  model: 'VZM31-SN',
2001
1881
  vendor: 'Inovelli',
2002
1882
  description: '2-in-1 switch + dimmer',
2003
1883
  exposes: exposesListVZM31.concat((0, modernExtend_1.identify)().exposes),
2004
- extend: [inovelliExtend.addCustomClusterInovelli()],
1884
+ extend: [
1885
+ (0, modernExtend_1.deviceEndpoints)({
1886
+ endpoints: { '1': 1, '2': 2, '3': 3 },
1887
+ multiEndpointSkip: ['state', 'power', 'energy', 'brightness'],
1888
+ }),
1889
+ inovelliExtend.addCustomClusterInovelli(),
1890
+ (0, modernExtend_1.electricityMeter)({
1891
+ current: false,
1892
+ voltage: false,
1893
+ power: { min: 15, max: 3600, change: 1 },
1894
+ energy: { min: 15, max: 3600, change: 0 },
1895
+ }),
1896
+ ],
2005
1897
  toZigbee: [
2006
1898
  tzLocal.light_onoff_brightness_inovelli,
2007
1899
  toZigbee_1.default.power_on_behavior,
@@ -2012,32 +1904,15 @@ const definitions = [
2012
1904
  tzLocal.inovelli_parameters(VZM31_ATTRIBUTES),
2013
1905
  tzLocal.inovelli_parameters_readOnly(VZM31_ATTRIBUTES),
2014
1906
  ],
2015
- fromZigbee: [
2016
- fromZigbee_1.default.on_off,
2017
- fromZigbee_1.default.brightness,
2018
- fromZigbee_1.default.level_config,
2019
- fromZigbee_1.default.power_on_behavior,
2020
- fromZigbee_1.default.ignore_basic_report,
2021
- fromZigbee_1.default.electrical_measurement,
2022
- fromZigbee_1.default.metering,
2023
- fzLocal.inovelli(VZM31_ATTRIBUTES),
2024
- ],
1907
+ fromZigbee: [fromZigbee_1.default.on_off, fromZigbee_1.default.brightness, fromZigbee_1.default.level_config, fromZigbee_1.default.power_on_behavior, fromZigbee_1.default.ignore_basic_report, fzLocal.inovelli(VZM31_ATTRIBUTES)],
2025
1908
  ota: true,
2026
1909
  configure: async (device, coordinatorEndpoint) => {
2027
1910
  const endpoint = device.getEndpoint(1);
2028
- await reporting.bind(endpoint, coordinatorEndpoint, ['seMetering', 'haElectricalMeasurement', 'genOnOff', 'genLevelCtrl']);
1911
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
2029
1912
  await reporting.onOff(endpoint);
2030
1913
  // Bind for Button Event Reporting
2031
1914
  const endpoint2 = device.getEndpoint(2);
2032
1915
  await reporting.bind(endpoint2, coordinatorEndpoint, ['manuSpecificInovelli']);
2033
- await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
2034
- await reporting.readMeteringMultiplierDivisor(endpoint);
2035
- await reporting.activePower(endpoint, { min: 15, max: 3600, change: 1 });
2036
- await reporting.currentSummDelivered(endpoint, {
2037
- min: 15,
2038
- max: 3600,
2039
- change: 0,
2040
- });
2041
1916
  },
2042
1917
  },
2043
1918
  {
@@ -2045,11 +1920,11 @@ const definitions = [
2045
1920
  model: 'VZM35-SN',
2046
1921
  vendor: 'Inovelli',
2047
1922
  description: 'Fan controller',
2048
- fromZigbee: [fzLocal.fan_state, fzLocal.fan_mode, fzLocal.breeze_mode, fzLocal.inovelli(VZM35_ATTRIBUTES)],
1923
+ fromZigbee: [fzLocal.fan_state, fzLocal.fan_mode(1), fzLocal.breeze_mode, fzLocal.inovelli(VZM35_ATTRIBUTES)],
2049
1924
  toZigbee: [
2050
1925
  toZigbee_1.default.identify,
2051
1926
  tzLocal.fan_state,
2052
- tzLocal.fan_mode,
1927
+ tzLocal.fan_mode(1),
2053
1928
  tzLocal.inovelli_led_effect,
2054
1929
  tzLocal.inovelli_individual_led_effect,
2055
1930
  tzLocal.inovelli_parameters(VZM35_ATTRIBUTES),
@@ -2072,17 +1947,11 @@ const definitions = [
2072
1947
  model: 'VZM36',
2073
1948
  vendor: 'Inovelli',
2074
1949
  description: 'Fan canopy module',
2075
- fromZigbee: [
2076
- fzLocal.brightness,
2077
- fzLocal.vzm36_fan_light_state,
2078
- fzLocal.vzm36_fan_mode,
2079
- fzLocal.breeze_mode,
2080
- fzLocal.inovelli(VZM36_ATTRIBUTES),
2081
- ],
1950
+ fromZigbee: [fzLocal.brightness, fzLocal.vzm36_fan_light_state, fzLocal.fan_mode(2), fzLocal.breeze_mode, fzLocal.inovelli(VZM36_ATTRIBUTES)],
2082
1951
  toZigbee: [
2083
1952
  toZigbee_1.default.identify,
2084
1953
  tzLocal.vzm36_fan_on_off, // Need to use VZM36 specific converter
2085
- tzLocal.vzm36_fan_mode, // Need to use VZM36 specific converter
1954
+ tzLocal.fan_mode(2),
2086
1955
  tzLocal.light_onoff_brightness_inovelli,
2087
1956
  tzLocal.inovelli_parameters(VZM36_ATTRIBUTES),
2088
1957
  tzLocal.inovelli_parameters_readOnly(VZM36_ATTRIBUTES),