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,331 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Coolix IR protocol encoder and decoder.
|
|
4
|
+
*
|
|
5
|
+
* Ported from IRremoteESP8266 `ir_Coolix.cpp` / `ir_Coolix.h`.
|
|
6
|
+
*
|
|
7
|
+
* Wire format: 24-bit data sent as 3 bytes MSB-first, each byte
|
|
8
|
+
* followed by its bitwise inverse (48 bits total on the wire).
|
|
9
|
+
*
|
|
10
|
+
* @see https://github.com/crankyoldgit/IRremoteESP8266/issues/484
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.CoolixCommand = exports.CoolixFan = exports.CoolixMode = void 0;
|
|
14
|
+
exports.buildCoolixRaw = buildCoolixRaw;
|
|
15
|
+
exports.encodeCoolixRaw = encodeCoolixRaw;
|
|
16
|
+
exports.sendCoolix = sendCoolix;
|
|
17
|
+
exports.decodeCoolixRaw = decodeCoolixRaw;
|
|
18
|
+
exports.parseCoolixState = parseCoolixState;
|
|
19
|
+
exports.decodeCoolix = decodeCoolix;
|
|
20
|
+
const encode_js_1 = require("../encode.js");
|
|
21
|
+
const decode_js_1 = require("../decode.js");
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Timing constants — must match ir_Coolix.h exactly
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
const COOLIX_TICK = 276;
|
|
26
|
+
const COOLIX_HDR_MARK = 17 * COOLIX_TICK; // 4692
|
|
27
|
+
const COOLIX_HDR_SPACE = 16 * COOLIX_TICK; // 4416
|
|
28
|
+
const COOLIX_BIT_MARK = 2 * COOLIX_TICK; // 552
|
|
29
|
+
const COOLIX_ONE_SPACE = 6 * COOLIX_TICK; // 1656
|
|
30
|
+
const COOLIX_ZERO_SPACE = 2 * COOLIX_TICK; // 552
|
|
31
|
+
const COOLIX_MIN_GAP = 19 * COOLIX_TICK; // 5244
|
|
32
|
+
/** Extra tolerance for Coolix decode — matches kCoolixExtraTolerance in C++. */
|
|
33
|
+
const COOLIX_TOLERANCE = 30; // 25% default + 5% extra
|
|
34
|
+
const COOLIX_FAN_TEMP_CODE = 0b1110;
|
|
35
|
+
const COOLIX_SENSOR_TEMP_IGNORE = 0x1F; // 31
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Temperature lookup table (index = degrees - 17, value = 4-bit code)
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
const COOLIX_TEMP_MAP = [
|
|
40
|
+
0b0000, // 17°C
|
|
41
|
+
0b0001, // 18°C
|
|
42
|
+
0b0011, // 19°C
|
|
43
|
+
0b0010, // 20°C
|
|
44
|
+
0b0110, // 21°C
|
|
45
|
+
0b0111, // 22°C
|
|
46
|
+
0b0101, // 23°C
|
|
47
|
+
0b0100, // 24°C
|
|
48
|
+
0b1100, // 25°C
|
|
49
|
+
0b1101, // 26°C
|
|
50
|
+
0b1001, // 27°C
|
|
51
|
+
0b1000, // 28°C
|
|
52
|
+
0b1010, // 29°C
|
|
53
|
+
0b1011, // 30°C
|
|
54
|
+
];
|
|
55
|
+
/** Reverse lookup: 4-bit code → degrees C (undefined for invalid codes). */
|
|
56
|
+
const COOLIX_CODE_TO_TEMP = [];
|
|
57
|
+
for (let i = 0; i < COOLIX_TEMP_MAP.length; i++) {
|
|
58
|
+
COOLIX_CODE_TO_TEMP[COOLIX_TEMP_MAP[i]] = i + 17;
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Mode constants
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
exports.CoolixMode = {
|
|
64
|
+
Cool: 0b00,
|
|
65
|
+
Dry: 0b01,
|
|
66
|
+
Auto: 0b10,
|
|
67
|
+
Heat: 0b11,
|
|
68
|
+
/** Synthetic mode: encoded as Dry + special temp code on the wire. */
|
|
69
|
+
Fan: 0b100,
|
|
70
|
+
};
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Fan constants
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
exports.CoolixFan = {
|
|
75
|
+
Auto0: 0b000,
|
|
76
|
+
Max: 0b001,
|
|
77
|
+
Med: 0b010,
|
|
78
|
+
Min: 0b100,
|
|
79
|
+
Auto: 0b101,
|
|
80
|
+
ZoneFollow: 0b110,
|
|
81
|
+
Fixed: 0b111,
|
|
82
|
+
};
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
// Fixed command codes
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
exports.CoolixCommand = {
|
|
87
|
+
Off: 0xB27BE0,
|
|
88
|
+
Swing: 0xB26BE0,
|
|
89
|
+
SwingH: 0xB5F5A2,
|
|
90
|
+
SwingV: 0xB20FE0,
|
|
91
|
+
Sleep: 0xB2E003,
|
|
92
|
+
Turbo: 0xB5F5A2,
|
|
93
|
+
Led: 0xB5F5A5,
|
|
94
|
+
Clean: 0xB5F5AA,
|
|
95
|
+
CmdFan: 0xB2BFE4,
|
|
96
|
+
};
|
|
97
|
+
/** Toggle/special commands that don't encode AC state. CmdFan is excluded
|
|
98
|
+
* because it IS a valid fan-mode state frame (Dry + temp 0xE). */
|
|
99
|
+
const COMMAND_SET = new Set([
|
|
100
|
+
exports.CoolixCommand.Off,
|
|
101
|
+
exports.CoolixCommand.Swing,
|
|
102
|
+
exports.CoolixCommand.SwingH,
|
|
103
|
+
exports.CoolixCommand.SwingV,
|
|
104
|
+
exports.CoolixCommand.Sleep,
|
|
105
|
+
exports.CoolixCommand.Turbo,
|
|
106
|
+
exports.CoolixCommand.Led,
|
|
107
|
+
exports.CoolixCommand.Clean,
|
|
108
|
+
]);
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Encode
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
const COOLIX_DEFAULT_STATE = 0xB21FC8;
|
|
113
|
+
const COOLIX_TEMP_MIN = 17;
|
|
114
|
+
const COOLIX_TEMP_MAX = 30;
|
|
115
|
+
/**
|
|
116
|
+
* Build a raw 24-bit Coolix code from a state object.
|
|
117
|
+
*/
|
|
118
|
+
function buildCoolixRaw(state) {
|
|
119
|
+
let raw = COOLIX_DEFAULT_STATE;
|
|
120
|
+
// Fixed upper nibble 0xB (bits 20-23)
|
|
121
|
+
raw = (raw & ~(0xF << 20)) | (0xB << 20);
|
|
122
|
+
// Mode (bits 2-3)
|
|
123
|
+
let mode = state.mode ?? exports.CoolixMode.Auto;
|
|
124
|
+
let tempCode;
|
|
125
|
+
if (mode === exports.CoolixMode.Fan) {
|
|
126
|
+
// Fan is synthetic: Dry mode + special temp code
|
|
127
|
+
raw = (raw & ~(0x3 << 2)) | (exports.CoolixMode.Dry << 2);
|
|
128
|
+
tempCode = COOLIX_FAN_TEMP_CODE;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
if (mode !== exports.CoolixMode.Cool && mode !== exports.CoolixMode.Dry &&
|
|
132
|
+
mode !== exports.CoolixMode.Auto && mode !== exports.CoolixMode.Heat) {
|
|
133
|
+
mode = exports.CoolixMode.Auto;
|
|
134
|
+
}
|
|
135
|
+
raw = (raw & ~(0x3 << 2)) | (mode << 2);
|
|
136
|
+
// Temp (bits 4-7)
|
|
137
|
+
const temp = Math.min(Math.max(state.temp ?? 25, COOLIX_TEMP_MIN), COOLIX_TEMP_MAX);
|
|
138
|
+
tempCode = COOLIX_TEMP_MAP[temp - COOLIX_TEMP_MIN];
|
|
139
|
+
}
|
|
140
|
+
raw = (raw & ~(0xF << 4)) | (tempCode << 4);
|
|
141
|
+
// Fan (bits 13-15) — with mode-dependent Auto/Auto0 adjustment.
|
|
142
|
+
// Only Auto and Dry modes use Auto0; all others (Cool, Heat, Fan) use Auto.
|
|
143
|
+
let fan = state.fan ?? exports.CoolixFan.Auto0;
|
|
144
|
+
switch (fan) {
|
|
145
|
+
case exports.CoolixFan.Auto:
|
|
146
|
+
// Auto (5) not valid in Dry/Auto mode → convert to Auto0 (0)
|
|
147
|
+
if (mode === exports.CoolixMode.Auto || mode === exports.CoolixMode.Dry) {
|
|
148
|
+
fan = exports.CoolixFan.Auto0;
|
|
149
|
+
}
|
|
150
|
+
break;
|
|
151
|
+
case exports.CoolixFan.Auto0:
|
|
152
|
+
// Auto0 (0) only valid in Dry/Auto mode → convert to Auto (5) for others
|
|
153
|
+
if (mode !== exports.CoolixMode.Auto && mode !== exports.CoolixMode.Dry) {
|
|
154
|
+
fan = exports.CoolixFan.Auto;
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
case exports.CoolixFan.Min:
|
|
158
|
+
case exports.CoolixFan.Med:
|
|
159
|
+
case exports.CoolixFan.Max:
|
|
160
|
+
case exports.CoolixFan.ZoneFollow:
|
|
161
|
+
case exports.CoolixFan.Fixed:
|
|
162
|
+
break;
|
|
163
|
+
default:
|
|
164
|
+
fan = exports.CoolixFan.Auto;
|
|
165
|
+
}
|
|
166
|
+
raw = (raw & ~(0x7 << 13)) | ((fan & 0x7) << 13);
|
|
167
|
+
// SensorTemp (bits 8-12)
|
|
168
|
+
const sensorTemp = state.sensorTemp !== undefined
|
|
169
|
+
? Math.min(Math.max(state.sensorTemp, 0), 30)
|
|
170
|
+
: COOLIX_SENSOR_TEMP_IGNORE;
|
|
171
|
+
raw = (raw & ~(0x1F << 8)) | (sensorTemp << 8);
|
|
172
|
+
// ZoneFollow (bits 1 and 19)
|
|
173
|
+
const zf = state.zoneFollow ?? false;
|
|
174
|
+
if (zf) {
|
|
175
|
+
raw |= (1 << 1); // ZoneFollow1
|
|
176
|
+
raw |= (1 << 19); // ZoneFollow2
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
raw &= ~(1 << 1);
|
|
180
|
+
raw &= ~(1 << 19);
|
|
181
|
+
}
|
|
182
|
+
return raw >>> 0; // Ensure unsigned
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Encode a raw 24-bit Coolix code into IR timings.
|
|
186
|
+
*
|
|
187
|
+
* Each of the 3 data bytes is sent normal then inverted (MSB-first).
|
|
188
|
+
* Matches IRremoteESP8266 `IRsend::sendCOOLIX`.
|
|
189
|
+
*/
|
|
190
|
+
function encodeCoolixRaw(data, repeat = 1) {
|
|
191
|
+
const result = [];
|
|
192
|
+
for (let r = 0; r <= repeat; r++) {
|
|
193
|
+
// Header
|
|
194
|
+
result.push(COOLIX_HDR_MARK, COOLIX_HDR_SPACE);
|
|
195
|
+
// Data: 3 bytes MSB-first, each followed by inverse
|
|
196
|
+
for (let i = 16; i >= 0; i -= 8) {
|
|
197
|
+
const byte = (data >> i) & 0xFF;
|
|
198
|
+
// Normal byte
|
|
199
|
+
const normal = (0, encode_js_1.encodeData)(COOLIX_BIT_MARK, COOLIX_ONE_SPACE, COOLIX_BIT_MARK, COOLIX_ZERO_SPACE, BigInt(byte), 8, true);
|
|
200
|
+
for (let j = 0; j < normal.length; j++)
|
|
201
|
+
result.push(normal[j]);
|
|
202
|
+
// Inverted byte
|
|
203
|
+
const inverted = (0, encode_js_1.encodeData)(COOLIX_BIT_MARK, COOLIX_ONE_SPACE, COOLIX_BIT_MARK, COOLIX_ZERO_SPACE, BigInt(byte ^ 0xFF), 8, true);
|
|
204
|
+
for (let j = 0; j < inverted.length; j++)
|
|
205
|
+
result.push(inverted[j]);
|
|
206
|
+
}
|
|
207
|
+
// Footer
|
|
208
|
+
result.push(COOLIX_BIT_MARK, COOLIX_MIN_GAP);
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Encode a Coolix AC state into raw IR timings.
|
|
214
|
+
*/
|
|
215
|
+
function sendCoolix(state, repeat = 1) {
|
|
216
|
+
return encodeCoolixRaw(buildCoolixRaw(state), repeat);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Decode raw IR timings into a 24-bit Coolix code.
|
|
220
|
+
*
|
|
221
|
+
* Validates byte inversion parity for all 3 bytes.
|
|
222
|
+
*
|
|
223
|
+
* @returns Raw 24-bit code and entries consumed, or null on mismatch.
|
|
224
|
+
*/
|
|
225
|
+
function decodeCoolixRaw(timings, offset = 0, headerOptional = false) {
|
|
226
|
+
let pos = offset;
|
|
227
|
+
const len = timings.length;
|
|
228
|
+
// Minimum: 48 data bits(96) + footer mark(1) = 97 entries (header may be optional)
|
|
229
|
+
if (len - offset < 97)
|
|
230
|
+
return null;
|
|
231
|
+
// Header — consume if present, fail if required but missing.
|
|
232
|
+
if (pos + 1 < len &&
|
|
233
|
+
(0, decode_js_1.matchMark)(timings[pos], COOLIX_HDR_MARK, COOLIX_TOLERANCE) &&
|
|
234
|
+
(0, decode_js_1.matchSpace)(timings[pos + 1], COOLIX_HDR_SPACE, COOLIX_TOLERANCE)) {
|
|
235
|
+
pos += 2;
|
|
236
|
+
}
|
|
237
|
+
else if (!headerOptional) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
// Decode 3 byte pairs (normal + inverted)
|
|
241
|
+
let data = 0;
|
|
242
|
+
for (let i = 0; i < 3; i++) {
|
|
243
|
+
// Normal byte (8 bits, MSB-first)
|
|
244
|
+
const normal = (0, decode_js_1.matchData)(timings, pos, 8, COOLIX_BIT_MARK, COOLIX_ONE_SPACE, COOLIX_BIT_MARK, COOLIX_ZERO_SPACE, COOLIX_TOLERANCE);
|
|
245
|
+
if (!normal.success)
|
|
246
|
+
return null;
|
|
247
|
+
pos += normal.used;
|
|
248
|
+
// Inverted byte (8 bits, MSB-first)
|
|
249
|
+
const inverted = (0, decode_js_1.matchData)(timings, pos, 8, COOLIX_BIT_MARK, COOLIX_ONE_SPACE, COOLIX_BIT_MARK, COOLIX_ZERO_SPACE, COOLIX_TOLERANCE);
|
|
250
|
+
if (!inverted.success)
|
|
251
|
+
return null;
|
|
252
|
+
pos += inverted.used;
|
|
253
|
+
// Validate inversion parity
|
|
254
|
+
const normalByte = Number(normal.data & 0xffn);
|
|
255
|
+
const invertedByte = Number(inverted.data & 0xffn);
|
|
256
|
+
if ((normalByte ^ 0xFF) !== invertedByte)
|
|
257
|
+
return null;
|
|
258
|
+
data = (data << 8) | normalByte;
|
|
259
|
+
}
|
|
260
|
+
// Footer mark
|
|
261
|
+
if (pos >= len)
|
|
262
|
+
return null;
|
|
263
|
+
if (!(0, decode_js_1.matchMark)(timings[pos], COOLIX_BIT_MARK, COOLIX_TOLERANCE))
|
|
264
|
+
return null;
|
|
265
|
+
pos++;
|
|
266
|
+
// Footer gap (optional — may be last frame)
|
|
267
|
+
if (pos < len) {
|
|
268
|
+
if (!(0, decode_js_1.matchAtLeast)(timings[pos], COOLIX_MIN_GAP, COOLIX_TOLERANCE))
|
|
269
|
+
return null;
|
|
270
|
+
pos++;
|
|
271
|
+
}
|
|
272
|
+
return { data: data >>> 0, used: pos - offset };
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Parse a raw 24-bit Coolix code into a state object.
|
|
276
|
+
*
|
|
277
|
+
* Returns null for command codes (Off, Swing, Turbo, etc.) since
|
|
278
|
+
* they don't encode AC state.
|
|
279
|
+
*/
|
|
280
|
+
function parseCoolixState(data) {
|
|
281
|
+
// Reject known command codes
|
|
282
|
+
if (COMMAND_SET.has(data))
|
|
283
|
+
return null;
|
|
284
|
+
const modeRaw = (data >> 2) & 0x3;
|
|
285
|
+
const tempCode = (data >> 4) & 0xF;
|
|
286
|
+
const fanRaw = (data >> 13) & 0x7;
|
|
287
|
+
const sensorTempRaw = (data >> 8) & 0x1F;
|
|
288
|
+
const zf1 = (data >> 1) & 1;
|
|
289
|
+
const zf2 = (data >> 19) & 1;
|
|
290
|
+
// Detect synthetic Fan mode (Dry + special temp code)
|
|
291
|
+
let mode;
|
|
292
|
+
let temp;
|
|
293
|
+
if (modeRaw === exports.CoolixMode.Dry && tempCode === COOLIX_FAN_TEMP_CODE) {
|
|
294
|
+
mode = exports.CoolixMode.Fan;
|
|
295
|
+
temp = undefined;
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
mode = modeRaw;
|
|
299
|
+
temp = COOLIX_CODE_TO_TEMP[tempCode];
|
|
300
|
+
if (temp === undefined)
|
|
301
|
+
return null; // Unknown temp code — not a state frame
|
|
302
|
+
}
|
|
303
|
+
const state = {
|
|
304
|
+
mode,
|
|
305
|
+
fan: fanRaw,
|
|
306
|
+
zoneFollow: !!(zf1 && zf2),
|
|
307
|
+
};
|
|
308
|
+
if (temp !== undefined)
|
|
309
|
+
state.temp = temp;
|
|
310
|
+
if (sensorTempRaw !== COOLIX_SENSOR_TEMP_IGNORE)
|
|
311
|
+
state.sensorTemp = sensorTempRaw;
|
|
312
|
+
return state;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Decode raw IR timings as a Coolix AC state.
|
|
316
|
+
*
|
|
317
|
+
* Returns null if the timings don't match Coolix protocol, or if
|
|
318
|
+
* the decoded code is a command (Off, Swing, etc.) rather than a state frame.
|
|
319
|
+
* Use {@link decodeCoolixRaw} to decode command codes.
|
|
320
|
+
*
|
|
321
|
+
* @param timings Raw mark/space timing array in microseconds.
|
|
322
|
+
* @param offset Starting index in the timings array (default 0).
|
|
323
|
+
* @returns Decoded state (same shape as encode input), or null.
|
|
324
|
+
*/
|
|
325
|
+
function decodeCoolix(timings, offset = 0, headerOptional = false) {
|
|
326
|
+
const raw = decodeCoolixRaw(timings, offset, headerOptional);
|
|
327
|
+
if (!raw)
|
|
328
|
+
return null;
|
|
329
|
+
return parseCoolixState(raw.data);
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=coolix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolix.js","sourceRoot":"","sources":["../../../src/protocols/coolix.ts"],"names":[],"mappings":"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"}
|
|
@@ -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, headerOptional?: boolean): 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,EAClB,cAAc,GAAE,OAAe,GAC9B,cAAc,GAAG,IAAI,CAmIvB"}
|