mclimate-payload-helper 1.2.0 → 1.2.2
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 +153 -121
- package/dist/decoders/commandsReadingHelper.js.map +1 -1
- package/dist/encoders/FanCoilThermostatCommands.d.ts.map +1 -1
- package/dist/encoders/FanCoilThermostatCommands.js +7 -1
- package/dist/encoders/FanCoilThermostatCommands.js.map +1 -1
- package/dist/encoders/types/schemas.d.ts +11 -0
- package/dist/encoders/types/schemas.d.ts.map +1 -1
- package/dist/encoders/types/schemas.js +20 -9
- package/dist/encoders/types/schemas.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/decoders/commandsReadingHelper.ts +142 -122
- package/src/encoders/FanCoilThermostatCommands.ts +7 -1
- package/src/encoders/types/schemas.ts +20 -8
- package/src/index.ts +1 -0
|
@@ -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,mBAilFnG,CAAA"}
|
|
@@ -1679,10 +1679,25 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1679
1679
|
{
|
|
1680
1680
|
try {
|
|
1681
1681
|
let data;
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1682
|
+
if (deviceType === types_1.DeviceType.Vicki) {
|
|
1683
|
+
command_len = 2;
|
|
1684
|
+
let notificationByte = parseInt(commands[i + 1], 16);
|
|
1685
|
+
// Extract notification flags from bits
|
|
1686
|
+
let temperatureRestoredAfterManualBoost = !!(notificationByte & 0x01); // Bit 0
|
|
1687
|
+
let temperatureChangedByHeatingSchedule = !!(notificationByte & 0x02); // Bit 1
|
|
1688
|
+
data = {
|
|
1689
|
+
notifications: {
|
|
1690
|
+
temperatureRestoredAfterManualBoost: temperatureRestoredAfterManualBoost,
|
|
1691
|
+
temperatureChangedByHeatingSchedule: temperatureChangedByHeatingSchedule
|
|
1692
|
+
}
|
|
1693
|
+
};
|
|
1694
|
+
}
|
|
1695
|
+
else {
|
|
1696
|
+
command_len = 3;
|
|
1697
|
+
let state = parseInt(commands[i + 1], 16);
|
|
1698
|
+
let time = (parseInt(commands[i + 2], 16) << 8) | parseInt(commands[i + 3], 16);
|
|
1699
|
+
data = { relayTimerInSeconds: { state, time } };
|
|
1700
|
+
}
|
|
1686
1701
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1687
1702
|
}
|
|
1688
1703
|
catch (e) {
|
|
@@ -1751,6 +1766,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1751
1766
|
command_len = 1;
|
|
1752
1767
|
data = { fanSpeedNotOccupied: parseInt(commands[i + 1], 16) };
|
|
1753
1768
|
}
|
|
1769
|
+
else {
|
|
1770
|
+
command_len = 1;
|
|
1771
|
+
data = { manualChangeRelayState: parseInt(commands[i + 1], 16) };
|
|
1772
|
+
}
|
|
1754
1773
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1755
1774
|
}
|
|
1756
1775
|
catch (e) {
|
|
@@ -1799,6 +1818,12 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1799
1818
|
overheatingEvents: { events: parseInt(commands[i + 1], 16), temperature: parseInt(commands[i + 2], 16) },
|
|
1800
1819
|
};
|
|
1801
1820
|
}
|
|
1821
|
+
else if (deviceType === types_1.DeviceType.Vicki) {
|
|
1822
|
+
command_len = 1;
|
|
1823
|
+
let offsetByte = parseInt(commands[i + 1], 16);
|
|
1824
|
+
let offsetHours = (offsetByte & 0x80) ? (offsetByte - 256) : offsetByte;
|
|
1825
|
+
data = { deviceTimeZone: offsetHours };
|
|
1826
|
+
}
|
|
1802
1827
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1803
1828
|
}
|
|
1804
1829
|
catch (e) {
|
|
@@ -1855,6 +1880,11 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
1855
1880
|
},
|
|
1856
1881
|
};
|
|
1857
1882
|
}
|
|
1883
|
+
else {
|
|
1884
|
+
command_len = 1;
|
|
1885
|
+
let timeValue = parseInt(commands[i + 1], 16);
|
|
1886
|
+
data = { autoSetpointRestoreStatus: timeValue === 0 ? 0 : timeValue * 10 };
|
|
1887
|
+
}
|
|
1858
1888
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
1859
1889
|
}
|
|
1860
1890
|
catch (e) {
|
|
@@ -2000,6 +2030,10 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2000
2030
|
command_len = 1;
|
|
2001
2031
|
data = { frostProtectionStatus: parseInt(commands[i + 1], 16) };
|
|
2002
2032
|
}
|
|
2033
|
+
else {
|
|
2034
|
+
command_len = 1;
|
|
2035
|
+
data = { timeRequestByMACcommand: parseInt(commands[i + 1], 16) };
|
|
2036
|
+
}
|
|
2003
2037
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2004
2038
|
}
|
|
2005
2039
|
catch (e) {
|
|
@@ -2435,22 +2469,6 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2435
2469
|
}
|
|
2436
2470
|
}
|
|
2437
2471
|
break;
|
|
2438
|
-
case '58':
|
|
2439
|
-
{
|
|
2440
|
-
command_len = 1;
|
|
2441
|
-
let notificationByte = parseInt(commands[i + 1], 16);
|
|
2442
|
-
// Extract notification flags from bits
|
|
2443
|
-
let temperatureRestoredAfterManualBoost = !!(notificationByte & 0x01); // Bit 0
|
|
2444
|
-
let temperatureChangedByHeatingSchedule = !!(notificationByte & 0x02); // Bit 1
|
|
2445
|
-
let data = {
|
|
2446
|
-
notifications: {
|
|
2447
|
-
temperatureRestoredAfterManualBoost: temperatureRestoredAfterManualBoost,
|
|
2448
|
-
temperatureChangedByHeatingSchedule: temperatureChangedByHeatingSchedule
|
|
2449
|
-
}
|
|
2450
|
-
};
|
|
2451
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2452
|
-
}
|
|
2453
|
-
break;
|
|
2454
2472
|
case '5a':
|
|
2455
2473
|
{
|
|
2456
2474
|
try {
|
|
@@ -2564,24 +2582,6 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2564
2582
|
}
|
|
2565
2583
|
}
|
|
2566
2584
|
break;
|
|
2567
|
-
case '5d':
|
|
2568
|
-
{
|
|
2569
|
-
try {
|
|
2570
|
-
command_len = 1;
|
|
2571
|
-
let data = { manualChangeRelayState: parseInt(commands[i + 1], 16) };
|
|
2572
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2573
|
-
}
|
|
2574
|
-
catch (e) {
|
|
2575
|
-
throw new utils_1.CustomError({
|
|
2576
|
-
message: `Failed to process command '5d'`,
|
|
2577
|
-
hexData,
|
|
2578
|
-
command,
|
|
2579
|
-
deviceType,
|
|
2580
|
-
originalError: e,
|
|
2581
|
-
});
|
|
2582
|
-
}
|
|
2583
|
-
}
|
|
2584
|
-
break;
|
|
2585
2585
|
case '5e':
|
|
2586
2586
|
{
|
|
2587
2587
|
try {
|
|
@@ -2611,108 +2611,140 @@ const commandsReadingHelper = (hexData, payloadLength, deviceType) => {
|
|
|
2611
2611
|
}
|
|
2612
2612
|
}
|
|
2613
2613
|
break;
|
|
2614
|
-
case '60':
|
|
2615
|
-
{
|
|
2616
|
-
command_len = 1;
|
|
2617
|
-
let offsetByte = parseInt(commands[i + 1], 16);
|
|
2618
|
-
let offsetHours = (offsetByte & 0x80) ? (offsetByte - 256) : offsetByte;
|
|
2619
|
-
let data = { deviceTimeZone: offsetHours };
|
|
2620
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2621
|
-
}
|
|
2622
|
-
break;
|
|
2623
|
-
case '62':
|
|
2624
|
-
{
|
|
2625
|
-
command_len = 1;
|
|
2626
|
-
let timeValue = parseInt(commands[i + 1], 16);
|
|
2627
|
-
let data = { autoSetpointRestoreStatus: timeValue === 0 ? 0 : timeValue * 10 };
|
|
2628
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2629
|
-
}
|
|
2630
|
-
break;
|
|
2631
2614
|
case '64':
|
|
2632
2615
|
{
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2616
|
+
try {
|
|
2617
|
+
command_len = 1;
|
|
2618
|
+
let ledDurationValue = parseInt(commands[i + 1], 16);
|
|
2619
|
+
let durationInSeconds = ledDurationValue / 2; // As per the docs, value is divided by 2 to get seconds
|
|
2620
|
+
let data = {
|
|
2621
|
+
ledIndicationDuration: durationInSeconds
|
|
2622
|
+
};
|
|
2623
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2624
|
+
}
|
|
2625
|
+
catch (e) {
|
|
2626
|
+
throw new utils_1.CustomError({
|
|
2627
|
+
message: `Failed to process command '64'`,
|
|
2628
|
+
hexData,
|
|
2629
|
+
command,
|
|
2630
|
+
deviceType,
|
|
2631
|
+
originalError: e,
|
|
2632
|
+
});
|
|
2633
|
+
}
|
|
2640
2634
|
}
|
|
2641
2635
|
break;
|
|
2642
2636
|
case '66':
|
|
2643
2637
|
{
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2638
|
+
try {
|
|
2639
|
+
command_len = 2;
|
|
2640
|
+
let tempHigh = parseInt(commands[i + 1], 16);
|
|
2641
|
+
let tempLow = parseInt(commands[i + 2], 16);
|
|
2642
|
+
let targetTemp = (tempHigh << 8) | tempLow;
|
|
2643
|
+
let data = {
|
|
2644
|
+
offlineTargetTemperature: targetTemp === 0 ? 0 : targetTemp / 10
|
|
2645
|
+
};
|
|
2646
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2647
|
+
}
|
|
2648
|
+
catch (e) {
|
|
2649
|
+
throw new utils_1.CustomError({
|
|
2650
|
+
message: `Failed to process command '66'`,
|
|
2651
|
+
hexData,
|
|
2652
|
+
command,
|
|
2653
|
+
deviceType,
|
|
2654
|
+
originalError: e,
|
|
2655
|
+
});
|
|
2656
|
+
}
|
|
2652
2657
|
}
|
|
2653
2658
|
break;
|
|
2654
2659
|
case '68':
|
|
2655
2660
|
{
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2661
|
+
try {
|
|
2662
|
+
command_len = 1;
|
|
2663
|
+
let data = { internalAlgoTemporaryState: parseInt(commands[i + 1], 16) === 0 ? true : false };
|
|
2664
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2665
|
+
}
|
|
2666
|
+
catch (e) {
|
|
2667
|
+
throw new utils_1.CustomError({
|
|
2668
|
+
message: `Failed to process command '68'`,
|
|
2669
|
+
hexData,
|
|
2670
|
+
command,
|
|
2671
|
+
deviceType,
|
|
2672
|
+
originalError: e,
|
|
2673
|
+
});
|
|
2674
|
+
}
|
|
2659
2675
|
}
|
|
2660
2676
|
break;
|
|
2661
2677
|
case '6a':
|
|
2662
2678
|
{
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
let
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2679
|
+
try {
|
|
2680
|
+
command_len = 12;
|
|
2681
|
+
let temperatureLevels = {};
|
|
2682
|
+
// Process 6 scale levels (0-5), each with a 2-byte temperature value
|
|
2683
|
+
for (let level = 0; level < 6; level++) {
|
|
2684
|
+
let tempHighByte = parseInt(commands[i + 1 + (level * 2)], 16);
|
|
2685
|
+
let tempLowByte = parseInt(commands[i + 2 + (level * 2)], 16);
|
|
2686
|
+
let tempValue = (tempHighByte << 8) | tempLowByte;
|
|
2687
|
+
// The temperature values are pre-multiplied by 10
|
|
2688
|
+
temperatureLevels['level' + level] = tempValue / 10;
|
|
2689
|
+
}
|
|
2690
|
+
let data = {
|
|
2691
|
+
temperatureLevels: temperatureLevels
|
|
2692
|
+
};
|
|
2693
|
+
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2694
|
+
}
|
|
2695
|
+
catch (e) {
|
|
2696
|
+
throw new utils_1.CustomError({
|
|
2697
|
+
message: `Failed to process command '6a'`,
|
|
2698
|
+
hexData,
|
|
2699
|
+
command,
|
|
2700
|
+
deviceType,
|
|
2701
|
+
originalError: e,
|
|
2702
|
+
});
|
|
2703
|
+
}
|
|
2704
|
+
}
|
|
2705
|
+
break;
|
|
2706
|
+
case '6c': {
|
|
2707
|
+
try {
|
|
2708
|
+
command_len = 4;
|
|
2709
|
+
let eventsHighByte = parseInt(commands[i + 2], 16); // Events 19-16
|
|
2710
|
+
let eventsMidByte = parseInt(commands[i + 3], 16); // Events 15-8
|
|
2711
|
+
let eventsLowByte = parseInt(commands[i + 4], 16); // Events 7-0
|
|
2712
|
+
// Create a more structured and readable format for heating events
|
|
2713
|
+
let heatingEventStates = {};
|
|
2714
|
+
// Process all 20 events (0-19) in a single loop
|
|
2715
|
+
for (let eventIdx = 0; eventIdx < 20; eventIdx++) {
|
|
2716
|
+
// Calculate which bit to check
|
|
2717
|
+
let bitPosition;
|
|
2718
|
+
if (eventIdx >= 16) {
|
|
2719
|
+
// Events 16-19 in high byte
|
|
2720
|
+
bitPosition = eventIdx - 16;
|
|
2721
|
+
heatingEventStates[eventIdx] = !!(eventsHighByte & (1 << bitPosition));
|
|
2722
|
+
}
|
|
2723
|
+
else if (eventIdx >= 8) {
|
|
2724
|
+
// Events 8-15 in mid byte
|
|
2725
|
+
bitPosition = eventIdx - 8;
|
|
2726
|
+
heatingEventStates[eventIdx] = !!(eventsMidByte & (1 << bitPosition));
|
|
2727
|
+
}
|
|
2728
|
+
else {
|
|
2729
|
+
// Events 0-7 in low byte
|
|
2730
|
+
bitPosition = eventIdx;
|
|
2731
|
+
heatingEventStates[eventIdx] = !!(eventsLowByte & (1 << bitPosition));
|
|
2732
|
+
}
|
|
2672
2733
|
}
|
|
2673
2734
|
let data = {
|
|
2674
|
-
|
|
2735
|
+
heatingEventStates: heatingEventStates
|
|
2675
2736
|
};
|
|
2676
2737
|
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2677
2738
|
}
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2681
|
-
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
for (let eventIdx = 0; eventIdx < 20; eventIdx++) {
|
|
2688
|
-
// Calculate which bit to check
|
|
2689
|
-
let bitPosition;
|
|
2690
|
-
if (eventIdx >= 16) {
|
|
2691
|
-
// Events 16-19 in high byte
|
|
2692
|
-
bitPosition = eventIdx - 16;
|
|
2693
|
-
heatingEventStates[eventIdx] = !!(eventsHighByte & (1 << bitPosition));
|
|
2694
|
-
}
|
|
2695
|
-
else if (eventIdx >= 8) {
|
|
2696
|
-
// Events 8-15 in mid byte
|
|
2697
|
-
bitPosition = eventIdx - 8;
|
|
2698
|
-
heatingEventStates[eventIdx] = !!(eventsMidByte & (1 << bitPosition));
|
|
2699
|
-
}
|
|
2700
|
-
else {
|
|
2701
|
-
// Events 0-7 in low byte
|
|
2702
|
-
bitPosition = eventIdx;
|
|
2703
|
-
heatingEventStates[eventIdx] = !!(eventsLowByte & (1 << bitPosition));
|
|
2704
|
-
}
|
|
2705
|
-
}
|
|
2706
|
-
let data = {
|
|
2707
|
-
heatingEventStates: heatingEventStates
|
|
2708
|
-
};
|
|
2709
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2710
|
-
break;
|
|
2711
|
-
}
|
|
2712
|
-
case '6e': {
|
|
2713
|
-
command_len = 1;
|
|
2714
|
-
let data = { timeRequestByMACcommand: parseInt(commands[i + 1], 16) };
|
|
2715
|
-
Object.assign(resultToPass, Object.assign({}, resultToPass), Object.assign({}, data));
|
|
2739
|
+
catch (e) {
|
|
2740
|
+
throw new utils_1.CustomError({
|
|
2741
|
+
message: `Failed to process command '6c'`,
|
|
2742
|
+
hexData,
|
|
2743
|
+
command,
|
|
2744
|
+
deviceType,
|
|
2745
|
+
originalError: e,
|
|
2746
|
+
});
|
|
2747
|
+
}
|
|
2716
2748
|
break;
|
|
2717
2749
|
}
|
|
2718
2750
|
case '9b':
|