Questions 1–3: done, and your handshake reproduces here on the Eco 8. All three answers are yes.
Setup: transmitting through the TCP gateway on the bus rather than an on-bus ESP, answering only the
master’s polls to 0x06, nothing initiated. Payload was twelve zero words, plus AFCA = 0x03E8 in the
“ack” phases. Two full A/B cycles, so nothing rests on a single transition:
| Phase |
Polls |
Poll interval |
0x0F:0861 (observations: values) |
| silent, 60 s |
14 |
4.26 s |
28 × 0 |
| zeros, 120 s |
112 |
0.70 / 1.44 s alternating |
56 × 0 |
| AFCA = 03E8, 120 s |
113 |
0.70 / 1.44 s |
56 × 16 |
| zeros, 120 s |
112 |
0.70 / 1.44 s |
56 × 0 |
| AFCA = 03E8, 120 s |
112 |
0.70 / 1.44 s |
56 × 16 |
| zeros, 120 s |
113 |
0.70 / 1.44 s |
56 × 0 |
| silent, 90 s |
84 |
still 0.70 / 1.44 s |
43 × 0 |
Q1 — cadence: yes. A plain all-zero reply is enough to move the 0x06 polling from a very steady
4.26 s (10th–90th percentile 4.25–4.26) to your alternating 0.70 / 1.44 s.
Q2 — ACK: yes. 0x0861 went 0 → 16 in both AFCA phases, and every single observation in those
phases was 16; every observation outside them was 0.
Q3 — clear: yes. Dropping AFCA back to 0, everything else unchanged, took the ACK back to 0 both
times.
On timing: first change seen 1.2 s and 0.6 s after setting AFCA, 1.0 s and 0.4 s after clearing it.
Treat those as upper bounds rather than measurements — the controller writes 0x0861 only about every
2 s here, so the resolution is coarse. Consistent with your 0.3–0.45 s and 1.0–1.2 s, but I cannot
confirm the asymmetry.
One thing you did not mention, which may or may not match your unit: the fast cadence outlives the
accessory. After I stopped answering, the master kept polling 0x06 at 0.70 / 1.44 s for roughly two
more minutes, then fell back to 4.25 s on its own — checked passively afterwards. So there is a
presence timeout of about two minutes before the slot is considered empty again.
So the transport layer is common to the platform, not specific to the XTR M. And your caveat holds
exactly as stated: the “ack” payload here was eleven zero words and one flag, which means nothing,
and it was acknowledged just the same. That is transport, not understanding.
Also useful for anyone following: the TCP gateway is fast enough. Every poll in the transmitting
phases got an answer, and the cadence change shows the master accepted them.
AFDC and A80E. During the test AFDC stopped pulsing, and since I had called it a steady heartbeat in my
last post, I did not want to guess whether that was me. It was not.
The heartbeat is the heating-season condition. Checked over eleven days of history (about 1300 ten-minute
bins): AFDC pulses 0 ↔ 32 exactly when the displayed outdoor temperature is below the heating-stop limit — 100 %
of bins at 3 K or more below, 75 % at 2 K, 48 % at 1 K, 0–1 % at or above the limit. That is a hysteresis of
about 2–3 K, and it does not depend on heating being switched on: it pulsed the same way before the heating
season, when the pump was only making hot water. A controlled A/B confirmed it: the owner raised the heating-stop limit from 17 to 20 at 14:04:22 UTC and the first
pulse came 31 s later, with the compressor only starting eleven minutes after that; lowering it back at 14:52:24
stopped the pulsing in the same second. Note that at 14:52:24 the pump also switched to hot water in that same
second, so that transition is not a clean heating-stop on its own; this morning’s natural one at 10:41:30 was.
AFDC 16 is a generic ten-minute window, not a heating-stop signal. I first read it that way, but the history
shows 13 such windows in eleven days, every one lasting 637–646 s, after several different events: entering
heating-stop, starting hot water from heating, during the periodic routine below (3 of its 10 occurrences),
and at other moments I cannot yet attribute.
A periodic routine, 10 out of 10 over eleven days. Once per cycle, A80C enters a state with bits 0x30 set (48
when idle, 112/113 in season) for 62–68 s, and at the exact moment it ends A80E raises bit 3 (values 8/40) for
636–645 s. It happens regardless of whether the compressor is running. The interval is 25 h 33 min, drifting by
about 1.5 h a day.
A possible explanation, offered as a hypothesis only. The mean AFDC pulse period over 7300 periods is 63.87 s.
In those units the routine interval is 1440.1 “minutes”, the 0x30 state is one, and the windows are ten. The
DHP-iQ manual says that during heat stop the circulation pump is exercised for one minute per day. A controller
counting minutes in ~63.9 s would produce exactly this. The routine is predicted for 2026-09-24 around 15:39:36
UTC; I will listen to the pump then and report whether it runs.
0x1E FC04 register 0x0014 is a bitfield, not an enum. Over seven days, sampled every 30 s (about 20 000
samples), each bit matches its signal in 100.0 % of samples: 0x01 compressor running, 0x04 outdoor fan
turning, 0x08 water flow / circulation pump, 0x10 always set. So 16 idle, 24 pump, 28 pump and fan, 29 plus
compressor, and your 20 is the fan alone. For defrost, Samsung reverses the cycle with the fan stopped, so I
expect 25 (0x19) — a value I have never seen yet. Something to look for on the first frosty night.
The request word AFCA, tested further. Thermia Online’s API, in a public debug dump from a DHP-AQ with a DCM
module, addresses parameters by the display’s own register numbers — 1000 heating curve, 1001/1002 curve
min/max, 1006 heat stop, 1090 cooling, plus 1363 operating mode and 1369 link integration. And 0x03E8 is 1000.
So I tested whether AFCA is a register number rather than a flag: 1001, 1002, 999 and 1234 against 1000 as
control at both ends, each A/B with about 28 observations of 0x0861 per phase. Result: ACK only for 0x03E8.
AFCA is a constant, and the 1000 is either a coincidence or a deliberately chosen value. No parameter changed
in any run.
One side effect is consistent, though: while AFCA holds any non-zero value, the AFDC pulse reads 16 instead of
32 (0x03E8 with ACK 3/3, 0x03E9 without ACK 4/4, 32 again in the zero phases). So the controller reads AFCA at
two levels: any non-zero value changes a bit in the heartbeat it sends to the module, and only 0x03E8 produces
the ACK in 0x0F:0861. I had briefly taken the 16 for a NAK; the longer run ruled that out.
One correction of mine, and I have edited post 4 to match: I called bit 6 of A80C “compressor”. It is
not. From 07:34 to 11:15 UTC today it stayed at 64 through three compressor stops, the last one a
heating-stop at 17 °C outside, with the compressor at 0 Hz and the fan at 0. Your “64 = normal” was the
better reading — it is a context bit, not a running flag. Bit 0 as the hot-water request stands.
Edit: extended the same evening, before any reply, with the eleven-day history check, the register 0x0014
bitfield and the AFCA tests. The first version described AFDC 16 as a heating-stop window and missed that the
pump also switched to hot water at 14:52:24.