zigbee-herdsman-converters 21.2.1 → 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.
- package/CHANGELOG.md +66 -0
- package/converters/toZigbee.d.ts +0 -9
- package/converters/toZigbee.d.ts.map +1 -1
- package/converters/toZigbee.js +0 -16
- package/converters/toZigbee.js.map +1 -1
- package/devices/amina.js +8 -8
- package/devices/amina.js.map +1 -1
- package/devices/custom_devices_diy.d.ts.map +1 -1
- package/devices/custom_devices_diy.js +30 -19
- package/devices/custom_devices_diy.js.map +1 -1
- package/devices/danfoss.d.ts.map +1 -1
- package/devices/danfoss.js +2 -1
- package/devices/danfoss.js.map +1 -1
- package/devices/elko.d.ts.map +1 -1
- package/devices/elko.js +14 -8
- package/devices/elko.js.map +1 -1
- package/devices/heiman.d.ts.map +1 -1
- package/devices/heiman.js +1 -0
- package/devices/heiman.js.map +1 -1
- package/devices/ikea.js +3 -3
- package/devices/ikea.js.map +1 -1
- package/devices/index.d.ts.map +1 -1
- package/devices/index.js +2 -0
- package/devices/index.js.map +1 -1
- package/devices/innr.d.ts.map +1 -1
- package/devices/innr.js +7 -0
- package/devices/innr.js.map +1 -1
- package/devices/inovelli.d.ts.map +1 -1
- package/devices/inovelli.js +162 -293
- package/devices/inovelli.js.map +1 -1
- package/devices/mazda.d.ts +4 -0
- package/devices/mazda.d.ts.map +1 -0
- package/devices/mazda.js +142 -0
- package/devices/mazda.js.map +1 -0
- package/devices/miboxer.d.ts.map +1 -1
- package/devices/miboxer.js +2 -1
- package/devices/miboxer.js.map +1 -1
- package/devices/moes.d.ts.map +1 -1
- package/devices/moes.js +5 -1
- package/devices/moes.js.map +1 -1
- package/devices/neo.js +1 -1
- package/devices/neo.js.map +1 -1
- package/devices/rademacher.d.ts.map +1 -1
- package/devices/rademacher.js +7 -0
- package/devices/rademacher.js.map +1 -1
- package/devices/saswell.d.ts.map +1 -1
- package/devices/saswell.js +2 -0
- package/devices/saswell.js.map +1 -1
- package/devices/schneider_electric.d.ts.map +1 -1
- package/devices/schneider_electric.js +89 -0
- package/devices/schneider_electric.js.map +1 -1
- package/devices/smlight.d.ts.map +1 -1
- package/devices/smlight.js +9 -10
- package/devices/smlight.js.map +1 -1
- package/devices/sonoff.d.ts.map +1 -1
- package/devices/sonoff.js +11 -3
- package/devices/sonoff.js.map +1 -1
- package/devices/tech.d.ts.map +1 -1
- package/devices/tech.js +4 -1
- package/devices/tech.js.map +1 -1
- package/devices/third_reality.d.ts.map +1 -1
- package/devices/third_reality.js +7 -3
- package/devices/third_reality.js.map +1 -1
- package/devices/tuya.d.ts.map +1 -1
- package/devices/tuya.js +310 -20
- package/devices/tuya.js.map +1 -1
- package/lib/lumi.d.ts.map +1 -1
- package/lib/lumi.js +4 -0
- package/lib/lumi.js.map +1 -1
- package/lib/modernExtend.d.ts +18 -0
- package/lib/modernExtend.d.ts.map +1 -1
- package/lib/modernExtend.js +42 -0
- package/lib/modernExtend.js.map +1 -1
- package/lib/ota.js +1 -1
- package/lib/ota.js.map +1 -1
- package/lib/tuya.js +1 -1
- package/lib/tuya.js.map +1 -1
- package/package.json +5 -5
package/devices/inovelli.js
CHANGED
|
@@ -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
|
|
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
|
-
...
|
|
1019
|
+
...COMMON_DIMMER_ATTRIBUTES,
|
|
1003
1020
|
minimumLevel: {
|
|
1004
|
-
...
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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: { ...
|
|
1063
|
-
maximumLevel_1: { ...
|
|
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: { ...
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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
|
-
|
|
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
|
-
|
|
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 ==
|
|
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
|
|
1765
|
-
e
|
|
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
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
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
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
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
|
-
|
|
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: [
|
|
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, ['
|
|
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.
|
|
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),
|