mclimate-payload-helper 1.2.19 → 1.2.21

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 (177) hide show
  1. package/README.md +21 -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/Co2DisplayCommonCommands.d.ts +4 -0
  18. package/dist/encoders/Co2DisplayCommonCommands.d.ts.map +1 -1
  19. package/dist/encoders/Co2DisplayCommonCommands.js +38 -0
  20. package/dist/encoders/Co2DisplayCommonCommands.js.map +1 -1
  21. package/dist/encoders/Co2DisplayLiteCommands.test.d.ts +2 -0
  22. package/dist/encoders/Co2DisplayLiteCommands.test.d.ts.map +1 -0
  23. package/dist/encoders/Co2DisplayLiteCommands.test.js +21 -0
  24. package/dist/encoders/Co2DisplayLiteCommands.test.js.map +1 -0
  25. package/dist/encoders/Co2PirLiteCommands.test.d.ts +2 -0
  26. package/dist/encoders/Co2PirLiteCommands.test.d.ts.map +1 -0
  27. package/dist/encoders/Co2PirLiteCommands.test.js +23 -0
  28. package/dist/encoders/Co2PirLiteCommands.test.js.map +1 -0
  29. package/dist/encoders/Co2SensorCommands.test.d.ts +2 -0
  30. package/dist/encoders/Co2SensorCommands.test.d.ts.map +1 -0
  31. package/dist/encoders/Co2SensorCommands.test.js +55 -0
  32. package/dist/encoders/Co2SensorCommands.test.js.map +1 -0
  33. package/dist/encoders/DisplayCommands.test.d.ts +2 -0
  34. package/dist/encoders/DisplayCommands.test.d.ts.map +1 -0
  35. package/dist/encoders/DisplayCommands.test.js +26 -0
  36. package/dist/encoders/DisplayCommands.test.js.map +1 -0
  37. package/dist/encoders/DskDeviceCommands.test.d.ts +2 -0
  38. package/dist/encoders/DskDeviceCommands.test.d.ts.map +1 -0
  39. package/dist/encoders/DskDeviceCommands.test.js +20 -0
  40. package/dist/encoders/DskDeviceCommands.test.js.map +1 -0
  41. package/dist/encoders/FanCoilThermostatCommands.test.d.ts +2 -0
  42. package/dist/encoders/FanCoilThermostatCommands.test.d.ts.map +1 -0
  43. package/dist/encoders/FanCoilThermostatCommands.test.js +117 -0
  44. package/dist/encoders/FanCoilThermostatCommands.test.js.map +1 -0
  45. package/dist/encoders/GeneralCommands.test.d.ts +2 -0
  46. package/dist/encoders/GeneralCommands.test.d.ts.map +1 -0
  47. package/dist/encoders/GeneralCommands.test.js +26 -0
  48. package/dist/encoders/GeneralCommands.test.js.map +1 -0
  49. package/dist/encoders/HTDisplayLiteCommands.test.d.ts +2 -0
  50. package/dist/encoders/HTDisplayLiteCommands.test.d.ts.map +1 -0
  51. package/dist/encoders/HTDisplayLiteCommands.test.js +20 -0
  52. package/dist/encoders/HTDisplayLiteCommands.test.js.map +1 -0
  53. package/dist/encoders/HTPirLiteCommands.test.d.ts +2 -0
  54. package/dist/encoders/HTPirLiteCommands.test.d.ts.map +1 -0
  55. package/dist/encoders/HTPirLiteCommands.test.js +23 -0
  56. package/dist/encoders/HTPirLiteCommands.test.js.map +1 -0
  57. package/dist/encoders/HTSensorCommands.test.d.ts +2 -0
  58. package/dist/encoders/HTSensorCommands.test.d.ts.map +1 -0
  59. package/dist/encoders/HTSensorCommands.test.js +17 -0
  60. package/dist/encoders/HTSensorCommands.test.js.map +1 -0
  61. package/dist/encoders/MelissaCommands.test.d.ts +2 -0
  62. package/dist/encoders/MelissaCommands.test.d.ts.map +1 -0
  63. package/dist/encoders/MelissaCommands.test.js +14 -0
  64. package/dist/encoders/MelissaCommands.test.js.map +1 -0
  65. package/dist/encoders/MultiSensorCommands.test.d.ts +2 -0
  66. package/dist/encoders/MultiSensorCommands.test.d.ts.map +1 -0
  67. package/dist/encoders/MultiSensorCommands.test.js +41 -0
  68. package/dist/encoders/MultiSensorCommands.test.js.map +1 -0
  69. package/dist/encoders/OpenCloseSensorCommands.test.d.ts +2 -0
  70. package/dist/encoders/OpenCloseSensorCommands.test.d.ts.map +1 -0
  71. package/dist/encoders/OpenCloseSensorCommands.test.js +14 -0
  72. package/dist/encoders/OpenCloseSensorCommands.test.js.map +1 -0
  73. package/dist/encoders/PIRCommands.test.d.ts +2 -0
  74. package/dist/encoders/PIRCommands.test.d.ts.map +1 -0
  75. package/dist/encoders/PIRCommands.test.js +29 -0
  76. package/dist/encoders/PIRCommands.test.js.map +1 -0
  77. package/dist/encoders/Relay16Commands.test.d.ts +2 -0
  78. package/dist/encoders/Relay16Commands.test.d.ts.map +1 -0
  79. package/dist/encoders/Relay16Commands.test.js +44 -0
  80. package/dist/encoders/Relay16Commands.test.js.map +1 -0
  81. package/dist/encoders/Relay16DryCommands.test.d.ts +2 -0
  82. package/dist/encoders/Relay16DryCommands.test.d.ts.map +1 -0
  83. package/dist/encoders/Relay16DryCommands.test.js +32 -0
  84. package/dist/encoders/Relay16DryCommands.test.js.map +1 -0
  85. package/dist/encoders/SetAqiLedCommands.test.d.ts +2 -0
  86. package/dist/encoders/SetAqiLedCommands.test.d.ts.map +1 -0
  87. package/dist/encoders/SetAqiLedCommands.test.js +20 -0
  88. package/dist/encoders/SetAqiLedCommands.test.js.map +1 -0
  89. package/dist/encoders/TFloodCommands.test.d.ts +2 -0
  90. package/dist/encoders/TFloodCommands.test.d.ts.map +1 -0
  91. package/dist/encoders/TFloodCommands.test.js +23 -0
  92. package/dist/encoders/TFloodCommands.test.js.map +1 -0
  93. package/dist/encoders/TRingThermostatCommands.test.d.ts +2 -0
  94. package/dist/encoders/TRingThermostatCommands.test.d.ts.map +1 -0
  95. package/dist/encoders/TRingThermostatCommands.test.js +16 -0
  96. package/dist/encoders/TRingThermostatCommands.test.js.map +1 -0
  97. package/dist/encoders/TValveCommands.test.d.ts +2 -0
  98. package/dist/encoders/TValveCommands.test.d.ts.map +1 -0
  99. package/dist/encoders/TValveCommands.test.js +56 -0
  100. package/dist/encoders/TValveCommands.test.js.map +1 -0
  101. package/dist/encoders/TemperatureCommonCommands.test.d.ts +2 -0
  102. package/dist/encoders/TemperatureCommonCommands.test.d.ts.map +1 -0
  103. package/dist/encoders/TemperatureCommonCommands.test.js +14 -0
  104. package/dist/encoders/TemperatureCommonCommands.test.js.map +1 -0
  105. package/dist/encoders/VickiCommands.test.d.ts +2 -0
  106. package/dist/encoders/VickiCommands.test.d.ts.map +1 -0
  107. package/dist/encoders/VickiCommands.test.js +156 -0
  108. package/dist/encoders/VickiCommands.test.js.map +1 -0
  109. package/dist/encoders/WirelessThermostatCommands.test.d.ts +2 -0
  110. package/dist/encoders/WirelessThermostatCommands.test.d.ts.map +1 -0
  111. package/dist/encoders/WirelessThermostatCommands.test.js +41 -0
  112. package/dist/encoders/WirelessThermostatCommands.test.js.map +1 -0
  113. package/dist/test/payloadDecoders.test.js +34 -34
  114. package/dist/test/payloadDecoders.test.js.map +1 -1
  115. package/package.json +1 -1
  116. package/src/decoders/payloadParsers/multisensorPayloadParser.ts +96 -34
  117. package/src/encoders/ButtonCommands.test.ts +26 -0
  118. package/src/encoders/ChildLockCommands.test.ts +22 -0
  119. package/src/encoders/Co2DisplayCommands.test.ts +26 -0
  120. package/src/encoders/Co2DisplayLiteCommands.test.ts +30 -0
  121. package/src/encoders/Co2PirLiteCommands.test.ts +32 -0
  122. package/src/encoders/Co2SensorCommands.test.ts +79 -0
  123. package/src/encoders/DisplayCommands.test.ts +40 -0
  124. package/src/encoders/DskDeviceCommands.test.ts +26 -0
  125. package/src/encoders/FanCoilThermostatCommands.test.ts +204 -0
  126. package/src/encoders/GeneralCommands.test.ts +38 -0
  127. package/src/encoders/HTDisplayLiteCommands.test.ts +28 -0
  128. package/src/encoders/HTPirLiteCommands.test.ts +32 -0
  129. package/src/encoders/HTSensorCommands.test.ts +24 -0
  130. package/src/encoders/MelissaCommands.test.ts +16 -0
  131. package/src/encoders/MultiSensorCommands.test.ts +68 -0
  132. package/src/encoders/OpenCloseSensorCommands.test.ts +16 -0
  133. package/src/encoders/PIRCommands.test.ts +46 -0
  134. package/src/encoders/Relay16Commands.test.ts +76 -0
  135. package/src/encoders/Relay16DryCommands.test.ts +52 -0
  136. package/src/encoders/SetAqiLedCommands.test.ts +18 -0
  137. package/src/encoders/TFloodCommands.test.ts +34 -0
  138. package/src/encoders/TRingThermostatCommands.test.ts +23 -0
  139. package/src/encoders/TValveCommands.test.ts +98 -0
  140. package/src/encoders/TemperatureCommonCommands.test.ts +16 -0
  141. package/src/encoders/VickiCommands.test.ts +275 -0
  142. package/src/encoders/WirelessThermostatCommands.test.ts +70 -0
  143. package/src/test/payloadDecoders.test.ts +34 -34
  144. package/src/test.txt +1 -0
  145. package/dist/encoders/FanCoilThermostat.d.ts +0 -61
  146. package/dist/encoders/FanCoilThermostat.d.ts.map +0 -1
  147. package/dist/encoders/FanCoilThermostat.js +0 -719
  148. package/dist/encoders/FanCoilThermostat.js.map +0 -1
  149. package/dist/encoders/SetAqiLed.d.ts +0 -6
  150. package/dist/encoders/SetAqiLed.d.ts.map +0 -1
  151. package/dist/encoders/SetAqiLed.js +0 -46
  152. package/dist/encoders/SetAqiLed.js.map +0 -1
  153. package/dist/encoders/types/enumValidation.d.ts +0 -6
  154. package/dist/encoders/types/enumValidation.d.ts.map +0 -1
  155. package/dist/encoders/types/enumValidation.js +0 -50
  156. package/dist/encoders/types/enumValidation.js.map +0 -1
  157. package/dist/encoders/types/schemaValidatedEnums.d.ts +0 -40
  158. package/dist/encoders/types/schemaValidatedEnums.d.ts.map +0 -1
  159. package/dist/encoders/types/schemaValidatedEnums.js +0 -181
  160. package/dist/encoders/types/schemaValidatedEnums.js.map +0 -1
  161. package/dist/types/deviceTypes.d.ts +0 -19
  162. package/dist/types/deviceTypes.d.ts.map +0 -1
  163. package/dist/types/deviceTypes.js +0 -23
  164. package/dist/types/deviceTypes.js.map +0 -1
  165. package/dist/types/index.d.ts +0 -2
  166. package/dist/types/index.d.ts.map +0 -1
  167. package/dist/types/index.js +0 -18
  168. package/dist/types/index.js.map +0 -1
  169. package/dist/types/types.d.ts +0 -13
  170. package/dist/types/types.d.ts.map +0 -1
  171. package/dist/types/types.js +0 -9
  172. package/dist/types/types.js.map +0 -1
  173. package/dist/validation.d.ts +0 -3
  174. package/dist/validation.d.ts.map +0 -1
  175. package/dist/validation.js +0 -8
  176. package/dist/validation.js.map +0 -1
  177. package/src/test/payloadEncoders.test.ts +0 -850
