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.
- package/README.md +127 -0
- package/dist/cjs/decode.d.ts +184 -0
- package/dist/cjs/decode.d.ts.map +1 -0
- package/dist/cjs/decode.js +431 -0
- package/dist/cjs/decode.js.map +1 -0
- package/dist/cjs/encode.d.ts +76 -0
- package/dist/cjs/encode.d.ts.map +1 -0
- package/dist/cjs/encode.js +185 -0
- package/dist/cjs/encode.js.map +1 -0
- package/dist/cjs/index.d.ts +34 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +99 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/protocols/coolix.d.ts +98 -0
- package/dist/cjs/protocols/coolix.d.ts.map +1 -0
- package/dist/cjs/protocols/coolix.js +331 -0
- package/dist/cjs/protocols/coolix.js.map +1 -0
- package/dist/cjs/protocols/daikin.d.ts +47 -0
- package/dist/cjs/protocols/daikin.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin.js +353 -0
- package/dist/cjs/protocols/daikin.js.map +1 -0
- package/dist/cjs/protocols/daikin128.d.ts +60 -0
- package/dist/cjs/protocols/daikin128.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin128.js +267 -0
- package/dist/cjs/protocols/daikin128.js.map +1 -0
- package/dist/cjs/protocols/daikin152.d.ts +47 -0
- package/dist/cjs/protocols/daikin152.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin152.js +256 -0
- package/dist/cjs/protocols/daikin152.js.map +1 -0
- package/dist/cjs/protocols/daikin160.d.ts +37 -0
- package/dist/cjs/protocols/daikin160.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin160.js +176 -0
- package/dist/cjs/protocols/daikin160.js.map +1 -0
- package/dist/cjs/protocols/daikin176.d.ts +44 -0
- package/dist/cjs/protocols/daikin176.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin176.js +215 -0
- package/dist/cjs/protocols/daikin176.js.map +1 -0
- package/dist/cjs/protocols/daikin2.d.ts +46 -0
- package/dist/cjs/protocols/daikin2.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin2.js +337 -0
- package/dist/cjs/protocols/daikin2.js.map +1 -0
- package/dist/cjs/protocols/daikin216.d.ts +30 -0
- package/dist/cjs/protocols/daikin216.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin216.js +167 -0
- package/dist/cjs/protocols/daikin216.js.map +1 -0
- package/dist/cjs/protocols/daikin312.d.ts +45 -0
- package/dist/cjs/protocols/daikin312.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin312.js +345 -0
- package/dist/cjs/protocols/daikin312.js.map +1 -0
- package/dist/cjs/protocols/daikin64.d.ts +79 -0
- package/dist/cjs/protocols/daikin64.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin64.js +260 -0
- package/dist/cjs/protocols/daikin64.js.map +1 -0
- package/dist/cjs/protocols/daikin_common.d.ts +28 -0
- package/dist/cjs/protocols/daikin_common.d.ts.map +1 -0
- package/dist/cjs/protocols/daikin_common.js +41 -0
- package/dist/cjs/protocols/daikin_common.js.map +1 -0
- package/dist/cjs/protocols/nec.d.ts +50 -0
- package/dist/cjs/protocols/nec.d.ts.map +1 -0
- package/dist/cjs/protocols/nec.js +180 -0
- package/dist/cjs/protocols/nec.js.map +1 -0
- package/dist/decode.d.ts +67 -0
- package/dist/decode.d.ts.map +1 -0
- package/dist/decode.js +242 -0
- package/dist/decode.js.map +1 -0
- package/dist/encode.d.ts +76 -0
- package/dist/encode.d.ts.map +1 -0
- package/dist/encode.js +174 -0
- package/dist/encode.js.map +1 -0
- package/dist/esm/decode.d.ts +184 -0
- package/dist/esm/decode.d.ts.map +1 -0
- package/dist/esm/decode.js +420 -0
- package/dist/esm/decode.js.map +1 -0
- package/dist/esm/encode.d.ts +76 -0
- package/dist/esm/encode.d.ts.map +1 -0
- package/dist/esm/encode.js +174 -0
- package/dist/esm/encode.js.map +1 -0
- package/dist/esm/index.d.ts +34 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/protocols/coolix.d.ts +98 -0
- package/dist/esm/protocols/coolix.d.ts.map +1 -0
- package/dist/esm/protocols/coolix.js +322 -0
- package/dist/esm/protocols/coolix.js.map +1 -0
- package/dist/esm/protocols/daikin.d.ts +47 -0
- package/dist/esm/protocols/daikin.d.ts.map +1 -0
- package/dist/esm/protocols/daikin.js +344 -0
- package/dist/esm/protocols/daikin.js.map +1 -0
- package/dist/esm/protocols/daikin128.d.ts +60 -0
- package/dist/esm/protocols/daikin128.d.ts.map +1 -0
- package/dist/esm/protocols/daikin128.js +260 -0
- package/dist/esm/protocols/daikin128.js.map +1 -0
- package/dist/esm/protocols/daikin152.d.ts +47 -0
- package/dist/esm/protocols/daikin152.d.ts.map +1 -0
- package/dist/esm/protocols/daikin152.js +247 -0
- package/dist/esm/protocols/daikin152.js.map +1 -0
- package/dist/esm/protocols/daikin160.d.ts +37 -0
- package/dist/esm/protocols/daikin160.d.ts.map +1 -0
- package/dist/esm/protocols/daikin160.js +167 -0
- package/dist/esm/protocols/daikin160.js.map +1 -0
- package/dist/esm/protocols/daikin176.d.ts +44 -0
- package/dist/esm/protocols/daikin176.d.ts.map +1 -0
- package/dist/esm/protocols/daikin176.js +208 -0
- package/dist/esm/protocols/daikin176.js.map +1 -0
- package/dist/esm/protocols/daikin2.d.ts +46 -0
- package/dist/esm/protocols/daikin2.d.ts.map +1 -0
- package/dist/esm/protocols/daikin2.js +328 -0
- package/dist/esm/protocols/daikin2.js.map +1 -0
- package/dist/esm/protocols/daikin216.d.ts +30 -0
- package/dist/esm/protocols/daikin216.d.ts.map +1 -0
- package/dist/esm/protocols/daikin216.js +158 -0
- package/dist/esm/protocols/daikin216.js.map +1 -0
- package/dist/esm/protocols/daikin312.d.ts +45 -0
- package/dist/esm/protocols/daikin312.d.ts.map +1 -0
- package/dist/esm/protocols/daikin312.js +336 -0
- package/dist/esm/protocols/daikin312.js.map +1 -0
- package/dist/esm/protocols/daikin64.d.ts +79 -0
- package/dist/esm/protocols/daikin64.d.ts.map +1 -0
- package/dist/esm/protocols/daikin64.js +253 -0
- package/dist/esm/protocols/daikin64.js.map +1 -0
- package/dist/esm/protocols/daikin_common.d.ts +28 -0
- package/dist/esm/protocols/daikin_common.d.ts.map +1 -0
- package/dist/esm/protocols/daikin_common.js +38 -0
- package/dist/esm/protocols/daikin_common.js.map +1 -0
- package/dist/esm/protocols/nec.d.ts +50 -0
- package/dist/esm/protocols/nec.d.ts.map +1 -0
- package/dist/esm/protocols/nec.js +175 -0
- package/dist/esm/protocols/nec.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/protocols/daikin.d.ts +47 -0
- package/dist/protocols/daikin.d.ts.map +1 -0
- package/dist/protocols/daikin.js +343 -0
- package/dist/protocols/daikin.js.map +1 -0
- package/dist/protocols/daikin128.d.ts +60 -0
- package/dist/protocols/daikin128.d.ts.map +1 -0
- package/dist/protocols/daikin128.js +259 -0
- package/dist/protocols/daikin128.js.map +1 -0
- package/dist/protocols/daikin152.d.ts +47 -0
- package/dist/protocols/daikin152.d.ts.map +1 -0
- package/dist/protocols/daikin152.js +246 -0
- package/dist/protocols/daikin152.js.map +1 -0
- package/dist/protocols/daikin160.d.ts +37 -0
- package/dist/protocols/daikin160.d.ts.map +1 -0
- package/dist/protocols/daikin160.js +166 -0
- package/dist/protocols/daikin160.js.map +1 -0
- package/dist/protocols/daikin176.d.ts +44 -0
- package/dist/protocols/daikin176.d.ts.map +1 -0
- package/dist/protocols/daikin176.js +207 -0
- package/dist/protocols/daikin176.js.map +1 -0
- package/dist/protocols/daikin2.d.ts +46 -0
- package/dist/protocols/daikin2.d.ts.map +1 -0
- package/dist/protocols/daikin2.js +326 -0
- package/dist/protocols/daikin2.js.map +1 -0
- package/dist/protocols/daikin216.d.ts +30 -0
- package/dist/protocols/daikin216.d.ts.map +1 -0
- package/dist/protocols/daikin216.js +157 -0
- package/dist/protocols/daikin216.js.map +1 -0
- package/dist/protocols/daikin312.d.ts +45 -0
- package/dist/protocols/daikin312.d.ts.map +1 -0
- package/dist/protocols/daikin312.js +334 -0
- package/dist/protocols/daikin312.js.map +1 -0
- package/dist/protocols/daikin64.d.ts +79 -0
- package/dist/protocols/daikin64.d.ts.map +1 -0
- package/dist/protocols/daikin64.js +251 -0
- package/dist/protocols/daikin64.js.map +1 -0
- package/dist/protocols/daikin_common.d.ts +28 -0
- package/dist/protocols/daikin_common.d.ts.map +1 -0
- package/dist/protocols/daikin_common.js +38 -0
- package/dist/protocols/daikin_common.js.map +1 -0
- package/dist/protocols/nec.d.ts +50 -0
- package/dist/protocols/nec.d.ts.map +1 -0
- package/dist/protocols/nec.js +175 -0
- package/dist/protocols/nec.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daikin312 312-bit (39-byte) IR protocol encoder.
|
|
3
|
+
*
|
|
4
|
+
* 5-bit header + 2 sections: bytes 0–19 (20) + bytes 20–38 (19).
|
|
5
|
+
* 36700 Hz carrier. Very similar to Daikin2 with field repositioning.
|
|
6
|
+
* Ported from IRremoteESP8266 `ir_Daikin.cpp`.
|
|
7
|
+
*/
|
|
8
|
+
import { sumBytes, sendGeneric, sendGenericBytes } from "../encode.js";
|
|
9
|
+
import { matchGeneric, matchGenericBytes } from "../decode.js";
|
|
10
|
+
import { DaikinMode, DaikinFan, DAIKIN_MIN_TEMP, DAIKIN_MAX_TEMP, DAIKIN2_MIN_COOL_TEMP, } from "./daikin_common.js";
|
|
11
|
+
export { DaikinMode, DaikinFan } from "./daikin_common.js";
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Timing constants
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
const HDR_MARK = 3518;
|
|
16
|
+
const HDR_SPACE = 1688;
|
|
17
|
+
const BIT_MARK = 453;
|
|
18
|
+
const ONE_SPACE = 1275;
|
|
19
|
+
const ZERO_SPACE = 414;
|
|
20
|
+
const HDR_GAP = 25100;
|
|
21
|
+
const SECTION_GAP = 35512;
|
|
22
|
+
const STATE_LENGTH = 39;
|
|
23
|
+
const SECTION1_LEN = 20;
|
|
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
|
+
function setFieldLE(raw, startByte, startBit, totalBits, value) {
|
|
40
|
+
let v = value;
|
|
41
|
+
let byte = startByte;
|
|
42
|
+
let bit = startBit;
|
|
43
|
+
let remaining = totalBits;
|
|
44
|
+
while (remaining > 0) {
|
|
45
|
+
const bitsInThisByte = Math.min(remaining, 8 - bit);
|
|
46
|
+
const mask = ((1 << bitsInThisByte) - 1) << bit;
|
|
47
|
+
raw[byte] = (raw[byte] & ~mask) | (((v & ((1 << bitsInThisByte) - 1)) << bit) & mask);
|
|
48
|
+
v >>>= bitsInThisByte;
|
|
49
|
+
remaining -= bitsInThisByte;
|
|
50
|
+
byte++;
|
|
51
|
+
bit = 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Build
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
function defaultState() {
|
|
58
|
+
const raw = new Uint8Array(STATE_LENGTH);
|
|
59
|
+
// Section 1
|
|
60
|
+
raw[0] = 0x11;
|
|
61
|
+
raw[1] = 0xda;
|
|
62
|
+
raw[2] = 0x27;
|
|
63
|
+
raw[4] = 0x02;
|
|
64
|
+
raw[5] = 0x58;
|
|
65
|
+
raw[6] = 0x64;
|
|
66
|
+
raw[7] = 0x58;
|
|
67
|
+
raw[8] = 0x64;
|
|
68
|
+
raw[9] = 0x06;
|
|
69
|
+
raw[12] = 0x01;
|
|
70
|
+
// Section 2
|
|
71
|
+
raw[20] = 0x11;
|
|
72
|
+
raw[21] = 0xda;
|
|
73
|
+
raw[22] = 0x27;
|
|
74
|
+
raw[25] = 0x08;
|
|
75
|
+
raw[26] = 0x2c;
|
|
76
|
+
raw[31] = 0x06;
|
|
77
|
+
raw[32] = 0x60;
|
|
78
|
+
raw[35] = 0xc5;
|
|
79
|
+
raw[37] = 0x08;
|
|
80
|
+
// disableOnTimer/disableOffTimer/disableSleepTimer
|
|
81
|
+
setFieldLE(raw, 30, 0, 12, UNUSED_TIME);
|
|
82
|
+
setBit(raw, 25, 1, false);
|
|
83
|
+
setBit(raw, 36, 5, false);
|
|
84
|
+
setFieldLE(raw, 31, 4, 12, UNUSED_TIME);
|
|
85
|
+
setBit(raw, 25, 2, false);
|
|
86
|
+
return raw;
|
|
87
|
+
}
|
|
88
|
+
export function buildDaikin312Raw(state) {
|
|
89
|
+
const raw = defaultState();
|
|
90
|
+
// --- Section 1 fields ---
|
|
91
|
+
// CurrentTime (bytes 5–6, bits 0–11)
|
|
92
|
+
if (state.currentTime !== undefined) {
|
|
93
|
+
let mins = state.currentTime;
|
|
94
|
+
if (mins > 24 * 60)
|
|
95
|
+
mins = 0;
|
|
96
|
+
setFieldLE(raw, 5, 0, 12, mins);
|
|
97
|
+
}
|
|
98
|
+
// Power2 (byte 6, bit 7) — inverted
|
|
99
|
+
const power = state.power ?? false;
|
|
100
|
+
setBit(raw, 6, 7, !power);
|
|
101
|
+
// Beep (byte 7, bits 6–7)
|
|
102
|
+
if (state.beep !== undefined)
|
|
103
|
+
setBitsRange(raw, 7, 6, 2, state.beep & 0x3);
|
|
104
|
+
// FreshAir (byte 8, bit 0), Mold (byte 8, bit 3), FreshAirHigh (byte 8, bit 7)
|
|
105
|
+
if (state.freshAir !== undefined)
|
|
106
|
+
setBit(raw, 8, 0, state.freshAir);
|
|
107
|
+
if (state.mold !== undefined)
|
|
108
|
+
setBit(raw, 8, 3, state.mold);
|
|
109
|
+
if (state.freshAirHigh !== undefined)
|
|
110
|
+
setBit(raw, 8, 7, state.freshAirHigh);
|
|
111
|
+
// Light (byte 12, bits 0–1) — moved from Daikin2's byte 7
|
|
112
|
+
if (state.light !== undefined)
|
|
113
|
+
setBitsRange(raw, 12, 0, 2, state.light & 0x3);
|
|
114
|
+
// Clean (byte 14, bit 4) — moved from Daikin2's byte 8
|
|
115
|
+
if (state.clean !== undefined)
|
|
116
|
+
setBit(raw, 14, 4, state.clean);
|
|
117
|
+
// --- Section 2 fields ---
|
|
118
|
+
// Mode (byte 25, bits 4–6)
|
|
119
|
+
let mode = state.mode ?? DaikinMode.Auto;
|
|
120
|
+
if (!(mode === DaikinMode.Auto || mode === DaikinMode.Cool || mode === DaikinMode.Heat || mode === DaikinMode.Fan || mode === DaikinMode.Dry))
|
|
121
|
+
mode = DaikinMode.Auto;
|
|
122
|
+
setBitsRange(raw, 25, 4, 3, mode);
|
|
123
|
+
// Temp (byte 26, bits 0–6, 7 bits) — stored as degrees * 2 for 0.5°C resolution
|
|
124
|
+
let temp;
|
|
125
|
+
if (state.temp !== undefined) {
|
|
126
|
+
const minTemp = (mode === DaikinMode.Cool) ? DAIKIN2_MIN_COOL_TEMP : DAIKIN_MIN_TEMP;
|
|
127
|
+
temp = Math.min(Math.max(state.temp, minTemp), DAIKIN_MAX_TEMP);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
temp = 22;
|
|
131
|
+
}
|
|
132
|
+
setBitsRange(raw, 26, 0, 7, Math.round(temp * 2));
|
|
133
|
+
// Fan (byte 28, bits 4–7)
|
|
134
|
+
const fanInput = state.fan ?? DaikinFan.Auto;
|
|
135
|
+
let fan;
|
|
136
|
+
if (fanInput === DaikinFan.Quiet || fanInput === DaikinFan.Auto)
|
|
137
|
+
fan = fanInput;
|
|
138
|
+
else if (fanInput < 1 || fanInput > 5)
|
|
139
|
+
fan = DaikinFan.Auto;
|
|
140
|
+
else
|
|
141
|
+
fan = fanInput + 2;
|
|
142
|
+
setBitsRange(raw, 28, 4, 4, fan);
|
|
143
|
+
// SwingV (byte 28, bits 0–3) — moved from Daikin2's byte 18
|
|
144
|
+
setBitsRange(raw, 28, 0, 4, (state.swingVertical ?? 0) & 0xf);
|
|
145
|
+
// SwingH (byte 29, bits 0–3) — moved from Daikin2's byte 17 (now 4-bit)
|
|
146
|
+
setBitsRange(raw, 29, 0, 4, (state.swingHorizontal ?? 0) & 0xf);
|
|
147
|
+
// Power (byte 25, bit 0)
|
|
148
|
+
setBit(raw, 25, 0, power);
|
|
149
|
+
// Quiet (byte 33, bit 5), Powerful (byte 33, bit 0)
|
|
150
|
+
let quiet = state.quiet ?? false;
|
|
151
|
+
let powerful = state.powerful ?? false;
|
|
152
|
+
if (quiet)
|
|
153
|
+
powerful = false;
|
|
154
|
+
if (powerful)
|
|
155
|
+
quiet = false;
|
|
156
|
+
setBit(raw, 33, 5, quiet);
|
|
157
|
+
setBit(raw, 33, 0, powerful);
|
|
158
|
+
// Econo (byte 36, bit 2), Eye (byte 36, bit 1), EyeAuto (byte 36, bit 3), Purify (byte 36, bit 4)
|
|
159
|
+
if (state.econo !== undefined)
|
|
160
|
+
setBit(raw, 36, 2, state.econo);
|
|
161
|
+
if (state.eye !== undefined)
|
|
162
|
+
setBit(raw, 36, 1, state.eye);
|
|
163
|
+
if (state.eyeAuto !== undefined)
|
|
164
|
+
setBit(raw, 36, 3, state.eyeAuto);
|
|
165
|
+
if (state.purify !== undefined)
|
|
166
|
+
setBit(raw, 36, 4, state.purify);
|
|
167
|
+
// --- Checksums ---
|
|
168
|
+
raw[19] = sumBytes(raw, 0, SECTION1_LEN - 1);
|
|
169
|
+
raw[38] = sumBytes(raw, SECTION1_LEN, STATE_LENGTH - 1);
|
|
170
|
+
return raw;
|
|
171
|
+
}
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
// Send
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
export function sendDaikin312(state, repeat = 0) {
|
|
176
|
+
return encodeDaikin312Raw(buildDaikin312Raw(state), repeat);
|
|
177
|
+
}
|
|
178
|
+
export function encodeDaikin312Raw(data, repeat = 0) {
|
|
179
|
+
const result = [];
|
|
180
|
+
const sectionOpts = {
|
|
181
|
+
headerMark: HDR_MARK, headerSpace: HDR_SPACE,
|
|
182
|
+
oneMark: BIT_MARK, oneSpace: ONE_SPACE,
|
|
183
|
+
zeroMark: BIT_MARK, zeroSpace: ZERO_SPACE,
|
|
184
|
+
footerMark: BIT_MARK, gap: SECTION_GAP, msbFirst: false,
|
|
185
|
+
};
|
|
186
|
+
for (let r = 0; r <= repeat; r++) {
|
|
187
|
+
// Header: 5 bits of zero
|
|
188
|
+
const hdr = sendGeneric({
|
|
189
|
+
headerMark: 0, headerSpace: 0,
|
|
190
|
+
oneMark: BIT_MARK, oneSpace: ONE_SPACE,
|
|
191
|
+
zeroMark: BIT_MARK, zeroSpace: ZERO_SPACE,
|
|
192
|
+
footerMark: BIT_MARK, gap: HDR_GAP,
|
|
193
|
+
data: 0n, nbits: HEADER_BITS, msbFirst: false,
|
|
194
|
+
});
|
|
195
|
+
for (let i = 0; i < hdr.length; i++)
|
|
196
|
+
result.push(hdr[i]);
|
|
197
|
+
// Section 1 (bytes 0–19)
|
|
198
|
+
const s1 = sendGenericBytes({ ...sectionOpts, data: data.subarray(0, SECTION1_LEN) });
|
|
199
|
+
for (let i = 0; i < s1.length; i++)
|
|
200
|
+
result.push(s1[i]);
|
|
201
|
+
// Section 2 (bytes 20–38)
|
|
202
|
+
const s2 = sendGenericBytes({ ...sectionOpts, data: data.subarray(SECTION1_LEN) });
|
|
203
|
+
for (let i = 0; i < s2.length; i++)
|
|
204
|
+
result.push(s2[i]);
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// Decode API
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
/**
|
|
212
|
+
* Try to skip a leader section (e.g. 5 zero bits + footer + gap).
|
|
213
|
+
* Returns the new offset past the leader, or the original offset if no leader.
|
|
214
|
+
*/
|
|
215
|
+
function skipLeader(timings, offset) {
|
|
216
|
+
const result = matchGeneric(timings, offset, timings.length - offset, HEADER_BITS, 0, 0, // no header
|
|
217
|
+
BIT_MARK, ONE_SPACE, // oneMark, oneSpace
|
|
218
|
+
BIT_MARK, ZERO_SPACE, // zeroMark, zeroSpace
|
|
219
|
+
BIT_MARK, HDR_GAP, // footerMark, gap
|
|
220
|
+
true);
|
|
221
|
+
return result ? offset + result.used : offset;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Read a little-endian bitfield spanning one or more bytes.
|
|
225
|
+
* Inverse of `setFieldLE`.
|
|
226
|
+
*/
|
|
227
|
+
function getFieldLE(raw, startByte, startBit, totalBits) {
|
|
228
|
+
let value = 0;
|
|
229
|
+
let byte = startByte;
|
|
230
|
+
let bit = startBit;
|
|
231
|
+
let remaining = totalBits;
|
|
232
|
+
let shift = 0;
|
|
233
|
+
while (remaining > 0) {
|
|
234
|
+
const bitsInThisByte = Math.min(remaining, 8 - bit);
|
|
235
|
+
const mask = ((1 << bitsInThisByte) - 1) << bit;
|
|
236
|
+
value |= ((raw[byte] & mask) >>> bit) << shift;
|
|
237
|
+
shift += bitsInThisByte;
|
|
238
|
+
remaining -= bitsInThisByte;
|
|
239
|
+
byte++;
|
|
240
|
+
bit = 0;
|
|
241
|
+
}
|
|
242
|
+
return value;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Decode raw IR timings as a Daikin312 message.
|
|
246
|
+
*
|
|
247
|
+
* The 5-bit header preamble is optional — hardware captures often miss it.
|
|
248
|
+
*
|
|
249
|
+
* @param timings Raw mark/space timing array in microseconds.
|
|
250
|
+
* @param offset Starting index in the timings array (default 0).
|
|
251
|
+
* @returns Decoded state (same shape as encode input), or null on mismatch.
|
|
252
|
+
*/
|
|
253
|
+
export function decodeDaikin312(timings, offset = 0) {
|
|
254
|
+
// Skip leader if present.
|
|
255
|
+
let pos = skipLeader(timings, offset);
|
|
256
|
+
// Section 1: 20 bytes (LSB-first)
|
|
257
|
+
const s1 = matchGenericBytes(timings, pos, timings.length - pos, SECTION1_LEN, HDR_MARK, HDR_SPACE, BIT_MARK, ONE_SPACE, BIT_MARK, ZERO_SPACE, BIT_MARK, SECTION_GAP, true, undefined, undefined, false);
|
|
258
|
+
if (!s1)
|
|
259
|
+
return null;
|
|
260
|
+
pos += s1.used;
|
|
261
|
+
// Section 2: 19 bytes (LSB-first)
|
|
262
|
+
const s2Len = STATE_LENGTH - SECTION1_LEN;
|
|
263
|
+
const s2 = matchGenericBytes(timings, pos, timings.length - pos, s2Len, HDR_MARK, HDR_SPACE, BIT_MARK, ONE_SPACE, BIT_MARK, ZERO_SPACE, BIT_MARK, SECTION_GAP, true, undefined, undefined, false);
|
|
264
|
+
if (!s2)
|
|
265
|
+
return null;
|
|
266
|
+
// Concatenate sections into one 39-byte array.
|
|
267
|
+
const raw = new Uint8Array(STATE_LENGTH);
|
|
268
|
+
raw.set(s1.data, 0);
|
|
269
|
+
raw.set(s2.data, SECTION1_LEN);
|
|
270
|
+
// Validate checksums.
|
|
271
|
+
if (raw[19] !== sumBytes(raw, 0, SECTION1_LEN - 1))
|
|
272
|
+
return null;
|
|
273
|
+
if (raw[38] !== sumBytes(raw, SECTION1_LEN, STATE_LENGTH - 1))
|
|
274
|
+
return null;
|
|
275
|
+
// --- Extract state ---
|
|
276
|
+
// CurrentTime (bytes 5–6, bits 0–11 LE)
|
|
277
|
+
const currentTime = getFieldLE(raw, 5, 0, 12);
|
|
278
|
+
// Power2 (byte 6, bit 7) — inverted
|
|
279
|
+
// Power (byte 25, bit 0) — primary
|
|
280
|
+
const power = !!(raw[25] & 0x01);
|
|
281
|
+
// Beep (byte 7, bits 6–7)
|
|
282
|
+
const beep = (raw[7] >> 6) & 0x3;
|
|
283
|
+
// FreshAir (byte 8, bit 0), Mold (byte 8, bit 3), FreshAirHigh (byte 8, bit 7)
|
|
284
|
+
const freshAir = !!(raw[8] & (1 << 0));
|
|
285
|
+
const mold = !!(raw[8] & (1 << 3));
|
|
286
|
+
const freshAirHigh = !!(raw[8] & (1 << 7));
|
|
287
|
+
// Light (byte 12, bits 0–1)
|
|
288
|
+
const light = raw[12] & 0x3;
|
|
289
|
+
// Clean (byte 14, bit 4)
|
|
290
|
+
const clean = !!(raw[14] & (1 << 4));
|
|
291
|
+
// Mode (byte 25, bits 4–6)
|
|
292
|
+
const mode = ((raw[25] >> 4) & 0b111);
|
|
293
|
+
// Temp (byte 26, bits 0–6, 7 bits) — stored as degrees * 2
|
|
294
|
+
const temp = (raw[26] & 0x7f) / 2;
|
|
295
|
+
// Fan (byte 28, bits 4–7)
|
|
296
|
+
const fanInternal = (raw[28] >> 4) & 0x0f;
|
|
297
|
+
const fan = fanInternal === DaikinFan.Auto || fanInternal === DaikinFan.Quiet
|
|
298
|
+
? fanInternal
|
|
299
|
+
: (fanInternal - 2);
|
|
300
|
+
// SwingV (byte 28, bits 0–3)
|
|
301
|
+
const swingVertical = raw[28] & 0x0f;
|
|
302
|
+
// SwingH (byte 29, bits 0–3)
|
|
303
|
+
const swingHorizontal = raw[29] & 0x0f;
|
|
304
|
+
// Quiet (byte 33, bit 5), Powerful (byte 33, bit 0)
|
|
305
|
+
const quiet = !!(raw[33] & (1 << 5));
|
|
306
|
+
const powerful = !!(raw[33] & (1 << 0));
|
|
307
|
+
// Econo (byte 36, bit 2), Eye (byte 36, bit 1), EyeAuto (byte 36, bit 3), Purify (byte 36, bit 4)
|
|
308
|
+
const econo = !!(raw[36] & (1 << 2));
|
|
309
|
+
const eye = !!(raw[36] & (1 << 1));
|
|
310
|
+
const eyeAuto = !!(raw[36] & (1 << 3));
|
|
311
|
+
const purify = !!(raw[36] & (1 << 4));
|
|
312
|
+
return {
|
|
313
|
+
power,
|
|
314
|
+
temp,
|
|
315
|
+
mode,
|
|
316
|
+
fan,
|
|
317
|
+
swingVertical,
|
|
318
|
+
swingHorizontal,
|
|
319
|
+
quiet,
|
|
320
|
+
powerful,
|
|
321
|
+
econo,
|
|
322
|
+
light,
|
|
323
|
+
beep,
|
|
324
|
+
clean,
|
|
325
|
+
mold,
|
|
326
|
+
freshAir,
|
|
327
|
+
freshAirHigh,
|
|
328
|
+
eye,
|
|
329
|
+
eyeAuto,
|
|
330
|
+
purify,
|
|
331
|
+
currentTime,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=daikin312.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daikin312.js","sourceRoot":"","sources":["../../src/protocols/daikin312.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daikin 64-bit IR protocol encoder.
|
|
3
|
+
*
|
|
4
|
+
* Ported from IRremoteESP8266 `ir_Daikin.cpp` / `ir_Daikin.h`.
|
|
5
|
+
*
|
|
6
|
+
* This is a stateless encoder: pass a {@link Daikin64State} object and get
|
|
7
|
+
* back a raw IR timing array.
|
|
8
|
+
*/
|
|
9
|
+
export declare const Daikin64Mode: {
|
|
10
|
+
readonly Dry: 1;
|
|
11
|
+
readonly Cool: 2;
|
|
12
|
+
readonly Fan: 4;
|
|
13
|
+
readonly Heat: 8;
|
|
14
|
+
};
|
|
15
|
+
export type Daikin64ModeValue = (typeof Daikin64Mode)[keyof typeof Daikin64Mode];
|
|
16
|
+
export declare const Daikin64Fan: {
|
|
17
|
+
readonly Auto: 1;
|
|
18
|
+
readonly High: 2;
|
|
19
|
+
readonly Med: 4;
|
|
20
|
+
readonly Low: 8;
|
|
21
|
+
readonly Quiet: 9;
|
|
22
|
+
readonly Turbo: 3;
|
|
23
|
+
};
|
|
24
|
+
export type Daikin64FanValue = (typeof Daikin64Fan)[keyof typeof Daikin64Fan];
|
|
25
|
+
export interface Daikin64State {
|
|
26
|
+
/** Power toggle. */
|
|
27
|
+
power?: boolean;
|
|
28
|
+
/** Temperature in degrees Celsius (16–30). */
|
|
29
|
+
temp?: number;
|
|
30
|
+
/** Operating mode. */
|
|
31
|
+
mode?: Daikin64ModeValue;
|
|
32
|
+
/** Fan speed. */
|
|
33
|
+
fan?: Daikin64FanValue;
|
|
34
|
+
/** Vertical swing. */
|
|
35
|
+
swingVertical?: boolean;
|
|
36
|
+
/** Sleep mode. */
|
|
37
|
+
sleep?: boolean;
|
|
38
|
+
/** Clock: minutes since midnight (0–1439). */
|
|
39
|
+
clock?: number;
|
|
40
|
+
/** On timer enabled. */
|
|
41
|
+
onTimerEnabled?: boolean;
|
|
42
|
+
/** On timer: minutes since midnight (resolution 30 min). */
|
|
43
|
+
onTime?: number;
|
|
44
|
+
/** Off timer enabled. */
|
|
45
|
+
offTimerEnabled?: boolean;
|
|
46
|
+
/** Off timer: minutes since midnight (resolution 30 min). */
|
|
47
|
+
offTime?: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build the raw 64-bit Daikin64 value from a state object.
|
|
51
|
+
* Fields not present in the state use the known-good defaults.
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildDaikin64Raw(state: Daikin64State): bigint;
|
|
54
|
+
/**
|
|
55
|
+
* Encode a Daikin64 AC state into raw IR timings.
|
|
56
|
+
*
|
|
57
|
+
* @param state The desired AC state.
|
|
58
|
+
* @param repeat Number of times to repeat the message (default 0).
|
|
59
|
+
* @returns Flat array of alternating mark/space durations in microseconds.
|
|
60
|
+
*/
|
|
61
|
+
export declare function sendDaikin64(state: Daikin64State, repeat?: number): number[];
|
|
62
|
+
/**
|
|
63
|
+
* Encode a raw 64-bit Daikin64 value into IR timings.
|
|
64
|
+
* Useful when you already have the packed uint64 (e.g. from `buildDaikin64Raw`).
|
|
65
|
+
*
|
|
66
|
+
* Matches IRremoteESP8266 `IRsend::sendDaikin64`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function encodeDaikin64Raw(data: bigint, repeat?: number): number[];
|
|
69
|
+
/**
|
|
70
|
+
* Decode raw IR timings as a Daikin64 message.
|
|
71
|
+
*
|
|
72
|
+
* The leader (2x mark+space pairs) is optional -- hardware captures may miss it.
|
|
73
|
+
*
|
|
74
|
+
* @param timings Raw mark/space timing array in microseconds.
|
|
75
|
+
* @param offset Starting index in the timings array (default 0).
|
|
76
|
+
* @returns Decoded state (same shape as encode input), or null on mismatch.
|
|
77
|
+
*/
|
|
78
|
+
export declare function decodeDaikin64(timings: number[], offset?: number): Daikin64State | null;
|
|
79
|
+
//# sourceMappingURL=daikin64.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daikin64.d.ts","sourceRoot":"","sources":["../../src/protocols/daikin64.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8BH,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAEjF,eAAO,MAAM,WAAW;;;;;;;CAOd,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAY9E,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,iBAAiB;IACjB,GAAG,CAAC,EAAE,gBAAgB,CAAC;IACvB,sBAAsB;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA4BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CA6D7D;AAMD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,aAAa,EACpB,MAAM,SAAI,GACT,MAAM,EAAE,CAGV;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,SAAI,GACT,MAAM,EAAE,CAgCV;AAgCD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,GAAE,MAAU,GACjB,aAAa,GAAG,IAAI,CAmEtB"}
|