mclimate-payload-helper 1.2.3 → 1.2.4
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/dist/decoders/commandsReadingHelper.d.ts.map +1 -1
- package/dist/decoders/commandsReadingHelper.js +124 -44
- package/dist/decoders/commandsReadingHelper.js.map +1 -1
- package/dist/decoders/payloadParsers/index.d.ts +1 -0
- package/dist/decoders/payloadParsers/index.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/index.js +1 -0
- package/dist/decoders/payloadParsers/index.js.map +1 -1
- package/dist/decoders/payloadParsers/multisensorPayloadParser.d.ts +2 -0
- package/dist/decoders/payloadParsers/multisensorPayloadParser.d.ts.map +1 -0
- package/dist/decoders/payloadParsers/multisensorPayloadParser.js +96 -0
- package/dist/decoders/payloadParsers/multisensorPayloadParser.js.map +1 -0
- package/dist/decoders/payloadParsers/types/allDevices.d.ts +2 -1
- package/dist/decoders/payloadParsers/types/allDevices.d.ts.map +1 -1
- package/dist/decoders/payloadParsers/types/allDevices.js +1 -0
- package/dist/decoders/payloadParsers/types/allDevices.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/CommandBuilder.d.ts.map +1 -1
- package/dist/encoders/CommandBuilder.js +1 -0
- 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/MultiSensorCommands.d.ts +25 -0
- package/dist/encoders/MultiSensorCommands.d.ts.map +1 -0
- package/dist/encoders/MultiSensorCommands.js +256 -0
- package/dist/encoders/MultiSensorCommands.js.map +1 -0
- 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/index.d.ts +1 -0
- package/dist/encoders/index.d.ts.map +1 -1
- package/dist/encoders/index.js +1 -0
- package/dist/encoders/index.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 +247 -0
- package/dist/encoders/types/schemas.d.ts.map +1 -1
- package/dist/encoders/types/schemas.js +24 -3
- package/dist/encoders/types/schemas.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/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 +1 -1
- package/src/decoders/commandsReadingHelper.ts +283 -204
- package/src/decoders/payloadParsers/index.ts +1 -1
- package/src/decoders/payloadParsers/multisensorPayloadParser.ts +97 -0
- package/src/decoders/payloadParsers/types/allDevices.ts +1 -0
- package/src/encoders/CommandBuilder.ts +2 -0
- package/src/encoders/MultiSensorCommands.ts +253 -0
- package/src/encoders/index.ts +1 -0
- package/src/encoders/types/schemas.ts +62 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandsReadingHelper.d.ts","sourceRoot":"","sources":["../../src/decoders/commandsReadingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAG5D,eAAO,MAAM,qBAAqB,YAAa,MAAM,iBAAiB,MAAM,cAAc,UAAU,
|
|
1
|
+
{"version":3,"file":"commandsReadingHelper.d.ts","sourceRoot":"","sources":["../../src/decoders/commandsReadingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAG5D,eAAO,MAAM,qBAAqB,YAAa,MAAM,iBAAiB,MAAM,cAAc,UAAU,mBA8tFnG,CAAA"}
|
|
@@ -21,6 +21,9 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
21
21
|
else if ((potentialKeepAlive[0] === '00' || potentialKeepAlive[0] === '88') && deviceType === types_1.DeviceType.TFlood) {
|
|
22
22
|
decodeKeepalive = true;
|
|
23
23
|
}
|
|
24
|
+
else if (potentialKeepAlive[0] === '82' && deviceType === types_1.DeviceType.MultiSensor) {
|
|
25
|
+
decodeKeepalive = true;
|
|
26
|
+
}
|
|
24
27
|
else if ((potentialKeepAlive[0] === '01' || potentialKeepAlive[0] === '20' || potentialKeepAlive[0] === '21') &&
|
|
25
28
|
deviceType === types_1.DeviceType.OpenCloseSensor) {
|
|
26
29
|
decodeKeepalive = true;
|
|
@@ -240,15 +243,16 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
240
243
|
const address = (bufferOffsetMSB << 8) | bufferOffsetLSB;
|
|
241
244
|
// The rest is IR code data
|
|
242
245
|
let irCodeDataString = '';
|
|
243
|
-
for (let j = 4; j < 4 + bytesCount - 2; j++) {
|
|
246
|
+
for (let j = 4; j < 4 + bytesCount - 2; j++) {
|
|
247
|
+
// -2 to account for the offset bytes
|
|
244
248
|
irCodeDataString += commands[i + j];
|
|
245
249
|
}
|
|
246
250
|
data = {
|
|
247
251
|
irCodeData: {
|
|
248
252
|
bytesCount: bytesCount - 2,
|
|
249
253
|
address,
|
|
250
|
-
data: irCodeDataString
|
|
251
|
-
}
|
|
254
|
+
data: irCodeDataString,
|
|
255
|
+
},
|
|
252
256
|
};
|
|
253
257
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
254
258
|
}
|
|
@@ -638,6 +642,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
638
642
|
};
|
|
639
643
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
640
644
|
}
|
|
645
|
+
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
646
|
+
command_len = 1;
|
|
647
|
+
let data = { lightEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
648
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
649
|
+
}
|
|
641
650
|
else {
|
|
642
651
|
command_len = 4;
|
|
643
652
|
let good_medium = parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16);
|
|
@@ -681,6 +690,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
681
690
|
};
|
|
682
691
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
683
692
|
}
|
|
693
|
+
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
694
|
+
command_len = 1;
|
|
695
|
+
let data = { hallEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
696
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
697
|
+
}
|
|
684
698
|
else if (deviceType !== types_1.DeviceType.OpenCloseSensor) {
|
|
685
699
|
command_len = 2;
|
|
686
700
|
let data = { autoZeroValue: parseInt(`${commands[i + 1]}${commands[i + 2]}`, 16) };
|
|
@@ -742,6 +756,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
742
756
|
let data = { overcurrentThreshold: parseInt(commands[i + 1], 16) };
|
|
743
757
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
744
758
|
}
|
|
759
|
+
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
760
|
+
command_len = 2;
|
|
761
|
+
let data = { hallBlindPeriod: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16) };
|
|
762
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
763
|
+
}
|
|
745
764
|
else {
|
|
746
765
|
command_len = 3;
|
|
747
766
|
let good_zone = parseInt(commands[i + 1], 16);
|
|
@@ -767,7 +786,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
767
786
|
case '25':
|
|
768
787
|
{
|
|
769
788
|
try {
|
|
770
|
-
let data
|
|
789
|
+
let data;
|
|
771
790
|
if (deviceType == types_1.DeviceType.Relay16) {
|
|
772
791
|
command_len = 2;
|
|
773
792
|
data = { overpowerThreshold: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16) };
|
|
@@ -811,6 +830,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
811
830
|
},
|
|
812
831
|
};
|
|
813
832
|
}
|
|
833
|
+
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
834
|
+
command_len = 1;
|
|
835
|
+
data = { microphoneEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
836
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
837
|
+
}
|
|
814
838
|
else {
|
|
815
839
|
command_len = 3;
|
|
816
840
|
let good_zone = parseInt(commands[i + 1], 16);
|
|
@@ -823,8 +847,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
823
847
|
bad_zone: Number(bad_zone),
|
|
824
848
|
},
|
|
825
849
|
};
|
|
850
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
826
851
|
}
|
|
827
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
828
852
|
}
|
|
829
853
|
catch (e) {
|
|
830
854
|
throw new utils_1.CustomError({
|
|
@@ -845,6 +869,13 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
845
869
|
let data = { OVAC: parseInt(commands[i + 1], 16) };
|
|
846
870
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
847
871
|
}
|
|
872
|
+
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
873
|
+
command_len = 2;
|
|
874
|
+
let data = {
|
|
875
|
+
microphoneSamplingPeriod: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16),
|
|
876
|
+
};
|
|
877
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
878
|
+
}
|
|
848
879
|
else {
|
|
849
880
|
command_len = 9;
|
|
850
881
|
let duration_good_beeping = parseInt(commands[i + 1], 16);
|
|
@@ -900,6 +931,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
900
931
|
let data = { proportionalAlgorithmParameters: { coefficient: Number(coefficient), period: Number(period) } };
|
|
901
932
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
902
933
|
}
|
|
934
|
+
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
935
|
+
command_len = 1;
|
|
936
|
+
let data = { gasEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
937
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
938
|
+
}
|
|
903
939
|
else {
|
|
904
940
|
command_len = 15;
|
|
905
941
|
let red_good = parseInt(commands[i + 1], 16);
|
|
@@ -964,6 +1000,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
964
1000
|
let data = { temperatureControlAlgorithm: algo };
|
|
965
1001
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
966
1002
|
}
|
|
1003
|
+
else if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
1004
|
+
command_len = 1;
|
|
1005
|
+
let data = { gasMeasurementPeriodMinutes: parseInt(commands[i + 1], 16) };
|
|
1006
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1007
|
+
}
|
|
967
1008
|
else {
|
|
968
1009
|
command_len = 1;
|
|
969
1010
|
let data = { autoZeroPeriod: parseInt(commands[i + 1], 16) };
|
|
@@ -981,11 +1022,36 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
981
1022
|
}
|
|
982
1023
|
}
|
|
983
1024
|
break;
|
|
1025
|
+
case '2d':
|
|
1026
|
+
{
|
|
1027
|
+
try {
|
|
1028
|
+
if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
1029
|
+
command_len = 1;
|
|
1030
|
+
let data = { pirEnabled: parseInt(commands[i + 1], 16) === 1 };
|
|
1031
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
catch (e) {
|
|
1035
|
+
throw new utils_1.CustomError({
|
|
1036
|
+
message: `Failed to process command '2d'`,
|
|
1037
|
+
hexData,
|
|
1038
|
+
command,
|
|
1039
|
+
deviceType,
|
|
1040
|
+
originalError: e,
|
|
1041
|
+
});
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
break;
|
|
984
1045
|
case '2f':
|
|
985
1046
|
{
|
|
986
1047
|
try {
|
|
987
1048
|
let data;
|
|
988
|
-
if (deviceType === types_1.DeviceType.
|
|
1049
|
+
if (deviceType === types_1.DeviceType.MultiSensor) {
|
|
1050
|
+
command_len = 2;
|
|
1051
|
+
data = { pirBlindPeriod: (parseInt(commands[i + 1], 16) << 8) | parseInt(commands[i + 2], 16) };
|
|
1052
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1053
|
+
}
|
|
1054
|
+
else if (deviceType === types_1.DeviceType.CO2DisplayLite ||
|
|
989
1055
|
deviceType === types_1.DeviceType.CO2PirLite ||
|
|
990
1056
|
deviceType === types_1.DeviceType.HTPirLite) {
|
|
991
1057
|
command_len = 1;
|
|
@@ -1035,6 +1101,24 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1035
1101
|
}
|
|
1036
1102
|
}
|
|
1037
1103
|
break;
|
|
1104
|
+
case 'a4':
|
|
1105
|
+
{
|
|
1106
|
+
try {
|
|
1107
|
+
command_len = 1;
|
|
1108
|
+
let data = { region: parseInt(commands[i + 1], 16) };
|
|
1109
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1110
|
+
}
|
|
1111
|
+
catch (e) {
|
|
1112
|
+
throw new utils_1.CustomError({
|
|
1113
|
+
message: `Failed to process command 'a4'`,
|
|
1114
|
+
hexData,
|
|
1115
|
+
command,
|
|
1116
|
+
deviceType,
|
|
1117
|
+
originalError: e,
|
|
1118
|
+
});
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
break;
|
|
1038
1122
|
case '32':
|
|
1039
1123
|
{
|
|
1040
1124
|
try {
|
|
@@ -1749,8 +1833,8 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1749
1833
|
data = {
|
|
1750
1834
|
notifications: {
|
|
1751
1835
|
temperatureRestoredAfterManualBoost: temperatureRestoredAfterManualBoost,
|
|
1752
|
-
temperatureChangedByHeatingSchedule: temperatureChangedByHeatingSchedule
|
|
1753
|
-
}
|
|
1836
|
+
temperatureChangedByHeatingSchedule: temperatureChangedByHeatingSchedule,
|
|
1837
|
+
},
|
|
1754
1838
|
};
|
|
1755
1839
|
}
|
|
1756
1840
|
else {
|
|
@@ -1882,7 +1966,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1882
1966
|
else if (deviceType === types_1.DeviceType.Vicki) {
|
|
1883
1967
|
command_len = 1;
|
|
1884
1968
|
let offsetByte = parseInt(commands[i + 1], 16);
|
|
1885
|
-
let offsetHours =
|
|
1969
|
+
let offsetHours = offsetByte & 0x80 ? offsetByte - 256 : offsetByte;
|
|
1886
1970
|
data = { deviceTimeZone: offsetHours };
|
|
1887
1971
|
}
|
|
1888
1972
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2494,24 +2578,6 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2494
2578
|
}
|
|
2495
2579
|
}
|
|
2496
2580
|
break;
|
|
2497
|
-
case 'a4':
|
|
2498
|
-
{
|
|
2499
|
-
try {
|
|
2500
|
-
command_len = 1;
|
|
2501
|
-
let data = { region: parseInt(commands[i + 1], 16) };
|
|
2502
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2503
|
-
}
|
|
2504
|
-
catch (e) {
|
|
2505
|
-
throw new utils_1.CustomError({
|
|
2506
|
-
message: `Failed to process command 'a4'`,
|
|
2507
|
-
hexData,
|
|
2508
|
-
command,
|
|
2509
|
-
deviceType,
|
|
2510
|
-
originalError: e,
|
|
2511
|
-
});
|
|
2512
|
-
}
|
|
2513
|
-
}
|
|
2514
|
-
break;
|
|
2515
2581
|
case 'a6':
|
|
2516
2582
|
{
|
|
2517
2583
|
try {
|
|
@@ -2544,10 +2610,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2544
2610
|
let eventGroupIndex = ['0-7', '8-15', '16-19'];
|
|
2545
2611
|
let heatingEvents = [];
|
|
2546
2612
|
// Process up to 8 events for groups 0 and 1, but only 4 events for group 2
|
|
2547
|
-
let eventsToProcess =
|
|
2613
|
+
let eventsToProcess = eventsGroup === 2 ? 4 : 8;
|
|
2548
2614
|
for (let eventIdx = 0; eventIdx < eventsToProcess; eventIdx++) {
|
|
2549
2615
|
// Each event takes 5 bytes (hour, minute, temp high, temp low, weekday bitmask)
|
|
2550
|
-
let offset = i + 2 +
|
|
2616
|
+
let offset = i + 2 + eventIdx * 5;
|
|
2551
2617
|
// Check if this event is configured
|
|
2552
2618
|
// Make sure we have valid values at this offset
|
|
2553
2619
|
if (offset >= commands.length || offset + 4 >= commands.length) {
|
|
@@ -2559,12 +2625,16 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2559
2625
|
let tempLow = parseInt(commands[offset + 3], 16);
|
|
2560
2626
|
let weekdayByte = parseInt(commands[offset + 4], 16);
|
|
2561
2627
|
// Skip events that are not configured (zeros or NaN values)
|
|
2562
|
-
if (isNaN(hour) ||
|
|
2628
|
+
if (isNaN(hour) ||
|
|
2629
|
+
isNaN(minute) ||
|
|
2630
|
+
isNaN(tempHigh) ||
|
|
2631
|
+
isNaN(tempLow) ||
|
|
2632
|
+
isNaN(weekdayByte) ||
|
|
2563
2633
|
(hour === 0 && minute === 0 && tempHigh === 0 && tempLow === 0 && weekdayByte === 0)) {
|
|
2564
2634
|
continue;
|
|
2565
2635
|
}
|
|
2566
2636
|
// Calculate actual event index in the full range (0-23)
|
|
2567
|
-
let globalEventIndex =
|
|
2637
|
+
let globalEventIndex = eventsGroup * 8 + eventIdx;
|
|
2568
2638
|
// Decode weekday bitmask (bit 0=Mon, bit 1=Tue, bit 2=Wed, bit 3=Thu, bit 4=Fri, bit 5=Sat, bit 6=Sun)
|
|
2569
2639
|
let weekdays = {
|
|
2570
2640
|
monday: !!(weekdayByte & 0x01), // bit 0
|
|
@@ -2573,20 +2643,20 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2573
2643
|
thursday: !!(weekdayByte & 0x08), // bit 3
|
|
2574
2644
|
friday: !!(weekdayByte & 0x10), // bit 4
|
|
2575
2645
|
saturday: !!(weekdayByte & 0x20), // bit 5
|
|
2576
|
-
sunday: !!(weekdayByte & 0x40) // bit 6
|
|
2646
|
+
sunday: !!(weekdayByte & 0x40), // bit 6
|
|
2577
2647
|
};
|
|
2578
2648
|
// Create heating event object
|
|
2579
2649
|
let heatingEvent = {
|
|
2580
2650
|
index: globalEventIndex,
|
|
2581
2651
|
start: (hour < 10 ? '0' + hour : hour) + ':' + (minute < 10 ? '0' + minute : minute),
|
|
2582
2652
|
targetTemperature: ((tempHigh << 8) | tempLow) / 10,
|
|
2583
|
-
weekdays: weekdays
|
|
2653
|
+
weekdays: weekdays,
|
|
2584
2654
|
};
|
|
2585
2655
|
heatingEvents.push(heatingEvent);
|
|
2586
2656
|
}
|
|
2587
2657
|
data = {
|
|
2588
2658
|
heatingEventGroup: eventGroupIndex[eventsGroup],
|
|
2589
|
-
heatingEvents: heatingEvents
|
|
2659
|
+
heatingEvents: heatingEvents,
|
|
2590
2660
|
};
|
|
2591
2661
|
}
|
|
2592
2662
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
@@ -2615,14 +2685,24 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2615
2685
|
let endDay = parseInt(commands[i + 4], 16);
|
|
2616
2686
|
// Convert to human-readable month names
|
|
2617
2687
|
let monthNames = [
|
|
2618
|
-
'January',
|
|
2619
|
-
'
|
|
2688
|
+
'January',
|
|
2689
|
+
'February',
|
|
2690
|
+
'March',
|
|
2691
|
+
'April',
|
|
2692
|
+
'May',
|
|
2693
|
+
'June',
|
|
2694
|
+
'July',
|
|
2695
|
+
'August',
|
|
2696
|
+
'September',
|
|
2697
|
+
'October',
|
|
2698
|
+
'November',
|
|
2699
|
+
'December',
|
|
2620
2700
|
];
|
|
2621
2701
|
data = {
|
|
2622
2702
|
heatingSchedule: {
|
|
2623
2703
|
start: startDay + ' ' + monthNames[startMonth],
|
|
2624
2704
|
end: endDay + ' ' + monthNames[endMonth],
|
|
2625
|
-
}
|
|
2705
|
+
},
|
|
2626
2706
|
};
|
|
2627
2707
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2628
2708
|
}
|
|
@@ -2657,7 +2737,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2657
2737
|
let date = dateObj.getUTCDate() + '/' + (dateObj.getUTCMonth() + 1) + '/' + dateObj.getUTCFullYear();
|
|
2658
2738
|
let time = dateObj.getUTCHours() + ':' + (dateObj.getUTCMinutes() < 10 ? '0' : '') + dateObj.getUTCMinutes();
|
|
2659
2739
|
let data = {
|
|
2660
|
-
deviceTime:
|
|
2740
|
+
deviceTime: '' + date + ' ' + time,
|
|
2661
2741
|
};
|
|
2662
2742
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2663
2743
|
}
|
|
@@ -2679,7 +2759,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2679
2759
|
let ledDurationValue = parseInt(commands[i + 1], 16);
|
|
2680
2760
|
let durationInSeconds = ledDurationValue / 2; // As per the docs, value is divided by 2 to get seconds
|
|
2681
2761
|
let data = {
|
|
2682
|
-
ledIndicationDuration: durationInSeconds
|
|
2762
|
+
ledIndicationDuration: durationInSeconds,
|
|
2683
2763
|
};
|
|
2684
2764
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2685
2765
|
}
|
|
@@ -2702,7 +2782,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2702
2782
|
let tempLow = parseInt(commands[i + 2], 16);
|
|
2703
2783
|
let targetTemp = (tempHigh << 8) | tempLow;
|
|
2704
2784
|
let data = {
|
|
2705
|
-
offlineTargetTemperature: targetTemp === 0 ? 0 : targetTemp / 10
|
|
2785
|
+
offlineTargetTemperature: targetTemp === 0 ? 0 : targetTemp / 10,
|
|
2706
2786
|
};
|
|
2707
2787
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2708
2788
|
}
|
|
@@ -2742,14 +2822,14 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2742
2822
|
let temperatureLevels = {};
|
|
2743
2823
|
// Process 6 scale levels (0-5), each with a 2-byte temperature value
|
|
2744
2824
|
for (let level = 0; level < 6; level++) {
|
|
2745
|
-
let tempHighByte = parseInt(commands[i + 1 +
|
|
2746
|
-
let tempLowByte = parseInt(commands[i + 2 +
|
|
2825
|
+
let tempHighByte = parseInt(commands[i + 1 + level * 2], 16);
|
|
2826
|
+
let tempLowByte = parseInt(commands[i + 2 + level * 2], 16);
|
|
2747
2827
|
let tempValue = (tempHighByte << 8) | tempLowByte;
|
|
2748
2828
|
// The temperature values are pre-multiplied by 10
|
|
2749
2829
|
temperatureLevels['level' + level] = tempValue / 10;
|
|
2750
2830
|
}
|
|
2751
2831
|
let data = {
|
|
2752
|
-
temperatureLevels: temperatureLevels
|
|
2832
|
+
temperatureLevels: temperatureLevels,
|
|
2753
2833
|
};
|
|
2754
2834
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2755
2835
|
}
|
|
@@ -2793,7 +2873,7 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2793
2873
|
}
|
|
2794
2874
|
}
|
|
2795
2875
|
let data = {
|
|
2796
|
-
heatingEventStates: heatingEventStates
|
|
2876
|
+
heatingEventStates: heatingEventStates,
|
|
2797
2877
|
};
|
|
2798
2878
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2799
2879
|
}
|