mclimate-payload-helper 1.2.6 → 1.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/.eslintrc.cjs +18 -0
  2. package/.husky/pre-commit +6 -0
  3. package/CLAUDE.md +10 -1
  4. package/add-encoder-command-existing.md +51 -51
  5. package/add-encoder-command-new.md +51 -51
  6. package/dist/decoders/commandsReadingHelper.d.ts.map +1 -1
  7. package/dist/decoders/commandsReadingHelper.js +240 -202
  8. package/dist/decoders/commandsReadingHelper.js.map +1 -1
  9. package/dist/decoders/payloadParsers/AQISensorPayloadParser.js +5 -5
  10. package/dist/decoders/payloadParsers/AQISensorPayloadParser.js.map +1 -1
  11. package/dist/decoders/payloadParsers/CO2DisplayLitePayloadParser.d.ts +1 -1
  12. package/dist/decoders/payloadParsers/CO2DisplayLitePayloadParser.d.ts.map +1 -1
  13. package/dist/decoders/payloadParsers/CO2DisplayLitePayloadParser.js +18 -18
  14. package/dist/decoders/payloadParsers/CO2DisplayLitePayloadParser.js.map +1 -1
  15. package/dist/decoders/payloadParsers/CO2DisplayPayloadParser.d.ts +1 -1
  16. package/dist/decoders/payloadParsers/CO2DisplayPayloadParser.d.ts.map +1 -1
  17. package/dist/decoders/payloadParsers/CO2DisplayPayloadParser.js +19 -19
  18. package/dist/decoders/payloadParsers/CO2DisplayPayloadParser.js.map +1 -1
  19. package/dist/decoders/payloadParsers/CO2SensorPayloadParser.d.ts +1 -1
  20. package/dist/decoders/payloadParsers/CO2SensorPayloadParser.d.ts.map +1 -1
  21. package/dist/decoders/payloadParsers/CO2SensorPayloadParser.js +3 -3
  22. package/dist/decoders/payloadParsers/CO2SensorPayloadParser.js.map +1 -1
  23. package/dist/decoders/payloadParsers/DskDevicePayloadParser.js +11 -11
  24. package/dist/decoders/payloadParsers/DskDevicePayloadParser.js.map +1 -1
  25. package/dist/decoders/payloadParsers/FanCoilThermostatPayloadParser.d.ts +1 -1
  26. package/dist/decoders/payloadParsers/FanCoilThermostatPayloadParser.d.ts.map +1 -1
  27. package/dist/decoders/payloadParsers/FanCoilThermostatPayloadParser.js +1 -1
  28. package/dist/decoders/payloadParsers/FanCoilThermostatPayloadParser.js.map +1 -1
  29. package/dist/decoders/payloadParsers/ThermostatPayloadParser.d.ts +1 -1
  30. package/dist/decoders/payloadParsers/ThermostatPayloadParser.d.ts.map +1 -1
  31. package/dist/decoders/payloadParsers/ThermostatPayloadParser.js +32 -40
  32. package/dist/decoders/payloadParsers/ThermostatPayloadParser.js.map +1 -1
  33. package/dist/decoders/payloadParsers/WirelessThermostatPayloadParser.d.ts +1 -1
  34. package/dist/decoders/payloadParsers/WirelessThermostatPayloadParser.d.ts.map +1 -1
  35. package/dist/decoders/payloadParsers/WirelessThermostatPayloadParser.js +13 -13
  36. package/dist/decoders/payloadParsers/WirelessThermostatPayloadParser.js.map +1 -1
  37. package/dist/decoders/payloadParsers/buttonPayloadParser.d.ts +1 -1
  38. package/dist/decoders/payloadParsers/buttonPayloadParser.d.ts.map +1 -1
  39. package/dist/decoders/payloadParsers/buttonPayloadParser.js +6 -6
  40. package/dist/decoders/payloadParsers/buttonPayloadParser.js.map +1 -1
  41. package/dist/decoders/payloadParsers/co2PirLitePayloadParser.d.ts +1 -1
  42. package/dist/decoders/payloadParsers/co2PirLitePayloadParser.d.ts.map +1 -1
  43. package/dist/decoders/payloadParsers/co2PirLitePayloadParser.js +31 -29
  44. package/dist/decoders/payloadParsers/co2PirLitePayloadParser.js.map +1 -1
  45. package/dist/decoders/payloadParsers/htDisplayLitePayloadParser.d.ts +1 -1
  46. package/dist/decoders/payloadParsers/htDisplayLitePayloadParser.d.ts.map +1 -1
  47. package/dist/decoders/payloadParsers/htDisplayLitePayloadParser.js +17 -17
  48. package/dist/decoders/payloadParsers/htDisplayLitePayloadParser.js.map +1 -1
  49. package/dist/decoders/payloadParsers/htPirLitePayloadParser.d.ts +1 -1
  50. package/dist/decoders/payloadParsers/htPirLitePayloadParser.d.ts.map +1 -1
  51. package/dist/decoders/payloadParsers/htPirLitePayloadParser.js +26 -26
  52. package/dist/decoders/payloadParsers/htPirLitePayloadParser.js.map +1 -1
  53. package/dist/decoders/payloadParsers/htSensorPayloadParser.d.ts +1 -1
  54. package/dist/decoders/payloadParsers/htSensorPayloadParser.d.ts.map +1 -1
  55. package/dist/decoders/payloadParsers/htSensorPayloadParser.js +16 -16
  56. package/dist/decoders/payloadParsers/htSensorPayloadParser.js.map +1 -1
  57. package/dist/decoders/payloadParsers/melissaLorawanPayloadParser.d.ts +1 -1
  58. package/dist/decoders/payloadParsers/melissaLorawanPayloadParser.d.ts.map +1 -1
  59. package/dist/decoders/payloadParsers/melissaLorawanPayloadParser.js +8 -8
  60. package/dist/decoders/payloadParsers/melissaLorawanPayloadParser.js.map +1 -1
  61. package/dist/decoders/payloadParsers/multisensorPayloadParser.d.ts +1 -1
  62. package/dist/decoders/payloadParsers/multisensorPayloadParser.d.ts.map +1 -1
  63. package/dist/decoders/payloadParsers/multisensorPayloadParser.js +4 -5
  64. package/dist/decoders/payloadParsers/multisensorPayloadParser.js.map +1 -1
  65. package/dist/decoders/payloadParsers/openCloseSensorPayloadParser.d.ts +1 -1
  66. package/dist/decoders/payloadParsers/openCloseSensorPayloadParser.d.ts.map +1 -1
  67. package/dist/decoders/payloadParsers/openCloseSensorPayloadParser.js +23 -20
  68. package/dist/decoders/payloadParsers/openCloseSensorPayloadParser.js.map +1 -1
  69. package/dist/decoders/payloadParsers/relay16DryPayloadParser.d.ts +1 -1
  70. package/dist/decoders/payloadParsers/relay16DryPayloadParser.d.ts.map +1 -1
  71. package/dist/decoders/payloadParsers/relay16DryPayloadParser.js +8 -8
  72. package/dist/decoders/payloadParsers/relay16DryPayloadParser.js.map +1 -1
  73. package/dist/decoders/payloadParsers/relay16PayloadParser.d.ts +1 -1
  74. package/dist/decoders/payloadParsers/relay16PayloadParser.d.ts.map +1 -1
  75. package/dist/decoders/payloadParsers/relay16PayloadParser.js +8 -8
  76. package/dist/decoders/payloadParsers/relay16PayloadParser.js.map +1 -1
  77. package/dist/decoders/payloadParsers/tFloodPayloadParser.js +7 -7
  78. package/dist/decoders/payloadParsers/tFloodPayloadParser.js.map +1 -1
  79. package/dist/decoders/payloadParsers/tValvePayloadParser.js +4 -4
  80. package/dist/decoders/payloadParsers/tValvePayloadParser.js.map +1 -1
  81. package/dist/decoders/payloadParsers/uplinkPayloadParser.d.ts +1 -1
  82. package/dist/decoders/payloadParsers/uplinkPayloadParser.d.ts.map +1 -1
  83. package/dist/decoders/payloadParsers/vickiPayloadParser.d.ts +1 -1
  84. package/dist/decoders/payloadParsers/vickiPayloadParser.d.ts.map +1 -1
  85. package/dist/decoders/payloadParsers/vickiPayloadParser.js +25 -25
  86. package/dist/decoders/payloadParsers/vickiPayloadParser.js.map +1 -1
  87. package/dist/encoders/Co2DisplayCommands.js +1 -1
  88. package/dist/encoders/Co2DisplayCommands.js.map +1 -1
  89. package/dist/encoders/Co2DisplayLiteCommands.js +1 -1
  90. package/dist/encoders/Co2DisplayLiteCommands.js.map +1 -1
  91. package/dist/encoders/Co2PirLiteCommands.d.ts +6 -2
  92. package/dist/encoders/Co2PirLiteCommands.d.ts.map +1 -1
  93. package/dist/encoders/Co2PirLiteCommands.js +66 -13
  94. package/dist/encoders/Co2PirLiteCommands.js.map +1 -1
  95. package/dist/encoders/CommandBuilder.d.ts +2 -2
  96. package/dist/encoders/CommandBuilder.d.ts.map +1 -1
  97. package/dist/encoders/CommandBuilder.js +4 -2
  98. package/dist/encoders/CommandBuilder.js.map +1 -1
  99. package/dist/encoders/HTPirLiteCommands.d.ts +6 -2
  100. package/dist/encoders/HTPirLiteCommands.d.ts.map +1 -1
  101. package/dist/encoders/HTPirLiteCommands.js +67 -18
  102. package/dist/encoders/HTPirLiteCommands.js.map +1 -1
  103. package/dist/encoders/MelissaCommands.d.ts.map +1 -1
  104. package/dist/encoders/MelissaCommands.js.map +1 -1
  105. package/dist/encoders/Relay16DryCommands.d.ts.map +1 -1
  106. package/dist/encoders/Relay16DryCommands.js +1 -3
  107. package/dist/encoders/Relay16DryCommands.js.map +1 -1
  108. package/dist/encoders/VickiCommands.d.ts.map +1 -1
  109. package/dist/encoders/VickiCommands.js +5 -7
  110. package/dist/encoders/VickiCommands.js.map +1 -1
  111. package/dist/encoders/types/schemas.d.ts +80 -170
  112. package/dist/encoders/types/schemas.d.ts.map +1 -1
  113. package/dist/encoders/types/schemas.js +30 -7
  114. package/dist/encoders/types/schemas.js.map +1 -1
  115. package/dist/test/payloadDecoders.test.js +54 -44
  116. package/dist/test/payloadDecoders.test.js.map +1 -1
  117. package/dist/test/payloadEncoders.test.js +50 -34
  118. package/dist/test/payloadEncoders.test.js.map +1 -1
  119. package/dist/utils/delMethods.d.ts +1 -1
  120. package/dist/utils/delMethods.d.ts.map +1 -1
  121. package/dist/utils/delMethods.js +3 -2
  122. package/dist/utils/delMethods.js.map +1 -1
  123. package/dist/utils/mixin.d.ts +1 -1
  124. package/dist/utils/mixin.d.ts.map +1 -1
  125. package/dist/utils/mixin.js +4 -1
  126. package/dist/utils/mixin.js.map +1 -1
  127. package/package.json +13 -2
  128. package/src/decoders/commandsReadingHelper.ts +239 -203
  129. package/src/decoders/payloadParsers/AQISensorPayloadParser.ts +5 -5
  130. package/src/decoders/payloadParsers/CO2DisplayLitePayloadParser.ts +19 -19
  131. package/src/decoders/payloadParsers/CO2DisplayPayloadParser.ts +19 -19
  132. package/src/decoders/payloadParsers/CO2SensorPayloadParser.ts +4 -4
  133. package/src/decoders/payloadParsers/DskDevicePayloadParser.ts +11 -11
  134. package/src/decoders/payloadParsers/FanCoilThermostatPayloadParser.ts +3 -3
  135. package/src/decoders/payloadParsers/ThermostatPayloadParser.ts +32 -42
  136. package/src/decoders/payloadParsers/WirelessThermostatPayloadParser.ts +16 -14
  137. package/src/decoders/payloadParsers/buttonPayloadParser.ts +6 -6
  138. package/src/decoders/payloadParsers/co2PirLitePayloadParser.ts +44 -40
  139. package/src/decoders/payloadParsers/htDisplayLitePayloadParser.ts +17 -17
  140. package/src/decoders/payloadParsers/htPirLitePayloadParser.ts +37 -35
  141. package/src/decoders/payloadParsers/htSensorPayloadParser.ts +17 -17
  142. package/src/decoders/payloadParsers/melissaLorawanPayloadParser.ts +11 -11
  143. package/src/decoders/payloadParsers/multisensorPayloadParser.ts +75 -77
  144. package/src/decoders/payloadParsers/openCloseSensorPayloadParser.ts +40 -36
  145. package/src/decoders/payloadParsers/relay16DryPayloadParser.ts +10 -10
  146. package/src/decoders/payloadParsers/relay16PayloadParser.ts +10 -10
  147. package/src/decoders/payloadParsers/tFloodPayloadParser.ts +7 -7
  148. package/src/decoders/payloadParsers/tValvePayloadParser.ts +4 -4
  149. package/src/decoders/payloadParsers/vickiPayloadParser.ts +28 -28
  150. package/src/encoders/Co2DisplayCommands.ts +1 -1
  151. package/src/encoders/Co2DisplayLiteCommands.ts +2 -2
  152. package/src/encoders/Co2PirLiteCommands.ts +66 -15
  153. package/src/encoders/CommandBuilder.ts +5 -3
  154. package/src/encoders/HTPirLiteCommands.ts +81 -34
  155. package/src/encoders/MelissaCommands.ts +20 -24
  156. package/src/encoders/Relay16DryCommands.ts +3 -6
  157. package/src/encoders/VickiCommands.ts +23 -53
  158. package/src/encoders/index.ts +0 -1
  159. package/src/encoders/types/schemas.ts +51 -12
  160. package/src/test/payloadDecoders.test.ts +114 -99
  161. package/src/test/payloadEncoders.test.ts +111 -92
  162. package/src/utils/delMethods.ts +6 -3
  163. 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