@@ -0,0 +1,23 @@
1
+ import { BaseCommand, CommandBuilder } from '@/encoders'
2
+
3
+ describe('TringThermostatCommands payload encoder', () => {
4
+ const commandBuilder = new CommandBuilder('thermostat')
5
+
6
+ test('SetThermostatTarget encodes target temperature', () => {
7
+ expect(commandBuilder.build('SetThermostatTarget', { target: 21.5 })).toStrictEqual(
8
+ new BaseCommand('SetThermostatTarget', 0x01, '00', '00', '00', 'D7', '00'),
9
+ )
10
+ })
11
+
12
+ test('SetThermostatConfig encodes config payload', () => {
13
+ expect(
14
+ commandBuilder.build('SetThermostatConfig', { time: 5, temp_span: 2, temp_sampling: 3, target: 22 }),
15
+ ).toStrictEqual(new BaseCommand('SetThermostatConfig', 0x02, '05', '02', '03', 'DC', '00'))
16
+ })
17
+
18
+ test('SetKeepAlive encodes keepalive payload with padding', () => {
19
+ expect(commandBuilder.build('SetKeepAlive', { time: 10 })).toStrictEqual(
20
+ new BaseCommand('SetKeepAlive', 0x02, '0A', '00', '00', '00', '00'),
21
+ )
22
+ })
23
+ })
@@ -0,0 +1,98 @@
1
+ import { BaseCommand, CommandBuilder } from '@/encoders'
2
+ import { CustomError } from '@/utils'
3
+
4
+ describe('TValveCommands payload encoder', () => {
5
+ const commandBuilder = new CommandBuilder('t_valve')
6
+
7
+ test('SetOpenCloseTime encodes opening and closing time', () => {
8
+ expect(commandBuilder.build('SetOpenCloseTime', { openingTime: 5, closingTime: 10 })).toStrictEqual(
9
+ new BaseCommand('SetOpenCloseTime', 0x01, '05', '0A'),
10
+ )
11
+ })
12
+
13
+ test('SetLED encodes led id, behavior and seconds', () => {
14
+ expect(commandBuilder.build('SetLED', { ledId: 1, behavior: 2, seconds: 5 })).toStrictEqual(
15
+ new BaseCommand('SetLED', 0x02, '01', '02', '05'),
16
+ )
17
+ })
18
+
19
+ test('SetBuzzer packs volume/frequency and timing', () => {
20
+ expect(
21
+ commandBuilder.build('SetBuzzer', { volume: 8, frequency: 4, activeTime: 10, onTime: 20, offTime: 30 }),
22
+ ).toStrictEqual(new BaseCommand('SetBuzzer', 0x03, '84', '0A', '02', '03'))
23
+ })
24
+
25
+ test('SetEmergencyOpenings encodes max openings', () => {
26
+ expect(commandBuilder.build('SetEmergencyOpenings', { maxOpenings: 7 })).toStrictEqual(
27
+ new BaseCommand('SetEmergencyOpenings', 0x04, '07'),
28
+ )
29
+ })
30
+
31
+ test('SetManualControl encodes open/close bits', () => {
32
+ expect(commandBuilder.build('SetManualControl', { enableOpen: true, enableClose: false })).toStrictEqual(
33
+ new BaseCommand('SetManualControl', 0x05, '00000001'),
34
+ )
35
+ })
36
+
37
+ test('SetFloodAlarmTime encodes alarm time', () => {
38
+ expect(commandBuilder.build('SetFloodAlarmTime', { time: 12 })).toStrictEqual(
39
+ new BaseCommand('SetFloodAlarmTime', 0x06, '0C'),
40
+ )
41
+ })
42
+
43
+ test('SetKeepAlive encodes keepalive', () => {
44
+ expect(commandBuilder.build('SetKeepAlive', { time: 5 })).toStrictEqual(new BaseCommand('SetKeepAlive', 0x07, '05'))
45
+ })
46
+
47
+ test('SetWorkingVoltage scales voltage before encoding', () => {
48
+ expect(commandBuilder.build('SetWorkingVoltage', { voltage: 2000 })).toStrictEqual(
49
+ new BaseCommand('SetWorkingVoltage', 0x09, '32'),
50
+ )
51
+ })
52
+
53
+ test('SetValveState encodes valve state', () => {
54
+ expect(commandBuilder.build('SetValveState', { state: 1 })).toStrictEqual(
55
+ new BaseCommand('SetValveState', 0x0c, '01'),
56
+ )
57
+ })
58
+
59
+ test('SetOpenCloseTimeExtended encodes extended times', () => {
60
+ expect(commandBuilder.build('SetOpenCloseTimeExtended', { openingTime: 300, closingTime: 400 })).toStrictEqual(
61
+ new BaseCommand('SetOpenCloseTimeExtended', 0x0d, '012C', '0190'),
62
+ )
63
+ })
64
+
65
+ test('SetSingleTimeValveState encodes state and time', () => {
66
+ expect(commandBuilder.build('SetSingleTimeValveState', { state: 1, time: 60 })).toStrictEqual(
67
+ new BaseCommand('SetSingleTimeValveState', 0x14, '01', '003C'),
68
+ )
69
+ })
70
+
71
+ test('SetDeviceFloodSensor encodes enable bit', () => {
72
+ expect(commandBuilder.build('SetDeviceFloodSensor', { enabled: true })).toStrictEqual(
73
+ new BaseCommand('SetDeviceFloodSensor', 0x0a, '1'),
74
+ )
75
+ })
76
+
77
+ test('SetJoinRetryPeriod scales minutes before encoding', () => {
78
+ expect(commandBuilder.build('SetJoinRetryPeriod', { period: 10 })).toStrictEqual(
79
+ new BaseCommand('SetJoinRetryPeriod', 0x15, '78'),
80
+ )
81
+ })
82
+
83
+ test('SetUplinkType forwards uplink type', () => {
84
+ expect(commandBuilder.build('SetUplinkType', { type: '01' })).toStrictEqual(
85
+ new BaseCommand('SetUplinkType', 0x17, '01'),
86
+ )
87
+ })
88
+
89
+ test('SetWatchDogParams encodes confirmed/unconfirmed uplinks', () => {
90
+ expect(commandBuilder.build('SetWatchDogParams', { confirmedUplinks: 2, unconfirmedUplinks: 3 })).toStrictEqual(
91
+ new BaseCommand('SetWatchDogParams', 0x19, '02', '03'),
92
+ )
93
+ })
94
+
95
+ test('Invalid SetOpenCloseTime throws validation error', () => {
96
+ expect(() => commandBuilder.build('SetOpenCloseTime', { openingTime: -1, closingTime: 1 })).toThrow(CustomError)
97
+ })
98
+ })
@@ -0,0 +1,16 @@
1
+ import { BaseCommand, CommandBuilder } from '@/encoders'
2
+ import { CustomError } from '@/utils'
3
+
4
+ describe('TemperatureCommonCommands payload encoder', () => {
5
+ const commandBuilder = new CommandBuilder('vicki')
6
+
7
+ test('SetTemperatureRange encodes min and max', () => {
8
+ expect(commandBuilder.build('SetTemperatureRange', { min: 5, max: 25 })).toStrictEqual(
9
+ new BaseCommand('SetTemperatureRange', 0x08, '05', '19'),
10
+ )
11
+ })
12
+
13
+ test('Invalid SetTemperatureRange throws validation error', () => {
14
+ expect(() => commandBuilder.build('SetTemperatureRange', { min: 0, max: 25 })).toThrow(CustomError)
15
+ })
16
+ })
@@ -0,0 +1,275 @@
1
+ import { BaseCommand, CommandBuilder } from '@/encoders'
2
+ import { CustomError } from '@/utils'
3
+
4
+ describe('VickiCommands payload encoder', () => {
5
+ const commandBuilder = new CommandBuilder('vicki')
6
+
7
+ test('SetOpenWindow encodes enabled, close time, motor position and delta', () => {
8
+ expect(
9
+ commandBuilder.build('SetOpenWindow', { enabled: true, delta: 5, closeTime: 30, motorPosition: 300 }),
10
+ ).toStrictEqual(new BaseCommand('SetOpenWindow', 0x06, '01', '06', '2C', '15', '5'))
11
+ })
12
+
13
+ test('SetInternalAlgoParams encodes period and P values', () => {
14
+ expect(commandBuilder.build('SetInternalAlgoParams', { period: 2, pFirstLast: 3, pNext: 4 })).toStrictEqual(
15
+ new BaseCommand('SetInternalAlgoParams', 0x0c, '02', '03', '04'),
16
+ )
17
+ })
18
+
19
+ test('SetOperationalMode encodes mode', () => {
20
+ expect(commandBuilder.build('SetOperationalMode', { mode: '01' })).toStrictEqual(
21
+ new BaseCommand('SetOperationalMode', 0x0d, '01'),
22
+ )
23
+ })
24
+
25
+ test('SetTargetTemperature uses precise path for floats', () => {
26
+ expect(commandBuilder.build('SetTargetTemperature', { targetTemperature: 21.5 })).toStrictEqual(
27
+ new BaseCommand('SetTargetTemperature', 0x51, '00D7'),
28
+ )
29
+ })
30
+
31
+ test('SetTargetTemperature uses integer path', () => {
32
+ expect(commandBuilder.build('SetTargetTemperature', { targetTemperature: 22 })).toStrictEqual(
33
+ new BaseCommand('SetTargetTemperature', 0x0e, '16'),
34
+ )
35
+ })
36
+
37
+ test('SetExternalTemperature encodes temperature', () => {
38
+ expect(commandBuilder.build('SetExternalTemperature', { temp: 25 })).toStrictEqual(
39
+ new BaseCommand('SetExternalTemperature', 0x0f, '19'),
40
+ )
41
+ })
42
+
43
+ test('SetInternalAlgoTdiffParams encodes cold and warm deltas', () => {
44
+ expect(commandBuilder.build('SetInternalAlgoTdiffParams', { cold: 10, warm: 20 })).toStrictEqual(
45
+ new BaseCommand('SetInternalAlgoTdiffParams', 0x1a, '0A', '14'),
46
+ )
47
+ })
48
+
49
+ test('SetPrimaryOperationalMode encodes mode', () => {
50
+ expect(commandBuilder.build('SetPrimaryOperationalMode', { mode: '01' })).toStrictEqual(
51
+ new BaseCommand('SetPrimaryOperationalMode', 0x1e, '01'),
52
+ )
53
+ })
54
+
55
+ test('SetBatteryRangesBoundaries encodes three boundaries', () => {
56
+ expect(
57
+ commandBuilder.build('SetBatteryRangesBoundaries', { Boundary1: 100, Boundary2: 200, Boundary3: 300 }),
58
+ ).toStrictEqual(new BaseCommand('SetBatteryRangesBoundaries', 0x20, '0064', '00C8', '012C'))
59
+ })
60
+
61
+ test('SetBatteryRangesOverVoltage encodes ranges with fixed first value', () => {
62
+ expect(commandBuilder.build('SetBatteryRangesOverVoltage', { Range1: 10, Range2: 20, Range3: 30 })).toStrictEqual(
63
+ new BaseCommand('SetBatteryRangesOverVoltage', 0x22, '0E', '0A', '14', '1E'),
64
+ )
65
+ })
66
+
67
+ test('SetOvac encodes ovac value', () => {
68
+ expect(commandBuilder.build('SetOvac', { ovac: 12 })).toStrictEqual(new BaseCommand('SetOvac', 0x26, '0C'))
69
+ })
70
+
71
+ test('SetProportionalAlgorithmParameters encodes coefficient and period', () => {
72
+ expect(commandBuilder.build('SetProportionalAlgorithmParameters', { coefficient: 5, period: 60 })).toStrictEqual(
73
+ new BaseCommand('SetProportionalAlgorithmParameters', 0x2a, '05', '3C'),
74
+ )
75
+ })
76
+
77
+ test('SetTemperatureControlAlgorithm encodes algorithm', () => {
78
+ expect(commandBuilder.build('SetTemperatureControlAlgorithm', { algorithm: '02' })).toStrictEqual(
79
+ new BaseCommand('SetTemperatureControlAlgorithm', 0x2c, '02'),
80
+ )
81
+ })
82
+
83
+ test('SetMotorPositionOnly encodes motor position', () => {
84
+ expect(commandBuilder.build('SetMotorPositionOnly', { position: 300 })).toStrictEqual(
85
+ new BaseCommand('SetMotorPositionOnly', 0x2d, '012C'),
86
+ )
87
+ })
88
+
89
+ test('SetTargetTemperatureAndMotorPosition encodes position and temperature', () => {
90
+ expect(
91
+ commandBuilder.build('SetTargetTemperatureAndMotorPosition', { motorPosition: 400, targetTemperature: 21 }),
92
+ ).toStrictEqual(new BaseCommand('SetTargetTemperatureAndMotorPosition', 0x31, '0190', '15'))
93
+ })
94
+
95
+ test('SetChildLockBehavior encodes behavior', () => {
96
+ expect(commandBuilder.build('SetChildLockBehavior', { behavior: 1 })).toStrictEqual(
97
+ new BaseCommand('SetChildLockBehavior', 0x35, '01'),
98
+ )
99
+ })
100
+
101
+ test('SetProportionalGain encodes fixed-point gain', () => {
102
+ expect(commandBuilder.build('SetProportionalGain', { proportionalGain: 1 })).toStrictEqual(
103
+ new BaseCommand('SetProportionalGain', 0x37, '020000'),
104
+ )
105
+ })
106
+
107
+ test('SetExternalTemperatureFloat encodes temperature *10', () => {
108
+ expect(commandBuilder.build('SetExternalTemperatureFloat', { temp: 12.3 })).toStrictEqual(
109
+ new BaseCommand('SetExternalTemperatureFloat', 0x3c, '007B'),
110
+ )
111
+ })
112
+
113
+ test('SetIntegralGain encodes fixed-point gain', () => {
114
+ expect(commandBuilder.build('SetIntegralGain', { integralGain: 2 })).toStrictEqual(
115
+ new BaseCommand('SetIntegralGain', 0x3e, '040000'),
116
+ )
117
+ })
118
+
119
+ test('SetPiRunPeriod encodes period', () => {
120
+ expect(commandBuilder.build('SetPiRunPeriod', { period: 15 })).toStrictEqual(
121
+ new BaseCommand('SetPiRunPeriod', 0x41, '0F'),
122
+ )
123
+ })
124
+
125
+ test('SetTemperatureHysteresis encodes hysteresis *10', () => {
126
+ expect(commandBuilder.build('SetTemperatureHysteresis', { hysteresis: 0.5 })).toStrictEqual(
127
+ new BaseCommand('SetTemperatureHysteresis', 0x43, '05'),
128
+ )
129
+ })
130
+
131
+ test('SetOpenWindowPrecisely encodes enable, duration and delta', () => {
132
+ expect(commandBuilder.build('SetOpenWindowPrecisely', { enabled: true, duration: 25, delta: 1.5 })).toStrictEqual(
133
+ new BaseCommand('SetOpenWindowPrecisely', 0x45, '01', '05', '0F'),
134
+ )
135
+ })
136
+
137
+ test('SetForceAttach encodes enabled flag', () => {
138
+ expect(commandBuilder.build('SetForceAttach', { enabled: true })).toStrictEqual(
139
+ new BaseCommand('SetForceAttach', 0x47, '01'),
140
+ )
141
+ })
142
+
143
+ test('SetAntiFreezeParams encodes temperatures *10', () => {
144
+ expect(
145
+ commandBuilder.build('SetAntiFreezeParams', {
146
+ activatedTemperature: 5,
147
+ deactivatedTemperature: 6,
148
+ targetTemperature: 7,
149
+ }),
150
+ ).toStrictEqual(new BaseCommand('SetAntiFreezeParams', 0x49, '32', '3C', '46'))
151
+ })
152
+
153
+ test('SetMaxAllowedIntegralValue encodes value *10', () => {
154
+ expect(commandBuilder.build('SetMaxAllowedIntegralValue', { value: 10 })).toStrictEqual(
155
+ new BaseCommand('SetMaxAllowedIntegralValue', 0x4c, '0064'),
156
+ )
157
+ })
158
+
159
+ test('SetValveOpennessInPercentage encodes openness', () => {
160
+ expect(commandBuilder.build('SetValveOpennessInPercentage', { value: 55 })).toStrictEqual(
161
+ new BaseCommand('SetValveOpennessInPercentage', 0x4e, '37'),
162
+ )
163
+ })
164
+
165
+ test('SetValveOpennessRangeInPercentage encodes inverted range', () => {
166
+ expect(commandBuilder.build('SetValveOpennessRangeInPercentage', { min: 10, max: 90 })).toStrictEqual(
167
+ new BaseCommand('SetValveOpennessRangeInPercentage', 0x4f, '0A', '5A'),
168
+ )
169
+ })
170
+
171
+ test('SetTemperatureOffset encodes offset', () => {
172
+ expect(commandBuilder.build('SetTemperatureOffset', { value: 0 })).toStrictEqual(
173
+ new BaseCommand('SetTemperatureOffset', 0x53, '1C'),
174
+ )
175
+ })
176
+
177
+ test('SetHeatingEvent encodes schedule payload', () => {
178
+ expect(
179
+ commandBuilder.build('SetHeatingEvent', {
180
+ eventIndex: 0,
181
+ startHour: 8,
182
+ startMinute: 1,
183
+ targetTemperature: 25.8,
184
+ daysActive: {
185
+ monday: true,
186
+ tuesday: true,
187
+ wednesday: true,
188
+ thursday: true,
189
+ friday: true,
190
+ saturday: false,
191
+ sunday: false,
192
+ },
193
+ }),
194
+ ).toStrictEqual(new BaseCommand('SetHeatingEvent', 0x59, '00', '08', '01', '0102', '1F'))
195
+ })
196
+
197
+ test('SetHeatingEventState encodes event index and state', () => {
198
+ expect(commandBuilder.build('SetHeatingEventState', { eventIndex: 16, active: true })).toStrictEqual(
199
+ new BaseCommand('SetHeatingEventState', 0x6b, '10', '01'),
200
+ )
201
+ })
202
+
203
+ test('SetTimeRequestByMACcommand encodes enable flag', () => {
204
+ expect(commandBuilder.build('SetTimeRequestByMACcommand', { enabled: true })).toStrictEqual(
205
+ new BaseCommand('SetTimeRequestByMACcommand', 0x6d, '01'),
206
+ )
207
+ })
208
+
209
+ test('SetHeatingSchedule encodes schedule dates', () => {
210
+ expect(
211
+ commandBuilder.build('SetHeatingSchedule', { startMonth: 0, startDay: 1, endMonth: 11, endDay: 31 }),
212
+ ).toStrictEqual(new BaseCommand('SetHeatingSchedule', 0x5b, '00', '01', '0B', '1F'))
213
+ })
214
+
215
+ test('SetDeviceTime encodes timestamp bytes', () => {
216
+ expect(commandBuilder.build('SetDeviceTime', { timestamp: 1690000000 })).toStrictEqual(
217
+ new BaseCommand('SetDeviceTime', 0x5d, '64', 'BB', '5A', '80'),
218
+ )
219
+ })
220
+
221
+ test('SetDeviceTimeZone encodes offset with two’s complement for negatives', () => {
222
+ expect(commandBuilder.build('SetDeviceTimeZone', { offsetHours: -3 })).toStrictEqual(
223
+ new BaseCommand('SetDeviceTimeZone', 0x5f, 'FD'),
224
+ )
225
+ })
226
+
227
+ test('SetAutomaticSetpointRestore encodes time/10', () => {
228
+ expect(commandBuilder.build('SetAutomaticSetpointRestore', { time: 30 })).toStrictEqual(
229
+ new BaseCommand('SetAutomaticSetpointRestore', 0x61, '03'),
230
+ )
231
+ })
232
+
233
+ test('SetOfflineTargetTemperature encodes target *10', () => {
234
+ expect(commandBuilder.build('SetOfflineTargetTemperature', { targetTemperature: 21.5 })).toStrictEqual(
235
+ new BaseCommand('SetOfflineTargetTemperature', 0x65, '00D7'),
236
+ )
237
+ })
238
+
239
+ test('SetOfflineTargetTemperature encodes disable payload when target is 0', () => {
240
+ expect(commandBuilder.build('SetOfflineTargetTemperature', { targetTemperature: 0 })).toStrictEqual(
241
+ new BaseCommand('SetOfflineTargetTemperature', 0x65, '0000'),
242
+ )
243
+ })
244
+
245
+ test('SetInternalAlgoTemporaryState encodes enable/disable flag', () => {
246
+ expect(commandBuilder.build('SetInternalAlgoTemporaryState', { enabled: false })).toStrictEqual(
247
+ new BaseCommand('SetInternalAlgoTemporaryState', 0x67, '01'),
248
+ )
249
+ })
250
+
251
+ test('SetTemperatureLevels encodes six level temperatures', () => {
252
+ expect(
253
+ commandBuilder.build('SetTemperatureLevels', {
254
+ scaleLevel0: 5.0,
255
+ scaleLevel1: 10.0,
256
+ scaleLevel2: 15.0,
257
+ scaleLevel3: 20.0,
258
+ scaleLevel4: 22.5,
259
+ scaleLevel5: 25.0,
260
+ }),
261
+ ).toStrictEqual(new BaseCommand('SetTemperatureLevels', 0x69, '0032', '0064', '0096', '00C8', '00E1', '00FA'))
262
+ })
263
+
264
+ test('SetLedIndicationDuration encodes doubled duration', () => {
265
+ expect(commandBuilder.build('SetLedIndicationDuration', { duration: 1.5 })).toStrictEqual(
266
+ new BaseCommand('SetLedIndicationDuration', 0x63, '03'),
267
+ )
268
+ })
269
+
270
+ test('Invalid SetOpenWindow params throw validation error', () => {
271
+ expect(() =>
272
+ commandBuilder.build('SetOpenWindow', { enabled: true, delta: -1, closeTime: 1, motorPosition: 1 }),
273
+ ).toThrow(CustomError)
274
+ })
275
+ })
@@ -0,0 +1,70 @@
1
+ import { BaseCommand, CommandBuilder } from '@/encoders'
2
+ import { CustomError } from '@/utils'
3
+
4
+ describe('WirelessThermostatCommands payload encoder', () => {
5
+ const commandBuilder = new CommandBuilder('wireless_thermostat')
6
+
7
+ test('SetTargetTemperature uses precise path for floats', () => {
8
+ expect(commandBuilder.build('SetTargetTemperature', { targetTemperature: 21.5 })).toStrictEqual(
9
+ new BaseCommand('SetTargetTemperature', 0x50, '00D7'),
10
+ )
11
+ })
12
+
13
+ test('SetTargetTemperature uses integer path', () => {
14
+ expect(commandBuilder.build('SetTargetTemperature', { targetTemperature: 22 })).toStrictEqual(
15
+ new BaseCommand('SetTargetTemperature', 0x2e, '16'),
16
+ )
17
+ })
18
+
19
+ test('SetHeatingStatus encodes status flag', () => {
20
+ expect(commandBuilder.build('SetHeatingStatus', { status: 1 })).toStrictEqual(
21
+ new BaseCommand('SetHeatingStatus', 0x31, '01'),
22
+ )
23
+ })
24
+
25
+ test('SetDisplayRefreshPeriod encodes period', () => {
26
+ expect(commandBuilder.build('SetDisplayRefreshPeriod', { period: 4 })).toStrictEqual(
27
+ new BaseCommand('SetDisplayRefreshPeriod', 0x33, '04'),
28
+ )
29
+ })
30
+
31
+ test('SetTargetSendDelay encodes delay', () => {
32
+ expect(commandBuilder.build('SetTargetSendDelay', { time: 10 })).toStrictEqual(
33
+ new BaseCommand('SetTargetSendDelay', 0x35, '0A'),
34
+ )
35
+ })
36
+
37
+ test('SetAutomaticHeatingStatus encodes toggle', () => {
38
+ expect(commandBuilder.build('SetAutomaticHeatingStatus', { state: 1 })).toStrictEqual(
39
+ new BaseCommand('SetAutomaticHeatingStatus', 0x37, '01'),
40
+ )
41
+ })
42
+
43
+ test('SetSensorMode encodes mode', () => {
44
+ expect(commandBuilder.build('SetSensorMode', { state: 1 })).toStrictEqual(
45
+ new BaseCommand('SetSensorMode', 0x39, '01'),
46
+ )
47
+ })
48
+
49
+ test('SetTemperatureHysteresis encodes hysteresis *10', () => {
50
+ expect(commandBuilder.build('SetTemperatureHysteresis', { hysteresis: 0.5 })).toStrictEqual(
51
+ new BaseCommand('SetTemperatureHysteresis', 0x4e, '05'),
52
+ )
53
+ })
54
+
55
+ test('SetTargetTemperaturePrecisely encodes temperature *10', () => {
56
+ expect(commandBuilder.build('SetTargetTemperaturePrecisely', { targetTemperature: 21.5 })).toStrictEqual(
57
+ new BaseCommand('SetTargetTemperaturePrecisely', 0x50, '00D7'),
58
+ )
59
+ })
60
+
61
+ test('SetTargetTemperatureStep encodes step *10', () => {
62
+ expect(commandBuilder.build('SetTargetTemperatureStep', { value: 0.5 })).toStrictEqual(
63
+ new BaseCommand('SetTargetTemperatureStep', 0x52, '05'),
64
+ )
65
+ })
66
+
67
+ test('Invalid SetTargetTemperatureStep throws validation error', () => {
68
+ expect(() => commandBuilder.build('SetTargetTemperatureStep', { value: 0 })).toThrow(CustomError)
69
+ })
70
+ })
@@ -924,44 +924,44 @@ describe('HTPirLite payload decoder', () => {
924
924
  })
