mclimate-payload-helper 1.2.18 → 1.2.20

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 (141) hide show
  1. package/README.md +75 -0
  2. package/dist/decoders/payloadParsers/multisensorPayloadParser.d.ts.map +1 -1
  3. package/dist/decoders/payloadParsers/multisensorPayloadParser.js +80 -33
  4. package/dist/decoders/payloadParsers/multisensorPayloadParser.js.map +1 -1
  5. package/dist/encoders/ButtonCommands.test.d.ts +2 -0
  6. package/dist/encoders/ButtonCommands.test.d.ts.map +1 -0
  7. package/dist/encoders/ButtonCommands.test.js +20 -0
  8. package/dist/encoders/ButtonCommands.test.js.map +1 -0
  9. package/dist/encoders/ChildLockCommands.test.d.ts +2 -0
  10. package/dist/encoders/ChildLockCommands.test.d.ts.map +1 -0
  11. package/dist/encoders/ChildLockCommands.test.js +17 -0
  12. package/dist/encoders/ChildLockCommands.test.js.map +1 -0
  13. package/dist/encoders/Co2DisplayCommands.test.d.ts +2 -0
  14. package/dist/encoders/Co2DisplayCommands.test.d.ts.map +1 -0
  15. package/dist/encoders/Co2DisplayCommands.test.js +18 -0
  16. package/dist/encoders/Co2DisplayCommands.test.js.map +1 -0
  17. package/dist/encoders/Co2DisplayLiteCommands.test.d.ts +2 -0
  18. package/dist/encoders/Co2DisplayLiteCommands.test.d.ts.map +1 -0
  19. package/dist/encoders/Co2DisplayLiteCommands.test.js +21 -0
  20. package/dist/encoders/Co2DisplayLiteCommands.test.js.map +1 -0
  21. package/dist/encoders/Co2PirLiteCommands.test.d.ts +2 -0
  22. package/dist/encoders/Co2PirLiteCommands.test.d.ts.map +1 -0
  23. package/dist/encoders/Co2PirLiteCommands.test.js +23 -0
  24. package/dist/encoders/Co2PirLiteCommands.test.js.map +1 -0
  25. package/dist/encoders/Co2SensorCommands.test.d.ts +2 -0
  26. package/dist/encoders/Co2SensorCommands.test.d.ts.map +1 -0
  27. package/dist/encoders/Co2SensorCommands.test.js +55 -0
  28. package/dist/encoders/Co2SensorCommands.test.js.map +1 -0
  29. package/dist/encoders/DisplayCommands.test.d.ts +2 -0
  30. package/dist/encoders/DisplayCommands.test.d.ts.map +1 -0
  31. package/dist/encoders/DisplayCommands.test.js +26 -0
  32. package/dist/encoders/DisplayCommands.test.js.map +1 -0
  33. package/dist/encoders/DskDeviceCommands.test.d.ts +2 -0
  34. package/dist/encoders/DskDeviceCommands.test.d.ts.map +1 -0
  35. package/dist/encoders/DskDeviceCommands.test.js +20 -0
  36. package/dist/encoders/DskDeviceCommands.test.js.map +1 -0
  37. package/dist/encoders/FanCoilThermostatCommands.test.d.ts +2 -0
  38. package/dist/encoders/FanCoilThermostatCommands.test.d.ts.map +1 -0
  39. package/dist/encoders/FanCoilThermostatCommands.test.js +117 -0
  40. package/dist/encoders/FanCoilThermostatCommands.test.js.map +1 -0
  41. package/dist/encoders/GeneralCommands.test.d.ts +2 -0
  42. package/dist/encoders/GeneralCommands.test.d.ts.map +1 -0
  43. package/dist/encoders/GeneralCommands.test.js +26 -0
  44. package/dist/encoders/GeneralCommands.test.js.map +1 -0
  45. package/dist/encoders/HTDisplayLiteCommands.test.d.ts +2 -0
  46. package/dist/encoders/HTDisplayLiteCommands.test.d.ts.map +1 -0
  47. package/dist/encoders/HTDisplayLiteCommands.test.js +20 -0
  48. package/dist/encoders/HTDisplayLiteCommands.test.js.map +1 -0
  49. package/dist/encoders/HTPirLiteCommands.test.d.ts +2 -0
  50. package/dist/encoders/HTPirLiteCommands.test.d.ts.map +1 -0
  51. package/dist/encoders/HTPirLiteCommands.test.js +23 -0
  52. package/dist/encoders/HTPirLiteCommands.test.js.map +1 -0
  53. package/dist/encoders/HTSensorCommands.test.d.ts +2 -0
  54. package/dist/encoders/HTSensorCommands.test.d.ts.map +1 -0
  55. package/dist/encoders/HTSensorCommands.test.js +17 -0
  56. package/dist/encoders/HTSensorCommands.test.js.map +1 -0
  57. package/dist/encoders/MelissaCommands.test.d.ts +2 -0
  58. package/dist/encoders/MelissaCommands.test.d.ts.map +1 -0
  59. package/dist/encoders/MelissaCommands.test.js +14 -0
  60. package/dist/encoders/MelissaCommands.test.js.map +1 -0
  61. package/dist/encoders/MultiSensorCommands.test.d.ts +2 -0
  62. package/dist/encoders/MultiSensorCommands.test.d.ts.map +1 -0
  63. package/dist/encoders/MultiSensorCommands.test.js +41 -0
  64. package/dist/encoders/MultiSensorCommands.test.js.map +1 -0
  65. package/dist/encoders/OpenCloseSensorCommands.test.d.ts +2 -0
  66. package/dist/encoders/OpenCloseSensorCommands.test.d.ts.map +1 -0
  67. package/dist/encoders/OpenCloseSensorCommands.test.js +14 -0
  68. package/dist/encoders/OpenCloseSensorCommands.test.js.map +1 -0
  69. package/dist/encoders/PIRCommands.test.d.ts +2 -0
  70. package/dist/encoders/PIRCommands.test.d.ts.map +1 -0
  71. package/dist/encoders/PIRCommands.test.js +29 -0
  72. package/dist/encoders/PIRCommands.test.js.map +1 -0
  73. package/dist/encoders/Relay16Commands.test.d.ts +2 -0
  74. package/dist/encoders/Relay16Commands.test.d.ts.map +1 -0
  75. package/dist/encoders/Relay16Commands.test.js +44 -0
  76. package/dist/encoders/Relay16Commands.test.js.map +1 -0
  77. package/dist/encoders/Relay16DryCommands.test.d.ts +2 -0
  78. package/dist/encoders/Relay16DryCommands.test.d.ts.map +1 -0
  79. package/dist/encoders/Relay16DryCommands.test.js +32 -0
  80. package/dist/encoders/Relay16DryCommands.test.js.map +1 -0
  81. package/dist/encoders/SetAqiLedCommands.test.d.ts +2 -0
  82. package/dist/encoders/SetAqiLedCommands.test.d.ts.map +1 -0
  83. package/dist/encoders/SetAqiLedCommands.test.js +20 -0
  84. package/dist/encoders/SetAqiLedCommands.test.js.map +1 -0
  85. package/dist/encoders/TFloodCommands.test.d.ts +2 -0
  86. package/dist/encoders/TFloodCommands.test.d.ts.map +1 -0
  87. package/dist/encoders/TFloodCommands.test.js +23 -0
  88. package/dist/encoders/TFloodCommands.test.js.map +1 -0
  89. package/dist/encoders/TRingThermostatCommands.test.d.ts +2 -0
  90. package/dist/encoders/TRingThermostatCommands.test.d.ts.map +1 -0
  91. package/dist/encoders/TRingThermostatCommands.test.js +16 -0
  92. package/dist/encoders/TRingThermostatCommands.test.js.map +1 -0
  93. package/dist/encoders/TValveCommands.test.d.ts +2 -0
  94. package/dist/encoders/TValveCommands.test.d.ts.map +1 -0
  95. package/dist/encoders/TValveCommands.test.js +56 -0
  96. package/dist/encoders/TValveCommands.test.js.map +1 -0
  97. package/dist/encoders/TemperatureCommonCommands.test.d.ts +2 -0
  98. package/dist/encoders/TemperatureCommonCommands.test.d.ts.map +1 -0
  99. package/dist/encoders/TemperatureCommonCommands.test.js +14 -0
  100. package/dist/encoders/TemperatureCommonCommands.test.js.map +1 -0
  101. package/dist/encoders/VickiCommands.test.d.ts +2 -0
  102. package/dist/encoders/VickiCommands.test.d.ts.map +1 -0
  103. package/dist/encoders/VickiCommands.test.js +156 -0
  104. package/dist/encoders/VickiCommands.test.js.map +1 -0
  105. package/dist/encoders/WirelessThermostatCommands.test.d.ts +2 -0
  106. package/dist/encoders/WirelessThermostatCommands.test.d.ts.map +1 -0
  107. package/dist/encoders/WirelessThermostatCommands.test.js +41 -0
  108. package/dist/encoders/WirelessThermostatCommands.test.js.map +1 -0
  109. package/dist/test/payloadDecoders.test.js +34 -34
  110. package/dist/test/payloadDecoders.test.js.map +1 -1
  111. package/package.json +1 -1
  112. package/src/decoders/payloadParsers/multisensorPayloadParser.ts +96 -34
  113. package/src/encoders/ButtonCommands.test.ts +26 -0
  114. package/src/encoders/ChildLockCommands.test.ts +22 -0
  115. package/src/encoders/Co2DisplayCommands.test.ts +26 -0
  116. package/src/encoders/Co2DisplayLiteCommands.test.ts +30 -0
  117. package/src/encoders/Co2PirLiteCommands.test.ts +32 -0
  118. package/src/encoders/Co2SensorCommands.test.ts +79 -0
  119. package/src/encoders/DisplayCommands.test.ts +40 -0
  120. package/src/encoders/DskDeviceCommands.test.ts +26 -0
  121. package/src/encoders/FanCoilThermostatCommands.test.ts +204 -0
  122. package/src/encoders/GeneralCommands.test.ts +38 -0
  123. package/src/encoders/HTDisplayLiteCommands.test.ts +28 -0
  124. package/src/encoders/HTPirLiteCommands.test.ts +32 -0
  125. package/src/encoders/HTSensorCommands.test.ts +24 -0
  126. package/src/encoders/MelissaCommands.test.ts +16 -0
  127. package/src/encoders/MultiSensorCommands.test.ts +68 -0
  128. package/src/encoders/OpenCloseSensorCommands.test.ts +16 -0
  129. package/src/encoders/PIRCommands.test.ts +46 -0
  130. package/src/encoders/Relay16Commands.test.ts +76 -0
  131. package/src/encoders/Relay16DryCommands.test.ts +52 -0
  132. package/src/encoders/SetAqiLedCommands.test.ts +18 -0
  133. package/src/encoders/TFloodCommands.test.ts +34 -0
  134. package/src/encoders/TRingThermostatCommands.test.ts +23 -0
  135. package/src/encoders/TValveCommands.test.ts +98 -0
  136. package/src/encoders/TemperatureCommonCommands.test.ts +16 -0
  137. package/src/encoders/VickiCommands.test.ts +275 -0
  138. package/src/encoders/WirelessThermostatCommands.test.ts +70 -0
  139. package/src/test/payloadDecoders.test.ts +34 -34
  140. package/src/test.txt +1 -0
  141. package/src/test/payloadEncoders.test.ts +0 -850