- let resultToPass = {};
8
- let data = hexData;
9
- let commands = data.match(/.{1,2}/g);
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 || deviceType === types_1.DeviceType.WirelessThermostat || deviceType === types_1.DeviceType.MultiSensor)) {
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
- let data = { decodeKeepalive: true };
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
- let data = { decodeKeepalive: true };
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
- let data = { decodeKeepalive: true };
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
- let hardwareVersion = commands[i + 1];
111
- let softwareVersion = commands[i + 2];
112
- let data = { deviceVersions: { hardware: Number(hardwareVersion), software: Number(softwareVersion) } };
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
- let data = { targetTemperatureStep: parseInt(commands[i + 1], 16) / 10 };
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
- let codeAddress = (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16);
151
- let codeAddressRaw = `${commands[i + 1]}${commands[i + 2]}`;
152
- let data = { preloadedCode: { codeAddress, codeAddressRaw } };
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
- let data = { alarmDuration: parseInt(commands[i + 1], 16) };
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
- let hardwareVersion = commands[i + 1];
176
- let softwareVersion = commands[i + 2];
177
- let data = { deviceVersions: { hardware: Number(hardwareVersion), software: Number(softwareVersion) } };
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
- let data = { floodEventSendTime: parseInt(commands[i + 1], 16) };
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
- let recordedIrCodeSize = (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16);
216
- let bytesSent = `${commands[i + 3]}${commands[i + 4]}`;
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
- let openingTime = (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16);
276
- let closingTime = (parseInt(commands[i + 3], 16) << 8) | parseInt(commands[i + 4], 16);
277
- let data = { openCloseTimeExtended: { openingTime: Number(openingTime), closingTime: Number(closingTime) } };
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
- let data = { emergencyOpenings: parseInt(commands[i + 1], 16) };
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
- let data = { floodAlarmTime: parseInt(commands[i + 1], 16) };
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
- let data = { workingVoltage: parseInt(commands[i + 1], 16) * 8 + 1600 };
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
- let enabled = !!parseInt(commands[i + 1], 16);
378
- let duration = parseInt(commands[i + 2], 16) * 5;
379
- let motorPos1 = parseInt(commands[i + 4], 16) >> 4; // upper 4 bits of Byte 4
380
- let motorPos2 = parseInt(commands[i + 3], 16) & 0xff; // lower 8 bits of Byte 3
381
- let motorPosition = (motorPos1 << 8) | motorPos2;
382
- let delta = parseInt(commands[i + 4], 16) & 0x0f; // lower 4 bits of Byte 4
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
- let data = {
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
- let commandResponse = parseInt(commands[i + 1], 16);
454
- let periodInMinutes = (commandResponse * 5) / 60;
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
- let commandResponse = parseInt(commands[i + 1], 16);
542
- let periodInMinutes = (commandResponse * 5) / 60;
543
- let data = { joinRetryPeriod: periodInMinutes };
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
- let wdpC = commands[i + 1] == '00' ? false : parseInt(commands[i + 1], 16);
562
- let wdpUc = commands[i + 2] == '00' ? false : parseInt(commands[i + 2], 16);
563
- let data = { watchDogParams: { wdpC, wdpUc } };
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
- let data = { uplinkType: commands[i + 1] };
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
- let wdpC = commands[i + 1] == '00' ? false : parseInt(commands[i + 1], 16);
600
- let wdpUc = commands[i + 2] == '00' ? false : parseInt(commands[i + 2], 16);
601
- let data = { watchDogParams: { wdpC, wdpUc } };
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
- let data = { primaryOperationalMode: commands[i + 1] };
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
- let data = { status: parseInt(commands[i + 1], 16) };
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
- let data = { notificationBlindTime: parseInt(commands[i + 1], 16) };
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
- let data = { sendEventLater: parseInt(commands[i + 1], 16) };
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
- let data = {
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
- let data = { lightEnabled: parseInt(commands[i + 1], 16) === 1 };
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
- let good_medium = parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16);
653
- let medium_bad = parseInt(`${commands[i + 3]}${commands[i + 4]}`, 16);
654
- let data = { boundaryLevels: { good_medium: Number(good_medium), medium_bad: Number(medium_bad) } };
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
- let data = {
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
- let data = {
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
- let data = { hallEnabled: parseInt(commands[i + 1], 16) === 1 };
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
- let data = { autoZeroValue: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) };
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
- let data = { onTime: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) };
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
- let data = {
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
- let data = { offTime: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) };
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
- let data = { overcurrentThreshold: parseInt(commands[i + 1], 16) };
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
- let data = { hallBlindPeriod: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16) };
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
- let good_zone = parseInt(commands[i + 1], 16);
767
- let medium_zone = parseInt(commands[i + 2], 16);
768
- let bad_zone = parseInt(commands[i + 3], 16);
769
- let data = {
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
- let good_zone = parseInt(commands[i + 1], 16);
840
- let medium_zone = parseInt(commands[i + 2], 16);
841
- let bad_zone = parseInt(commands[i + 3], 16);
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
- let data = { OVAC: parseInt(commands[i + 1], 16) };
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
- let data = {
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
- let duration_good_beeping = parseInt(commands[i + 1], 16);
881
- let duration_good_loud = parseInt(commands[i + 2], 16) * 10;
882
- let duration_good_silent = parseInt(commands[i + 3], 16) * 10;
883
- let duration_medium_beeping = parseInt(commands[i + 4], 16);
884
- let duration_medium_loud = parseInt(commands[i + 5], 16) * 10;
885
- let duration_medium_silent = parseInt(commands[i + 6], 16) * 10;
886
- let duration_bad_beeping = parseInt(commands[i + 7], 16);
887
- let duration_bad_loud = parseInt(commands[i + 8], 16) * 10;
888
- let duration_bad_silent = parseInt(commands[i + 9], 16) * 10;
889
- let data = {
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
- let data = { manualTargetTemperatureUpdate: parseInt(commands[i + 1], 16) };
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
- let coefficient = parseInt(commands[i + 1], 16);
929
- let period = parseInt(commands[i + 2], 16);
930
- let data = { proportionalAlgorithmParameters: { coefficient: Number(coefficient), period: Number(period) } };
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
- let data = { gasEnabled: parseInt(commands[i + 1], 16) === 1 };
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
- let red_good = parseInt(commands[i + 1], 16);
941
- let green_good = parseInt(commands[i + 2], 16);
942
- let blue_good = parseInt(commands[i + 3], 16);
943
- let duration_good = parseInt(`${commands[i + 4]}${commands[i + 5]}`, 16) * 10;
944
- let red_medium = parseInt(commands[i + 6], 16);
945
- let green_medium = parseInt(commands[i + 7], 16);
946
- let blue_medium = parseInt(commands[i + 8], 16);
947
- let duration_medium = parseInt(`${commands[i + 9]}${commands[i + 10]}`, 16) * 10;
948
- let red_bad = parseInt(commands[i + 11], 16);
949
- let green_bad = parseInt(commands[i + 12], 16);
950
- let blue_bad = parseInt(commands[i + 13], 16);
951
- let duration_bad = parseInt(`${commands[i + 14]}${commands[i + 15]}`, 16) * 10;
952
- let data = {
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
- let data = { temperatureControlAlgorithm: algo };
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
- let data = { gasMeasurementPeriodMinutes: parseInt(commands[i + 1], 16) };
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
- let data = { autoZeroPeriod: parseInt(commands[i + 1], 16) };
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
- let data = { pirEnabled: parseInt(commands[i + 1], 16) === 1 };
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
- let data = { region: parseInt(commands[i + 1], 16) };
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
- let data = { childLockBehavior: commands[i + 1] };
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
- let data = {
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
- let data = { displayRefreshPeriod: parseInt(commands[i + 1], 16) };
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
- let kp = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}`, 16) / 131072;
1196
- let data = { proportionalGain: Number(kp).toFixed(5) };
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
- let data = { extAutomaticTemperatureControl: parseInt(commands[i + 1], 16) };
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
- let data = { sendTargetTempDelay: parseInt(commands[i + 1], 16) };
1208
+ const data = { sendTargetTempDelay: parseInt(commands[i + 1], 16) };
1207
1209
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1208
1210
  }
1209
1211
  }
@@ -1218,11 +1220,29 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1218
1220
  }
1219
1221
  }
1220
1222
  break;
1223
+ case '37':
1224
+ {
1225
+ try {
1226
+ command_len = 1;
1227
+ const data = { pirSensorState: parseInt(commands[i + 1], 16) };
1228
+ Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1229
+ }
1230
+ catch (e) {
1231
+ throw new utils_1.CustomError({
1232
+ message: `Failed to process command '37'`,
1233
+ hexData,
1234
+ command,
1235
+ deviceType,
1236
+ originalError: e,
1237
+ });
1238
+ }
1239
+ }
1240
+ break;
1221
1241
  case '38':
1222
1242
  {
1223
1243
  try {
1224
1244
  command_len = 1;
1225
- let data = { automaticHeatingStatus: parseInt(commands[i + 1], 16) };
1245
+ const data = { automaticHeatingStatus: parseInt(commands[i + 1], 16) };
1226
1246
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1227
1247
  }
1228
1248
  catch (e) {
@@ -1236,11 +1256,29 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1236
1256
  }
1237
1257
  }
1238
1258
  break;
1259
+ case '39':
1260
+ {
1261
+ try {
1262
+ command_len = 2;
1263
+ const data = { occupancyTimeout: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16) };
1264
+ Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1265
+ }
1266
+ catch (e) {
1267
+ throw new utils_1.CustomError({
1268
+ message: `Failed to process command '39'`,
1269
+ hexData,
1270
+ command,
1271
+ deviceType,
1272
+ originalError: e,
1273
+ });
1274
+ }
1275
+ }
1276
+ break;
1239
1277
  case '3a':
1240
1278
  {
1241
1279
  try {
1242
1280
  command_len = 1;
1243
- let data = { sensorMode: parseInt(commands[i + 1], 16) };
1281
+ const data = { sensorMode: parseInt(commands[i + 1], 16) };
1244
1282
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1245
1283
  }
1246
1284
  catch (e) {
@@ -1259,13 +1297,13 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1259
1297
  try {
1260
1298
  if (deviceType === types_1.DeviceType.Vicki) {
1261
1299
  command_len = 3;
1262
- let ki = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}`, 16) / 131072;
1263
- let data = { integralGain: Number(ki).toFixed(5) };
1300
+ const ki = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}`, 16) / 131072;
1301
+ const data = { integralGain: Number(ki).toFixed(5) };
1264
1302
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1265
1303
  }
1266
1304
  else {
1267
1305
  command_len = 1;
1268
- let data = { pirSensorStatus: parseInt(commands[i + 1], 16) };
1306
+ const data = { pirSensorStatus: parseInt(commands[i + 1], 16) };
1269
1307
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1270
1308
  }
1271
1309
  }
@@ -1306,12 +1344,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1306
1344
  try {
1307
1345
  if (deviceType === types_1.DeviceType.Vicki) {
1308
1346
  command_len = 2;
1309
- let data = { integralValue: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
1347
+ const data = { integralValue: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
1310
1348
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1311
1349
  }
1312
1350
  else {
1313
1351
  command_len = 1;
1314
- let data = { pirSensorSensitivity: parseInt(commands[i + 1], 16) };
1352
+ const data = { pirSensorSensitivity: parseInt(commands[i + 1], 16) };
1315
1353
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1316
1354
  }
1317
1355
  }
@@ -1330,7 +1368,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1330
1368
  {
1331
1369
  try {
1332
1370
  command_len = 1;
1333
- let data = { piRunPeriod: parseInt(commands[i + 1], 16) };
1371
+ const data = { piRunPeriod: parseInt(commands[i + 1], 16) };
1334
1372
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1335
1373
  }
1336
1374
  catch (e) {
@@ -1348,7 +1386,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1348
1386
  {
1349
1387
  try {
1350
1388
  command_len = 1;
1351
- let data = { currentTemperatureVisibility: parseInt(commands[i + 1], 16) };
1389
+ const data = { currentTemperatureVisibility: parseInt(commands[i + 1], 16) };
1352
1390
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1353
1391
  }
1354
1392
  catch (e) {
@@ -1366,7 +1404,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1366
1404
  {
1367
1405
  try {
1368
1406
  command_len = 1;
1369
- let data = { tempHysteresis: parseInt(commands[i + 1], 16) / 10 };
1407
+ const data = { tempHysteresis: parseInt(commands[i + 1], 16) / 10 };
1370
1408
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1371
1409
  }
1372
1410
  catch (e) {
@@ -1384,7 +1422,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1384
1422
  {
1385
1423
  try {
1386
1424
  command_len = 1;
1387
- let data = { humidityVisibility: parseInt(commands[i + 1], 16) };
1425
+ const data = { humidityVisibility: parseInt(commands[i + 1], 16) };
1388
1426
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1389
1427
  }
1390
1428
  catch (e) {
@@ -1402,7 +1440,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1402
1440
  {
1403
1441
  try {
1404
1442
  command_len = 2;
1405
- let data = { extSensorTemperature: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
1443
+ const data = { extSensorTemperature: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
1406
1444
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1407
1445
  }
1408
1446
  catch (e) {
@@ -1445,10 +1483,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1445
1483
  {
1446
1484
  try {
1447
1485
  command_len = 3;
1448
- let enabled = !!parseInt(commands[i + 1], 16);
1449
- let duration = parseInt(commands[i + 2], 16) * 5;
1450
- let delta = parseInt(commands[i + 3], 16) / 10;
1451
- let data = { openWindowPrecisely: { enabled: enabled, duration: duration, delta: delta } };
1486
+ const enabled = !!parseInt(commands[i + 1], 16);
1487
+ const duration = parseInt(commands[i + 2], 16) * 5;
1488
+ const delta = parseInt(commands[i + 3], 16) / 10;
1489
+ const data = { openWindowPrecisely: { enabled: enabled, duration: duration, delta: delta } };
1452
1490
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1453
1491
  }
1454
1492
  catch (e) {
@@ -1491,7 +1529,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1491
1529
  {
1492
1530
  try {
1493
1531
  command_len = 1;
1494
- let data = { forceAttach: !!parseInt(commands[i + 1], 16) };
1532
+ const data = { forceAttach: !!parseInt(commands[i + 1], 16) };
1495
1533
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1496
1534
  }
1497
1535
  catch (e) {
@@ -1534,10 +1572,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1534
1572
  {
1535
1573
  try {
1536
1574
  command_len = 3;
1537
- let activatedTemperature = parseInt(commands[i + 1], 16) / 10;
1538
- let deactivatedTemperature = parseInt(commands[i + 2], 16) / 10;
1539
- let targetTemperature = parseInt(commands[i + 3], 16);
1540
- let data = { antiFreezeParams: { activatedTemperature, deactivatedTemperature, targetTemperature } };
1575
+ const activatedTemperature = parseInt(commands[i + 1], 16) / 10;
1576
+ const deactivatedTemperature = parseInt(commands[i + 2], 16) / 10;
1577
+ const targetTemperature = parseInt(commands[i + 3], 16);
1578
+ const data = { antiFreezeParams: { activatedTemperature, deactivatedTemperature, targetTemperature } };
1541
1579
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1542
1580
  }
1543
1581
  catch (e) {
@@ -1638,7 +1676,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1638
1676
  {
1639
1677
  try {
1640
1678
  command_len = 2;
1641
- let data = {
1679
+ const data = {
1642
1680
  valveOpennessRangeInPercentage: {
1643
1681
  max: 100 - parseInt(commands[i + 1], 16),
1644
1682
  min: 100 - parseInt(commands[i + 2], 16),
@@ -1688,7 +1726,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1688
1726
  {
1689
1727
  try {
1690
1728
  command_len = 2;
1691
- let data = { targetTemperatureFloat: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
1729
+ const data = { targetTemperatureFloat: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) / 10 };
1692
1730
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1693
1731
  }
1694
1732
  catch (e) {
@@ -1706,7 +1744,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1706
1744
  {
1707
1745
  try {
1708
1746
  command_len = 1;
1709
- let data = { targetTemperatureStep: parseInt(commands[i + 1], 16) / 10 };
1747
+ const data = { targetTemperatureStep: parseInt(commands[i + 1], 16) / 10 };
1710
1748
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
1711
1749
  }
1712
1750
  catch (e) {
@@ -1734,7 +1772,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1734
1772
  }
1735
1773
  else {
1736
1774
  command_len = 1;
1737
- let offset = (parseInt(commands[i + 1], 16) - 28) * 0.176;
1775
+ const offset = (parseInt(commands[i + 1], 16) - 28) * 0.176;
1738
1776
  data = { temperatureOffset: offset };
1739
1777
  }
1740
1778
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -1781,8 +1819,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1781
1819
  }
1782
1820
  else if (deviceType === types_1.DeviceType.Relay16 || deviceType === types_1.DeviceType.Relay16Dry) {
1783
1821
  command_len = 3;
1784
- let state = parseInt(commands[i + 1], 16);
1785
- let time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
1822
+ const state = parseInt(commands[i + 1], 16);
1823
+ const time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
1786
1824
  data = { relayTimerInMilliseconds: { state, time } };
1787
1825
  }
1788
1826
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -1825,10 +1863,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1825
1863
  let data;
1826
1864
  if (deviceType === types_1.DeviceType.Vicki) {
1827
1865
  command_len = 2;
1828
- let notificationByte = parseInt(commands[i + 1], 16);
1866
+ const notificationByte = parseInt(commands[i + 1], 16);
1829
1867
  // Extract notification flags from bits
1830
- let temperatureRestoredAfterManualBoost = !!(notificationByte & 0x01); // Bit 0
1831
- let temperatureChangedByHeatingSchedule = !!(notificationByte & 0x02); // Bit 1
1868
+ const temperatureRestoredAfterManualBoost = !!(notificationByte & 0x01); // Bit 0
1869
+ const temperatureChangedByHeatingSchedule = !!(notificationByte & 0x02); // Bit 1
1832
1870
  data = {
1833
1871
  notifications: {
1834
1872
  temperatureRestoredAfterManualBoost: temperatureRestoredAfterManualBoost,
@@ -1838,8 +1876,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1838
1876
  }
1839
1877
  else {
1840
1878
  command_len = 3;
1841
- let state = parseInt(commands[i + 1], 16);
1842
- let time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
1879
+ const state = parseInt(commands[i + 1], 16);
1880
+ const time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
1843
1881
  data = { relayTimerInSeconds: { state, time } };
1844
1882
  }
1845
1883
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -1964,8 +2002,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
1964
2002
  }
1965
2003
  else if (deviceType === types_1.DeviceType.Vicki) {
1966
2004
  command_len = 1;
1967
- let offsetByte = parseInt(commands[i + 1], 16);
1968
- let offsetHours = offsetByte & 0x80 ? offsetByte - 256 : offsetByte;
2005
+ const offsetByte = parseInt(commands[i + 1], 16);
2006
+ const offsetHours = offsetByte & 0x80 ? offsetByte - 256 : offsetByte;
1969
2007
  data = { deviceTimeZone: offsetHours };
1970
2008
  }
1971
2009
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2026,7 +2064,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2026
2064
  }
2027
2065
  else {
2028
2066
  command_len = 1;
2029
- let timeValue = parseInt(commands[i + 1], 16);
2067
+ const timeValue = parseInt(commands[i + 1], 16);
2030
2068
  data = { autoSetpointRestoreStatus: timeValue === 0 ? 0 : timeValue * 10 };
2031
2069
  }
2032
2070
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2454,7 +2492,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2454
2492
  {
2455
2493
  try {
2456
2494
  command_len = 1;
2457
- let data = { measurementBlindTime: parseInt(commands[i + 1], 16) };
2495
+ const data = { measurementBlindTime: parseInt(commands[i + 1], 16) };
2458
2496
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
2459
2497
  }
2460
2498
  catch (e) {
@@ -2472,11 +2510,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2472
2510
  {
2473
2511
  try {
2474
2512
  command_len = 1;
2475
- let bin = decbin(parseInt(commands[i + 1], 16));
2476
- let chart = Number(bin[5]);
2477
- let digital_value = Number(bin[6]);
2478
- let emoji = Number(bin[7]);
2479
- let data = { imagesVisibility: { chart, digital_value, emoji } };
2513
+ const bin = decbin(parseInt(commands[i + 1], 16));
2514
+ const chart = Number(bin[5]);
2515
+ const digital_value = Number(bin[6]);
2516
+ const emoji = Number(bin[7]);
2517
+ const data = { imagesVisibility: { chart, digital_value, emoji } };
2480
2518
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
2481
2519
  }
2482
2520
  catch (e) {
@@ -2521,7 +2559,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2521
2559
  {
2522
2560
  try {
2523
2561
  command_len = 3;
2524
- let data = {
2562
+ const data = {
2525
2563
  doublePressEventCounter: (parseInt(commands[i + 1], 16) << 16) | (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16),
2526
2564
  };
2527
2565
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2541,7 +2579,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2541
2579
  {
2542
2580
  try {
2543
2581
  command_len = 3;
2544
- let data = {
2582
+ const data = {
2545
2583
  triplePressEventCounter: (parseInt(commands[i + 1], 16) << 16) | (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16),
2546
2584
  };
2547
2585
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2561,9 +2599,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2561
2599
  {
2562
2600
  try {
2563
2601
  command_len = 4;
2564
- let fuota_address = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`, 16);
2565
- let fuota_address_raw = `${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`;
2566
- let data = { fuota: { fuota_address, fuota_address_raw } };
2602
+ const fuota_address = parseInt(`${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`, 16);
2603
+ const fuota_address_raw = `${commands[i + 1]}${commands[i + 2]}${commands[i + 3]}${commands[i + 4]}`;
2604
+ const data = { fuota: { fuota_address, fuota_address_raw } };
2567
2605
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
2568
2606
  }
2569
2607
  catch (e) {
@@ -2581,7 +2619,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2581
2619
  {
2582
2620
  try {
2583
2621
  command_len = 1;
2584
- let data = { crystalOscillatorError: true };
2622
+ const data = { crystalOscillatorError: true };
2585
2623
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
2586
2624
  }
2587
2625
  catch (e) {
@@ -2605,24 +2643,24 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2605
2643
  }
2606
2644
  else {
2607
2645
  command_len = 41;
2608
- let eventsGroup = parseInt(commands[i + 1], 16); // 0 = events 0-7, 1 = events 8-15, 2 = events 16-19
2609
- let eventGroupIndex = ['0-7', '8-15', '16-19'];
2610
- let heatingEvents = [];
2646
+ const eventsGroup = parseInt(commands[i + 1], 16); // 0 = events 0-7, 1 = events 8-15, 2 = events 16-19
2647
+ const eventGroupIndex = ['0-7', '8-15', '16-19'];
2648
+ const heatingEvents = [];
2611
2649
  // Process up to 8 events for groups 0 and 1, but only 4 events for group 2
2612
- let eventsToProcess = eventsGroup === 2 ? 4 : 8;
2650
+ const eventsToProcess = eventsGroup === 2 ? 4 : 8;
2613
2651
  for (let eventIdx = 0; eventIdx < eventsToProcess; eventIdx++) {
2614
2652
  // Each event takes 5 bytes (hour, minute, temp high, temp low, weekday bitmask)
2615
- let offset = i + 2 + eventIdx * 5;
2653
+ const offset = i + 2 + eventIdx * 5;
2616
2654
  // Check if this event is configured
2617
2655
  // Make sure we have valid values at this offset
2618
2656
  if (offset >= commands.length || offset + 4 >= commands.length) {
2619
2657
  continue;
2620
2658
  }
2621
- let hour = parseInt(commands[offset], 16);
2622
- let minute = parseInt(commands[offset + 1], 16);
2623
- let tempHigh = parseInt(commands[offset + 2], 16);
2624
- let tempLow = parseInt(commands[offset + 3], 16);
2625
- let weekdayByte = parseInt(commands[offset + 4], 16);
2659
+ const hour = parseInt(commands[offset], 16);
2660
+ const minute = parseInt(commands[offset + 1], 16);
2661
+ const tempHigh = parseInt(commands[offset + 2], 16);
2662
+ const tempLow = parseInt(commands[offset + 3], 16);
2663
+ const weekdayByte = parseInt(commands[offset + 4], 16);
2626
2664
  // Skip events that are not configured (zeros or NaN values)
2627
2665
  if (isNaN(hour) ||
2628
2666
  isNaN(minute) ||
@@ -2633,9 +2671,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2633
2671
  continue;
2634
2672
  }
2635
2673
  // Calculate actual event index in the full range (0-23)
2636
- let globalEventIndex = eventsGroup * 8 + eventIdx;
2674
+ const globalEventIndex = eventsGroup * 8 + eventIdx;
2637
2675
  // Decode weekday bitmask (bit 0=Mon, bit 1=Tue, bit 2=Wed, bit 3=Thu, bit 4=Fri, bit 5=Sat, bit 6=Sun)
2638
- let weekdays = {
2676
+ const weekdays = {
2639
2677
  monday: !!(weekdayByte & 0x01), // bit 0
2640
2678
  tuesday: !!(weekdayByte & 0x02), // bit 1
2641
2679
  wednesday: !!(weekdayByte & 0x04), // bit 2
@@ -2645,7 +2683,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2645
2683
  sunday: !!(weekdayByte & 0x40), // bit 6
2646
2684
  };
2647
2685
  // Create heating event object
2648
- let heatingEvent = {
2686
+ const heatingEvent = {
2649
2687
  index: globalEventIndex,
2650
2688
  start: (hour < 10 ? '0' + hour : hour) + ':' + (minute < 10 ? '0' + minute : minute),
2651
2689
  targetTemperature: ((tempHigh << 8) | tempLow) / 10,
@@ -2678,12 +2716,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2678
2716
  if (deviceType === types_1.DeviceType.Vicki) {
2679
2717
  command_len = 4;
2680
2718
  // Note: Months are 0-11 (January=0, December=11)
2681
- let startMonth = parseInt(commands[i + 1], 16);
2682
- let startDay = parseInt(commands[i + 2], 16);
2683
- let endMonth = parseInt(commands[i + 3], 16);
2684
- let endDay = parseInt(commands[i + 4], 16);
2719
+ const startMonth = parseInt(commands[i + 1], 16);
2720
+ const startDay = parseInt(commands[i + 2], 16);
2721
+ const endMonth = parseInt(commands[i + 3], 16);
2722
+ const endDay = parseInt(commands[i + 4], 16);
2685
2723
  // Convert to human-readable month names
2686
- let monthNames = [
2724
+ const monthNames = [
2687
2725
  'January',
2688
2726
  'February',
2689
2727
  'March',
@@ -2727,15 +2765,15 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2727
2765
  try {
2728
2766
  command_len = 4;
2729
2767
  // Parse 32-bit UNIX timestamp (4 bytes)
2730
- var unixTimestamp = (parseInt(commands[i + 1], 16) << 24) |
2768
+ const unixTimestamp = (parseInt(commands[i + 1], 16) << 24) |
2731
2769
  (parseInt(commands[i + 2], 16) << 16) |
2732
2770
  (parseInt(commands[i + 3], 16) << 8) |
2733
2771
  parseInt(commands[i + 4], 16);
2734
2772
  // Convert UNIX timestamp to JavaScript Date
2735
- let dateObj = new Date(unixTimestamp * 1000); // Convert seconds to milliseconds
2736
- let date = dateObj.getUTCDate() + '/' + (dateObj.getUTCMonth() + 1) + '/' + dateObj.getUTCFullYear();
2737
- let time = dateObj.getUTCHours() + ':' + (dateObj.getUTCMinutes() < 10 ? '0' : '') + dateObj.getUTCMinutes();
2738
- let data = {
2773
+ const dateObj = new Date(unixTimestamp * 1000); // Convert seconds to milliseconds
2774
+ const date = dateObj.getUTCDate() + '/' + (dateObj.getUTCMonth() + 1) + '/' + dateObj.getUTCFullYear();
2775
+ const time = dateObj.getUTCHours() + ':' + (dateObj.getUTCMinutes() < 10 ? '0' : '') + dateObj.getUTCMinutes();
2776
+ const data = {
2739
2777
  deviceTime: '' + date + ' ' + time,
2740
2778
  };
2741
2779
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2755,9 +2793,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2755
2793
  {
2756
2794
  try {
2757
2795
  command_len = 1;
2758
- let ledDurationValue = parseInt(commands[i + 1], 16);
2759
- let durationInSeconds = ledDurationValue / 2; // As per the docs, value is divided by 2 to get seconds
2760
- let data = {
2796
+ const ledDurationValue = parseInt(commands[i + 1], 16);
2797
+ const durationInSeconds = ledDurationValue / 2; // As per the docs, value is divided by 2 to get seconds
2798
+ const data = {
2761
2799
  ledIndicationDuration: durationInSeconds,
2762
2800
  };
2763
2801
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2777,10 +2815,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2777
2815
  {
2778
2816
  try {
2779
2817
  command_len = 2;
2780
- let tempHigh = parseInt(commands[i + 1], 16);
2781
- let tempLow = parseInt(commands[i + 2], 16);
2782
- let targetTemp = (tempHigh << 8) | tempLow;
2783
- let data = {
2818
+ const tempHigh = parseInt(commands[i + 1], 16);
2819
+ const tempLow = parseInt(commands[i + 2], 16);
2820
+ const targetTemp = (tempHigh << 8) | tempLow;
2821
+ const data = {
2784
2822
  offlineTargetTemperature: targetTemp === 0 ? 0 : targetTemp / 10,
2785
2823
  };
2786
2824
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2800,7 +2838,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2800
2838
  {
2801
2839
  try {
2802
2840
  command_len = 1;
2803
- let data = { internalAlgoTemporaryState: parseInt(commands[i + 1], 16) === 0 ? true : false };
2841
+ const data = { internalAlgoTemporaryState: parseInt(commands[i + 1], 16) === 0 ? true : false };
2804
2842
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
2805
2843
  }
2806
2844
  catch (e) {
@@ -2818,16 +2856,16 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2818
2856
  {
2819
2857
  try {
2820
2858
  command_len = 12;
2821
- let temperatureLevels = {};
2859
+ const temperatureLevels = {};
2822
2860
  // Process 6 scale levels (0-5), each with a 2-byte temperature value
2823
2861
  for (let level = 0; level < 6; level++) {
2824
- let tempHighByte = parseInt(commands[i + 1 + level * 2], 16);
2825
- let tempLowByte = parseInt(commands[i + 2 + level * 2], 16);
2826
- let tempValue = (tempHighByte << 8) | tempLowByte;
2862
+ const tempHighByte = parseInt(commands[i + 1 + level * 2], 16);
2863
+ const tempLowByte = parseInt(commands[i + 2 + level * 2], 16);
2864
+ const tempValue = (tempHighByte << 8) | tempLowByte;
2827
2865
  // The temperature values are pre-multiplied by 10
2828
2866
  temperatureLevels['level' + level] = tempValue / 10;
2829
2867
  }
2830
- let data = {
2868
+ const data = {
2831
2869
  temperatureLevels: temperatureLevels,
2832
2870
  };
2833
2871
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2846,11 +2884,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2846
2884
  case '6c': {
2847
2885
  try {
2848
2886
  command_len = 4;
2849
- let eventsHighByte = parseInt(commands[i + 2], 16); // Events 19-16
2850
- let eventsMidByte = parseInt(commands[i + 3], 16); // Events 15-8
2851
- let eventsLowByte = parseInt(commands[i + 4], 16); // Events 7-0
2887
+ const eventsHighByte = parseInt(commands[i + 2], 16); // Events 19-16
2888
+ const eventsMidByte = parseInt(commands[i + 3], 16); // Events 15-8
2889
+ const eventsLowByte = parseInt(commands[i + 4], 16); // Events 7-0
2852
2890
  // Create a more structured and readable format for heating events
2853
- let heatingEventStates = {};
2891
+ const heatingEventStates = {};
2854
2892
  // Process all 20 events (0-19) in a single loop
2855
2893
  for (let eventIdx = 0; eventIdx < 20; eventIdx++) {
2856
2894
  // Calculate which bit to check
@@ -2871,7 +2909,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2871
2909
  heatingEventStates[eventIdx] = !!(eventsLowByte & (1 << bitPosition));
2872
2910
  }
2873
2911
  }
2874
- let data = {
2912
+ const data = {
2875
2913
  heatingEventStates: heatingEventStates,
2876
2914
  };
2877
2915
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
@@ -2891,7 +2929,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
2891
2929
  {
2892
2930
  try {
2893
2931
  command_len = 1;
2894
- let data = { userInterfaceLanguage: parseInt(commands[i + 1], 16) };
2932
+ const data = { userInterfaceLanguage: parseInt(commands[i + 1], 16) };
2895
2933
  Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
2896
2934
  }
2897
2935
  catch (e) {