mclimate-payload-helper 1.2.6 → 1.2.8
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/.eslintrc.cjs +18 -0
- package/.husky/pre-commit +6 -0
- package/CLAUDE.md +10 -1
- package/add-encoder-command-existing.md +51 -51
- package/add-encoder-command-new.md +51 -51
- package/dist/decoders/commandsReadingHelper.d.ts.map +1 -1
- package/dist/decoders/commandsReadingHelper.js +240 -202
- package/dist/decoders/commandsReadingHelper.js.map +1 -1
- package/dist/decoders/payloadParsers/AQISensorPayloadParser.js +5 -5
- package/dist/decoders/payloadParsers/AQISensorPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/CO2DisplayLitePayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/CO2DisplayLitePayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/CO2DisplayLitePayloadParser.js +18 -18
- package/dist/decoders/payloadParsers/CO2DisplayLitePayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/CO2DisplayPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/CO2DisplayPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/CO2DisplayPayloadParser.js +19 -19
- package/dist/decoders/payloadParsers/CO2DisplayPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/CO2SensorPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/CO2SensorPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/CO2SensorPayloadParser.js +3 -3
- package/dist/decoders/payloadParsers/CO2SensorPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/DskDevicePayloadParser.js +11 -11
- package/dist/decoders/payloadParsers/DskDevicePayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/FanCoilThermostatPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/FanCoilThermostatPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/FanCoilThermostatPayloadParser.js +1 -1
- package/dist/decoders/payloadParsers/FanCoilThermostatPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/ThermostatPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/ThermostatPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/ThermostatPayloadParser.js +32 -40
- package/dist/decoders/payloadParsers/ThermostatPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/WirelessThermostatPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/WirelessThermostatPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/WirelessThermostatPayloadParser.js +13 -13
- package/dist/decoders/payloadParsers/WirelessThermostatPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/buttonPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/buttonPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/buttonPayloadParser.js +6 -6
- package/dist/decoders/payloadParsers/buttonPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/co2PirLitePayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/co2PirLitePayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/co2PirLitePayloadParser.js +31 -29
- package/dist/decoders/payloadParsers/co2PirLitePayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/htDisplayLitePayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/htDisplayLitePayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/htDisplayLitePayloadParser.js +17 -17
- package/dist/decoders/payloadParsers/htDisplayLitePayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/htPirLitePayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/htPirLitePayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/htPirLitePayloadParser.js +26 -26
- package/dist/decoders/payloadParsers/htPirLitePayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/htSensorPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/htSensorPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/htSensorPayloadParser.js +16 -16
- package/dist/decoders/payloadParsers/htSensorPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/melissaLorawanPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/melissaLorawanPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/melissaLorawanPayloadParser.js +8 -8
- package/dist/decoders/payloadParsers/melissaLorawanPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/multisensorPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/multisensorPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/multisensorPayloadParser.js +4 -5
- package/dist/decoders/payloadParsers/multisensorPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/openCloseSensorPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/openCloseSensorPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/openCloseSensorPayloadParser.js +23 -20
- package/dist/decoders/payloadParsers/openCloseSensorPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/relay16DryPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/relay16DryPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/relay16DryPayloadParser.js +8 -8
- package/dist/decoders/payloadParsers/relay16DryPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/relay16PayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/relay16PayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/relay16PayloadParser.js +8 -8
- package/dist/decoders/payloadParsers/relay16PayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/tFloodPayloadParser.js +7 -7
- package/dist/decoders/payloadParsers/tFloodPayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/tValvePayloadParser.js +4 -4
- package/dist/decoders/payloadParsers/tValvePayloadParser.js.map +1 -1
- package/dist/decoders/payloadParsers/uplinkPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/uplinkPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/vickiPayloadParser.d.ts +1 -1
- package/dist/decoders/payloadParsers/vickiPayloadParser.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/vickiPayloadParser.js +25 -25
- package/dist/decoders/payloadParsers/vickiPayloadParser.js.map +1 -1
- package/dist/encoders/Co2DisplayCommands.js +1 -1
- package/dist/encoders/Co2DisplayCommands.js.map +1 -1
- package/dist/encoders/Co2DisplayLiteCommands.js +1 -1
- package/dist/encoders/Co2DisplayLiteCommands.js.map +1 -1
- package/dist/encoders/Co2PirLiteCommands.d.ts +6 -2
- package/dist/encoders/Co2PirLiteCommands.d.ts.map +1 -1
- package/dist/encoders/Co2PirLiteCommands.js +66 -13
- package/dist/encoders/Co2PirLiteCommands.js.map +1 -1
- package/dist/encoders/CommandBuilder.d.ts +2 -2
- package/dist/encoders/CommandBuilder.d.ts.map +1 -1
- package/dist/encoders/CommandBuilder.js +4 -2
- package/dist/encoders/CommandBuilder.js.map +1 -1
- package/dist/encoders/HTPirLiteCommands.d.ts +6 -2
- package/dist/encoders/HTPirLiteCommands.d.ts.map +1 -1
- package/dist/encoders/HTPirLiteCommands.js +67 -18
- package/dist/encoders/HTPirLiteCommands.js.map +1 -1
- package/dist/encoders/MelissaCommands.d.ts.map +1 -1
- package/dist/encoders/MelissaCommands.js.map +1 -1
- package/dist/encoders/Relay16DryCommands.d.ts.map +1 -1
- package/dist/encoders/Relay16DryCommands.js +1 -3
- package/dist/encoders/Relay16DryCommands.js.map +1 -1
- package/dist/encoders/VickiCommands.d.ts.map +1 -1
- package/dist/encoders/VickiCommands.js +5 -7
- package/dist/encoders/VickiCommands.js.map +1 -1
- package/dist/encoders/types/schemas.d.ts +80 -170
- package/dist/encoders/types/schemas.d.ts.map +1 -1
- package/dist/encoders/types/schemas.js +30 -7
- package/dist/encoders/types/schemas.js.map +1 -1
- package/dist/test/payloadDecoders.test.js +54 -44
- package/dist/test/payloadDecoders.test.js.map +1 -1
- package/dist/test/payloadEncoders.test.js +50 -34
- package/dist/test/payloadEncoders.test.js.map +1 -1
- package/dist/utils/delMethods.d.ts +1 -1
- package/dist/utils/delMethods.d.ts.map +1 -1
- package/dist/utils/delMethods.js +3 -2
- package/dist/utils/delMethods.js.map +1 -1
- package/dist/utils/mixin.d.ts +1 -1
- package/dist/utils/mixin.d.ts.map +1 -1
- package/dist/utils/mixin.js +4 -1
- package/dist/utils/mixin.js.map +1 -1
- package/package.json +13 -2
- package/src/decoders/commandsReadingHelper.ts +239 -203
- package/src/decoders/payloadParsers/AQISensorPayloadParser.ts +5 -5
- package/src/decoders/payloadParsers/CO2DisplayLitePayloadParser.ts +19 -19
- package/src/decoders/payloadParsers/CO2DisplayPayloadParser.ts +19 -19
- package/src/decoders/payloadParsers/CO2SensorPayloadParser.ts +4 -4
- package/src/decoders/payloadParsers/DskDevicePayloadParser.ts +11 -11
- package/src/decoders/payloadParsers/FanCoilThermostatPayloadParser.ts +3 -3
- package/src/decoders/payloadParsers/ThermostatPayloadParser.ts +32 -42
- package/src/decoders/payloadParsers/WirelessThermostatPayloadParser.ts +16 -14
- package/src/decoders/payloadParsers/buttonPayloadParser.ts +6 -6
- package/src/decoders/payloadParsers/co2PirLitePayloadParser.ts +44 -40
- package/src/decoders/payloadParsers/htDisplayLitePayloadParser.ts +17 -17
- package/src/decoders/payloadParsers/htPirLitePayloadParser.ts +37 -35
- package/src/decoders/payloadParsers/htSensorPayloadParser.ts +17 -17
- package/src/decoders/payloadParsers/melissaLorawanPayloadParser.ts +11 -11
- package/src/decoders/payloadParsers/multisensorPayloadParser.ts +75 -77
- package/src/decoders/payloadParsers/openCloseSensorPayloadParser.ts +40 -36
- package/src/decoders/payloadParsers/relay16DryPayloadParser.ts +10 -10
- package/src/decoders/payloadParsers/relay16PayloadParser.ts +10 -10
- package/src/decoders/payloadParsers/tFloodPayloadParser.ts +7 -7
- package/src/decoders/payloadParsers/tValvePayloadParser.ts +4 -4
- package/src/decoders/payloadParsers/vickiPayloadParser.ts +28 -28
- package/src/encoders/Co2DisplayCommands.ts +1 -1
- package/src/encoders/Co2DisplayLiteCommands.ts +2 -2
- package/src/encoders/Co2PirLiteCommands.ts +66 -15
- package/src/encoders/CommandBuilder.ts +5 -3
- package/src/encoders/HTPirLiteCommands.ts +81 -34
- package/src/encoders/MelissaCommands.ts +20 -24
- package/src/encoders/Relay16DryCommands.ts +3 -6
- package/src/encoders/VickiCommands.ts +23 -53
- package/src/encoders/index.ts +0 -1
- package/src/encoders/types/schemas.ts +51 -12
- package/src/test/payloadDecoders.test.ts +114 -99
- package/src/test/payloadEncoders.test.ts +111 -92
- package/src/utils/delMethods.ts +6 -3
- package/src/utils/mixin.ts +5 -2
|
@@ -4,9 +4,9 @@ exports.commandsReadingHelper = void 0;
|
|
|
4
4
|
const types_1 = require("../decoders/payloadParsers/types");
|
|
5
5
|
const utils_1 = require("../utils");
|
|
6
6
|
const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const resultToPass = {};
|
|
8
|
+
const data = hexData;
|
|
9
|
+
const commands = data.match(/.{1,2}/g);
|
|
10
10
|
let command_len = 0;
|
|
11
11
|
const decbin = (byte) => {
|
|
12
12
|
return byte.toString(2).padStart(8, '0');
|
|
@@ -15,7 +15,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
15
15
|
let decodeKeepalive = false;
|
|
16
16
|
const potentialKeepAlive = commands.slice(-payloadLength / 2);
|
|
17
17
|
if (potentialKeepAlive[0] === '81' &&
|
|
18
|
-
(deviceType === types_1.DeviceType.Vicki ||
|
|
18
|
+
(deviceType === types_1.DeviceType.Vicki ||
|
|
19
|
+
deviceType === types_1.DeviceType.WirelessThermostat ||
|
|
20
|
+
deviceType === types_1.DeviceType.MultiSensor)) {
|
|
19
21
|
decodeKeepalive = true;
|
|
20
22
|
}
|
|
21
23
|
else if ((potentialKeepAlive[0] === '00' || potentialKeepAlive[0] === '88') && deviceType === types_1.DeviceType.TFlood) {
|
|
@@ -52,7 +54,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
52
54
|
try {
|
|
53
55
|
if (deviceType === types_1.DeviceType.TFlood) {
|
|
54
56
|
command_len = payloadLength / 2;
|
|
55
|
-
|
|
57
|
+
const data = { decodeKeepalive: true };
|
|
56
58
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
57
59
|
}
|
|
58
60
|
}
|
|
@@ -71,7 +73,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
71
73
|
{
|
|
72
74
|
try {
|
|
73
75
|
command_len = payloadLength / 2;
|
|
74
|
-
|
|
76
|
+
const data = { decodeKeepalive: true };
|
|
75
77
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
76
78
|
}
|
|
77
79
|
catch (e) {
|
|
@@ -89,7 +91,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
89
91
|
{
|
|
90
92
|
try {
|
|
91
93
|
command_len = payloadLength / 2;
|
|
92
|
-
|
|
94
|
+
const data = { decodeKeepalive: true };
|
|
93
95
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
94
96
|
}
|
|
95
97
|
catch (e) {
|
|
@@ -107,9 +109,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
107
109
|
{
|
|
108
110
|
try {
|
|
109
111
|
command_len = 2;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
112
|
+
const hardwareVersion = commands[i + 1];
|
|
113
|
+
const softwareVersion = commands[i + 2];
|
|
114
|
+
const data = { deviceVersions: { hardware: Number(hardwareVersion), software: Number(softwareVersion) } };
|
|
113
115
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
114
116
|
}
|
|
115
117
|
catch (e) {
|
|
@@ -127,7 +129,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
127
129
|
{
|
|
128
130
|
try {
|
|
129
131
|
command_len = 1;
|
|
130
|
-
|
|
132
|
+
const data = { targetTemperatureStep: parseInt(commands[i + 1], 16) / 10 };
|
|
131
133
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
132
134
|
}
|
|
133
135
|
catch (e) {
|
|
@@ -147,13 +149,13 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
147
149
|
command_len = 1;
|
|
148
150
|
if (deviceType === types_1.DeviceType.MelissaLorawan) {
|
|
149
151
|
command_len = 2;
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
const codeAddress = (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16);
|
|
153
|
+
const codeAddressRaw = `${commands[i + 1]}${commands[i + 2]}`;
|
|
154
|
+
const data = { preloadedCode: { codeAddress, codeAddressRaw } };
|
|
153
155
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
154
156
|
}
|
|
155
157
|
else {
|
|
156
|
-
|
|
158
|
+
const data = { alarmDuration: parseInt(commands[i + 1], 16) };
|
|
157
159
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
158
160
|
}
|
|
159
161
|
}
|
|
@@ -172,9 +174,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
172
174
|
{
|
|
173
175
|
try {
|
|
174
176
|
command_len = 2;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
177
|
+
const hardwareVersion = commands[i + 1];
|
|
178
|
+
const softwareVersion = commands[i + 2];
|
|
179
|
+
const data = { deviceVersions: { hardware: Number(hardwareVersion), software: Number(softwareVersion) } };
|
|
178
180
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
179
181
|
}
|
|
180
182
|
catch (e) {
|
|
@@ -192,7 +194,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
192
194
|
{
|
|
193
195
|
try {
|
|
194
196
|
command_len = 1;
|
|
195
|
-
|
|
197
|
+
const data = { floodEventSendTime: parseInt(commands[i + 1], 16) };
|
|
196
198
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
197
199
|
}
|
|
198
200
|
catch (e) {
|
|
@@ -212,8 +214,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
212
214
|
let data;
|
|
213
215
|
if (deviceType === types_1.DeviceType.MelissaLorawan) {
|
|
214
216
|
command_len = 4;
|
|
215
|
-
|
|
216
|
-
|
|
217
|
+
const recordedIrCodeSize = (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16);
|
|
218
|
+
const bytesSent = `${commands[i + 3]}${commands[i + 4]}`;
|
|
217
219
|
data = { recordedIrInfo: { recordedIrCodeSize, bytesSent } };
|
|
218
220
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
219
221
|
}
|
|
@@ -272,9 +274,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
272
274
|
{
|
|
273
275
|
try {
|
|
274
276
|
command_len = 4;
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
277
|
+
const openingTime = (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16);
|
|
278
|
+
const closingTime = (parseInt(commands[i + 3], 16) << 8) | parseInt(commands[i + 4], 16);
|
|
279
|
+
const data = { openCloseTimeExtended: { openingTime: Number(openingTime), closingTime: Number(closingTime) } };
|
|
278
280
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
279
281
|
}
|
|
280
282
|
catch (e) {
|
|
@@ -292,7 +294,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
292
294
|
{
|
|
293
295
|
try {
|
|
294
296
|
command_len = 1;
|
|
295
|
-
|
|
297
|
+
const data = { emergencyOpenings: parseInt(commands[i + 1], 16) };
|
|
296
298
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
297
299
|
}
|
|
298
300
|
catch (e) {
|
|
@@ -310,7 +312,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
310
312
|
{
|
|
311
313
|
try {
|
|
312
314
|
command_len = 1;
|
|
313
|
-
|
|
315
|
+
const data = { floodAlarmTime: parseInt(commands[i + 1], 16) };
|
|
314
316
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
315
317
|
}
|
|
316
318
|
catch (e) {
|
|
@@ -328,7 +330,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
328
330
|
{
|
|
329
331
|
try {
|
|
330
332
|
command_len = 1;
|
|
331
|
-
|
|
333
|
+
const data = { workingVoltage: parseInt(commands[i + 1], 16) * 8 + 1600 };
|
|
332
334
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
333
335
|
}
|
|
334
336
|
catch (e) {
|
|
@@ -374,12 +376,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
374
376
|
}
|
|
375
377
|
else {
|
|
376
378
|
command_len = 4;
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
379
|
+
const enabled = !!parseInt(commands[i + 1], 16);
|
|
380
|
+
const duration = parseInt(commands[i + 2], 16) * 5;
|
|
381
|
+
const motorPos1 = parseInt(commands[i + 4], 16) >> 4; // upper 4 bits of Byte 4
|
|
382
|
+
const motorPos2 = parseInt(commands[i + 3], 16) & 0xff; // lower 8 bits of Byte 3
|
|
383
|
+
const motorPosition = (motorPos1 << 8) | motorPos2;
|
|
384
|
+
const delta = parseInt(commands[i + 4], 16) & 0x0f; // lower 4 bits of Byte 4
|
|
383
385
|
data = { openWindowParams: { enabled: enabled, duration: duration, motorPosition: motorPosition, delta: delta } };
|
|
384
386
|
}
|
|
385
387
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -428,7 +430,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
428
430
|
{
|
|
429
431
|
try {
|
|
430
432
|
command_len = 2;
|
|
431
|
-
|
|
433
|
+
const data = {
|
|
432
434
|
temperatureRangeSettings: { min: parseInt(commands[i + 1], 16), max: parseInt(commands[i + 2], 16) },
|
|
433
435
|
};
|
|
434
436
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -450,8 +452,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
450
452
|
let data;
|
|
451
453
|
if (deviceType === types_1.DeviceType.TValve) {
|
|
452
454
|
command_len = 1;
|
|
453
|
-
|
|
454
|
-
|
|
455
|
+
const commandResponse = parseInt(commands[i + 1], 16);
|
|
456
|
+
const periodInMinutes = (commandResponse * 5) / 60;
|
|
455
457
|
data = { joinRetryPeriod: periodInMinutes };
|
|
456
458
|
}
|
|
457
459
|
else {
|
|
@@ -538,9 +540,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
538
540
|
{
|
|
539
541
|
try {
|
|
540
542
|
command_len = 1;
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
543
|
+
const commandResponse = parseInt(commands[i + 1], 16);
|
|
544
|
+
const periodInMinutes = (commandResponse * 5) / 60;
|
|
545
|
+
const data = { joinRetryPeriod: periodInMinutes };
|
|
544
546
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
545
547
|
}
|
|
546
548
|
catch (e) {
|
|
@@ -558,9 +560,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
558
560
|
{
|
|
559
561
|
try {
|
|
560
562
|
command_len = 2;
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
563
|
+
const wdpC = commands[i + 1] == '00' ? false : parseInt(commands[i + 1], 16);
|
|
564
|
+
const wdpUc = commands[i + 2] == '00' ? false : parseInt(commands[i + 2], 16);
|
|
565
|
+
const data = { watchDogParams: { wdpC, wdpUc } };
|
|
564
566
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
565
567
|
}
|
|
566
568
|
catch (e) {
|
|
@@ -578,7 +580,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
578
580
|
{
|
|
579
581
|
try {
|
|
580
582
|
command_len = 1;
|
|
581
|
-
|
|
583
|
+
const data = { uplinkType: commands[i + 1] };
|
|
582
584
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
583
585
|
}
|
|
584
586
|
catch (e) {
|
|
@@ -596,9 +598,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
596
598
|
{
|
|
597
599
|
try {
|
|
598
600
|
command_len = 2;
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
601
|
+
const wdpC = commands[i + 1] == '00' ? false : parseInt(commands[i + 1], 16);
|
|
602
|
+
const wdpUc = commands[i + 2] == '00' ? false : parseInt(commands[i + 2], 16);
|
|
603
|
+
const data = { watchDogParams: { wdpC, wdpUc } };
|
|
602
604
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
603
605
|
}
|
|
604
606
|
catch (e) {
|
|
@@ -617,41 +619,41 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
617
619
|
try {
|
|
618
620
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
619
621
|
command_len = 1;
|
|
620
|
-
|
|
622
|
+
const data = { primaryOperationalMode: commands[i + 1] };
|
|
621
623
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
622
624
|
}
|
|
623
625
|
else if (deviceType === types_1.DeviceType.DskDevice) {
|
|
624
626
|
command_len = 1;
|
|
625
|
-
|
|
627
|
+
const data = { status: parseInt(commands[i + 1], 16) };
|
|
626
628
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
627
629
|
}
|
|
628
630
|
else if (deviceType === types_1.DeviceType.OpenCloseSensor) {
|
|
629
631
|
command_len = 1;
|
|
630
|
-
|
|
632
|
+
const data = { notificationBlindTime: parseInt(commands[i + 1], 16) };
|
|
631
633
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
632
634
|
}
|
|
633
635
|
else if (deviceType === types_1.DeviceType.MCButton) {
|
|
634
636
|
command_len = 1;
|
|
635
|
-
|
|
637
|
+
const data = { sendEventLater: parseInt(commands[i + 1], 16) };
|
|
636
638
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
637
639
|
}
|
|
638
640
|
else if (deviceType === types_1.DeviceType.Relay16) {
|
|
639
641
|
command_len = 2;
|
|
640
|
-
|
|
642
|
+
const data = {
|
|
641
643
|
overheatingThresholds: { trigger: parseInt(commands[i + 1], 16), recovery: parseInt(commands[i + 2], 16) },
|
|
642
644
|
};
|
|
643
645
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
644
646
|
}
|
|
645
647
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
646
648
|
command_len = 1;
|
|
647
|
-
|
|
649
|
+
const data = { lightEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
648
650
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
649
651
|
}
|
|
650
652
|
else {
|
|
651
653
|
command_len = 4;
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
654
|
+
const good_medium = parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16);
|
|
655
|
+
const medium_bad = parseInt(`${commands[i + 3]}${commands[i + 4]}`, 16);
|
|
656
|
+
const data = { boundaryLevels: { good_medium: Number(good_medium), medium_bad: Number(medium_bad) } };
|
|
655
657
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
656
658
|
}
|
|
657
659
|
}
|
|
@@ -671,7 +673,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
671
673
|
try {
|
|
672
674
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
673
675
|
command_len = 6;
|
|
674
|
-
|
|
676
|
+
const data = {
|
|
675
677
|
batteryRangesBoundaries: {
|
|
676
678
|
Boundary1: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16),
|
|
677
679
|
Boundary2: parseInt(`${commands[i + 3]}${commands[i + 4]}`, 16),
|
|
@@ -682,7 +684,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
682
684
|
}
|
|
683
685
|
else if (deviceType === types_1.DeviceType.Relay16) {
|
|
684
686
|
command_len = 3;
|
|
685
|
-
|
|
687
|
+
const data = {
|
|
686
688
|
overvoltageThresholds: {
|
|
687
689
|
trigger: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16),
|
|
688
690
|
recovery: parseInt(commands[i + 3], 16),
|
|
@@ -692,12 +694,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
692
694
|
}
|
|
693
695
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
694
696
|
command_len = 1;
|
|
695
|
-
|
|
697
|
+
const data = { hallEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
696
698
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
697
699
|
}
|
|
698
700
|
else if (deviceType !== types_1.DeviceType.OpenCloseSensor) {
|
|
699
701
|
command_len = 2;
|
|
700
|
-
|
|
702
|
+
const data = { autoZeroValue: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) };
|
|
701
703
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
702
704
|
}
|
|
703
705
|
}
|
|
@@ -717,7 +719,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
717
719
|
try {
|
|
718
720
|
if (deviceType === types_1.DeviceType.DskDevice) {
|
|
719
721
|
command_len = 2;
|
|
720
|
-
|
|
722
|
+
const data = { onTime: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) };
|
|
721
723
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
722
724
|
}
|
|
723
725
|
}
|
|
@@ -737,7 +739,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
737
739
|
try {
|
|
738
740
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
739
741
|
command_len = 4;
|
|
740
|
-
|
|
742
|
+
const data = {
|
|
741
743
|
batteryRangesOverVoltage: {
|
|
742
744
|
Range1: parseInt(commands[i + 2], 16),
|
|
743
745
|
Range2: parseInt(commands[i + 3], 16),
|
|
@@ -748,25 +750,25 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
748
750
|
}
|
|
749
751
|
else if (deviceType === types_1.DeviceType.DskDevice) {
|
|
750
752
|
command_len = 2;
|
|
751
|
-
|
|
753
|
+
const data = { offTime: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) };
|
|
752
754
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
753
755
|
}
|
|
754
756
|
else if (deviceType === types_1.DeviceType.Relay16) {
|
|
755
757
|
command_len = 1;
|
|
756
|
-
|
|
758
|
+
const data = { overcurrentThreshold: parseInt(commands[i + 1], 16) };
|
|
757
759
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
758
760
|
}
|
|
759
761
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
760
762
|
command_len = 2;
|
|
761
|
-
|
|
763
|
+
const data = { hallBlindPeriod: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16) };
|
|
762
764
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
763
765
|
}
|
|
764
766
|
else {
|
|
765
767
|
command_len = 3;
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
768
|
+
const good_zone = parseInt(commands[i + 1], 16);
|
|
769
|
+
const medium_zone = parseInt(commands[i + 2], 16);
|
|
770
|
+
const bad_zone = parseInt(commands[i + 3], 16);
|
|
771
|
+
const data = {
|
|
770
772
|
notifyPeriod: { good_zone: Number(good_zone), medium_zone: Number(medium_zone), bad_zone: Number(bad_zone) },
|
|
771
773
|
};
|
|
772
774
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -836,9 +838,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
836
838
|
}
|
|
837
839
|
else {
|
|
838
840
|
command_len = 3;
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
841
|
+
const good_zone = parseInt(commands[i + 1], 16);
|
|
842
|
+
const medium_zone = parseInt(commands[i + 2], 16);
|
|
843
|
+
const bad_zone = parseInt(commands[i + 3], 16);
|
|
842
844
|
data = {
|
|
843
845
|
measurementPeriod: {
|
|
844
846
|
good_zone: Number(good_zone),
|
|
@@ -865,28 +867,28 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
865
867
|
try {
|
|
866
868
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
867
869
|
command_len = 1;
|
|
868
|
-
|
|
870
|
+
const data = { OVAC: parseInt(commands[i + 1], 16) };
|
|
869
871
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
870
872
|
}
|
|
871
873
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
872
874
|
command_len = 2;
|
|
873
|
-
|
|
875
|
+
const data = {
|
|
874
876
|
microphoneSamplingPeriod: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16),
|
|
875
877
|
};
|
|
876
878
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
877
879
|
}
|
|
878
880
|
else {
|
|
879
881
|
command_len = 9;
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
882
|
+
const duration_good_beeping = parseInt(commands[i + 1], 16);
|
|
883
|
+
const duration_good_loud = parseInt(commands[i + 2], 16) * 10;
|
|
884
|
+
const duration_good_silent = parseInt(commands[i + 3], 16) * 10;
|
|
885
|
+
const duration_medium_beeping = parseInt(commands[i + 4], 16);
|
|
886
|
+
const duration_medium_loud = parseInt(commands[i + 5], 16) * 10;
|
|
887
|
+
const duration_medium_silent = parseInt(commands[i + 6], 16) * 10;
|
|
888
|
+
const duration_bad_beeping = parseInt(commands[i + 7], 16);
|
|
889
|
+
const duration_bad_loud = parseInt(commands[i + 8], 16) * 10;
|
|
890
|
+
const duration_bad_silent = parseInt(commands[i + 9], 16) * 10;
|
|
891
|
+
const data = {
|
|
890
892
|
buzzerNotification: {
|
|
891
893
|
duration_good_beeping: Number(duration_good_beeping),
|
|
892
894
|
duration_good_loud: Number(duration_good_loud),
|
|
@@ -916,7 +918,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
916
918
|
case '28':
|
|
917
919
|
{
|
|
918
920
|
command_len = 1;
|
|
919
|
-
|
|
921
|
+
const data = { manualTargetTemperatureUpdate: parseInt(commands[i + 1], 16) };
|
|
920
922
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
921
923
|
}
|
|
922
924
|
break;
|
|
@@ -925,31 +927,31 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
925
927
|
try {
|
|
926
928
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
927
929
|
command_len = 2;
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
930
|
+
const coefficient = parseInt(commands[i + 1], 16);
|
|
931
|
+
const period = parseInt(commands[i + 2], 16);
|
|
932
|
+
const data = { proportionalAlgorithmParameters: { coefficient: Number(coefficient), period: Number(period) } };
|
|
931
933
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
932
934
|
}
|
|
933
935
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
934
936
|
command_len = 1;
|
|
935
|
-
|
|
937
|
+
const data = { gasEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
936
938
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
937
939
|
}
|
|
938
940
|
else {
|
|
939
941
|
command_len = 15;
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
942
|
+
const red_good = parseInt(commands[i + 1], 16);
|
|
943
|
+
const green_good = parseInt(commands[i + 2], 16);
|
|
944
|
+
const blue_good = parseInt(commands[i + 3], 16);
|
|
945
|
+
const duration_good = parseInt(`${commands[i + 4]}${commands[i + 5]}`, 16) * 10;
|
|
946
|
+
const red_medium = parseInt(commands[i + 6], 16);
|
|
947
|
+
const green_medium = parseInt(commands[i + 7], 16);
|
|
948
|
+
const blue_medium = parseInt(commands[i + 8], 16);
|
|
949
|
+
const duration_medium = parseInt(`${commands[i + 9]}${commands[i + 10]}`, 16) * 10;
|
|
950
|
+
const red_bad = parseInt(commands[i + 11], 16);
|
|
951
|
+
const green_bad = parseInt(commands[i + 12], 16);
|
|
952
|
+
const blue_bad = parseInt(commands[i + 13], 16);
|
|
953
|
+
const duration_bad = parseInt(`${commands[i + 14]}${commands[i + 15]}`, 16) * 10;
|
|
954
|
+
const data = {
|
|
953
955
|
ledNotification: {
|
|
954
956
|
red_good: Number(red_good),
|
|
955
957
|
green_good: Number(green_good),
|
|
@@ -996,17 +998,17 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
996
998
|
algo = 'proportionalIntegral';
|
|
997
999
|
break;
|
|
998
1000
|
}
|
|
999
|
-
|
|
1001
|
+
const data = { temperatureControlAlgorithm: algo };
|
|
1000
1002
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1001
1003
|
}
|
|
1002
1004
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
1003
1005
|
command_len = 1;
|
|
1004
|
-
|
|
1006
|
+
const data = { gasMeasurementPeriodMinutes: parseInt(commands[i + 1], 16) };
|
|
1005
1007
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1006
1008
|
}
|
|
1007
1009
|
else {
|
|
1008
1010
|
command_len = 1;
|
|
1009
|
-
|
|
1011
|
+
const data = { autoZeroPeriod: parseInt(commands[i + 1], 16) };
|
|
1010
1012
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1011
1013
|
}
|
|
1012
1014
|
}
|
|
@@ -1026,7 +1028,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1026
1028
|
try {
|
|
1027
1029
|
if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
1028
1030
|
command_len = 1;
|
|
1029
|
-
|
|
1031
|
+
const data = { pirEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
1030
1032
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1031
1033
|
}
|
|
1032
1034
|
}
|
|
@@ -1104,7 +1106,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1104
1106
|
{
|
|
1105
1107
|
try {
|
|
1106
1108
|
command_len = 1;
|
|
1107
|
-
|
|
1109
|
+
const data = { region: parseInt(commands[i + 1], 16) };
|
|
1108
1110
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1109
1111
|
}
|
|
1110
1112
|
catch (e) {
|
|
@@ -1157,12 +1159,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1157
1159
|
try {
|
|
1158
1160
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1159
1161
|
command_len = 1;
|
|
1160
|
-
|
|
1162
|
+
const data = { childLockBehavior: commands[i + 1] };
|
|
1161
1163
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1162
1164
|
}
|
|
1163
1165
|
else if (deviceType === types_1.DeviceType.HTSensor) {
|
|
1164
1166
|
command_len = 2;
|
|
1165
|
-
|
|
1167
|
+
const data = {
|
|
1166
1168
|
humidityCompensation: {
|
|
1167
1169
|
negativeCompensation: !!parseInt(commands[i + 1], 16),
|
|
1168
1170
|
compensation: parseInt(commands[i + 2], 16),
|
|
@@ -1172,7 +1174,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1172
1174
|
}
|
|
1173
1175
|
else {
|
|
1174
1176
|
command_len = 1;
|
|
1175
|
-
|
|
1177
|
+
const data = { displayRefreshPeriod: parseInt(commands[i + 1], 16) };
|
|
1176
1178
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1177
1179
|
}
|
|
1178
1180
|
}
|
|
@@ -1192,18 +1194,18 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1192
1194
|
try {
|
|
1193
1195
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1194
1196
|
command_len = 3;
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
+
const kp = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}`, 16) / 131072;
|
|
1198
|
+
const data = { proportionalGain: Number(kp).toFixed(5) };
|
|
1197
1199
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1198
1200
|
}
|
|
1199
1201
|
else if (deviceType === types_1.DeviceType.FanCoilThermostat) {
|
|
1200
1202
|
command_len = 1;
|
|
1201
|
-
|
|
1203
|
+
const data = { extAutomaticTemperatureControl: parseInt(commands[i + 1], 16) };
|
|
1202
1204
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1203
1205
|
}
|
|
1204
1206
|
else {
|
|
1205
1207
|
command_len = 1;
|
|
1206
|
-
|
|
1208
|
+
const data = { sendTargetTempDelay: parseInt(commands[i + 1], 16) };
|
|
1207
1209
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1208
1210
|
}
|
|
1209
1211
|
}
|
|
@@ -1218,11 +1220,29 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1218
1220
|
}
|
|
1219
1221
|
}
|
|
1220
1222
|
break;
|
|
1223
|
+
case '37':
|
|
1224
|
+
{
|
|
1225
|
+
try {
|
|
1226
|
+
command_len = 1;
|
|
1227
|
+
const data = { pirSensorState: parseInt(commands[i + 1], 16) };
|
|
1228
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1229
|
+
}
|
|
1230
|
+
catch (e) {
|
|
1231
|
+
throw new utils_1.CustomError({
|
|
1232
|
+
message: `Failed to process command '37'`,
|
|
1233
|
+
hexData,
|
|
1234
|
+
command,
|
|
1235
|
+
deviceType,
|
|
1236
|
+
originalError: e,
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
break;
|
|
1221
1241
|
case '38':
|
|
1222
1242
|
{
|
|
1223
1243
|
try {
|
|
1224
1244
|
command_len = 1;
|
|
1225
|
-
|
|
1245
|
+
const data = { automaticHeatingStatus: parseInt(commands[i + 1], 16) };
|
|
1226
1246
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1227
1247
|
}
|
|
1228
1248
|
catch (e) {
|
|
@@ -1236,11 +1256,29 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1236
1256
|
}
|
|
1237
1257
|
}
|
|
1238
1258
|
break;
|
|
1259
|
+
case '39':
|
|
1260
|
+
{
|
|
1261
|
+
try {
|
|
1262
|
+
command_len = 2;
|
|
1263
|
+
const data = { occupancyTimeout: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16) };
|
|
1264
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1265
|
+
}
|
|
1266
|
+
catch (e) {
|
|
1267
|
+
throw new utils_1.CustomError({
|
|
1268
|
+
message: `Failed to process command '39'`,
|
|
1269
|
+
hexData,
|
|
1270
|
+
command,
|
|
1271
|
+
deviceType,
|
|
1272
|
+
originalError: e,
|
|
1273
|
+
});
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
break;
|
|
1239
1277
|
case '3a':
|
|
1240
1278
|
{
|
|
1241
1279
|
try {
|
|
1242
1280
|
command_len = 1;
|
|
1243
|
-
|
|
1281
|
+
const data = { sensorMode: parseInt(commands[i + 1], 16) };
|
|
1244
1282
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1245
1283
|
}
|
|
1246
1284
|
catch (e) {
|
|
@@ -1259,13 +1297,13 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1259
1297
|
try {
|
|
1260
1298
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1261
1299
|
command_len = 3;
|
|
1262
|
-
|
|
1263
|
-
|
|
1300
|
+
const ki = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}`, 16) / 131072;
|
|
1301
|
+
const data = { integralGain: Number(ki).toFixed(5) };
|
|
1264
1302
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1265
1303
|
}
|
|
1266
1304
|
else {
|
|
1267
1305
|
command_len = 1;
|
|
1268
|
-
|
|
1306
|
+
const data = { pirSensorStatus: parseInt(commands[i + 1], 16) };
|
|
1269
1307
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1270
1308
|
}
|
|
1271
1309
|
}
|
|
@@ -1306,12 +1344,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1306
1344
|
try {
|
|
1307
1345
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1308
1346
|
command_len = 2;
|
|
1309
|
-
|
|
1347
|
+
const data = { integralValue: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1310
1348
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1311
1349
|
}
|
|
1312
1350
|
else {
|
|
1313
1351
|
command_len = 1;
|
|
1314
|
-
|
|
1352
|
+
const data = { pirSensorSensitivity: parseInt(commands[i + 1], 16) };
|
|
1315
1353
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1316
1354
|
}
|
|
1317
1355
|
}
|
|
@@ -1330,7 +1368,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1330
1368
|
{
|
|
1331
1369
|
try {
|
|
1332
1370
|
command_len = 1;
|
|
1333
|
-
|
|
1371
|
+
const data = { piRunPeriod: parseInt(commands[i + 1], 16) };
|
|
1334
1372
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1335
1373
|
}
|
|
1336
1374
|
catch (e) {
|
|
@@ -1348,7 +1386,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1348
1386
|
{
|
|
1349
1387
|
try {
|
|
1350
1388
|
command_len = 1;
|
|
1351
|
-
|
|
1389
|
+
const data = { currentTemperatureVisibility: parseInt(commands[i + 1], 16) };
|
|
1352
1390
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1353
1391
|
}
|
|
1354
1392
|
catch (e) {
|
|
@@ -1366,7 +1404,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1366
1404
|
{
|
|
1367
1405
|
try {
|
|
1368
1406
|
command_len = 1;
|
|
1369
|
-
|
|
1407
|
+
const data = { tempHysteresis: parseInt(commands[i + 1], 16) / 10 };
|
|
1370
1408
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1371
1409
|
}
|
|
1372
1410
|
catch (e) {
|
|
@@ -1384,7 +1422,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1384
1422
|
{
|
|
1385
1423
|
try {
|
|
1386
1424
|
command_len = 1;
|
|
1387
|
-
|
|
1425
|
+
const data = { humidityVisibility: parseInt(commands[i + 1], 16) };
|
|
1388
1426
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1389
1427
|
}
|
|
1390
1428
|
catch (e) {
|
|
@@ -1402,7 +1440,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1402
1440
|
{
|
|
1403
1441
|
try {
|
|
1404
1442
|
command_len = 2;
|
|
1405
|
-
|
|
1443
|
+
const data = { extSensorTemperature: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1406
1444
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1407
1445
|
}
|
|
1408
1446
|
catch (e) {
|
|
@@ -1445,10 +1483,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1445
1483
|
{
|
|
1446
1484
|
try {
|
|
1447
1485
|
command_len = 3;
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1486
|
+
const enabled = !!parseInt(commands[i + 1], 16);
|
|
1487
|
+
const duration = parseInt(commands[i + 2], 16) * 5;
|
|
1488
|
+
const delta = parseInt(commands[i + 3], 16) / 10;
|
|
1489
|
+
const data = { openWindowPrecisely: { enabled: enabled, duration: duration, delta: delta } };
|
|
1452
1490
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1453
1491
|
}
|
|
1454
1492
|
catch (e) {
|
|
@@ -1491,7 +1529,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1491
1529
|
{
|
|
1492
1530
|
try {
|
|
1493
1531
|
command_len = 1;
|
|
1494
|
-
|
|
1532
|
+
const data = { forceAttach: !!parseInt(commands[i + 1], 16) };
|
|
1495
1533
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1496
1534
|
}
|
|
1497
1535
|
catch (e) {
|
|
@@ -1534,10 +1572,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1534
1572
|
{
|
|
1535
1573
|
try {
|
|
1536
1574
|
command_len = 3;
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1575
|
+
const activatedTemperature = parseInt(commands[i + 1], 16) / 10;
|
|
1576
|
+
const deactivatedTemperature = parseInt(commands[i + 2], 16) / 10;
|
|
1577
|
+
const targetTemperature = parseInt(commands[i + 3], 16);
|
|
1578
|
+
const data = { antiFreezeParams: { activatedTemperature, deactivatedTemperature, targetTemperature } };
|
|
1541
1579
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1542
1580
|
}
|
|
1543
1581
|
catch (e) {
|
|
@@ -1638,7 +1676,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1638
1676
|
{
|
|
1639
1677
|
try {
|
|
1640
1678
|
command_len = 2;
|
|
1641
|
-
|
|
1679
|
+
const data = {
|
|
1642
1680
|
valveOpennessRangeInPercentage: {
|
|
1643
1681
|
max: 100 - parseInt(commands[i + 1], 16),
|
|
1644
1682
|
min: 100 - parseInt(commands[i + 2], 16),
|
|
@@ -1688,7 +1726,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1688
1726
|
{
|
|
1689
1727
|
try {
|
|
1690
1728
|
command_len = 2;
|
|
1691
|
-
|
|
1729
|
+
const data = { targetTemperatureFloat: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1692
1730
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1693
1731
|
}
|
|
1694
1732
|
catch (e) {
|
|
@@ -1706,7 +1744,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1706
1744
|
{
|
|
1707
1745
|
try {
|
|
1708
1746
|
command_len = 1;
|
|
1709
|
-
|
|
1747
|
+
const data = { targetTemperatureStep: parseInt(commands[i + 1], 16) / 10 };
|
|
1710
1748
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1711
1749
|
}
|
|
1712
1750
|
catch (e) {
|
|
@@ -1734,7 +1772,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1734
1772
|
}
|
|
1735
1773
|
else {
|
|
1736
1774
|
command_len = 1;
|
|
1737
|
-
|
|
1775
|
+
const offset = (parseInt(commands[i + 1], 16) - 28) * 0.176;
|
|
1738
1776
|
data = { temperatureOffset: offset };
|
|
1739
1777
|
}
|
|
1740
1778
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1781,8 +1819,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1781
1819
|
}
|
|
1782
1820
|
else if (deviceType === types_1.DeviceType.Relay16 || deviceType === types_1.DeviceType.Relay16Dry) {
|
|
1783
1821
|
command_len = 3;
|
|
1784
|
-
|
|
1785
|
-
|
|
1822
|
+
const state = parseInt(commands[i + 1], 16);
|
|
1823
|
+
const time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
|
|
1786
1824
|
data = { relayTimerInMilliseconds: { state, time } };
|
|
1787
1825
|
}
|
|
1788
1826
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1825,10 +1863,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1825
1863
|
let data;
|
|
1826
1864
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1827
1865
|
command_len = 2;
|
|
1828
|
-
|
|
1866
|
+
const notificationByte = parseInt(commands[i + 1], 16);
|
|
1829
1867
|
// Extract notification flags from bits
|
|
1830
|
-
|
|
1831
|
-
|
|
1868
|
+
const temperatureRestoredAfterManualBoost = !!(notificationByte & 0x01); // Bit 0
|
|
1869
|
+
const temperatureChangedByHeatingSchedule = !!(notificationByte & 0x02); // Bit 1
|
|
1832
1870
|
data = {
|
|
1833
1871
|
notifications: {
|
|
1834
1872
|
temperatureRestoredAfterManualBoost: temperatureRestoredAfterManualBoost,
|
|
@@ -1838,8 +1876,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1838
1876
|
}
|
|
1839
1877
|
else {
|
|
1840
1878
|
command_len = 3;
|
|
1841
|
-
|
|
1842
|
-
|
|
1879
|
+
const state = parseInt(commands[i + 1], 16);
|
|
1880
|
+
const time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
|
|
1843
1881
|
data = { relayTimerInSeconds: { state, time } };
|
|
1844
1882
|
}
|
|
1845
1883
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1964,8 +2002,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1964
2002
|
}
|
|
1965
2003
|
else if (deviceType === types_1.DeviceType.Vicki) {
|
|
1966
2004
|
command_len = 1;
|
|
1967
|
-
|
|
1968
|
-
|
|
2005
|
+
const offsetByte = parseInt(commands[i + 1], 16);
|
|
2006
|
+
const offsetHours = offsetByte & 0x80 ? offsetByte - 256 : offsetByte;
|
|
1969
2007
|
data = { deviceTimeZone: offsetHours };
|
|
1970
2008
|
}
|
|
1971
2009
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2026,7 +2064,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2026
2064
|
}
|
|
2027
2065
|
else {
|
|
2028
2066
|
command_len = 1;
|
|
2029
|
-
|
|
2067
|
+
const timeValue = parseInt(commands[i + 1], 16);
|
|
2030
2068
|
data = { autoSetpointRestoreStatus: timeValue === 0 ? 0 : timeValue * 10 };
|
|
2031
2069
|
}
|
|
2032
2070
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2454,7 +2492,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2454
2492
|
{
|
|
2455
2493
|
try {
|
|
2456
2494
|
command_len = 1;
|
|
2457
|
-
|
|
2495
|
+
const data = { measurementBlindTime: parseInt(commands[i + 1], 16) };
|
|
2458
2496
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2459
2497
|
}
|
|
2460
2498
|
catch (e) {
|
|
@@ -2472,11 +2510,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2472
2510
|
{
|
|
2473
2511
|
try {
|
|
2474
2512
|
command_len = 1;
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2513
|
+
const bin = decbin(parseInt(commands[i + 1], 16));
|
|
2514
|
+
const chart = Number(bin[5]);
|
|
2515
|
+
const digital_value = Number(bin[6]);
|
|
2516
|
+
const emoji = Number(bin[7]);
|
|
2517
|
+
const data = { imagesVisibility: { chart, digital_value, emoji } };
|
|
2480
2518
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2481
2519
|
}
|
|
2482
2520
|
catch (e) {
|
|
@@ -2521,7 +2559,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2521
2559
|
{
|
|
2522
2560
|
try {
|
|
2523
2561
|
command_len = 3;
|
|
2524
|
-
|
|
2562
|
+
const data = {
|
|
2525
2563
|
doublePressEventCounter: (parseInt(commands[i + 1], 16) << 16) | (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16),
|
|
2526
2564
|
};
|
|
2527
2565
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2541,7 +2579,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2541
2579
|
{
|
|
2542
2580
|
try {
|
|
2543
2581
|
command_len = 3;
|
|
2544
|
-
|
|
2582
|
+
const data = {
|
|
2545
2583
|
triplePressEventCounter: (parseInt(commands[i + 1], 16) << 16) | (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16),
|
|
2546
2584
|
};
|
|
2547
2585
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2561,9 +2599,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2561
2599
|
{
|
|
2562
2600
|
try {
|
|
2563
2601
|
command_len = 4;
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2602
|
+
const fuota_address = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`, 16);
|
|
2603
|
+
const fuota_address_raw = `${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`;
|
|
2604
|
+
const data = { fuota: { fuota_address, fuota_address_raw } };
|
|
2567
2605
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2568
2606
|
}
|
|
2569
2607
|
catch (e) {
|
|
@@ -2581,7 +2619,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2581
2619
|
{
|
|
2582
2620
|
try {
|
|
2583
2621
|
command_len = 1;
|
|
2584
|
-
|
|
2622
|
+
const data = { crystalOscillatorError: true };
|
|
2585
2623
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2586
2624
|
}
|
|
2587
2625
|
catch (e) {
|
|
@@ -2605,24 +2643,24 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2605
2643
|
}
|
|
2606
2644
|
else {
|
|
2607
2645
|
command_len = 41;
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2646
|
+
const eventsGroup = parseInt(commands[i + 1], 16); // 0 = events 0-7, 1 = events 8-15, 2 = events 16-19
|
|
2647
|
+
const eventGroupIndex = ['0-7', '8-15', '16-19'];
|
|
2648
|
+
const heatingEvents = [];
|
|
2611
2649
|
// Process up to 8 events for groups 0 and 1, but only 4 events for group 2
|
|
2612
|
-
|
|
2650
|
+
const eventsToProcess = eventsGroup === 2 ? 4 : 8;
|
|
2613
2651
|
for (let eventIdx = 0; eventIdx < eventsToProcess; eventIdx++) {
|
|
2614
2652
|
// Each event takes 5 bytes (hour, minute, temp high, temp low, weekday bitmask)
|
|
2615
|
-
|
|
2653
|
+
const offset = i + 2 + eventIdx * 5;
|
|
2616
2654
|
// Check if this event is configured
|
|
2617
2655
|
// Make sure we have valid values at this offset
|
|
2618
2656
|
if (offset >= commands.length || offset + 4 >= commands.length) {
|
|
2619
2657
|
continue;
|
|
2620
2658
|
}
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2659
|
+
const hour = parseInt(commands[offset], 16);
|
|
2660
|
+
const minute = parseInt(commands[offset + 1], 16);
|
|
2661
|
+
const tempHigh = parseInt(commands[offset + 2], 16);
|
|
2662
|
+
const tempLow = parseInt(commands[offset + 3], 16);
|
|
2663
|
+
const weekdayByte = parseInt(commands[offset + 4], 16);
|
|
2626
2664
|
// Skip events that are not configured (zeros or NaN values)
|
|
2627
2665
|
if (isNaN(hour) ||
|
|
2628
2666
|
isNaN(minute) ||
|
|
@@ -2633,9 +2671,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2633
2671
|
continue;
|
|
2634
2672
|
}
|
|
2635
2673
|
// Calculate actual event index in the full range (0-23)
|
|
2636
|
-
|
|
2674
|
+
const globalEventIndex = eventsGroup * 8 + eventIdx;
|
|
2637
2675
|
// Decode weekday bitmask (bit 0=Mon, bit 1=Tue, bit 2=Wed, bit 3=Thu, bit 4=Fri, bit 5=Sat, bit 6=Sun)
|
|
2638
|
-
|
|
2676
|
+
const weekdays = {
|
|
2639
2677
|
monday: !!(weekdayByte & 0x01), // bit 0
|
|
2640
2678
|
tuesday: !!(weekdayByte & 0x02), // bit 1
|
|
2641
2679
|
wednesday: !!(weekdayByte & 0x04), // bit 2
|
|
@@ -2645,7 +2683,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2645
2683
|
sunday: !!(weekdayByte & 0x40), // bit 6
|
|
2646
2684
|
};
|
|
2647
2685
|
// Create heating event object
|
|
2648
|
-
|
|
2686
|
+
const heatingEvent = {
|
|
2649
2687
|
index: globalEventIndex,
|
|
2650
2688
|
start: (hour < 10 ? '0' + hour : hour) + ':' + (minute < 10 ? '0' + minute : minute),
|
|
2651
2689
|
targetTemperature: ((tempHigh << 8) | tempLow) / 10,
|
|
@@ -2678,12 +2716,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2678
2716
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
2679
2717
|
command_len = 4;
|
|
2680
2718
|
// Note: Months are 0-11 (January=0, December=11)
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2719
|
+
const startMonth = parseInt(commands[i + 1], 16);
|
|
2720
|
+
const startDay = parseInt(commands[i + 2], 16);
|
|
2721
|
+
const endMonth = parseInt(commands[i + 3], 16);
|
|
2722
|
+
const endDay = parseInt(commands[i + 4], 16);
|
|
2685
2723
|
// Convert to human-readable month names
|
|
2686
|
-
|
|
2724
|
+
const monthNames = [
|
|
2687
2725
|
'January',
|
|
2688
2726
|
'February',
|
|
2689
2727
|
'March',
|
|
@@ -2727,15 +2765,15 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2727
2765
|
try {
|
|
2728
2766
|
command_len = 4;
|
|
2729
2767
|
// Parse 32-bit UNIX timestamp (4 bytes)
|
|
2730
|
-
|
|
2768
|
+
const unixTimestamp = (parseInt(commands[i + 1], 16) << 24) |
|
|
2731
2769
|
(parseInt(commands[i + 2], 16) << 16) |
|
|
2732
2770
|
(parseInt(commands[i + 3], 16) << 8) |
|
|
2733
2771
|
parseInt(commands[i + 4], 16);
|
|
2734
2772
|
// Convert UNIX timestamp to JavaScript Date
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2773
|
+
const dateObj = new Date(unixTimestamp * 1000); // Convert seconds to milliseconds
|
|
2774
|
+
const date = dateObj.getUTCDate() + '/' + (dateObj.getUTCMonth() + 1) + '/' + dateObj.getUTCFullYear();
|
|
2775
|
+
const time = dateObj.getUTCHours() + ':' + (dateObj.getUTCMinutes() < 10 ? '0' : '') + dateObj.getUTCMinutes();
|
|
2776
|
+
const data = {
|
|
2739
2777
|
deviceTime: '' + date + ' ' + time,
|
|
2740
2778
|
};
|
|
2741
2779
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2755,9 +2793,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2755
2793
|
{
|
|
2756
2794
|
try {
|
|
2757
2795
|
command_len = 1;
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
2796
|
+
const ledDurationValue = parseInt(commands[i + 1], 16);
|
|
2797
|
+
const durationInSeconds = ledDurationValue / 2; // As per the docs, value is divided by 2 to get seconds
|
|
2798
|
+
const data = {
|
|
2761
2799
|
ledIndicationDuration: durationInSeconds,
|
|
2762
2800
|
};
|
|
2763
2801
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2777,10 +2815,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2777
2815
|
{
|
|
2778
2816
|
try {
|
|
2779
2817
|
command_len = 2;
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2818
|
+
const tempHigh = parseInt(commands[i + 1], 16);
|
|
2819
|
+
const tempLow = parseInt(commands[i + 2], 16);
|
|
2820
|
+
const targetTemp = (tempHigh << 8) | tempLow;
|
|
2821
|
+
const data = {
|
|
2784
2822
|
offlineTargetTemperature: targetTemp === 0 ? 0 : targetTemp / 10,
|
|
2785
2823
|
};
|
|
2786
2824
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2800,7 +2838,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2800
2838
|
{
|
|
2801
2839
|
try {
|
|
2802
2840
|
command_len = 1;
|
|
2803
|
-
|
|
2841
|
+
const data = { internalAlgoTemporaryState: parseInt(commands[i + 1], 16) === 0 ? true : false };
|
|
2804
2842
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2805
2843
|
}
|
|
2806
2844
|
catch (e) {
|
|
@@ -2818,16 +2856,16 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2818
2856
|
{
|
|
2819
2857
|
try {
|
|
2820
2858
|
command_len = 12;
|
|
2821
|
-
|
|
2859
|
+
const temperatureLevels = {};
|
|
2822
2860
|
// Process 6 scale levels (0-5), each with a 2-byte temperature value
|
|
2823
2861
|
for (let level = 0; level < 6; level++) {
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
2862
|
+
const tempHighByte = parseInt(commands[i + 1 + level * 2], 16);
|
|
2863
|
+
const tempLowByte = parseInt(commands[i + 2 + level * 2], 16);
|
|
2864
|
+
const tempValue = (tempHighByte << 8) | tempLowByte;
|
|
2827
2865
|
// The temperature values are pre-multiplied by 10
|
|
2828
2866
|
temperatureLevels['level' + level] = tempValue / 10;
|
|
2829
2867
|
}
|
|
2830
|
-
|
|
2868
|
+
const data = {
|
|
2831
2869
|
temperatureLevels: temperatureLevels,
|
|
2832
2870
|
};
|
|
2833
2871
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2846,11 +2884,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2846
2884
|
case '6c': {
|
|
2847
2885
|
try {
|
|
2848
2886
|
command_len = 4;
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2887
|
+
const eventsHighByte = parseInt(commands[i + 2], 16); // Events 19-16
|
|
2888
|
+
const eventsMidByte = parseInt(commands[i + 3], 16); // Events 15-8
|
|
2889
|
+
const eventsLowByte = parseInt(commands[i + 4], 16); // Events 7-0
|
|
2852
2890
|
// Create a more structured and readable format for heating events
|
|
2853
|
-
|
|
2891
|
+
const heatingEventStates = {};
|
|
2854
2892
|
// Process all 20 events (0-19) in a single loop
|
|
2855
2893
|
for (let eventIdx = 0; eventIdx < 20; eventIdx++) {
|
|
2856
2894
|
// Calculate which bit to check
|
|
@@ -2871,7 +2909,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2871
2909
|
heatingEventStates[eventIdx] = !!(eventsLowByte & (1 << bitPosition));
|
|
2872
2910
|
}
|
|
2873
2911
|
}
|
|
2874
|
-
|
|
2912
|
+
const data = {
|
|
2875
2913
|
heatingEventStates: heatingEventStates,
|
|
2876
2914
|
};
|
|
2877
2915
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2891,7 +2929,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2891
2929
|
{
|
|
2892
2930
|
try {
|
|
2893
2931
|
command_len = 1;
|
|
2894
|
-
|
|
2932
|
+
const data = { userInterfaceLanguage: parseInt(commands[i + 1], 16) };
|
|
2895
2933
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2896
2934
|
}
|
|
2897
2935
|
catch (e) {
|