925
925
  describe('MultiSensor payload decoder', () => {
926
926
  test('simple keepalive', () => {
927
- expect(uplinkPayloadParser('810001061AA91F0E0008133D00E506', DeviceType.MultiSensor)).toStrictEqual({
928
- deltaTMinC: 0,
929
- deltaTMaxC: 0.1,
930
- avgTempC: 0.6,
931
- relativeHumidity: 26,
932
- pressureMbar: 958.47,
933
- staticAQI: 60.78,
934
- eCO2ppm: 652.55,
935
- tvocRaw: 8,
936
- tvocPpbApprox: 8,
937
- lightLux: 75,
938
- noiseDb: 61,
939
- pirTriggerCount: 0,
940
- deviceVoltageMv: 3576,
941
- deviceVoltage: 3.58,
942
- powerSourceRaw: 6,
943
- powerSource: 'Battery',
927
+ expect(uplinkPayloadParser('820F17CB2DA80D0600040A3A01DD03', DeviceType.MultiSensor)).toStrictEqual({
928
+ averageTemperature: 45.9,
929
+ minTemperature: 44.4,
930
+ maxTemperature: 47,
931
+ relativeHumidity: 45,
932
+ pressure: 956.94,
933
+ staticAQI: 25,
934
+ eCO2: 508.24,
935
+ bVOC: 4,
936
+ lightLevel: 39,
937
+ noiseLevel: 58,
938
+ pirTriggerCount: 1,
939
+ batteryVoltage: 3.51,
940
+ pir: false,
941
+ hallSensorEvent: false,
942
+ staticAQIAccuracy: 1,
943
+ powerSourceStatus: 1,
944
944
  })
945
945
  })
946
946
  test('keepalive with response of preloaded code', () => {
947
- expect(uplinkPayloadParser('1202810001061AA91F0E0008133D00E506', DeviceType.MultiSensor)).toStrictEqual({
947
+ expect(uplinkPayloadParser('1202820F17CB2DA80D0600040A3A01DD03', DeviceType.MultiSensor)).toStrictEqual({
948
948
  keepAliveTime: 2,
949
- deltaTMinC: 0,
950
- deltaTMaxC: 0.1,
951
- avgTempC: 0.6,
952
- relativeHumidity: 26,
953
- pressureMbar: 958.47,
954
- staticAQI: 60.78,
955
- eCO2ppm: 652.55,
956
- tvocRaw: 8,
957
- tvocPpbApprox: 8,
958
- lightLux: 75,
959
- noiseDb: 61,
960
- pirTriggerCount: 0,
961
- deviceVoltageMv: 3576,
962
- deviceVoltage: 3.58,
963
- powerSourceRaw: 6,
964
- powerSource: 'Battery',
949
+ averageTemperature: 45.9,
950
+ minTemperature: 44.4,
951
+ maxTemperature: 47,
952
+ relativeHumidity: 45,
953
+ pressure: 956.94,
954
+ staticAQI: 25,
955
+ eCO2: 508.24,
956
+ bVOC: 4,
957
+ lightLevel: 39,
958
+ noiseLevel: 58,
959
+ pirTriggerCount: 1,
960
+ batteryVoltage: 3.51,
961
+ pir: false,
962
+ hallSensorEvent: false,
963
+ staticAQIAccuracy: 1,
964
+ powerSourceStatus: 1,
965
965
  })
966
966
  })
967
967
  })
package/src/test.txt ADDED
@@ -0,0 +1 @@
1
+ test
@@ -1,61 +0,0 @@
1
- import { BaseCommand } from '../encoders';
2
- import { FanCoilThermostatCommandTypes } from '../encoders/types';
3
- export declare class FanCoilThermostatCommands {
4
- static setTargetTemperatureStep(params: FanCoilThermostatCommandTypes.SetTargetTemperatureStepParams): BaseCommand;
5
- static getTargetTemperatureStep(): BaseCommand;
6
- static setKeysLock(params: FanCoilThermostatCommandTypes.SetKeysLockParams): BaseCommand;
7
- static getKeysLock(): BaseCommand;
8
- static setFanCoilTarget(params: FanCoilThermostatCommandTypes.SetFanCoilTargetParams): BaseCommand;
9
- static setTargetTemperature(params: FanCoilThermostatCommandTypes.SetTargetTemperatureFanCoilParams): BaseCommand;
10
- static setFctOperationalMode(params: FanCoilThermostatCommandTypes.SetFctOperationalModeParams): BaseCommand;
11
- static setValveOpenCloseTime(params: FanCoilThermostatCommandTypes.SetValveOpenCloseTimeParams): BaseCommand;
12
- static getValveOpenCloseTime(): BaseCommand;
13
- static setExtAutomaticTemperatureControl(params: FanCoilThermostatCommandTypes.SetExtAutomaticTemperatureControlParams): BaseCommand;
14
- static getExtAutomaticTemperatureControl(): BaseCommand;
15
- static setFanSpeed(params: FanCoilThermostatCommandTypes.SetFanSpeedParams): BaseCommand;
16
- static getFanSpeed(): BaseCommand;
17
- static setFanSpeedLimit(params: FanCoilThermostatCommandTypes.SetFanSpeedLimitParams): BaseCommand;
18
- static getFanSpeedLimit(): BaseCommand;
19
- static setEcmVoltageRange(params: FanCoilThermostatCommandTypes.SetEcmVoltageRangeParams): BaseCommand;
20
- static getEcmVoltageRange(): BaseCommand;
21
- static setEcmStartUpTime(params: FanCoilThermostatCommandTypes.SetEcmStartUpTimeParams): BaseCommand;
22
- static getEcmStartUpTime(): BaseCommand;
23
- static setEcmRelay(params: FanCoilThermostatCommandTypes.SetEcmRelayParams): BaseCommand;
24
- static getEcmRelay(): BaseCommand;
25
- static setFrostProtection(params: FanCoilThermostatCommandTypes.SetFrostProtectionParams): BaseCommand;
26
- static getFrostProtection(): BaseCommand;
27
- static setFrostProtectionSettings(params: FanCoilThermostatCommandTypes.SetFrostProtectionSettingsParams): BaseCommand;
28
- static getFrostProtectionSettings(): BaseCommand;
29
- static setAllowedOperationalModes(params: FanCoilThermostatCommandTypes.SetAllowedOperationalModesParams): BaseCommand;
30
- static getAllowedOperationalModes(): BaseCommand;
31
- static setCoolingSetpointNotOccupied(params: FanCoilThermostatCommandTypes.SetCoolingSetpointNotOccupiedParams): BaseCommand;
32
- static getCoolingSetpointNotOccupied(): BaseCommand;
33
- static setHeatingSetpointNotOccupied(params: FanCoilThermostatCommandTypes.SetHeatingSetpointNotOccupiedParams): BaseCommand;
34
- static getHeatingSetpointNotOccupied(): BaseCommand;
35
- static setTempSensorCompensation(params: FanCoilThermostatCommandTypes.SetTempSensorCompensationParams): BaseCommand;
36
- static getTempSensorCompensation(): BaseCommand;
37
- static setFanSpeedNotOccupied(params: FanCoilThermostatCommandTypes.SetFanSpeedNotOccupiedParams): BaseCommand;
38
- static getFanSpeedNotOccupied(): BaseCommand;
39
- static setAutomaticChangeover(params: FanCoilThermostatCommandTypes.SetAutomaticChangeoverParams): BaseCommand;
40
- static getAutomaticChangeover(): BaseCommand;
41
- static setWiringDiagram(params: FanCoilThermostatCommandTypes.SetWiringDiagramParams): BaseCommand;
42
- static getWiringDiagram(): BaseCommand;
43
- static setOccFunction(params: FanCoilThermostatCommandTypes.SetOccFunctionParams): BaseCommand;
44
- static getOccFunction(): BaseCommand;
45
- static setAutomaticChangeoverThreshold(params: FanCoilThermostatCommandTypes.SetAutomaticChangeoverThresholdParams): BaseCommand;
46
- static getAutomaticChangeoverThreshold(): BaseCommand;
47
- static setDeviceStatus(params: FanCoilThermostatCommandTypes.SetDeviceStatusParams): BaseCommand;
48
- static getDeviceStatus(): BaseCommand;
49
- static setReturnOfPowerOperation(params: FanCoilThermostatCommandTypes.SetReturnOfPowerOperationParams): BaseCommand;
50
- static getReturnOfPowerOperation(): BaseCommand;
51
- static setDeltaTemperature1(params: FanCoilThermostatCommandTypes.SetDeltaTemperature1Params): BaseCommand;
52
- static getDeltaTemperature1(): BaseCommand;
53
- static setDeltaTemperature2and3(params: FanCoilThermostatCommandTypes.SetDeltaTemperature2and3Params): BaseCommand;
54
- static getDeltaTemperature2and3(): BaseCommand;
55
- static getFrostProtectionStatus(): BaseCommand;
56
- static getOccupancySensorStatusSetPoint(): BaseCommand;
57
- static getOccupancySensorStatus(): BaseCommand;
58
- static getDewPointSensorStatus(): BaseCommand;
59
- static getFilterAlarm(): BaseCommand;
60
- }
61
- //# sourceMappingURL=FanCoilThermostat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FanCoilThermostat.d.ts","sourceRoot":"","sources":["../../src/encoders/FanCoilThermostat.ts"],"names":[],"mappings":"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"}