irtxrx 0.0.1

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 (178) hide show
  1. package/README.md +127 -0
  2. package/dist/cjs/decode.d.ts +184 -0
  3. package/dist/cjs/decode.d.ts.map +1 -0
  4. package/dist/cjs/decode.js +431 -0
  5. package/dist/cjs/decode.js.map +1 -0
  6. package/dist/cjs/encode.d.ts +76 -0
  7. package/dist/cjs/encode.d.ts.map +1 -0
  8. package/dist/cjs/encode.js +185 -0
  9. package/dist/cjs/encode.js.map +1 -0
  10. package/dist/cjs/index.d.ts +34 -0
  11. package/dist/cjs/index.d.ts.map +1 -0
  12. package/dist/cjs/index.js +99 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/protocols/coolix.d.ts +98 -0
  15. package/dist/cjs/protocols/coolix.d.ts.map +1 -0
  16. package/dist/cjs/protocols/coolix.js +331 -0
  17. package/dist/cjs/protocols/coolix.js.map +1 -0
  18. package/dist/cjs/protocols/daikin.d.ts +47 -0
  19. package/dist/cjs/protocols/daikin.d.ts.map +1 -0
  20. package/dist/cjs/protocols/daikin.js +353 -0
  21. package/dist/cjs/protocols/daikin.js.map +1 -0
  22. package/dist/cjs/protocols/daikin128.d.ts +60 -0
  23. package/dist/cjs/protocols/daikin128.d.ts.map +1 -0
  24. package/dist/cjs/protocols/daikin128.js +267 -0
  25. package/dist/cjs/protocols/daikin128.js.map +1 -0
  26. package/dist/cjs/protocols/daikin152.d.ts +47 -0
  27. package/dist/cjs/protocols/daikin152.d.ts.map +1 -0
  28. package/dist/cjs/protocols/daikin152.js +256 -0
  29. package/dist/cjs/protocols/daikin152.js.map +1 -0
  30. package/dist/cjs/protocols/daikin160.d.ts +37 -0
  31. package/dist/cjs/protocols/daikin160.d.ts.map +1 -0
  32. package/dist/cjs/protocols/daikin160.js +176 -0
  33. package/dist/cjs/protocols/daikin160.js.map +1 -0
  34. package/dist/cjs/protocols/daikin176.d.ts +44 -0
  35. package/dist/cjs/protocols/daikin176.d.ts.map +1 -0
  36. package/dist/cjs/protocols/daikin176.js +215 -0
  37. package/dist/cjs/protocols/daikin176.js.map +1 -0
  38. package/dist/cjs/protocols/daikin2.d.ts +46 -0
  39. package/dist/cjs/protocols/daikin2.d.ts.map +1 -0
  40. package/dist/cjs/protocols/daikin2.js +337 -0
  41. package/dist/cjs/protocols/daikin2.js.map +1 -0
  42. package/dist/cjs/protocols/daikin216.d.ts +30 -0
  43. package/dist/cjs/protocols/daikin216.d.ts.map +1 -0
  44. package/dist/cjs/protocols/daikin216.js +167 -0
  45. package/dist/cjs/protocols/daikin216.js.map +1 -0
  46. package/dist/cjs/protocols/daikin312.d.ts +45 -0
  47. package/dist/cjs/protocols/daikin312.d.ts.map +1 -0
  48. package/dist/cjs/protocols/daikin312.js +345 -0
  49. package/dist/cjs/protocols/daikin312.js.map +1 -0
  50. package/dist/cjs/protocols/daikin64.d.ts +79 -0
  51. package/dist/cjs/protocols/daikin64.d.ts.map +1 -0
  52. package/dist/cjs/protocols/daikin64.js +260 -0
  53. package/dist/cjs/protocols/daikin64.js.map +1 -0
  54. package/dist/cjs/protocols/daikin_common.d.ts +28 -0
  55. package/dist/cjs/protocols/daikin_common.d.ts.map +1 -0
  56. package/dist/cjs/protocols/daikin_common.js +41 -0
  57. package/dist/cjs/protocols/daikin_common.js.map +1 -0
  58. package/dist/cjs/protocols/nec.d.ts +50 -0
  59. package/dist/cjs/protocols/nec.d.ts.map +1 -0
  60. package/dist/cjs/protocols/nec.js +180 -0
  61. package/dist/cjs/protocols/nec.js.map +1 -0
  62. package/dist/decode.d.ts +67 -0
  63. package/dist/decode.d.ts.map +1 -0
  64. package/dist/decode.js +242 -0
  65. package/dist/decode.js.map +1 -0
  66. package/dist/encode.d.ts +76 -0
  67. package/dist/encode.d.ts.map +1 -0
  68. package/dist/encode.js +174 -0
  69. package/dist/encode.js.map +1 -0
  70. package/dist/esm/decode.d.ts +184 -0
  71. package/dist/esm/decode.d.ts.map +1 -0
  72. package/dist/esm/decode.js +420 -0
  73. package/dist/esm/decode.js.map +1 -0
  74. package/dist/esm/encode.d.ts +76 -0
  75. package/dist/esm/encode.d.ts.map +1 -0
  76. package/dist/esm/encode.js +174 -0
  77. package/dist/esm/encode.js.map +1 -0
  78. package/dist/esm/index.d.ts +34 -0
  79. package/dist/esm/index.d.ts.map +1 -0
  80. package/dist/esm/index.js +20 -0
  81. package/dist/esm/index.js.map +1 -0
  82. package/dist/esm/protocols/coolix.d.ts +98 -0
  83. package/dist/esm/protocols/coolix.d.ts.map +1 -0
  84. package/dist/esm/protocols/coolix.js +322 -0
  85. package/dist/esm/protocols/coolix.js.map +1 -0
  86. package/dist/esm/protocols/daikin.d.ts +47 -0
  87. package/dist/esm/protocols/daikin.d.ts.map +1 -0
  88. package/dist/esm/protocols/daikin.js +344 -0
  89. package/dist/esm/protocols/daikin.js.map +1 -0
  90. package/dist/esm/protocols/daikin128.d.ts +60 -0
  91. package/dist/esm/protocols/daikin128.d.ts.map +1 -0
  92. package/dist/esm/protocols/daikin128.js +260 -0
  93. package/dist/esm/protocols/daikin128.js.map +1 -0
  94. package/dist/esm/protocols/daikin152.d.ts +47 -0
  95. package/dist/esm/protocols/daikin152.d.ts.map +1 -0
  96. package/dist/esm/protocols/daikin152.js +247 -0
  97. package/dist/esm/protocols/daikin152.js.map +1 -0
  98. package/dist/esm/protocols/daikin160.d.ts +37 -0
  99. package/dist/esm/protocols/daikin160.d.ts.map +1 -0
  100. package/dist/esm/protocols/daikin160.js +167 -0
  101. package/dist/esm/protocols/daikin160.js.map +1 -0
  102. package/dist/esm/protocols/daikin176.d.ts +44 -0
  103. package/dist/esm/protocols/daikin176.d.ts.map +1 -0
  104. package/dist/esm/protocols/daikin176.js +208 -0
  105. package/dist/esm/protocols/daikin176.js.map +1 -0
  106. package/dist/esm/protocols/daikin2.d.ts +46 -0
  107. package/dist/esm/protocols/daikin2.d.ts.map +1 -0
  108. package/dist/esm/protocols/daikin2.js +328 -0
  109. package/dist/esm/protocols/daikin2.js.map +1 -0
  110. package/dist/esm/protocols/daikin216.d.ts +30 -0
  111. package/dist/esm/protocols/daikin216.d.ts.map +1 -0
  112. package/dist/esm/protocols/daikin216.js +158 -0
  113. package/dist/esm/protocols/daikin216.js.map +1 -0
  114. package/dist/esm/protocols/daikin312.d.ts +45 -0
  115. package/dist/esm/protocols/daikin312.d.ts.map +1 -0
  116. package/dist/esm/protocols/daikin312.js +336 -0
  117. package/dist/esm/protocols/daikin312.js.map +1 -0
  118. package/dist/esm/protocols/daikin64.d.ts +79 -0
  119. package/dist/esm/protocols/daikin64.d.ts.map +1 -0
  120. package/dist/esm/protocols/daikin64.js +253 -0
  121. package/dist/esm/protocols/daikin64.js.map +1 -0
  122. package/dist/esm/protocols/daikin_common.d.ts +28 -0
  123. package/dist/esm/protocols/daikin_common.d.ts.map +1 -0
  124. package/dist/esm/protocols/daikin_common.js +38 -0
  125. package/dist/esm/protocols/daikin_common.js.map +1 -0
  126. package/dist/esm/protocols/nec.d.ts +50 -0
  127. package/dist/esm/protocols/nec.d.ts.map +1 -0
  128. package/dist/esm/protocols/nec.js +175 -0
  129. package/dist/esm/protocols/nec.js.map +1 -0
  130. package/dist/index.d.ts +32 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +19 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/protocols/daikin.d.ts +47 -0
  135. package/dist/protocols/daikin.d.ts.map +1 -0
  136. package/dist/protocols/daikin.js +343 -0
  137. package/dist/protocols/daikin.js.map +1 -0
  138. package/dist/protocols/daikin128.d.ts +60 -0
  139. package/dist/protocols/daikin128.d.ts.map +1 -0
  140. package/dist/protocols/daikin128.js +259 -0
  141. package/dist/protocols/daikin128.js.map +1 -0
  142. package/dist/protocols/daikin152.d.ts +47 -0
  143. package/dist/protocols/daikin152.d.ts.map +1 -0
  144. package/dist/protocols/daikin152.js +246 -0
  145. package/dist/protocols/daikin152.js.map +1 -0
  146. package/dist/protocols/daikin160.d.ts +37 -0
  147. package/dist/protocols/daikin160.d.ts.map +1 -0
  148. package/dist/protocols/daikin160.js +166 -0
  149. package/dist/protocols/daikin160.js.map +1 -0
  150. package/dist/protocols/daikin176.d.ts +44 -0
  151. package/dist/protocols/daikin176.d.ts.map +1 -0
  152. package/dist/protocols/daikin176.js +207 -0
  153. package/dist/protocols/daikin176.js.map +1 -0
  154. package/dist/protocols/daikin2.d.ts +46 -0
  155. package/dist/protocols/daikin2.d.ts.map +1 -0
  156. package/dist/protocols/daikin2.js +326 -0
  157. package/dist/protocols/daikin2.js.map +1 -0
  158. package/dist/protocols/daikin216.d.ts +30 -0
  159. package/dist/protocols/daikin216.d.ts.map +1 -0
  160. package/dist/protocols/daikin216.js +157 -0
  161. package/dist/protocols/daikin216.js.map +1 -0
  162. package/dist/protocols/daikin312.d.ts +45 -0
  163. package/dist/protocols/daikin312.d.ts.map +1 -0
  164. package/dist/protocols/daikin312.js +334 -0
  165. package/dist/protocols/daikin312.js.map +1 -0
  166. package/dist/protocols/daikin64.d.ts +79 -0
  167. package/dist/protocols/daikin64.d.ts.map +1 -0
  168. package/dist/protocols/daikin64.js +251 -0
  169. package/dist/protocols/daikin64.js.map +1 -0
  170. package/dist/protocols/daikin_common.d.ts +28 -0
  171. package/dist/protocols/daikin_common.d.ts.map +1 -0
  172. package/dist/protocols/daikin_common.js +38 -0
  173. package/dist/protocols/daikin_common.js.map +1 -0
  174. package/dist/protocols/nec.d.ts +50 -0
  175. package/dist/protocols/nec.d.ts.map +1 -0
  176. package/dist/protocols/nec.js +175 -0
  177. package/dist/protocols/nec.js.map +1 -0
  178. package/package.json +37 -0
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Daikin ESP / standard 280-bit (35-byte) IR protocol encoder.
3
+ *
4
+ * Header (5-bit) + 3 sections: bytes 0–7 (8) + bytes 8–15 (8) + bytes 16–34 (19).
5
+ * Ported from IRremoteESP8266 `ir_Daikin.cpp`.
6
+ */
7
+ import type { DaikinModeValue, DaikinFanValue } from "./daikin_common.js";
8
+ export { DaikinMode, DaikinFan } from "./daikin_common.js";
9
+ export interface DaikinESPState {
10
+ power?: boolean;
11
+ /** Temperature in °C (10–32). Supports 0.5°C increments. */
12
+ temp?: number;
13
+ mode?: DaikinModeValue;
14
+ fan?: DaikinFanValue;
15
+ swingVertical?: boolean;
16
+ swingHorizontal?: boolean;
17
+ quiet?: boolean;
18
+ powerful?: boolean;
19
+ econo?: boolean;
20
+ mold?: boolean;
21
+ comfort?: boolean;
22
+ sensor?: boolean;
23
+ /** Weekly timer enable. */
24
+ weeklyTimer?: boolean;
25
+ /** Current time in minutes past midnight (0–1439). */
26
+ currentTime?: number;
27
+ /** Current day of week (1=SUN..7=SAT). */
28
+ currentDay?: number;
29
+ /** On timer: minutes past midnight. Undefined = disabled. */
30
+ onTime?: number;
31
+ /** Off timer: minutes past midnight. Undefined = disabled. */
32
+ offTime?: number;
33
+ }
34
+ export declare function buildDaikinESPRaw(state: DaikinESPState): Uint8Array;
35
+ export declare function sendDaikinESP(state: DaikinESPState, repeat?: number): number[];
36
+ export declare function encodeDaikinESPRaw(data: Uint8Array, repeat?: number): number[];
37
+ /**
38
+ * Decode raw IR timings as a DaikinESP message.
39
+ *
40
+ * The 5-bit leader preamble is optional — hardware captures often miss it.
41
+ *
42
+ * @param timings Raw mark/space timing array in microseconds.
43
+ * @param offset Starting index in the timings array (default 0).
44
+ * @returns Decoded state (same shape as encode input), or null on mismatch.
45
+ */
46
+ export declare function decodeDaikinESP(timings: number[], offset?: number): DaikinESPState | null;
47
+ //# sourceMappingURL=daikin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daikin.d.ts","sourceRoot":"","sources":["../../src/protocols/daikin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAuB3D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAuDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAyFnE;AAMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAiCzE;AAgDD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,GAAE,MAAU,GACjB,cAAc,GAAG,IAAI,CAkIvB"}
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Daikin ESP / standard 280-bit (35-byte) IR protocol encoder.
3
+ *
4
+ * Header (5-bit) + 3 sections: bytes 0–7 (8) + bytes 8–15 (8) + bytes 16–34 (19).
5
+ * Ported from IRremoteESP8266 `ir_Daikin.cpp`.
6
+ */
7
+ import { sumBytes, sendGeneric, sendGenericBytes } from "../encode.js";
8
+ import { matchGeneric, matchGenericBytes } from "../decode.js";
9
+ import { DaikinMode, DaikinFan, DAIKIN_SWING_ON, DAIKIN_SWING_OFF, DAIKIN_MIN_TEMP, DAIKIN_MAX_TEMP, } from "./daikin_common.js";
10
+ export { DaikinMode, DaikinFan } from "./daikin_common.js";
11
+ // ---------------------------------------------------------------------------
12
+ // Timing constants
13
+ // ---------------------------------------------------------------------------
14
+ const HDR_MARK = 3650;
15
+ const HDR_SPACE = 1623;
16
+ const BIT_MARK = 428;
17
+ const ONE_SPACE = 1280;
18
+ const ZERO_SPACE = 428;
19
+ const GAP = 29000;
20
+ const FOOTER_GAP = ZERO_SPACE + GAP; // 29428
21
+ const STATE_LENGTH = 35;
22
+ const SECTION1_LEN = 8;
23
+ const SECTION2_LEN = 8;
24
+ const HEADER_BITS = 5;
25
+ const UNUSED_TIME = 0x600;
26
+ // ---------------------------------------------------------------------------
27
+ // Bit helpers
28
+ // ---------------------------------------------------------------------------
29
+ function setBit(raw, byteIdx, bitIdx, on) {
30
+ if (on)
31
+ raw[byteIdx] = raw[byteIdx] | (1 << bitIdx);
32
+ else
33
+ raw[byteIdx] = raw[byteIdx] & ~(1 << bitIdx);
34
+ }
35
+ function setBitsRange(raw, byteIdx, bitOffset, size, value) {
36
+ const mask = ((1 << size) - 1) << bitOffset;
37
+ raw[byteIdx] = (raw[byteIdx] & ~mask) | ((value << bitOffset) & mask);
38
+ }
39
+ /** Set a multi-byte little-endian bitfield spanning byte boundaries. */
40
+ function setFieldLE(raw, startByte, startBit, totalBits, value) {
41
+ let v = value;
42
+ let byte = startByte;
43
+ let bit = startBit;
44
+ let remaining = totalBits;
45
+ while (remaining > 0) {
46
+ const bitsInThisByte = Math.min(remaining, 8 - bit);
47
+ const mask = ((1 << bitsInThisByte) - 1) << bit;
48
+ raw[byte] = (raw[byte] & ~mask) | (((v & ((1 << bitsInThisByte) - 1)) << bit) & mask);
49
+ v >>>= bitsInThisByte;
50
+ remaining -= bitsInThisByte;
51
+ byte++;
52
+ bit = 0;
53
+ }
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Build
57
+ // ---------------------------------------------------------------------------
58
+ function defaultState() {
59
+ const raw = new Uint8Array(STATE_LENGTH);
60
+ raw[0] = 0x11;
61
+ raw[1] = 0xda;
62
+ raw[2] = 0x27;
63
+ raw[4] = 0xc5;
64
+ raw[8] = 0x11;
65
+ raw[9] = 0xda;
66
+ raw[10] = 0x27;
67
+ raw[12] = 0x42;
68
+ raw[16] = 0x11;
69
+ raw[17] = 0xda;
70
+ raw[18] = 0x27;
71
+ raw[21] = 0x49; // Power=1, OnTimer=0, OffTimer=0, :1=1, Mode=kDaikinHeat(0b100)
72
+ raw[22] = 0x1e; // Temp = 15°C * 2 = 30 = 0x1E
73
+ raw[24] = 0xb0; // SwingV=0, Fan=0xB
74
+ raw[27] = 0x06;
75
+ raw[28] = 0x60;
76
+ raw[31] = 0xc0;
77
+ return raw;
78
+ }
79
+ export function buildDaikinESPRaw(state) {
80
+ const raw = defaultState();
81
+ // --- Section 1 (bytes 0–7) ---
82
+ // Comfort (byte 6, bit 4)
83
+ setBit(raw, 6, 4, state.comfort ?? false);
84
+ // --- Section 2 (bytes 8–15) ---
85
+ // CurrentTime (bytes 13–14, bits 0–10 starting at byte 13 bit 0)
86
+ if (state.currentTime !== undefined) {
87
+ let mins = state.currentTime;
88
+ if (mins > 24 * 60)
89
+ mins = 0;
90
+ setFieldLE(raw, 13, 0, 11, mins);
91
+ }
92
+ // CurrentDay (byte 14, bits 3–5)
93
+ if (state.currentDay !== undefined) {
94
+ setBitsRange(raw, 14, 3, 3, state.currentDay & 0x7);
95
+ }
96
+ // --- Section 3 (bytes 16–34) ---
97
+ // Mode (byte 21, bits 4–6)
98
+ let mode = state.mode ?? DaikinMode.Auto;
99
+ if (!(mode === DaikinMode.Auto || mode === DaikinMode.Cool || mode === DaikinMode.Heat || mode === DaikinMode.Fan || mode === DaikinMode.Dry))
100
+ mode = DaikinMode.Auto;
101
+ setBitsRange(raw, 21, 4, 3, mode);
102
+ // Power (byte 21, bit 0)
103
+ setBit(raw, 21, 0, state.power ?? false);
104
+ // Temp (byte 22) — stored as degrees * 2
105
+ const temp = Math.min(Math.max(state.temp ?? 25, DAIKIN_MIN_TEMP), DAIKIN_MAX_TEMP);
106
+ raw[22] = Math.round(temp * 2);
107
+ // Fan (byte 24, bits 4–7)
108
+ const fanInput = state.fan ?? DaikinFan.Auto;
109
+ let fan;
110
+ if (fanInput === DaikinFan.Quiet || fanInput === DaikinFan.Auto)
111
+ fan = fanInput;
112
+ else if (fanInput < 1 || fanInput > 5)
113
+ fan = DaikinFan.Auto;
114
+ else
115
+ fan = fanInput + 2;
116
+ setBitsRange(raw, 24, 4, 4, fan);
117
+ // SwingV (byte 24, bits 0–3)
118
+ setBitsRange(raw, 24, 0, 4, (state.swingVertical ?? false) ? DAIKIN_SWING_ON : DAIKIN_SWING_OFF);
119
+ // SwingH (byte 25, bits 0–3)
120
+ setBitsRange(raw, 25, 0, 4, (state.swingHorizontal ?? false) ? DAIKIN_SWING_ON : DAIKIN_SWING_OFF);
121
+ // On/Off timers (bytes 26–28, 12 bits each)
122
+ if (state.onTime !== undefined) {
123
+ setBit(raw, 21, 1, true); // OnTimer enable
124
+ setFieldLE(raw, 26, 0, 12, state.onTime);
125
+ }
126
+ else {
127
+ setBit(raw, 21, 1, false);
128
+ setFieldLE(raw, 26, 0, 12, UNUSED_TIME);
129
+ }
130
+ if (state.offTime !== undefined) {
131
+ setBit(raw, 21, 2, true); // OffTimer enable
132
+ setFieldLE(raw, 27, 4, 12, state.offTime);
133
+ }
134
+ else {
135
+ setBit(raw, 21, 2, false);
136
+ setFieldLE(raw, 27, 4, 12, UNUSED_TIME);
137
+ }
138
+ // Quiet/Powerful/Econo with mutual exclusions
139
+ let quiet = state.quiet ?? false;
140
+ let powerful = state.powerful ?? false;
141
+ let econo = state.econo ?? false;
142
+ if (quiet)
143
+ powerful = false;
144
+ if (powerful) {
145
+ quiet = false;
146
+ econo = false;
147
+ }
148
+ if (econo)
149
+ powerful = false;
150
+ setBit(raw, 29, 5, quiet); // Byte 29, bit 5
151
+ setBit(raw, 29, 0, powerful); // Byte 29, bit 0
152
+ setBit(raw, 32, 2, econo); // Byte 32, bit 2
153
+ // Other flags
154
+ setBit(raw, 32, 1, state.sensor ?? false);
155
+ setBit(raw, 32, 7, !(state.weeklyTimer ?? true)); // Inverted: bit=1 means disabled
156
+ setBit(raw, 33, 1, state.mold ?? false);
157
+ // The constant bit in byte 21 bit 3 should always be 1
158
+ setBit(raw, 21, 3, true);
159
+ // --- Checksums ---
160
+ raw[7] = sumBytes(raw, 0, SECTION1_LEN - 1);
161
+ raw[15] = sumBytes(raw, SECTION1_LEN, SECTION1_LEN + SECTION2_LEN - 1);
162
+ raw[34] = sumBytes(raw, SECTION1_LEN + SECTION2_LEN, STATE_LENGTH - 1);
163
+ return raw;
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // Send
167
+ // ---------------------------------------------------------------------------
168
+ export function sendDaikinESP(state, repeat = 0) {
169
+ return encodeDaikinESPRaw(buildDaikinESPRaw(state), repeat);
170
+ }
171
+ export function encodeDaikinESPRaw(data, repeat = 0) {
172
+ const result = [];
173
+ const sectionOpts = {
174
+ headerMark: HDR_MARK, headerSpace: HDR_SPACE,
175
+ oneMark: BIT_MARK, oneSpace: ONE_SPACE,
176
+ zeroMark: BIT_MARK, zeroSpace: ZERO_SPACE,
177
+ footerMark: BIT_MARK, gap: FOOTER_GAP, msbFirst: false,
178
+ };
179
+ for (let r = 0; r <= repeat; r++) {
180
+ // Header: 5 bits of zero (no header mark/space)
181
+ const hdr = sendGeneric({
182
+ headerMark: 0, headerSpace: 0,
183
+ oneMark: BIT_MARK, oneSpace: ONE_SPACE,
184
+ zeroMark: BIT_MARK, zeroSpace: ZERO_SPACE,
185
+ footerMark: BIT_MARK, gap: FOOTER_GAP,
186
+ data: 0n, nbits: HEADER_BITS, msbFirst: false,
187
+ });
188
+ for (let i = 0; i < hdr.length; i++)
189
+ result.push(hdr[i]);
190
+ // Section 1 (bytes 0–7)
191
+ const s1 = sendGenericBytes({ ...sectionOpts, data: data.subarray(0, SECTION1_LEN) });
192
+ for (let i = 0; i < s1.length; i++)
193
+ result.push(s1[i]);
194
+ // Section 2 (bytes 8–15)
195
+ const s2 = sendGenericBytes({ ...sectionOpts, data: data.subarray(SECTION1_LEN, SECTION1_LEN + SECTION2_LEN) });
196
+ for (let i = 0; i < s2.length; i++)
197
+ result.push(s2[i]);
198
+ // Section 3 (bytes 16–34)
199
+ const s3 = sendGenericBytes({ ...sectionOpts, data: data.subarray(SECTION1_LEN + SECTION2_LEN) });
200
+ for (let i = 0; i < s3.length; i++)
201
+ result.push(s3[i]);
202
+ }
203
+ return result;
204
+ }
205
+ // ---------------------------------------------------------------------------
206
+ // Decode API
207
+ // ---------------------------------------------------------------------------
208
+ const SECTION3_LEN = STATE_LENGTH - SECTION1_LEN - SECTION2_LEN; // 19
209
+ /** Read a multi-byte little-endian bitfield (inverse of setFieldLE). */
210
+ function getFieldLE(raw, startByte, startBit, totalBits) {
211
+ let value = 0;
212
+ let byte = startByte;
213
+ let bit = startBit;
214
+ let remaining = totalBits;
215
+ let shift = 0;
216
+ while (remaining > 0) {
217
+ const bitsInThisByte = Math.min(remaining, 8 - bit);
218
+ const mask = ((1 << bitsInThisByte) - 1) << bit;
219
+ value |= ((raw[byte] & mask) >>> bit) << shift;
220
+ shift += bitsInThisByte;
221
+ remaining -= bitsInThisByte;
222
+ byte++;
223
+ bit = 0;
224
+ }
225
+ return value;
226
+ }
227
+ /**
228
+ * Try to skip the 5-bit zero leader (no header mark/space).
229
+ * Returns the new offset past the leader, or the original offset if no leader.
230
+ */
231
+ function skipLeader(timings, offset) {
232
+ const result = matchGeneric(timings, offset, timings.length - offset, HEADER_BITS, 0, 0, // no header
233
+ BIT_MARK, ONE_SPACE, // oneMark, oneSpace
234
+ BIT_MARK, ZERO_SPACE, // zeroMark, zeroSpace
235
+ BIT_MARK, FOOTER_GAP, // footerMark, gap
236
+ true);
237
+ return result ? offset + result.used : offset;
238
+ }
239
+ /**
240
+ * Decode raw IR timings as a DaikinESP message.
241
+ *
242
+ * The 5-bit leader preamble is optional — hardware captures often miss it.
243
+ *
244
+ * @param timings Raw mark/space timing array in microseconds.
245
+ * @param offset Starting index in the timings array (default 0).
246
+ * @returns Decoded state (same shape as encode input), or null on mismatch.
247
+ */
248
+ export function decodeDaikinESP(timings, offset = 0) {
249
+ // Skip leader if present.
250
+ let pos = skipLeader(timings, offset);
251
+ // Section 1 (bytes 0–7): header + 8 bytes + footer.
252
+ const s1 = matchGenericBytes(timings, pos, timings.length - pos, SECTION1_LEN, HDR_MARK, HDR_SPACE, BIT_MARK, ONE_SPACE, BIT_MARK, ZERO_SPACE, BIT_MARK, FOOTER_GAP, true, undefined, undefined, false);
253
+ if (!s1)
254
+ return null;
255
+ pos += s1.used;
256
+ // Section 2 (bytes 8–15): header + 8 bytes + footer.
257
+ const s2 = matchGenericBytes(timings, pos, timings.length - pos, SECTION2_LEN, HDR_MARK, HDR_SPACE, BIT_MARK, ONE_SPACE, BIT_MARK, ZERO_SPACE, BIT_MARK, FOOTER_GAP, true, undefined, undefined, false);
258
+ if (!s2)
259
+ return null;
260
+ pos += s2.used;
261
+ // Section 3 (bytes 16–34): header + 19 bytes + footer.
262
+ const s3 = matchGenericBytes(timings, pos, timings.length - pos, SECTION3_LEN, HDR_MARK, HDR_SPACE, BIT_MARK, ONE_SPACE, BIT_MARK, ZERO_SPACE, BIT_MARK, FOOTER_GAP, true, undefined, undefined, false);
263
+ if (!s3)
264
+ return null;
265
+ // Concatenate sections into one 35-byte array.
266
+ const raw = new Uint8Array(STATE_LENGTH);
267
+ raw.set(s1.data, 0);
268
+ raw.set(s2.data, SECTION1_LEN);
269
+ raw.set(s3.data, SECTION1_LEN + SECTION2_LEN);
270
+ // Validate checksums.
271
+ if (raw[7] !== sumBytes(raw, 0, SECTION1_LEN - 1))
272
+ return null;
273
+ if (raw[15] !== sumBytes(raw, SECTION1_LEN, SECTION1_LEN + SECTION2_LEN - 1))
274
+ return null;
275
+ if (raw[34] !== sumBytes(raw, SECTION1_LEN + SECTION2_LEN, STATE_LENGTH - 1))
276
+ return null;
277
+ // Extract state from byte/bit positions.
278
+ // --- Section 1 fields ---
279
+ const comfort = !!(raw[6] & (1 << 4));
280
+ // --- Section 2 fields ---
281
+ // CurrentTime: 11-bit LE field at byte 13, bit 0
282
+ const currentTime = getFieldLE(raw, 13, 0, 11);
283
+ // CurrentDay: byte 14, bits 3–5
284
+ const currentDay = (raw[14] >> 3) & 0x07;
285
+ // --- Section 3 fields ---
286
+ // Mode (byte 21, bits 4–6)
287
+ const mode = ((raw[21] >> 4) & 0b111);
288
+ // Power (byte 21, bit 0)
289
+ const power = !!(raw[21] & 0x01);
290
+ // On/Off timer enables (byte 21, bits 1–2)
291
+ const onTimerEnabled = !!(raw[21] & (1 << 1));
292
+ const offTimerEnabled = !!(raw[21] & (1 << 2));
293
+ // Temp (byte 22) — stored as degrees * 2
294
+ const temp = raw[22] / 2;
295
+ // Fan (byte 24, bits 4–7)
296
+ const fanInternal = (raw[24] >> 4) & 0x0f;
297
+ const fan = fanInternal === DaikinFan.Auto || fanInternal === DaikinFan.Quiet
298
+ ? fanInternal
299
+ : (fanInternal - 2);
300
+ // SwingV (byte 24, bits 0–3)
301
+ const swingVertical = (raw[24] & 0x0f) === DAIKIN_SWING_ON;
302
+ // SwingH (byte 25, bits 0–3)
303
+ const swingHorizontal = (raw[25] & 0x0f) === DAIKIN_SWING_ON;
304
+ // On timer: 12-bit LE field at byte 26, bit 0
305
+ const onTimeRaw = getFieldLE(raw, 26, 0, 12);
306
+ // Off timer: 12-bit LE field at byte 27, bit 4
307
+ const offTimeRaw = getFieldLE(raw, 27, 4, 12);
308
+ // Quiet (byte 29, bit 5)
309
+ const quiet = !!(raw[29] & (1 << 5));
310
+ // Powerful (byte 29, bit 0)
311
+ const powerful = !!(raw[29] & (1 << 0));
312
+ // Econo (byte 32, bit 2)
313
+ const econo = !!(raw[32] & (1 << 2));
314
+ // Sensor (byte 32, bit 1)
315
+ const sensor = !!(raw[32] & (1 << 1));
316
+ // WeeklyTimer (byte 32, bit 7) — inverted: bit=1 means disabled
317
+ const weeklyTimer = !(raw[32] & (1 << 7));
318
+ // Mold (byte 33, bit 1)
319
+ const mold = !!(raw[33] & (1 << 1));
320
+ const result = {
321
+ power,
322
+ temp,
323
+ mode,
324
+ fan,
325
+ swingVertical,
326
+ swingHorizontal,
327
+ quiet,
328
+ powerful,
329
+ econo,
330
+ mold,
331
+ comfort,
332
+ sensor,
333
+ weeklyTimer,
334
+ currentTime,
335
+ currentDay,
336
+ };
337
+ if (onTimerEnabled)
338
+ result.onTime = onTimeRaw;
339
+ if (offTimerEnabled)
340
+ result.offTime = offTimeRaw;
341
+ return result;
342
+ }
343
+ //# sourceMappingURL=daikin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daikin.js","sourceRoot":"","sources":["../../src/protocols/daikin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Daikin 128-bit (16-byte) IR protocol encoder.
3
+ *
4
+ * Leader (2x mark/space) + 2 sections: bytes 0–7 (with header) + bytes 8–15 (no header, footer mark).
5
+ * Nibble-based checksums.
6
+ * Ported from IRremoteESP8266 `ir_Daikin.cpp`.
7
+ */
8
+ export declare const Daikin128Mode: {
9
+ readonly Dry: 1;
10
+ readonly Cool: 2;
11
+ readonly Fan: 4;
12
+ readonly Heat: 8;
13
+ readonly Auto: 10;
14
+ };
15
+ export type Daikin128ModeValue = (typeof Daikin128Mode)[keyof typeof Daikin128Mode];
16
+ export declare const Daikin128Fan: {
17
+ readonly Auto: 1;
18
+ readonly High: 2;
19
+ readonly Med: 4;
20
+ readonly Low: 8;
21
+ readonly Powerful: 3;
22
+ readonly Quiet: 9;
23
+ };
24
+ export type Daikin128FanValue = (typeof Daikin128Fan)[keyof typeof Daikin128Fan];
25
+ export interface Daikin128State {
26
+ power?: boolean;
27
+ temp?: number;
28
+ mode?: Daikin128ModeValue;
29
+ fan?: Daikin128FanValue;
30
+ swingVertical?: boolean;
31
+ sleep?: boolean;
32
+ econo?: boolean;
33
+ /** Ceiling light control. */
34
+ ceiling?: boolean;
35
+ /** Wall light control. */
36
+ wall?: boolean;
37
+ /** Clock: minutes since midnight (0–1439). */
38
+ clock?: number;
39
+ onTimerEnabled?: boolean;
40
+ /** On timer: minutes since midnight (resolution 30 min). */
41
+ onTime?: number;
42
+ offTimerEnabled?: boolean;
43
+ /** Off timer: minutes since midnight (resolution 30 min). */
44
+ offTime?: number;
45
+ }
46
+ export declare function buildDaikin128Raw(state: Daikin128State): Uint8Array;
47
+ export declare function sendDaikin128(state: Daikin128State, repeat?: number): number[];
48
+ export declare function encodeDaikin128Raw(data: Uint8Array, repeat?: number): number[];
49
+ /**
50
+ * Decode raw IR timings as a Daikin128 message.
51
+ *
52
+ * The leader preamble (2x mark/space) is optional — hardware captures often
53
+ * miss it.
54
+ *
55
+ * @param timings Raw mark/space timing array in microseconds.
56
+ * @param offset Starting index in the timings array (default 0).
57
+ * @returns Decoded state (same shape as encode input), or null on mismatch.
58
+ */
59
+ export declare function decodeDaikin128(timings: number[], offset?: number): Daikin128State | null;
60
+ //# sourceMappingURL=daikin128.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daikin128.d.ts","sourceRoot":"","sources":["../../src/protocols/daikin128.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyBH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAEpF,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AASjF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA8BD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAqEnE;AAMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CA+BzE;AAyBD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,GAAE,MAAU,GACjB,cAAc,GAAG,IAAI,CAiFvB"}