package/README.md CHANGED
@@ -1 +1,76 @@
1
1
  # mclimate-payload-helper
2
+
3
+ Utilities for working with MClimate IoT device payloads. The package exposes TypeScript helpers to parse uplink payloads, construct downlink command payloads, and reuse the enums/schemas that describe each supported device family.
4
+
5
+ ## Features
6
+
7
+ - Typed `uplinkPayloadParser` that converts raw payload buffers into structured data for every supported `DeviceType`.
8
+ - Command builders and enums for devices such as Vicki, Relay 16, TFlood, CO₂ sensors, thermostats, and more.
9
+ - Shared error helpers (`CustomError`) and validation schemas so client apps can keep business logic consistent with the firmware payload contracts.
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ npm install mclimate-payload-helper
15
+ ```
16
+
17
+ The library ships TypeScript declarations, so no extra typings package is required.
18
+
19
+ ## Usage
20
+
21
+ ```ts
22
+ import { uplinkPayloadParser, CommandBuilder, DeviceType } from 'mclimate-payload-helper'
23
+
24
+ const uplink = uplinkPayloadParser({
25
+ deviceType: DeviceType.Relay16,
26
+ payloadHex: '0100aa34ff...',
27
+ })
28
+
29
+ const command = new CommandBuilder()
30
+ .forDevice(DeviceType.Vicki)
31
+ .useCommand('setTargetTemperature')
32
+ .withPayload({ temperature: 22 })
33
+ .build()
34
+ ```
35
+
36
+ Refer to the `src/decoders` and `src/encoders` directories for the complete list of parsers, commands, enums, and helper functions.
37
+
38
+ ## Pre-commit hooks
39
+
40
+ Husky enforces repository quality gates before every commit (`.husky/pre-commit`):
41
+
42
+ 1. `npm run format:check` – Prettier formatting guard.
43
+ 2. `npm run type-check` – Ensures the TypeScript project still compiles.
44
+ 3. `npm run lint` – ESLint with the repo ruleset.
45
+ 4. `npm run test` – Jest unit tests.
46
+
47
+ If a hook fails, fix the issue locally before committing again.
48
+
49
+ ## Publishing a new version
50
+
51
+ 1. Bump the version in `package.json` (or run `npm version patch|minor|major` which updates the lockfile and creates a git tag).
52
+ 2. Run the full quality suite locally (`npm run format`, `npm run lint`, `npm run type-check`, `npm test`) and ensure `npm run build` succeeds.
53
+ 3. Publish the package with `npm publish`. The `prepublishOnly` script will rebuild the dist folder automatically.
54
+
55
+ Skipping the version bump will cause `npm publish` to fail, so always increment the version before publishing.
56
+
57
+ ## Testing approach
58
+
59
+ Unit tests live next to their encoders in `src/encoders` (e.g., `Relay16Commands.ts` and `Relay16Commands.test.ts`). For each command class with set commands:
60
+
61
+ - All set commands are exercised with exact `BaseCommand` payload expectations (command id + hex params).
62
+ - `CommandBuilder` is used when the device is available there, so registry routing and camel-casing are covered.
63
+ - Each suite includes at least one validation error case to ensure zod schema failures surface as `CustomError`.
64
+
65
+ Mixin-only classes are covered via the concrete implementations they extend; only classes with distinct command surfaces get their own suite. GeneralCommands is also tested to validate shared helpers like custom hex, keepalive, uplink type, and watchdog parameters.
66
+
67
+ - Decoder tests remain consolidated in `src/test/payloadDecoders.test.ts`.
68
+
69
+ ## Adding encoder commands with AI helpers
70
+
71
+ Two interactive guides exist to speed up encoder additions:
72
+
73
+ - `add-encoder-command-existing.md`: walks through adding commands to an existing device class (prompts for command names, params, BaseCommand payloads, schema updates, mixins, and exclusions).
74
+ - `add-encoder-command-new.md`: guides creating a brand-new device class, wiring it into `CommandBuilder`, and adding schemas/types and mixins.
75
+
76
+ Both scripts explain the expected file locations (`src/encoders`, `src/encoders/types/schemas.ts`), import style (`@/...`), and validation patterns (Zod + `CustomError`). Use them as a step-by-step checklist.
@@ -1 +1 @@
1
- {"version":3,"file":"multisensorPayloadParser.d.ts","sourceRoot":"","sources":["../../../src/decoders/payloadParsers/multisensorPayloadParser.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,wBAAwB,YAAa,MAAM,wCAsFvD,CAAA"}
1
+ {"version":3,"file":"multisensorPayloadParser.d.ts","sourceRoot":"","sources":["../../../src/decoders/payloadParsers/multisensorPayloadParser.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,wBAAwB,YAAa,MAAM,wCAoJvD,CAAA"}
@@ -15,44 +15,91 @@ const multisensorPayloadParser = (hexData) => {
15
15
  if (!bytes || !bytes.length)
16
16
  return;
17
17
  const handleKeepAliveData = (barr) => {
18
- // Decode according to provided example indexing
19
- const b = (i, d = 0) => (typeof barr[i] === 'number' ? barr[i] : d);
20
- // Byte 1..14 mapping per example
21
- const deltaTMinC = b(1) / 10;
22
- const deltaTMaxC = b(2) / 10;
23
- const avgTempC = Number((b(3) / 10).toFixed(1));
24
- const relativeHumidity = b(4);
25
- // Pressure: matches example (A8 -> 956.94): scale = 390
26
- const pressureMbar = Number(((b(5) * 390) / 255 + 700).toFixed(2));
27
- const staticAQI = Number(((b(6) * 500) / 255).toFixed(2));
28
- // eCO2: matches example (06 -> 508.23): scale = 4600
29
- const eCO2ppm = Number(((b(7) * 4600) / 255 + 400).toFixed(2));
30
- const tvocRaw = ((b(8) & 0xff) << 8) | (b(9) & 0xff);
31
- const tvocPpbApprox = tvocRaw;
32
- const lightLux = Math.round((b(10) * 1000) / 255);
33
- const noiseDb = b(11);
34
- const pirTriggerCount = b(12);
35
- const deviceVoltageMv = Math.round((b(13) * 2200) / 255 + 1600);
18
+ // Verify it's a keepalive message (command byte should be 0x82)
19
+ if (barr[0] !== 0x82 && barr[0] !== 0x81) {
20
+ throw new Error('Not a keepalive message');
21
+ }
22
+ // Byte 2, bit 0 and Byte 3: Average temperature
23
+ // Formula: Average temperature, [°C] = [8:0] / 10
24
+ // Extract bit 0 from byte 2 for the higher bit (bit 8)
25
+ const avgTempHighBit = (barr[2] & 0x01) << 8;
26
+ // Use all bits from byte 3 for the lower bits (bits 7:0)
27
+ const avgTempLowBits = barr[3];
28
+ // Combine to get the full 9-bit temperature value
29
+ const avgTempRaw = avgTempHighBit | avgTempLowBits;
30
+ const avgTempC = Number((avgTempRaw / 10).toFixed(1));
31
+ // Calculate min and max temperature based on deltas
32
+ let minTempC = null;
33
+ let maxTempC = null;
34
+ // Byte 1, bits 6:0: Delta temperature min in °C
35
+ // Formula: ΔT min, [°C] = [6:0] / 10
36
+ if ((barr[1] & 0x7f) !== 0xff) {
37
+ // Check if field is used (not 0xFF)
38
+ const deltaMin = Number(((barr[1] & 0x7f) / 10).toFixed(1));
39
+ minTempC = Number((avgTempC - deltaMin).toFixed(1));
40
+ }
41
+ // Byte 2, bits 7:1: Delta temperature max in °C
42
+ // Formula: ΔT max, [°C] = [7:1] / 10
43
+ if (((barr[2] >> 1) & 0x7f) !== 0xff) {
44
+ // Check if field is used (not 0xFF)
45
+ const deltaMax = Number((((barr[2] >> 1) & 0x7f) / 10).toFixed(1));
46
+ maxTempC = Number((avgTempC + deltaMax).toFixed(1));
47
+ }
48
+ // Byte 4: Relative Humidity data
49
+ // Formula: RH[%] = XX
50
+ const relativeHumidity = barr[4];
51
+ // Byte 5: Pressure (Atmospheric)
52
+ // Formula: Pressure (Atmospheric), [mb] = ((XX * 390) / 255) + 700
53
+ const pressureMbar = Number(((barr[5] * 390) / 255 + 700).toFixed(2));
54
+ // Byte 6: Static AQI
55
+ // Formula: Static AQI = (XX * 500) / 255
56
+ const staticAQI = Math.round((barr[6] * 500) / 255);
57
+ // Byte 7: eCO2
58
+ // Formula: eCO2, [ppm] = ((XX * 4600) / 255) + 400
59
+ const eCO2ppm = Number(((barr[7] * 4600) / 255 + 400).toFixed(2));
60
+ // Byte 8 & 9: bVOC data
61
+ // Byte 8 contains bits [15:8] of bVOC data
62
+ // Byte 9 contains bits [7:0] of bVOC data
63
+ // Formula: bVOC, [ppb] = [15:0]
64
+ const tvocRaw = (barr[8] << 8) | barr[9];
65
+ // Byte 10: Light level
66
+ // Formula: Light level, [Lux] = (XX * 1000) / 255
67
+ const lightLux = Math.round((barr[10] * 1000) / 255);
68
+ // Byte 11: Noise level, [dB]
69
+ const noiseDb = barr[11];
70
+ // Byte 12: PIR trigger count
71
+ const pirTriggerCount = barr[12];
72
+ // Byte 13: Battery Voltage
73
+ // Formula: Battery Voltage, [mV] = ((XX * 2200) / 255) + 1600
74
+ const deviceVoltageMv = Math.round((barr[13] * 2200) / 255 + 1600);
36
75
  const deviceVoltage = Number((deviceVoltageMv / 1000).toFixed(2));
37
- const powerSourceRaw = b(14);
38
- const powerSource = powerSourceRaw === 1 ? 'USB' : 'Battery';
76
+ // Byte 14 - Bit positions for different flags and settings
77
+ const byte14 = barr[14];
78
+ // Bit 4: PIR sensor event flag
79
+ const pir = ((byte14 >> 4) & 0x01) === 1;
80
+ // Bit 3: Hall sensor event flag
81
+ const hallSensorEvent = ((byte14 >> 3) & 0x01) === 1;
82
+ // Bits 2:1: Static AQI accuracy
83
+ const staticAQIAccuracy = (byte14 >> 1) & 0x03;
84
+ // Bit 0: Device power source (0 - Battery, 1 - External)
85
+ const powerSourceStatus = byte14 & 0x01;
39
86
  const keepaliveData = {
40
- deltaTMinC,
41
- deltaTMaxC,
42
- avgTempC,
87
+ averageTemperature: avgTempC,
88
+ minTemperature: minTempC,
89
+ maxTemperature: maxTempC,
43
90
  relativeHumidity,
44
- pressureMbar,
91
+ pressure: pressureMbar,
45
92
  staticAQI,
46
- eCO2ppm,
47
- tvocRaw,
48
- tvocPpbApprox,
49
- lightLux,
50
- noiseDb,
93
+ eCO2: eCO2ppm,
94
+ bVOC: tvocRaw,
95
+ lightLevel: lightLux,
96
+ noiseLevel: noiseDb,
51
97
  pirTriggerCount,
52
- deviceVoltageMv,
53
- deviceVoltage,
54
- powerSourceRaw,
55
- powerSource,
98
+ batteryVoltage: deviceVoltage,
99
+ pir,
100
+ hallSensorEvent,
101
+ staticAQIAccuracy,
102
+ powerSourceStatus,
56
103
  };
57
104
  Object.assign(deviceData, Object.assign({}, deviceData), Object.assign({}, keepaliveData));
58
105
  };
@@ -1 +1 @@
1
- {"version":3,"file":"multisensorPayloadParser.js","sourceRoot":"","sources":["../../../src/decoders/payloadParsers/multisensorPayloadParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"multisensorPayloadParser.js","sourceRoot":"","sources":["../../../src/decoders/payloadParsers/multisensorPayloadParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ButtonCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/ButtonCommands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const encoders_1 = require("../encoders");
4
+ const utils_1 = require("../utils");
5
+ describe('ButtonCommands payload encoder', () => {
6
+ const commandBuilder = new encoders_1.CommandBuilder('mc_button');
7
+ test('SetSendEventLater encodes toggle flag', () => {
8
+ expect(commandBuilder.build('SetSendEventLater', { value: 1 })).toStrictEqual(new encoders_1.BaseCommand('SetSendEventLater', 0x1e, '01'));
9
+ });
10
+ test('ClearPressEventCounter encodes press count selector', () => {
11
+ expect(commandBuilder.build('ClearPressEventCounter', { value: 3 })).toStrictEqual(new encoders_1.BaseCommand('ClearPressEventCounter', 0x20, '03'));
12
+ });
13
+ test('RestartDevice emits restart command', () => {
14
+ expect(commandBuilder.build('RestartDevice')).toStrictEqual(new encoders_1.BaseCommand('RestartDevice', 0xa5));
15
+ });
16
+ test('Invalid SetSendEventLater value throws validation error', () => {
17
+ expect(() => commandBuilder.build('SetSendEventLater', { value: 2 })).toThrow(utils_1.CustomError);
18
+ });
19
+ });
20
+ //# sourceMappingURL=ButtonCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonCommands.test.js","sourceRoot":"","sources":["../../src/encoders/ButtonCommands.test.ts"],"names":[],"mappings":";;AAAA,yCAAwD;AACxD,mCAAqC;AAErC,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC/C,MAAM,cAAc,GAAG,IAAI,yBAAc,CAAC,WAAW,CAAC,CAAA;IAEtD,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAC5E,IAAI,sBAAW,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,CAChD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CACjF,IAAI,sBAAW,CAAC,wBAAwB,EAAE,IAAI,EAAE,IAAI,CAAC,CACrD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,sBAAW,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAA;IACpG,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ChildLockCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChildLockCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/ChildLockCommands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const encoders_1 = require("../encoders");
4
+ const utils_1 = require("../utils");
5
+ describe('ChildLockCommands payload encoder', () => {
6
+ const commandBuilder = new encoders_1.CommandBuilder('vicki');
7
+ test('SetChildLock encodes enabled flag', () => {
8
+ expect(commandBuilder.build('SetChildLock', { enabled: true })).toStrictEqual(new encoders_1.BaseCommand('SetChildLock', 0x07, '01'));
9
+ });
10
+ test('SetChildLock encodes disabled flag', () => {
11
+ expect(commandBuilder.build('SetChildLock', { enabled: false })).toStrictEqual(new encoders_1.BaseCommand('SetChildLock', 0x07, '00'));
12
+ });
13
+ test('Invalid SetChildLock param throws validation error', () => {
14
+ expect(() => commandBuilder.build('SetChildLock', { enabled: 2 })).toThrow(utils_1.CustomError);
15
+ });
16
+ });
17
+ //# sourceMappingURL=ChildLockCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChildLockCommands.test.js","sourceRoot":"","sources":["../../src/encoders/ChildLockCommands.test.ts"],"names":[],"mappings":";;AAAA,yCAAwD;AACxD,mCAAqC;AAErC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAClD,MAAM,cAAc,GAAG,IAAI,yBAAc,CAAC,OAAO,CAAC,CAAA;IAElD,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,CAC5E,IAAI,sBAAW,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAC3C,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAC7E,IAAI,sBAAW,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAC3C,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,CAAuB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAA;IAC9G,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Co2DisplayCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Co2DisplayCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/Co2DisplayCommands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const encoders_1 = require("../encoders");
4
+ const utils_1 = require("../utils");
5
+ describe('CO2DisplayCommands payload encoder', () => {
6
+ const commandBuilder = new encoders_1.CommandBuilder('co2_display');
7
+ test('SetCo2MeasurementBlindTime encodes time value', () => {
8
+ expect(commandBuilder.build('SetCo2MeasurementBlindTime', { time: 10 })).toStrictEqual(new encoders_1.BaseCommand('SetCo2MeasurementBlindTime', 0x81, '0A'));
9
+ });
10
+ test('SetCo2ImagesVisibility encodes chart/digital/emoji bits', () => {
11
+ expect(commandBuilder.build('SetCo2ImagesVisibility', { chart: true, digital_value: true, emoji: false })).toStrictEqual(new encoders_1.BaseCommand('SetCo2ImagesVisibility', 0x82, '06'));
12
+ expect(commandBuilder.build('SetCo2ImagesVisibility', { chart: false, digital_value: false, emoji: true })).toStrictEqual(new encoders_1.BaseCommand('SetCo2ImagesVisibility', 0x82, '01'));
13
+ });
14
+ test('Invalid SetCo2MeasurementBlindTime params throw validation error', () => {
15
+ expect(() => commandBuilder.build('SetCo2MeasurementBlindTime', { time: -1 })).toThrow(utils_1.CustomError);
16
+ });
17
+ });
18
+ //# sourceMappingURL=Co2DisplayCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Co2DisplayCommands.test.js","sourceRoot":"","sources":["../../src/encoders/Co2DisplayCommands.test.ts"],"names":[],"mappings":";;AAAA,yCAAwD;AACxD,mCAAqC;AAErC,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IACnD,MAAM,cAAc,GAAG,IAAI,yBAAc,CAAC,aAAa,CAAC,CAAA;IAExD,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CACrF,IAAI,sBAAW,CAAC,4BAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,CACzD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACpE,MAAM,CACL,cAAc,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAClG,CAAC,aAAa,CAAC,IAAI,sBAAW,CAAC,wBAAwB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAEtE,MAAM,CACL,cAAc,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACnG,CAAC,aAAa,CAAC,IAAI,sBAAW,CAAC,wBAAwB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAA;IACpG,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Co2DisplayLiteCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Co2DisplayLiteCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/Co2DisplayLiteCommands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const encoders_1 = require("../encoders");
4
+ const utils_1 = require("../utils");
5
+ describe('CO2DisplayLiteCommands payload encoder', () => {
6
+ const commandBuilder = new encoders_1.CommandBuilder('co2_display_lite');
7
+ test('SetCo2ImagesVisibility encodes digital and emoji bits', () => {
8
+ expect(commandBuilder.build('SetCo2ImagesVisibility', { digital_value: true, emoji: false, chart: false })).toStrictEqual(new encoders_1.BaseCommand('SetCo2ImagesVisibility', 0x82, '02'));
9
+ expect(commandBuilder.build('SetCo2ImagesVisibility', { digital_value: true, emoji: true, chart: false })).toStrictEqual(new encoders_1.BaseCommand('SetCo2ImagesVisibility', 0x82, '03'));
10
+ });
11
+ test('SetUplinkSendingOnButtonPress encodes toggle value', () => {
12
+ expect(commandBuilder.build('SetUplinkSendingOnButtonPress', { value: 1 })).toStrictEqual(new encoders_1.BaseCommand('SetUplinkSendingOnButtonPress', 0x2e, '01'));
13
+ });
14
+ test('RestartDevice emits restart command', () => {
15
+ expect(commandBuilder.build('RestartDevice')).toStrictEqual(new encoders_1.BaseCommand('RestartDevice', 0xa5));
16
+ });
17
+ test('Invalid SetUplinkSendingOnButtonPress params throw validation error', () => {
18
+ expect(() => commandBuilder.build('SetUplinkSendingOnButtonPress', { value: -1 })).toThrow(utils_1.CustomError);
19
+ });
20
+ });
21
+ //# sourceMappingURL=Co2DisplayLiteCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Co2DisplayLiteCommands.test.js","sourceRoot":"","sources":["../../src/encoders/Co2DisplayLiteCommands.test.ts"],"names":[],"mappings":";;AAAA,yCAAwD;AACxD,mCAAqC;AAErC,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACvD,MAAM,cAAc,GAAG,IAAI,yBAAc,CAAC,kBAAkB,CAAC,CAAA;IAE7D,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAClE,MAAM,CACL,cAAc,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CACnG,CAAC,aAAa,CAAC,IAAI,sBAAW,CAAC,wBAAwB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAEtE,MAAM,CACL,cAAc,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAClG,CAAC,aAAa,CAAC,IAAI,sBAAW,CAAC,wBAAwB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CACxF,IAAI,sBAAW,CAAC,+BAA+B,EAAE,IAAI,EAAE,IAAI,CAAC,CAC5D,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,sBAAW,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAA;IACpG,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAA;IACxG,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Co2PirLiteCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Co2PirLiteCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/Co2PirLiteCommands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const encoders_1 = require("../encoders");
4
+ const utils_1 = require("../utils");
5
+ describe('Co2PirLiteCommands payload encoder', () => {
6
+ const commandBuilder = new encoders_1.CommandBuilder('co2_pir_lite');
7
+ test('SetPIRSensorState encodes enabled flag', () => {
8
+ expect(commandBuilder.build('SetPIRSensorState', { state: 1 })).toStrictEqual(new encoders_1.BaseCommand('SetPIRSensorState', 0x36, '01'));
9
+ });
10
+ test('SetPIRSensorSensitivity encodes sensitivity value', () => {
11
+ expect(commandBuilder.build('SetPIRSensorSensitivity', { sensitivity: 64 })).toStrictEqual(new encoders_1.BaseCommand('SetPIRSensorSensitivity', 0x3e, '40'));
12
+ });
13
+ test('SetOccupancyTimeout encodes timeout into two bytes', () => {
14
+ expect(commandBuilder.build('SetOccupancyTimeout', { timeout: 60 })).toStrictEqual(new encoders_1.BaseCommand('SetOccupancyTimeout', 0x38, '003C'));
15
+ });
16
+ test('RestartDevice emits restart command', () => {
17
+ expect(commandBuilder.build('RestartDevice')).toStrictEqual(new encoders_1.BaseCommand('RestartDevice', 0xa5));
18
+ });
19
+ test('Invalid SetPIRSensorState throws validation error', () => {
20
+ expect(() => commandBuilder.build('SetPIRSensorState', { state: 2 })).toThrow(utils_1.CustomError);
21
+ });
22
+ });
23
+ //# sourceMappingURL=Co2PirLiteCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Co2PirLiteCommands.test.js","sourceRoot":"","sources":["../../src/encoders/Co2PirLiteCommands.test.ts"],"names":[],"mappings":";;AAAA,yCAAwD;AACxD,mCAAqC;AAErC,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IACnD,MAAM,cAAc,GAAG,IAAI,yBAAc,CAAC,cAAc,CAAC,CAAA;IAEzD,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAC5E,IAAI,sBAAW,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,CAChD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CACzF,IAAI,sBAAW,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,CAAC,CACtD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CACjF,IAAI,sBAAW,CAAC,qBAAqB,EAAE,IAAI,EAAE,MAAM,CAAC,CACpD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,sBAAW,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAA;IACpG,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Co2SensorCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Co2SensorCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/Co2SensorCommands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const encoders_1 = require("../encoders");
4
+ const utils_1 = require("../utils");
5
+ describe('CO2SensorCommands payload encoder', () => {
6
+ const commandBuilder = new encoders_1.CommandBuilder('co2_sensor');
7
+ test('SetCo2BoundaryLevels encodes good/medium thresholds', () => {
8
+ expect(commandBuilder.build('SetCo2BoundaryLevels', { good_medium: 200, medium_bad: 250 })).toStrictEqual(new encoders_1.BaseCommand('SetCo2BoundaryLevels', 0x1e, '00C8', '00FA'));
9
+ });
10
+ test('SetCo2AutoZeroValue encodes ppm value', () => {
11
+ expect(commandBuilder.build('SetCo2AutoZeroValue', { ppm: 150 })).toStrictEqual(new encoders_1.BaseCommand('SetCo2AutoZeroValue', 0x20, '0096'));
12
+ });
13
+ test('SetNotifyPeriod encodes zone periods', () => {
14
+ expect(commandBuilder.build('SetNotifyPeriod', { good_zone: 10, medium_zone: 20, bad_zone: 30 })).toStrictEqual(new encoders_1.BaseCommand('SetNotifyPeriod', 0x22, '0A', '14', '1E'));
15
+ });
16
+ test('SetCo2MeasurementPeriod encodes zone periods', () => {
17
+ expect(commandBuilder.build('SetCo2MeasurementPeriod', { good_zone: 5, medium_zone: 15, bad_zone: 25 })).toStrictEqual(new encoders_1.BaseCommand('SetCo2MeasurementPeriod', 0x24, '05', '0F', '19'));
18
+ });
19
+ test('SetCo2AutoZeroPeriod encodes hours', () => {
20
+ expect(commandBuilder.build('SetCo2AutoZeroPeriod', { hours: 12 })).toStrictEqual(new encoders_1.BaseCommand('SetCo2AutoZeroPeriod', 0x2a, '0C'));
21
+ });
22
+ test('SetBuzzerNotification encodes durations and loud/silent intervals', () => {
23
+ expect(commandBuilder.build('SetBuzzerNotification', {
24
+ duration_good_beeping: 1,
25
+ duration_good_loud: 20,
26
+ duration_good_silent: 30,
27
+ duration_medium_beeping: 2,
28
+ duration_medium_loud: 40,
29
+ duration_medium_silent: 50,
30
+ duration_bad_beeping: 3,
31
+ duration_bad_loud: 60,
32
+ duration_bad_silent: 70,
33
+ })).toStrictEqual(new encoders_1.BaseCommand('SetBuzzerNotification', 0x26, '01', '02', '03', '02', '04', '05', '03', '06', '07'));
34
+ });
35
+ test('SetCo2Led encodes color and duration sequences', () => {
36
+ expect(commandBuilder.build('SetCo2Led', {
37
+ red_good: 1,
38
+ green_good: 2,
39
+ blue_good: 3,
40
+ duration_good: 50,
41
+ red_medium: 4,
42
+ green_medium: 5,
43
+ blue_medium: 6,
44
+ duration_medium: 60,
45
+ red_bad: 7,
46
+ green_bad: 8,
47
+ blue_bad: 9,
48
+ duration_bad: 70,
49
+ })).toStrictEqual(new encoders_1.BaseCommand('SetCo2Led', 0x28, '01', '02', '03', '0005', '04', '05', '06', '0006', '07', '08', '09', '0007'));
50
+ });
51
+ test('Invalid SetCo2BoundaryLevels throws validation error', () => {
52
+ expect(() => commandBuilder.build('SetCo2BoundaryLevels', { good_medium: 2000, medium_bad: 250 })).toThrow(utils_1.CustomError);
53
+ });
54
+ });
55
+ //# sourceMappingURL=Co2SensorCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Co2SensorCommands.test.js","sourceRoot":"","sources":["../../src/encoders/Co2SensorCommands.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=DisplayCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisplayCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/DisplayCommands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const encoders_1 = require("../encoders");
4
+ const utils_1 = require("../utils");
5
+ describe('DisplayCommands payload encoder', () => {
6
+ const commandBuilder = new encoders_1.CommandBuilder('co2_display');
7
+ test('SetDisplayRefreshPeriod encodes period hours', () => {
8
+ expect(commandBuilder.build('SetDisplayRefreshPeriod', { period: 5 })).toStrictEqual(new encoders_1.BaseCommand('SetDisplayRefreshPeriod', 0x33, '05'));
9
+ });
10
+ test('SetDeepSleepMode encodes state flag', () => {
11
+ expect(commandBuilder.build('SetDeepSleepMode', { state: 1 })).toStrictEqual(new encoders_1.BaseCommand('SetDeepSleepMode', 0x3b, '01'));
12
+ });
13
+ test('SetHumidityVisibility encodes toggle', () => {
14
+ expect(commandBuilder.build('SetHumidityVisibility', { state: 0 })).toStrictEqual(new encoders_1.BaseCommand('SetHumidityVisibility', 0x42, '00'));
15
+ });
16
+ test('SetLightIntensityVisibility encodes toggle', () => {
17
+ expect(commandBuilder.build('SetLightIntensityVisibility', { state: 1 })).toStrictEqual(new encoders_1.BaseCommand('SetLightIntensityVisibility', 0x44, '01'));
18
+ });
19
+ test('SetCurrentTemperatureVisibility encodes toggle', () => {
20
+ expect(commandBuilder.build('SetCurrentTemperatureVisibility', { state: 1 })).toStrictEqual(new encoders_1.BaseCommand('SetCurrentTemperatureVisibility', 0x40, '01'));
21
+ });
22
+ test('Invalid SetDisplayRefreshPeriod throws validation error', () => {
23
+ expect(() => commandBuilder.build('SetDisplayRefreshPeriod', { period: 0 })).toThrow(utils_1.CustomError);
24
+ });
25
+ });
26
+ //# sourceMappingURL=DisplayCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisplayCommands.test.js","sourceRoot":"","sources":["../../src/encoders/DisplayCommands.test.ts"],"names":[],"mappings":";;AAAA,yCAAwD;AACxD,mCAAqC;AAErC,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAChD,MAAM,cAAc,GAAG,IAAI,yBAAc,CAAC,aAAa,CAAC,CAAA;IAExD,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CACnF,IAAI,sBAAW,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,CAAC,CACtD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAC3E,IAAI,sBAAW,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,CAAC,CAC/C,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAChF,IAAI,sBAAW,CAAC,uBAAuB,EAAE,IAAI,EAAE,IAAI,CAAC,CACpD,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CACtF,IAAI,sBAAW,CAAC,6BAA6B,EAAE,IAAI,EAAE,IAAI,CAAC,CAC1D,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAC1F,IAAI,sBAAW,CAAC,iCAAiC,EAAE,IAAI,EAAE,IAAI,CAAC,CAC9D,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=DskDeviceCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DskDeviceCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/DskDeviceCommands.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const encoders_1 = require("../encoders");
4
+ const utils_1 = require("../utils");
5
+ describe('DskDeviceCommands payload encoder', () => {
6
+ const commandBuilder = new encoders_1.CommandBuilder('dsk_device');
7
+ test('SetVrvStatus encodes status flag', () => {
8
+ expect(commandBuilder.build('SetVrvStatus', { status: 1 })).toStrictEqual(new encoders_1.BaseCommand('SetVrvStatus', 0x1e, '01'));
9
+ });
10
+ test('SetVrvOnTime encodes seconds', () => {
11
+ expect(commandBuilder.build('SetVrvOnTime', { time: 300 })).toStrictEqual(new encoders_1.BaseCommand('SetVrvOnTime', 0x20, '012C'));
12
+ });
13
+ test('SetVrvOffTime encodes seconds', () => {
14
+ expect(commandBuilder.build('SetVrvOffTime', { time: 120 })).toStrictEqual(new encoders_1.BaseCommand('SetVrvOffTime', 0x21, '0078'));
15
+ });
16
+ test('Invalid SetVrvStatus params throw validation error', () => {
17
+ expect(() => commandBuilder.build('SetVrvStatus', { status: 'on' })).toThrow(utils_1.CustomError);
18
+ });
19
+ });
20
+ //# sourceMappingURL=DskDeviceCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DskDeviceCommands.test.js","sourceRoot":"","sources":["../../src/encoders/DskDeviceCommands.test.ts"],"names":[],"mappings":";;AAAA,yCAAwD;AACxD,mCAAqC;AAErC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAClD,MAAM,cAAc,GAAG,IAAI,yBAAc,CAAC,YAAY,CAAC,CAAA;IAEvD,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,sBAAW,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACvH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,CACxE,IAAI,sBAAW,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,CAC7C,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,CACzE,IAAI,sBAAW,CAAC,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAC9C,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAyB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAW,CAAC,CAAA;IAC/G,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FanCoilThermostatCommands.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FanCoilThermostatCommands.test.d.ts","sourceRoot":"","sources":["../../src/encoders/FanCoilThermostatCommands.test.ts"],"names":[],"mappings":""}