mclimate-payload-helper 1.2.6 → 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 +204 -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 +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/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 +205 -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 +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/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));
|
|
@@ -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
|
}
|
|
@@ -1222,7 +1224,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1222
1224
|
{
|
|
1223
1225
|
try {
|
|
1224
1226
|
command_len = 1;
|
|
1225
|
-
|
|
1227
|
+
const data = { automaticHeatingStatus: parseInt(commands[i + 1], 16) };
|
|
1226
1228
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1227
1229
|
}
|
|
1228
1230
|
catch (e) {
|
|
@@ -1240,7 +1242,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1240
1242
|
{
|
|
1241
1243
|
try {
|
|
1242
1244
|
command_len = 1;
|
|
1243
|
-
|
|
1245
|
+
const data = { sensorMode: parseInt(commands[i + 1], 16) };
|
|
1244
1246
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1245
1247
|
}
|
|
1246
1248
|
catch (e) {
|
|
@@ -1259,13 +1261,13 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1259
1261
|
try {
|
|
1260
1262
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1261
1263
|
command_len = 3;
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
+
const ki = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}`, 16) / 131072;
|
|
1265
|
+
const data = { integralGain: Number(ki).toFixed(5) };
|
|
1264
1266
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1265
1267
|
}
|
|
1266
1268
|
else {
|
|
1267
1269
|
command_len = 1;
|
|
1268
|
-
|
|
1270
|
+
const data = { pirSensorStatus: parseInt(commands[i + 1], 16) };
|
|
1269
1271
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1270
1272
|
}
|
|
1271
1273
|
}
|
|
@@ -1306,12 +1308,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1306
1308
|
try {
|
|
1307
1309
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1308
1310
|
command_len = 2;
|
|
1309
|
-
|
|
1311
|
+
const data = { integralValue: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1310
1312
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1311
1313
|
}
|
|
1312
1314
|
else {
|
|
1313
1315
|
command_len = 1;
|
|
1314
|
-
|
|
1316
|
+
const data = { pirSensorSensitivity: parseInt(commands[i + 1], 16) };
|
|
1315
1317
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1316
1318
|
}
|
|
1317
1319
|
}
|
|
@@ -1330,7 +1332,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1330
1332
|
{
|
|
1331
1333
|
try {
|
|
1332
1334
|
command_len = 1;
|
|
1333
|
-
|
|
1335
|
+
const data = { piRunPeriod: parseInt(commands[i + 1], 16) };
|
|
1334
1336
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1335
1337
|
}
|
|
1336
1338
|
catch (e) {
|
|
@@ -1348,7 +1350,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1348
1350
|
{
|
|
1349
1351
|
try {
|
|
1350
1352
|
command_len = 1;
|
|
1351
|
-
|
|
1353
|
+
const data = { currentTemperatureVisibility: parseInt(commands[i + 1], 16) };
|
|
1352
1354
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1353
1355
|
}
|
|
1354
1356
|
catch (e) {
|
|
@@ -1366,7 +1368,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1366
1368
|
{
|
|
1367
1369
|
try {
|
|
1368
1370
|
command_len = 1;
|
|
1369
|
-
|
|
1371
|
+
const data = { tempHysteresis: parseInt(commands[i + 1], 16) / 10 };
|
|
1370
1372
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1371
1373
|
}
|
|
1372
1374
|
catch (e) {
|
|
@@ -1384,7 +1386,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1384
1386
|
{
|
|
1385
1387
|
try {
|
|
1386
1388
|
command_len = 1;
|
|
1387
|
-
|
|
1389
|
+
const data = { humidityVisibility: parseInt(commands[i + 1], 16) };
|
|
1388
1390
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1389
1391
|
}
|
|
1390
1392
|
catch (e) {
|
|
@@ -1402,7 +1404,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1402
1404
|
{
|
|
1403
1405
|
try {
|
|
1404
1406
|
command_len = 2;
|
|
1405
|
-
|
|
1407
|
+
const data = { extSensorTemperature: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1406
1408
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1407
1409
|
}
|
|
1408
1410
|
catch (e) {
|
|
@@ -1445,10 +1447,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1445
1447
|
{
|
|
1446
1448
|
try {
|
|
1447
1449
|
command_len = 3;
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
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 } };
|
|
1452
1454
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1453
1455
|
}
|
|
1454
1456
|
catch (e) {
|
|
@@ -1491,7 +1493,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1491
1493
|
{
|
|
1492
1494
|
try {
|
|
1493
1495
|
command_len = 1;
|
|
1494
|
-
|
|
1496
|
+
const data = { forceAttach: !!parseInt(commands[i + 1], 16) };
|
|
1495
1497
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1496
1498
|
}
|
|
1497
1499
|
catch (e) {
|
|
@@ -1534,10 +1536,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1534
1536
|
{
|
|
1535
1537
|
try {
|
|
1536
1538
|
command_len = 3;
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
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 } };
|
|
1541
1543
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1542
1544
|
}
|
|
1543
1545
|
catch (e) {
|
|
@@ -1638,7 +1640,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1638
1640
|
{
|
|
1639
1641
|
try {
|
|
1640
1642
|
command_len = 2;
|
|
1641
|
-
|
|
1643
|
+
const data = {
|
|
1642
1644
|
valveOpennessRangeInPercentage: {
|
|
1643
1645
|
max: 100 - parseInt(commands[i + 1], 16),
|
|
1644
1646
|
min: 100 - parseInt(commands[i + 2], 16),
|
|
@@ -1688,7 +1690,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1688
1690
|
{
|
|
1689
1691
|
try {
|
|
1690
1692
|
command_len = 2;
|
|
1691
|
-
|
|
1693
|
+
const data = { targetTemperatureFloat: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
|
|
1692
1694
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1693
1695
|
}
|
|
1694
1696
|
catch (e) {
|
|
@@ -1706,7 +1708,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1706
1708
|
{
|
|
1707
1709
|
try {
|
|
1708
1710
|
command_len = 1;
|
|
1709
|
-
|
|
1711
|
+
const data = { targetTemperatureStep: parseInt(commands[i + 1], 16) / 10 };
|
|
1710
1712
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1711
1713
|
}
|
|
1712
1714
|
catch (e) {
|
|
@@ -1734,7 +1736,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1734
1736
|
}
|
|
1735
1737
|
else {
|
|
1736
1738
|
command_len = 1;
|
|
1737
|
-
|
|
1739
|
+
const offset = (parseInt(commands[i + 1], 16) - 28) * 0.176;
|
|
1738
1740
|
data = { temperatureOffset: offset };
|
|
1739
1741
|
}
|
|
1740
1742
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1781,8 +1783,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1781
1783
|
}
|
|
1782
1784
|
else if (deviceType === types_1.DeviceType.Relay16 || deviceType === types_1.DeviceType.Relay16Dry) {
|
|
1783
1785
|
command_len = 3;
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
+
const state = parseInt(commands[i + 1], 16);
|
|
1787
|
+
const time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
|
|
1786
1788
|
data = { relayTimerInMilliseconds: { state, time } };
|
|
1787
1789
|
}
|
|
1788
1790
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1825,10 +1827,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1825
1827
|
let data;
|
|
1826
1828
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1827
1829
|
command_len = 2;
|
|
1828
|
-
|
|
1830
|
+
const notificationByte = parseInt(commands[i + 1], 16);
|
|
1829
1831
|
// Extract notification flags from bits
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
+
const temperatureRestoredAfterManualBoost = !!(notificationByte & 0x01); // Bit 0
|
|
1833
|
+
const temperatureChangedByHeatingSchedule = !!(notificationByte & 0x02); // Bit 1
|
|
1832
1834
|
data = {
|
|
1833
1835
|
notifications: {
|
|
1834
1836
|
temperatureRestoredAfterManualBoost: temperatureRestoredAfterManualBoost,
|
|
@@ -1838,8 +1840,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1838
1840
|
}
|
|
1839
1841
|
else {
|
|
1840
1842
|
command_len = 3;
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
+
const state = parseInt(commands[i + 1], 16);
|
|
1844
|
+
const time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
|
|
1843
1845
|
data = { relayTimerInSeconds: { state, time } };
|
|
1844
1846
|
}
|
|
1845
1847
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -1964,8 +1966,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1964
1966
|
}
|
|
1965
1967
|
else if (deviceType === types_1.DeviceType.Vicki) {
|
|
1966
1968
|
command_len = 1;
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
+
const offsetByte = parseInt(commands[i + 1], 16);
|
|
1970
|
+
const offsetHours = offsetByte & 0x80 ? offsetByte - 256 : offsetByte;
|
|
1969
1971
|
data = { deviceTimeZone: offsetHours };
|
|
1970
1972
|
}
|
|
1971
1973
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2026,7 +2028,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2026
2028
|
}
|
|
2027
2029
|
else {
|
|
2028
2030
|
command_len = 1;
|
|
2029
|
-
|
|
2031
|
+
const timeValue = parseInt(commands[i + 1], 16);
|
|
2030
2032
|
data = { autoSetpointRestoreStatus: timeValue === 0 ? 0 : timeValue * 10 };
|
|
2031
2033
|
}
|
|
2032
2034
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2454,7 +2456,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2454
2456
|
{
|
|
2455
2457
|
try {
|
|
2456
2458
|
command_len = 1;
|
|
2457
|
-
|
|
2459
|
+
const data = { measurementBlindTime: parseInt(commands[i + 1], 16) };
|
|
2458
2460
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2459
2461
|
}
|
|
2460
2462
|
catch (e) {
|
|
@@ -2472,11 +2474,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2472
2474
|
{
|
|
2473
2475
|
try {
|
|
2474
2476
|
command_len = 1;
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
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 } };
|
|
2480
2482
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2481
2483
|
}
|
|
2482
2484
|
catch (e) {
|
|
@@ -2521,7 +2523,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2521
2523
|
{
|
|
2522
2524
|
try {
|
|
2523
2525
|
command_len = 3;
|
|
2524
|
-
|
|
2526
|
+
const data = {
|
|
2525
2527
|
doublePressEventCounter: (parseInt(commands[i + 1], 16) << 16) | (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16),
|
|
2526
2528
|
};
|
|
2527
2529
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2541,7 +2543,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2541
2543
|
{
|
|
2542
2544
|
try {
|
|
2543
2545
|
command_len = 3;
|
|
2544
|
-
|
|
2546
|
+
const data = {
|
|
2545
2547
|
triplePressEventCounter: (parseInt(commands[i + 1], 16) << 16) | (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16),
|
|
2546
2548
|
};
|
|
2547
2549
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2561,9 +2563,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2561
2563
|
{
|
|
2562
2564
|
try {
|
|
2563
2565
|
command_len = 4;
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
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 } };
|
|
2567
2569
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2568
2570
|
}
|
|
2569
2571
|
catch (e) {
|
|
@@ -2581,7 +2583,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2581
2583
|
{
|
|
2582
2584
|
try {
|
|
2583
2585
|
command_len = 1;
|
|
2584
|
-
|
|
2586
|
+
const data = { crystalOscillatorError: true };
|
|
2585
2587
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2586
2588
|
}
|
|
2587
2589
|
catch (e) {
|
|
@@ -2605,24 +2607,24 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2605
2607
|
}
|
|
2606
2608
|
else {
|
|
2607
2609
|
command_len = 41;
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
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 = [];
|
|
2611
2613
|
// Process up to 8 events for groups 0 and 1, but only 4 events for group 2
|
|
2612
|
-
|
|
2614
|
+
const eventsToProcess = eventsGroup === 2 ? 4 : 8;
|
|
2613
2615
|
for (let eventIdx = 0; eventIdx < eventsToProcess; eventIdx++) {
|
|
2614
2616
|
// Each event takes 5 bytes (hour, minute, temp high, temp low, weekday bitmask)
|
|
2615
|
-
|
|
2617
|
+
const offset = i + 2 + eventIdx * 5;
|
|
2616
2618
|
// Check if this event is configured
|
|
2617
2619
|
// Make sure we have valid values at this offset
|
|
2618
2620
|
if (offset >= commands.length || offset + 4 >= commands.length) {
|
|
2619
2621
|
continue;
|
|
2620
2622
|
}
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
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);
|
|
2626
2628
|
// Skip events that are not configured (zeros or NaN values)
|
|
2627
2629
|
if (isNaN(hour) ||
|
|
2628
2630
|
isNaN(minute) ||
|
|
@@ -2633,9 +2635,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2633
2635
|
continue;
|
|
2634
2636
|
}
|
|
2635
2637
|
// Calculate actual event index in the full range (0-23)
|
|
2636
|
-
|
|
2638
|
+
const globalEventIndex = eventsGroup * 8 + eventIdx;
|
|
2637
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)
|
|
2638
|
-
|
|
2640
|
+
const weekdays = {
|
|
2639
2641
|
monday: !!(weekdayByte & 0x01), // bit 0
|
|
2640
2642
|
tuesday: !!(weekdayByte & 0x02), // bit 1
|
|
2641
2643
|
wednesday: !!(weekdayByte & 0x04), // bit 2
|
|
@@ -2645,7 +2647,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2645
2647
|
sunday: !!(weekdayByte & 0x40), // bit 6
|
|
2646
2648
|
};
|
|
2647
2649
|
// Create heating event object
|
|
2648
|
-
|
|
2650
|
+
const heatingEvent = {
|
|
2649
2651
|
index: globalEventIndex,
|
|
2650
2652
|
start: (hour < 10 ? '0' + hour : hour) + ':' + (minute < 10 ? '0' + minute : minute),
|
|
2651
2653
|
targetTemperature: ((tempHigh << 8) | tempLow) / 10,
|
|
@@ -2678,12 +2680,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2678
2680
|
if (deviceType === types_1.DeviceType.Vicki) {
|
|
2679
2681
|
command_len = 4;
|
|
2680
2682
|
// Note: Months are 0-11 (January=0, December=11)
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
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);
|
|
2685
2687
|
// Convert to human-readable month names
|
|
2686
|
-
|
|
2688
|
+
const monthNames = [
|
|
2687
2689
|
'January',
|
|
2688
2690
|
'February',
|
|
2689
2691
|
'March',
|
|
@@ -2727,15 +2729,15 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2727
2729
|
try {
|
|
2728
2730
|
command_len = 4;
|
|
2729
2731
|
// Parse 32-bit UNIX timestamp (4 bytes)
|
|
2730
|
-
|
|
2732
|
+
const unixTimestamp = (parseInt(commands[i + 1], 16) << 24) |
|
|
2731
2733
|
(parseInt(commands[i + 2], 16) << 16) |
|
|
2732
2734
|
(parseInt(commands[i + 3], 16) << 8) |
|
|
2733
2735
|
parseInt(commands[i + 4], 16);
|
|
2734
2736
|
// Convert UNIX timestamp to JavaScript Date
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
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 = {
|
|
2739
2741
|
deviceTime: '' + date + ' ' + time,
|
|
2740
2742
|
};
|
|
2741
2743
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2755,9 +2757,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2755
2757
|
{
|
|
2756
2758
|
try {
|
|
2757
2759
|
command_len = 1;
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
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 = {
|
|
2761
2763
|
ledIndicationDuration: durationInSeconds,
|
|
2762
2764
|
};
|
|
2763
2765
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2777,10 +2779,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2777
2779
|
{
|
|
2778
2780
|
try {
|
|
2779
2781
|
command_len = 2;
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
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 = {
|
|
2784
2786
|
offlineTargetTemperature: targetTemp === 0 ? 0 : targetTemp / 10,
|
|
2785
2787
|
};
|
|
2786
2788
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2800,7 +2802,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2800
2802
|
{
|
|
2801
2803
|
try {
|
|
2802
2804
|
command_len = 1;
|
|
2803
|
-
|
|
2805
|
+
const data = { internalAlgoTemporaryState: parseInt(commands[i + 1], 16) === 0 ? true : false };
|
|
2804
2806
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2805
2807
|
}
|
|
2806
2808
|
catch (e) {
|
|
@@ -2818,16 +2820,16 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2818
2820
|
{
|
|
2819
2821
|
try {
|
|
2820
2822
|
command_len = 12;
|
|
2821
|
-
|
|
2823
|
+
const temperatureLevels = {};
|
|
2822
2824
|
// Process 6 scale levels (0-5), each with a 2-byte temperature value
|
|
2823
2825
|
for (let level = 0; level < 6; level++) {
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
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;
|
|
2827
2829
|
// The temperature values are pre-multiplied by 10
|
|
2828
2830
|
temperatureLevels['level' + level] = tempValue / 10;
|
|
2829
2831
|
}
|
|
2830
|
-
|
|
2832
|
+
const data = {
|
|
2831
2833
|
temperatureLevels: temperatureLevels,
|
|
2832
2834
|
};
|
|
2833
2835
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2846,11 +2848,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2846
2848
|
case '6c': {
|
|
2847
2849
|
try {
|
|
2848
2850
|
command_len = 4;
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
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
|
|
2852
2854
|
// Create a more structured and readable format for heating events
|
|
2853
|
-
|
|
2855
|
+
const heatingEventStates = {};
|
|
2854
2856
|
// Process all 20 events (0-19) in a single loop
|
|
2855
2857
|
for (let eventIdx = 0; eventIdx < 20; eventIdx++) {
|
|
2856
2858
|
// Calculate which bit to check
|
|
@@ -2871,7 +2873,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2871
2873
|
heatingEventStates[eventIdx] = !!(eventsLowByte & (1 << bitPosition));
|
|
2872
2874
|
}
|
|
2873
2875
|
}
|
|
2874
|
-
|
|
2876
|
+
const data = {
|
|
2875
2877
|
heatingEventStates: heatingEventStates,
|
|
2876
2878
|
};
|
|
2877
2879
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2891,7 +2893,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2891
2893
|
{
|
|
2892
2894
|
try {
|
|
2893
2895
|
command_len = 1;
|
|
2894
|
-
|
|
2896
|
+
const data = { userInterfaceLanguage: parseInt(commands[i + 1], 16) };
|
|
2895
2897
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2896
2898
|
}
|
|
2897
2899
|
catch (e) {
|