mclimate-payload-helper 1.2.5 → 1.2.7
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 +206 -205
- 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 +16 -16
- 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 +14 -14
- 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/Co2DisplayCommonCommands.d.ts +0 -4
- package/dist/encoders/Co2DisplayCommonCommands.d.ts.map +1 -1
- package/dist/encoders/Co2DisplayCommonCommands.js +0 -38
- package/dist/encoders/Co2DisplayCommonCommands.js.map +1 -1
- package/dist/encoders/Co2DisplayLiteCommands.js +1 -1
- package/dist/encoders/Co2DisplayLiteCommands.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/FanCoilThermostat.d.ts +61 -0
- package/dist/encoders/FanCoilThermostat.d.ts.map +1 -0
- package/dist/encoders/FanCoilThermostat.js +719 -0
- package/dist/encoders/FanCoilThermostat.js.map +1 -0
- package/dist/encoders/FanCoilThermostatCommands.d.ts.map +1 -1
- package/dist/encoders/FanCoilThermostatCommands.js +1 -3
- package/dist/encoders/FanCoilThermostatCommands.js.map +1 -1
- package/dist/encoders/HTPirLiteCommands.d.ts.map +1 -1
- package/dist/encoders/HTPirLiteCommands.js +2 -8
- 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/SetAqiLed.d.ts +6 -0
- package/dist/encoders/SetAqiLed.d.ts.map +1 -0
- package/dist/encoders/SetAqiLed.js +46 -0
- package/dist/encoders/SetAqiLed.js.map +1 -0
- 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/enumValidation.d.ts +6 -0
- package/dist/encoders/types/enumValidation.d.ts.map +1 -0
- package/dist/encoders/types/enumValidation.js +50 -0
- package/dist/encoders/types/enumValidation.js.map +1 -0
- package/dist/encoders/types/schemaValidatedEnums.d.ts +40 -0
- package/dist/encoders/types/schemaValidatedEnums.d.ts.map +1 -0
- package/dist/encoders/types/schemaValidatedEnums.js +181 -0
- package/dist/encoders/types/schemaValidatedEnums.js.map +1 -0
- package/dist/encoders/types/schemas.d.ts.map +1 -1
- package/dist/encoders/types/schemas.js +1 -0
- package/dist/encoders/types/schemas.js.map +1 -1
- package/dist/test/payloadDecoders.test.js +28 -23
- package/dist/test/payloadDecoders.test.js.map +1 -1
- package/dist/test/payloadEncoders.test.js +44 -22
- package/dist/test/payloadEncoders.test.js.map +1 -1
- package/dist/types/deviceTypes.d.ts +19 -0
- package/dist/types/deviceTypes.d.ts.map +1 -0
- package/dist/types/deviceTypes.js +23 -0
- package/dist/types/deviceTypes.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/types.d.ts +13 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +9 -0
- package/dist/types/types.js.map +1 -0
- 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/dist/validation.d.ts +3 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +8 -0
- package/dist/validation.js.map +1 -0
- package/package.json +13 -2
- package/src/decoders/commandsReadingHelper.ts +206 -205
- 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 +28 -29
- package/src/decoders/payloadParsers/htDisplayLitePayloadParser.ts +17 -17
- package/src/decoders/payloadParsers/htPirLitePayloadParser.ts +25 -25
- 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 +0 -1
- package/src/encoders/CommandBuilder.ts +5 -3
- package/src/encoders/FanCoilThermostatCommands.ts +2 -3
- package/src/encoders/HTPirLiteCommands.ts +27 -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 +1 -0
- package/src/test/payloadDecoders.test.ts +88 -73
- package/src/test/payloadEncoders.test.ts +101 -72
- 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));
|
|
@@ -786,7 +788,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
786
788
|
case '25':
|
|
787
789
|
{
|
|
788
790
|
try {
|
|
789
|
-
let data;
|
|
791
|
+
let data = {};
|
|
790
792
|
if (deviceType == types_1.DeviceType.Relay16) {
|
|
791
793
|
command_len = 2;
|
|
792
794
|
data = { overpowerThreshold: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16) };
|
|
@@ -833,13 +835,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
833
835
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
834
836
|
command_len = 1;
|
|
835
837
|
data = { microphoneEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
836
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
837
838
|
}
|
|
838
839
|
else {
|
|
839
840
|
command_len = 3;
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
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);
|
|
843
844
|
data = {
|
|
844
845
|
measurementPeriod: {
|
|
845
846
|
good_zone: Number(good_zone),
|
|
@@ -847,8 +848,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
847
848
|
bad_zone: Number(bad_zone),
|
|
848
849
|
},
|
|
849
850
|
};
|
|
850
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
851
851
|
}
|
|
852
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
852
853
|
}
|
|
853
854
|
catch (e) {
|
|
854
855
|
throw new utils_1.CustomError({
|
|
@@ -866,28 +867,28 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
866
867
|
try {
|
|
867
868
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
868
869
|
command_len = 1;
|
|
869
|
-
|
|
870
|
+
const data = { OVAC: parseInt(commands[i + 1], 16) };
|
|
870
871
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
871
872
|
}
|
|
872
873
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
873
874
|
command_len = 2;
|
|
874
|
-
|
|
875
|
+
const data = {
|
|
875
876
|
microphoneSamplingPeriod: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16),
|
|
876
877
|
};
|
|
877
878
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
878
879
|
}
|
|
879
880
|
else {
|
|
880
881
|
command_len = 9;
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
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 = {
|
|
891
892
|
buzzerNotification: {
|
|
892
893
|
duration_good_beeping: Number(duration_good_beeping),
|
|
893
894
|
duration_good_loud: Number(duration_good_loud),
|
|
@@ -917,7 +918,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
917
918
|
case '28':
|
|
918
919
|
{
|
|
919
920
|
command_len = 1;
|
|
920
|
-
|
|
921
|
+
const data = { manualTargetTemperatureUpdate: parseInt(commands[i + 1], 16) };
|
|
921
922
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
922
923
|
}
|
|
923
924
|
break;
|
|
@@ -926,31 +927,31 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
926
927
|
try {
|
|
927
928
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
928
929
|
command_len = 2;
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
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) } };
|
|
932
933
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
933
934
|
}
|
|
934
935
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
935
936
|
command_len = 1;
|
|
936
|
-
|
|
937
|
+
const data = { gasEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
937
938
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
938
939
|
}
|
|
939
940
|
else {
|
|
940
941
|
command_len = 15;
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
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 = {
|
|
954
955
|
ledNotification: {
|
|
955
956
|
red_good: Number(red_good),
|
|
956
957
|
green_good: Number(green_good),
|
|
@@ -997,17 +998,17 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
997
998
|
algo = 'proportionalIntegral';
|
|
998
999
|
break;
|
|
999
1000
|
}
|
|
1000
|
-
|
|
1001
|
+
const data = { temperatureControlAlgorithm: algo };
|
|
1001
1002
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1002
1003
|
}
|
|
1003
1004
|
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
1004
1005
|
command_len = 1;
|
|
1005
|
-
|
|
1006
|
+
const data = { gasMeasurementPeriodMinutes: parseInt(commands[i + 1], 16) };
|
|
1006
1007
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1007
1008
|
}
|
|
1008
1009
|
else {
|
|
1009
1010
|
command_len = 1;
|
|
1010
|
-
|
|
1011
|
+
const data = { autoZeroPeriod: parseInt(commands[i + 1], 16) };
|
|
1011
1012
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1012
1013
|
}
|
|
1013
1014
|
}
|
|
@@ -1027,7 +1028,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1027
1028
|
try {
|
|
1028
1029
|
if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
1029
1030
|
command_len = 1;
|
|
1030
|
-
|
|
1031
|
+
const data = { pirEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
1031
1032
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1032
1033
|
}
|
|
1033
1034
|
}
|
|
@@ -1105,7 +1106,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1105
1106
|
{
|
|
1106
1107
|
try {
|
|
1107
1108
|
command_len = 1;
|
|
1108
|
-
|
|
1109
|
+
const data = { region: parseInt(commands[i + 1], 16) };
|
|
1109
1110
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1110
1111
|
}
|
|
1111
1112
|
catch (e) {
|
|
@@ -1158,12 +1159,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1158
1159
|
try {
|
|
1159
1160
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1160
1161
|
command_len = 1;
|
|
1161
|
-
|
|
1162
|
+
const data = { childLockBehavior: commands[i + 1] };
|
|
1162
1163
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1163
1164
|
}
|
|
1164
1165
|
else if (deviceType === types_1.DeviceType.HTSensor) {
|
|
1165
1166
|
command_len = 2;
|
|
1166
|
-
|
|
1167
|
+
const data = {
|
|
1167
1168
|
humidityCompensation: {
|
|
1168
1169
|
negativeCompensation: !!parseInt(commands[i + 1], 16),
|
|
1169
1170
|
compensation: parseInt(commands[i + 2], 16),
|
|
@@ -1173,7 +1174,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1173
1174
|
}
|
|
1174
1175
|
else {
|
|
1175
1176
|
command_len = 1;
|
|
1176
|
-
|
|
1177
|
+
const data = { displayRefreshPeriod: parseInt(commands[i + 1], 16) };
|
|
1177
1178
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1178
1179
|
}
|
|
1179
1180
|
}
|
|
@@ -1193,18 +1194,18 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1193
1194
|
try {
|
|
1194
1195
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1195
1196
|
command_len = 3;
|
|
1196
|
-
|
|
1197
|
-
|
|
1197
|
+
const kp = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}`, 16) / 131072;
|
|
1198
|
+
const data = { proportionalGain: Number(kp).toFixed(5) };
|
|
1198
1199
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1199
1200
|
}
|
|
1200
1201
|
else if (deviceType === types_1.DeviceType.FanCoilThermostat) {
|
|
1201
1202
|
command_len = 1;
|
|
1202
|
-
|
|
1203
|
+
const data = { extAutomaticTemperatureControl: parseInt(commands[i + 1], 16) };
|
|
1203
1204
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1204
1205
|
}
|
|
1205
1206
|
else {
|
|
1206
1207
|
command_len = 1;
|
|
1207
|
-
|
|
1208
|
+
const data = { sendTargetTempDelay: parseInt(commands[i + 1], 16) };
|
|
1208
1209
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1209
1210
|
}
|
|
1210
1211
|
}
|
|
@@ -1223,7 +1224,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1223
1224
|
{
|
|
1224
1225
|
try {
|
|
1225
1226
|
command_len = 1;
|
|
1226
|
-
|
|
1227
|
+
const data = { automaticHeatingStatus: parseInt(commands[i + 1], 16) };
|
|
1227
1228
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1228
1229
|
}
|
|
1229
1230
|
catch (e) {
|
|
@@ -1241,7 +1242,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1241
1242
|
{
|
|
1242
1243
|
try {
|
|
1243
1244
|
command_len = 1;
|
|
1244
|
-
|
|
1245
|
+
const data = { sensorMode: parseInt(commands[i + 1], 16) };
|
|
1245
1246
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1246
1247
|
}
|
|
1247
1248
|
catch (e) {
|
|
@@ -1260,13 +1261,13 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1260
1261
|
try {
|
|
1261
1262
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1262
1263
|
command_len = 3;
|
|
1263
|
-
|
|
1264
|
-
|
|
1264
|
+
const ki = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}`, 16) / 131072;
|
|
1265
|
+
const data = { integralGain: Number(ki).toFixed(5) };
|
|
1265
1266
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1266
1267
|
}
|
|
1267
1268
|
else {
|
|
1268
1269
|
command_len = 1;
|
|
1269
|
-
|
|
1270
|
+
const data = { pirSensorStatus: parseInt(commands[i + 1], 16) };
|
|
1270
1271
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1271
1272
|
}
|
|
1272
1273
|
}
|
|
@@ -1307,12 +1308,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1307
1308
|
try {
|
|
1308
1309
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1309
1310
|
command_len = 2;
|
|
1310
|
-
|
|
1311
|
+
const data = { integralValue: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1311
1312
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1312
1313
|
}
|
|
1313
1314
|
else {
|
|
1314
1315
|
command_len = 1;
|
|
1315
|
-
|
|
1316
|
+
const data = { pirSensorSensitivity: parseInt(commands[i + 1], 16) };
|
|
1316
1317
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1317
1318
|
}
|
|
1318
1319
|
}
|
|
@@ -1331,7 +1332,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1331
1332
|
{
|
|
1332
1333
|
try {
|
|
1333
1334
|
command_len = 1;
|
|
1334
|
-
|
|
1335
|
+
const data = { piRunPeriod: parseInt(commands[i + 1], 16) };
|
|
1335
1336
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1336
1337
|
}
|
|
1337
1338
|
catch (e) {
|
|
@@ -1349,7 +1350,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1349
1350
|
{
|
|
1350
1351
|
try {
|
|
1351
1352
|
command_len = 1;
|
|
1352
|
-
|
|
1353
|
+
const data = { currentTemperatureVisibility: parseInt(commands[i + 1], 16) };
|
|
1353
1354
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1354
1355
|
}
|
|
1355
1356
|
catch (e) {
|
|
@@ -1367,7 +1368,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1367
1368
|
{
|
|
1368
1369
|
try {
|
|
1369
1370
|
command_len = 1;
|
|
1370
|
-
|
|
1371
|
+
const data = { tempHysteresis: parseInt(commands[i + 1], 16) / 10 };
|
|
1371
1372
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1372
1373
|
}
|
|
1373
1374
|
catch (e) {
|
|
@@ -1385,7 +1386,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1385
1386
|
{
|
|
1386
1387
|
try {
|
|
1387
1388
|
command_len = 1;
|
|
1388
|
-
|
|
1389
|
+
const data = { humidityVisibility: parseInt(commands[i + 1], 16) };
|
|
1389
1390
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1390
1391
|
}
|
|
1391
1392
|
catch (e) {
|
|
@@ -1403,7 +1404,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1403
1404
|
{
|
|
1404
1405
|
try {
|
|
1405
1406
|
command_len = 2;
|
|
1406
|
-
|
|
1407
|
+
const data = { extSensorTemperature: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1407
1408
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1408
1409
|
}
|
|
1409
1410
|
catch (e) {
|
|
@@ -1446,10 +1447,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1446
1447
|
{
|
|
1447
1448
|
try {
|
|
1448
1449
|
command_len = 3;
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1450
|
+
const enabled = !!parseInt(commands[i + 1], 16);
|
|
1451
|
+
const duration = parseInt(commands[i + 2], 16) * 5;
|
|
1452
|
+
const delta = parseInt(commands[i + 3], 16) / 10;
|
|
1453
|
+
const data = { openWindowPrecisely: { enabled: enabled, duration: duration, delta: delta } };
|
|
1453
1454
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1454
1455
|
}
|
|
1455
1456
|
catch (e) {
|
|
@@ -1492,7 +1493,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1492
1493
|
{
|
|
1493
1494
|
try {
|
|
1494
1495
|
command_len = 1;
|
|
1495
|
-
|
|
1496
|
+
const data = { forceAttach: !!parseInt(commands[i + 1], 16) };
|
|
1496
1497
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1497
1498
|
}
|
|
1498
1499
|
catch (e) {
|
|
@@ -1535,10 +1536,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1535
1536
|
{
|
|
1536
1537
|
try {
|
|
1537
1538
|
command_len = 3;
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1539
|
+
const activatedTemperature = parseInt(commands[i + 1], 16) / 10;
|
|
1540
|
+
const deactivatedTemperature = parseInt(commands[i + 2], 16) / 10;
|
|
1541
|
+
const targetTemperature = parseInt(commands[i + 3], 16);
|
|
1542
|
+
const data = { antiFreezeParams: { activatedTemperature, deactivatedTemperature, targetTemperature } };
|
|
1542
1543
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1543
1544
|
}
|
|
1544
1545
|
catch (e) {
|
|
@@ -1639,7 +1640,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1639
1640
|
{
|
|
1640
1641
|
try {
|
|
1641
1642
|
command_len = 2;
|
|
1642
|
-
|
|
1643
|
+
const data = {
|
|
1643
1644
|
valveOpennessRangeInPercentage: {
|
|
1644
1645
|
max: 100 - parseInt(commands[i + 1], 16),
|
|
1645
1646
|
min: 100 - parseInt(commands[i + 2], 16),
|
|
@@ -1689,7 +1690,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1689
1690
|
{
|
|
1690
1691
|
try {
|
|
1691
1692
|
command_len = 2;
|
|
1692
|
-
|
|
1693
|
+
const data = { targetTemperatureFloat: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1693
1694
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1694
1695
|
}
|
|
1695
1696
|
catch (e) {
|
|
@@ -1707,7 +1708,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1707
1708
|
{
|
|
1708
1709
|
try {
|
|
1709
1710
|
command_len = 1;
|
|
1710
|
-
|
|
1711
|
+
const data = { targetTemperatureStep: parseInt(commands[i + 1], 16) / 10 };
|
|
1711
1712
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1712
1713
|
}
|
|
1713
1714
|
catch (e) {
|
|
@@ -1735,7 +1736,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1735
1736
|
}
|
|
1736
1737
|
else {
|
|
1737
1738
|
command_len = 1;
|
|
1738
|
-
|
|
1739
|
+
const offset = (parseInt(commands[i + 1], 16) - 28) * 0.176;
|
|
1739
1740
|
data = { temperatureOffset: offset };
|
|
1740
1741
|
}
|
|
1741
1742
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1782,8 +1783,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1782
1783
|
}
|
|
1783
1784
|
else if (deviceType === types_1.DeviceType.Relay16 || deviceType === types_1.DeviceType.Relay16Dry) {
|
|
1784
1785
|
command_len = 3;
|
|
1785
|
-
|
|
1786
|
-
|
|
1786
|
+
const state = parseInt(commands[i + 1], 16);
|
|
1787
|
+
const time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
|
|
1787
1788
|
data = { relayTimerInMilliseconds: { state, time } };
|
|
1788
1789
|
}
|
|
1789
1790
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1826,10 +1827,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1826
1827
|
let data;
|
|
1827
1828
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1828
1829
|
command_len = 2;
|
|
1829
|
-
|
|
1830
|
+
const notificationByte = parseInt(commands[i + 1], 16);
|
|
1830
1831
|
// Extract notification flags from bits
|
|
1831
|
-
|
|
1832
|
-
|
|
1832
|
+
const temperatureRestoredAfterManualBoost = !!(notificationByte & 0x01); // Bit 0
|
|
1833
|
+
const temperatureChangedByHeatingSchedule = !!(notificationByte & 0x02); // Bit 1
|
|
1833
1834
|
data = {
|
|
1834
1835
|
notifications: {
|
|
1835
1836
|
temperatureRestoredAfterManualBoost: temperatureRestoredAfterManualBoost,
|
|
@@ -1839,8 +1840,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1839
1840
|
}
|
|
1840
1841
|
else {
|
|
1841
1842
|
command_len = 3;
|
|
1842
|
-
|
|
1843
|
-
|
|
1843
|
+
const state = parseInt(commands[i + 1], 16);
|
|
1844
|
+
const time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
|
|
1844
1845
|
data = { relayTimerInSeconds: { state, time } };
|
|
1845
1846
|
}
|
|
1846
1847
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1965,8 +1966,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1965
1966
|
}
|
|
1966
1967
|
else if (deviceType === types_1.DeviceType.Vicki) {
|
|
1967
1968
|
command_len = 1;
|
|
1968
|
-
|
|
1969
|
-
|
|
1969
|
+
const offsetByte = parseInt(commands[i + 1], 16);
|
|
1970
|
+
const offsetHours = offsetByte & 0x80 ? offsetByte - 256 : offsetByte;
|
|
1970
1971
|
data = { deviceTimeZone: offsetHours };
|
|
1971
1972
|
}
|
|
1972
1973
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2027,7 +2028,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2027
2028
|
}
|
|
2028
2029
|
else {
|
|
2029
2030
|
command_len = 1;
|
|
2030
|
-
|
|
2031
|
+
const timeValue = parseInt(commands[i + 1], 16);
|
|
2031
2032
|
data = { autoSetpointRestoreStatus: timeValue === 0 ? 0 : timeValue * 10 };
|
|
2032
2033
|
}
|
|
2033
2034
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2455,7 +2456,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2455
2456
|
{
|
|
2456
2457
|
try {
|
|
2457
2458
|
command_len = 1;
|
|
2458
|
-
|
|
2459
|
+
const data = { measurementBlindTime: parseInt(commands[i + 1], 16) };
|
|
2459
2460
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2460
2461
|
}
|
|
2461
2462
|
catch (e) {
|
|
@@ -2473,11 +2474,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2473
2474
|
{
|
|
2474
2475
|
try {
|
|
2475
2476
|
command_len = 1;
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2477
|
+
const bin = decbin(parseInt(commands[i + 1], 16));
|
|
2478
|
+
const chart = Number(bin[5]);
|
|
2479
|
+
const digital_value = Number(bin[6]);
|
|
2480
|
+
const emoji = Number(bin[7]);
|
|
2481
|
+
const data = { imagesVisibility: { chart, digital_value, emoji } };
|
|
2481
2482
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2482
2483
|
}
|
|
2483
2484
|
catch (e) {
|
|
@@ -2522,7 +2523,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2522
2523
|
{
|
|
2523
2524
|
try {
|
|
2524
2525
|
command_len = 3;
|
|
2525
|
-
|
|
2526
|
+
const data = {
|
|
2526
2527
|
doublePressEventCounter: (parseInt(commands[i + 1], 16) << 16) | (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16),
|
|
2527
2528
|
};
|
|
2528
2529
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2542,7 +2543,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2542
2543
|
{
|
|
2543
2544
|
try {
|
|
2544
2545
|
command_len = 3;
|
|
2545
|
-
|
|
2546
|
+
const data = {
|
|
2546
2547
|
triplePressEventCounter: (parseInt(commands[i + 1], 16) << 16) | (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16),
|
|
2547
2548
|
};
|
|
2548
2549
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2562,9 +2563,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2562
2563
|
{
|
|
2563
2564
|
try {
|
|
2564
2565
|
command_len = 4;
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2566
|
+
const fuota_address = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`, 16);
|
|
2567
|
+
const fuota_address_raw = `${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`;
|
|
2568
|
+
const data = { fuota: { fuota_address, fuota_address_raw } };
|
|
2568
2569
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2569
2570
|
}
|
|
2570
2571
|
catch (e) {
|
|
@@ -2582,7 +2583,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2582
2583
|
{
|
|
2583
2584
|
try {
|
|
2584
2585
|
command_len = 1;
|
|
2585
|
-
|
|
2586
|
+
const data = { crystalOscillatorError: true };
|
|
2586
2587
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2587
2588
|
}
|
|
2588
2589
|
catch (e) {
|
|
@@ -2606,24 +2607,24 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2606
2607
|
}
|
|
2607
2608
|
else {
|
|
2608
2609
|
command_len = 41;
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2610
|
+
const eventsGroup = parseInt(commands[i + 1], 16); // 0 = events 0-7, 1 = events 8-15, 2 = events 16-19
|
|
2611
|
+
const eventGroupIndex = ['0-7', '8-15', '16-19'];
|
|
2612
|
+
const heatingEvents = [];
|
|
2612
2613
|
// Process up to 8 events for groups 0 and 1, but only 4 events for group 2
|
|
2613
|
-
|
|
2614
|
+
const eventsToProcess = eventsGroup === 2 ? 4 : 8;
|
|
2614
2615
|
for (let eventIdx = 0; eventIdx < eventsToProcess; eventIdx++) {
|
|
2615
2616
|
// Each event takes 5 bytes (hour, minute, temp high, temp low, weekday bitmask)
|
|
2616
|
-
|
|
2617
|
+
const offset = i + 2 + eventIdx * 5;
|
|
2617
2618
|
// Check if this event is configured
|
|
2618
2619
|
// Make sure we have valid values at this offset
|
|
2619
2620
|
if (offset >= commands.length || offset + 4 >= commands.length) {
|
|
2620
2621
|
continue;
|
|
2621
2622
|
}
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2623
|
+
const hour = parseInt(commands[offset], 16);
|
|
2624
|
+
const minute = parseInt(commands[offset + 1], 16);
|
|
2625
|
+
const tempHigh = parseInt(commands[offset + 2], 16);
|
|
2626
|
+
const tempLow = parseInt(commands[offset + 3], 16);
|
|
2627
|
+
const weekdayByte = parseInt(commands[offset + 4], 16);
|
|
2627
2628
|
// Skip events that are not configured (zeros or NaN values)
|
|
2628
2629
|
if (isNaN(hour) ||
|
|
2629
2630
|
isNaN(minute) ||
|
|
@@ -2634,9 +2635,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2634
2635
|
continue;
|
|
2635
2636
|
}
|
|
2636
2637
|
// Calculate actual event index in the full range (0-23)
|
|
2637
|
-
|
|
2638
|
+
const globalEventIndex = eventsGroup * 8 + eventIdx;
|
|
2638
2639
|
// Decode weekday bitmask (bit 0=Mon, bit 1=Tue, bit 2=Wed, bit 3=Thu, bit 4=Fri, bit 5=Sat, bit 6=Sun)
|
|
2639
|
-
|
|
2640
|
+
const weekdays = {
|
|
2640
2641
|
monday: !!(weekdayByte & 0x01), // bit 0
|
|
2641
2642
|
tuesday: !!(weekdayByte & 0x02), // bit 1
|
|
2642
2643
|
wednesday: !!(weekdayByte & 0x04), // bit 2
|
|
@@ -2646,7 +2647,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2646
2647
|
sunday: !!(weekdayByte & 0x40), // bit 6
|
|
2647
2648
|
};
|
|
2648
2649
|
// Create heating event object
|
|
2649
|
-
|
|
2650
|
+
const heatingEvent = {
|
|
2650
2651
|
index: globalEventIndex,
|
|
2651
2652
|
start: (hour < 10 ? '0' + hour : hour) + ':' + (minute < 10 ? '0' + minute : minute),
|
|
2652
2653
|
targetTemperature: ((tempHigh << 8) | tempLow) / 10,
|
|
@@ -2679,12 +2680,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2679
2680
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
2680
2681
|
command_len = 4;
|
|
2681
2682
|
// Note: Months are 0-11 (January=0, December=11)
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2683
|
+
const startMonth = parseInt(commands[i + 1], 16);
|
|
2684
|
+
const startDay = parseInt(commands[i + 2], 16);
|
|
2685
|
+
const endMonth = parseInt(commands[i + 3], 16);
|
|
2686
|
+
const endDay = parseInt(commands[i + 4], 16);
|
|
2686
2687
|
// Convert to human-readable month names
|
|
2687
|
-
|
|
2688
|
+
const monthNames = [
|
|
2688
2689
|
'January',
|
|
2689
2690
|
'February',
|
|
2690
2691
|
'March',
|
|
@@ -2728,15 +2729,15 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2728
2729
|
try {
|
|
2729
2730
|
command_len = 4;
|
|
2730
2731
|
// Parse 32-bit UNIX timestamp (4 bytes)
|
|
2731
|
-
|
|
2732
|
+
const unixTimestamp = (parseInt(commands[i + 1], 16) << 24) |
|
|
2732
2733
|
(parseInt(commands[i + 2], 16) << 16) |
|
|
2733
2734
|
(parseInt(commands[i + 3], 16) << 8) |
|
|
2734
2735
|
parseInt(commands[i + 4], 16);
|
|
2735
2736
|
// Convert UNIX timestamp to JavaScript Date
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2737
|
+
const dateObj = new Date(unixTimestamp * 1000); // Convert seconds to milliseconds
|
|
2738
|
+
const date = dateObj.getUTCDate() + '/' + (dateObj.getUTCMonth() + 1) + '/' + dateObj.getUTCFullYear();
|
|
2739
|
+
const time = dateObj.getUTCHours() + ':' + (dateObj.getUTCMinutes() < 10 ? '0' : '') + dateObj.getUTCMinutes();
|
|
2740
|
+
const data = {
|
|
2740
2741
|
deviceTime: '' + date + ' ' + time,
|
|
2741
2742
|
};
|
|
2742
2743
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2756,9 +2757,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2756
2757
|
{
|
|
2757
2758
|
try {
|
|
2758
2759
|
command_len = 1;
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2760
|
+
const ledDurationValue = parseInt(commands[i + 1], 16);
|
|
2761
|
+
const durationInSeconds = ledDurationValue / 2; // As per the docs, value is divided by 2 to get seconds
|
|
2762
|
+
const data = {
|
|
2762
2763
|
ledIndicationDuration: durationInSeconds,
|
|
2763
2764
|
};
|
|
2764
2765
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2778,10 +2779,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2778
2779
|
{
|
|
2779
2780
|
try {
|
|
2780
2781
|
command_len = 2;
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2782
|
+
const tempHigh = parseInt(commands[i + 1], 16);
|
|
2783
|
+
const tempLow = parseInt(commands[i + 2], 16);
|
|
2784
|
+
const targetTemp = (tempHigh << 8) | tempLow;
|
|
2785
|
+
const data = {
|
|
2785
2786
|
offlineTargetTemperature: targetTemp === 0 ? 0 : targetTemp / 10,
|
|
2786
2787
|
};
|
|
2787
2788
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2801,7 +2802,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2801
2802
|
{
|
|
2802
2803
|
try {
|
|
2803
2804
|
command_len = 1;
|
|
2804
|
-
|
|
2805
|
+
const data = { internalAlgoTemporaryState: parseInt(commands[i + 1], 16) === 0 ? true : false };
|
|
2805
2806
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2806
2807
|
}
|
|
2807
2808
|
catch (e) {
|
|
@@ -2819,16 +2820,16 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2819
2820
|
{
|
|
2820
2821
|
try {
|
|
2821
2822
|
command_len = 12;
|
|
2822
|
-
|
|
2823
|
+
const temperatureLevels = {};
|
|
2823
2824
|
// Process 6 scale levels (0-5), each with a 2-byte temperature value
|
|
2824
2825
|
for (let level = 0; level < 6; level++) {
|
|
2825
|
-
|
|
2826
|
-
|
|
2827
|
-
|
|
2826
|
+
const tempHighByte = parseInt(commands[i + 1 + level * 2], 16);
|
|
2827
|
+
const tempLowByte = parseInt(commands[i + 2 + level * 2], 16);
|
|
2828
|
+
const tempValue = (tempHighByte << 8) | tempLowByte;
|
|
2828
2829
|
// The temperature values are pre-multiplied by 10
|
|
2829
2830
|
temperatureLevels['level' + level] = tempValue / 10;
|
|
2830
2831
|
}
|
|
2831
|
-
|
|
2832
|
+
const data = {
|
|
2832
2833
|
temperatureLevels: temperatureLevels,
|
|
2833
2834
|
};
|
|
2834
2835
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2847,11 +2848,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2847
2848
|
case '6c': {
|
|
2848
2849
|
try {
|
|
2849
2850
|
command_len = 4;
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2851
|
+
const eventsHighByte = parseInt(commands[i + 2], 16); // Events 19-16
|
|
2852
|
+
const eventsMidByte = parseInt(commands[i + 3], 16); // Events 15-8
|
|
2853
|
+
const eventsLowByte = parseInt(commands[i + 4], 16); // Events 7-0
|
|
2853
2854
|
// Create a more structured and readable format for heating events
|
|
2854
|
-
|
|
2855
|
+
const heatingEventStates = {};
|
|
2855
2856
|
// Process all 20 events (0-19) in a single loop
|
|
2856
2857
|
for (let eventIdx = 0; eventIdx < 20; eventIdx++) {
|
|
2857
2858
|
// Calculate which bit to check
|
|
@@ -2872,7 +2873,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2872
2873
|
heatingEventStates[eventIdx] = !!(eventsLowByte & (1 << bitPosition));
|
|
2873
2874
|
}
|
|
2874
2875
|
}
|
|
2875
|
-
|
|
2876
|
+
const data = {
|
|
2876
2877
|
heatingEventStates: heatingEventStates,
|
|
2877
2878
|
};
|
|
2878
2879
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2892,7 +2893,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2892
2893
|
{
|
|
2893
2894
|
try {
|
|
2894
2895
|
command_len = 1;
|
|
2895
|
-
|
|
2896
|
+
const data = { userInterfaceLanguage: parseInt(commands[i + 1], 16) };
|
|
2896
2897
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2897
2898
|
}
|
|
2898
2899
|
catch (e) {
|