Third unit reporting in, and it is a multi-head, so most of this is corroboration for @MidATRIX plus one conflict and one offer.
Unit: ACiQ ES-48Z-M6C, five heads on a 6-zone-capable ODU, R-454B, manufactured 05/2025. I read it through a custom CN45 adapter using a vendored fork of the component pinned at 9302edc7. It has been running pretty much continuously since August. (@fmckee, if any of this is useful for the compatibility table, tell me what detail you want and I will pull it.)
The tap, before I tidied it up. Little grey module on the lid is the CN45 adapter, and the black cable drops through the lid grommet into the control compartment. The two-digit display on the board at left is DSP1, which is what I anchored the current and DC bus formulas against further down. Head terminals are the numbered blocks on the right. Disconnect was pulled for this, which is the only time that panel should be open.
Multi-head: four decoded fields are hard sentinels
Constant 0x00 across 807 rows of a capture spanning 31 to 71 Hz, anchored against the ODU’s own DSP1 display, and unchanged in the five weeks since:
0x00[2] T1 indoor ambient, 0x00
0x00[3] T2 indoor coil, 0x00
0x00[7..8] outdoor fan speed (uint16), 0x0000
0x01[7] TT indoor setpoint, 0x00
Three of those make sense. There is no single indoor unit to report. The fan-speed one really surprised me, since the fan is plainly running… on this unit the fan state seems to live in the DSP1 index instead (code 48, a step code 0 to 7) rather than as an RPM word on the wire.
Everything else in FRAME-BYTES.md decodes correctly here. So the protocol is not different on multi-head. Four fields just have no referent.
0x01[4] really does look like IPM temperature
I saw this got pulled after @MidATRIX raised that 0x01[4], 0x03[4] and 0x03[5] might be thermal thresholds rather than readings. On this unit 0x01[4] through the NTC beta model behaves like a heatsink, not a constant:
- range 33.5 to 50 C over the last several days
- sits consistently 9 to 19 C above outdoor ambient
- rises with compressor load and falls with it, with a visible lag
A threshold would not move with load like that. I have no independent reference for it though, since the DSP1 index on this unit does not expose an IPM temperature, so it is behavioural evidence and not proof. If either of you has a frame where 0x01[4] sits flat while ambient swings, that kills it.
Conflict: 0x02[8] reads 0x02 while this unit is COOLING
FRAME-BYTES.md has 0x02[8] as operating mode, with 2 = HEAT. This ODU emits b8 = 0x02 continuously while every head is set to cool, the reversing valve is in cooling, and it is making cold air. By the table that is HEAT.
Mode and fan step are degenerate in everything I have (both would read 2), so I cannot separate them without a heat-mode test, which I have not run. I am flagging it mainly so nobody trusts a mode reading off a multi-head unit without checking it against something physical.
L0 (0x02[4] bit 7): confirmed here, with an indoor coil measurement
Your L0 identification matches what I see, and it named a byte I had been calling an unknown dormant flag for two weeks. Thank you for that.
I have nine fully characterised episodes now, 2026-09-15 through 09-17, every one of them slot2:b4 = 0x80 with slot 2 reading 0x5502100F800000000208 at onset:
onset (CDT) duration preceding 10 min, Hz
09-15 09:10:23 21.2 min 15 to 51
09-15 11:18:13 27.5 min 15 to 51
09-16 04:07:24 26.7 min flat 15
09-16 05:04:04 113.7 min flat 15
09-16 08:37:24 5.7 min flat 15
09-16 10:31:54 1.0 min 0 to 30
09-16 10:45:34 6.2 min 15 to 16
09-17 05:59:24 3.8 min flat 15
09-17 06:43:45 34.5 min 15 to 51
Here is the part I think is really worth your time, with the caveat that it splits two ways and the split matters more than the average.
Per episode, indoor coil inlet on the living-room head, against EEV position:
ep onset (CDT) coil med coil min EEV med
1 09-15 09:10:23 44.0 39.0 270 cold
3 09-16 04:07:24 41.0 40.0 246 cold
4 09-16 05:04:04 40.0 39.0 256 cold
8 09-17 05:59:24 40.0 40.0 258 cold
9 09-17 06:43:45 43.0 39.0 288 cold
2 09-15 11:18:13 63.0 61.0 - warm
6 09-16 10:31:54 67.0 66.0 - warm
5, 7 no coil samples in window
Five of the nine sit at 40 to 44 F with the EEV wide open, which is the shape your L0 identification predicts. Two sit at 63 to 67 F, nowhere near a freeze threshold, and those two also have no EEV samples in window. I read that as the living-room head being idle, so for those episodes the sensor is not watching the evaporator that matters. My coil is on one head out of five.
Aggregated across all nine it comes out as roughly six degrees colder on the means and eight on the medians against unflagged time at the same compressor frequency, time-weighted. I would not lean on that number. An average over a cold cluster and a warm cluster describes neither, and I only quote it because somebody will ask.
What I would lean on is the cold cluster: five episodes, coil 40 to 44 F, EEV between 246 and 288 steps, compressor pinned at its floor. That is a coherent picture and it is yours, not mine.
Two things argue against reading it as a hard freeze limit. The coil touched 38 F once with the flag clear (09-17 02:39, a single sample), so whatever the threshold is, it is not simply “colder than 39”. And I do not have a sourced figure for the protection setpoint on this unit. I have seen 4 C for 250 s quoted, but I have not read it in a manual for this model, so treat it as hearsay until somebody produces the page.
What I got wrong on the way here, in case it saves you the detour
My first read was that L0 trails a demand excursion. The compressor swings hard, settles, and the flag lands. That is wrong, and four of the nine episodes killed it: the preceding ten minutes were completely flat at 15 Hz, no excursion at all.
Then I over-corrected and decided the flag must be causing the frequency floor. Also wrong, and worse, because it was a nice story. The floor is already running when the flag asserts, by 118 minutes in one case and 78 in another. A cause cannot lag its effect by two hours. On top of that, 81.6% of the time the plant spends at its minimum frequency is never flagged at all, and the longest unflagged stretch at the floor (119.7 minutes) is longer than the longest flagged episode.
So the honest version is that L0 and the frequency floor co-occur, and the thing that actually separates a flagged floor from an unflagged one is the indoor coil temperature. Which is what your byte map said in the first place.
Durations still vary 114 times over, from 1.0 minutes to 113.7, out of what looks like the same stimulus. I do not have a good story for that one yet.
One confirmation from the unit’s own display
I had DSP1 and a clamp CT on the branch circuit during the August capture, so these are independent of the formula rather than a restatement of it:
0x01[2] current. 0.117 * b + 0.92 agrees with DSP1 code 35 (ADC x 0.2 A). At b2 = 78, formula gives 10.05 A against 10.0 A displayed. Tracks the line CT at r = 0.997 across a 1638 to 4632 W ramp.
0x03[6] DC bus. round(b * 59 / 32 - 1) reproduces exactly (marked as hypothesis in the doc).
Small naming thought on the first one. The measurement point looks inverter-side, not line-side. A line CT always reads higher, and that gap is not a decode error… current_draw invites exactly that comparison, which cost me an afternoon I would like back.
I can run the 0x05 and 0x04 probes on a third unit
@MidATRIX, you asked whether values ever change on 0x05[3], and @fmckee posted charts from two units and said he had no idea. I think I can answer that one, because a five-head unit gives you six things to move independently instead of one.
My firmware already has the type 0x04, 0x05 and 0x06 queries plus a set of parameterised probes, including a zone-selector hypothesis on 0x04 with b2 = 0x01..0x06 that I wrote before I read your posts. I just do not publish those slots yet.
If it is useful I can enable capture and post raw 0x04, 0x05 and 0x06 frames from a five-head ACiQ alongside per-zone setpoints and room temps. Third unit, different brand, different head count. Happy to drive specific zones to specific setpoints if you want a controlled read on 0x05[3].
I also still have the 807-row CSV (raw frames, decoded values, and branch-circuit watts and amps at 10 second resolution) if anyone wants it.