Skip to content

Commit b8e1a4d

Browse files
Byte 4 und die Bedeutung von Byte 45 am Geraet belegt
Freigabe von Alexander, gemessen an H1 bei stehender Waermepumpe. SET14 WaterPump, Byte 4 Bits 3+4: set/WaterPump 0 Byte 4 = 0x55 Bits 3+4 = b01 (Auto) Pumpe steht set/WaterPump 1 Byte 4 = 0x65 Bits 3+4 = b10 (On) Pumpe laeuft set/WaterPump 0 Byte 4 = 0x55 Bits 3+4 = b01 (Auto) Pumpe steht Der Wert 0x65 deckt sich mit der Referenz. Dass die Pumpe tatsaechlich anlief, ist ueber TOP65 (2300 1/min), TOP1 (11,95 l/min) und TOP92 belegt - das Bitfeld meldet den wirksamen Zustand, nicht den Wunsch. Damit ist auch die zweite der vier Rueckmeldungs-Luecken direkt schliessbar: Water_Pump_Mode auf Byte 4 mit getBit3and4. Air purge (b11) bleibt ungemessen - das haette an einer intakten Anlage eine Entlueftungsroutine ausgeloest, dafuer gibt es keinen Anlass; der Eintrag stuetzt sich wie bei TOP102 auf die Referenz. Bei laufender Pumpe fiel die letzte offene Frage gleich mit ab - ob Byte 45 ein Duty oder eine Drehzahl ist. Grenze verstellt, Wirkung gemessen: Byte 45 = 100 -> Pump_Duty 100, 2300 1/min, 11,95 l/min Byte 45 = 80 -> Pump_Duty 80, 1500 1/min, 6,93 l/min Die Pumpe laeuft im Handbetrieb genau bis zur konfigurierten Obergrenze und nicht darueber. Der Name Pump_Duty_Max ist damit gemessen belegt statt nur plausibel, und TOP92 ist die Groesse, auf die sich die Grenze bezieht. Alle Sollwerte zurueckgestellt und nachgeprueft: set/WaterPump 0, set/WaterPumpSpeed 100, Pump_Speed und Pump_Duty wieder 0, Anlage steht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent e6391bb commit b8e1a4d

2 files changed

Lines changed: 79 additions & 30 deletions

File tree

‎SET-TOP-Zuordnung.md‎

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ SET | Kommando | Byte | Bits | Lage
160160
:--- | :--- | ---: | :--- | :---
161161
SET12 | `ForceDefrost` | 8 | 7 | Byte 8 ist im Antworttelegramm unbelegt — kein Rücklesen möglich
162162
SET13 | `ForceSterilization` | 8 | 6 | dito
163-
SET14 | `WaterPump` | 4 | 3+4 | Antwortbyte führt das Feld, *Auto* gemessen — **teilweise belegt**, Abschnitt 4
163+
SET14 | `WaterPump` | 4 | 3+4 | Antwortbyte am Gerät belegt (Auto und On) — **Lücke, direkt schließbar**, Abschnitt 4
164164
SET15 | `WaterPumpSpeed` | 45 | ganz | Antwortbyte am Gerät belegt — **Lücke, direkt schließbar**, Abschnitt 4
165165

166166
Für die beiden Force-Kommandos gibt es keinen Rückgabewert, wohl aber einen
@@ -253,9 +253,10 @@ Kommandoname `WaterPumpSpeed` führt hier in die Irre, siehe Abschnitt 4.
253253

254254
## 4. Was sich schließen ließe
255255

256-
Nach Aufwand und Risiko geordnet. Die ersten beiden ändern nur die Leseseite —
257-
an die Wärmepumpe wird nichts geschrieben, es kann dort also nichts kaputtgehen.
258-
Erst der dritte Punkt fasst eine laufende Anlage an.
256+
Nach Aufwand und Risiko geordnet. Die ersten beiden sind je eine Zeile in
257+
`decode.cpp` und am Gerät ausgemessen — sie ergänzen nur die Leseseite, am
258+
Schreibpfad ändert sich nichts. Erst der dritte Punkt fasst eine laufende
259+
Anlage an.
259260

260261
**1. Rücklesen für SET15 — `Pump_Duty_Max` auf Byte 45 (eine Zeile in
261262
`decode.cpp`).**
@@ -264,8 +265,9 @@ Erst der dritte Punkt fasst eine laufende Anlage an.
264265
{103, 45, "Pump_Duty_Max", getIntMinus1, nullptr, Duty},
265266
```
266267
267-
Dazu `NUMBEROFTOPICS` von 90 auf 91. Kein Eingriff in den Schreibpfad, keine
268-
Messung an der Anlage nötig — die Klartextliste `Duty` gibt es schon (TOP92).
268+
Dazu `NUMBEROFTOPICS` um eins hoch; die Klartextliste `Duty` gibt es schon
269+
(TOP92). Kein Eingriff in den Schreibpfad. Zusammen mit Punkt 2 sind es zwei
270+
neue Zeilen und `NUMBEROFTOPICS` 92.
269271
270272
**Byte 45 ist am Gerät gemessen, nicht aus der Referenz übernommen**
271273
(2026-08-19, Rohbytes über den Hexlog mit
@@ -286,36 +288,56 @@ selben Mitschnitt (ein Telegramm mit dem alten, die folgenden mit dem neuen
286288
Wert). Byte 95 blieb über alle vier Messungen unverändert bei 20 und ist die
287289
Heiz/Kühl-Umschalttemperatur TOP79.
288290
289-
**Der Wert ist ein Duty, keine Drehzahl** — die Obergrenze, bis zu der die
290-
Pumpe modulieren darf. Dazu passen die Umrechnung `X−1` wie bei TOP92
291-
`Pump_Duty` (Byte 172, die Ist-Drehzahl TOP65 rechnet `(X−1)×50`) und die
292-
Regelart auf Byte 29, die die Referenz mit den Zuständen *deltaT* und
293-
*Max. Duty* führt. Die **Ist**-Werte stehen bereits in TOP65 `Pump_Speed` und
294-
TOP92 `Pump_Duty`; `Pump_Duty_Max` wäre die Grenze zu TOP92, nicht dessen
295-
Ersatz. Der Kommandoname `WaterPumpSpeed` führt in die Irre — ob er auf
291+
**Der Wert ist ein Duty, keine Drehzahl** — und auch das ist gemessen, nicht
292+
geschlossen. Bei laufender Umwälzpumpe (Wärmepumpe stand, Pumpe über SET14 von
293+
Hand eingeschaltet) folgte TOP92 `Pump_Duty` der Grenze aus Byte 45 unmittelbar:
294+
295+
Byte 45 als `X−1` | TOP92 `Pump_Duty` | TOP65 `Pump_Speed` | TOP1 `Pump_Flow`
296+
---: | ---: | ---: | ---:
297+
100 | **100** | 2300 1/min | 11,95 l/min
298+
80 | **80** | 1500 1/min | 6,93 l/min
299+
300+
Die Pumpe läuft im Handbetrieb also genau bis zur konfigurierten Obergrenze und
301+
nicht darüber; Drehzahl und Durchfluss gehen mit. `Pump_Duty_Max` ist damit die
302+
Grenze zu TOP92, nicht dessen Ersatz — die Ist-Werte stehen weiter in TOP65 und
303+
TOP92. Der Kommandoname `WaterPumpSpeed` führt in die Irre; ob er auf
296304
`MaxPumpDuty` geändert wird, ist eine Entscheidung über die Kompatibilität der
297-
Topic-Namen und steht hier bewusst nicht offen; die Kaskadensteuerung schreibt
298-
heute auf den alten Namen.
305+
Topic-Namen und steht hier bewusst nicht offen, denn die Kaskadensteuerung
306+
schreibt heute auf den alten Namen.
299307
300308
Beim Nachschlagen in `ProtocolByteDecrypt.md`: Byte 45 trägt dort in der ersten
301309
Spalte die Nummer TOP95 — das ist die Topic-Nummer des Original-Projekts, keine
302310
Byte-Position.
303311
304-
**2. Rücklesen für SET14 — ein Zustand gemessen, zwei offen.**
305-
Byte 4 wurde bei denselben Messungen mitgeschnitten. Die Bits 3+4 standen an
306-
beiden Stufen durchgehend auf `b01`, also *Auto* — der Ruhezustand ist damit
307-
belegt, und dass die Wärmepumpe das Feld überhaupt führt.
312+
**2. Rücklesen für SET14 — `Water_Pump_Mode` auf Byte 4 (eine Zeile in
313+
`decode.cpp`).**
314+
315+
```c
316+
{104, 4, "Water_Pump_Mode", getBit3and4, nullptr, WaterPumpMode},
317+
```
318+
319+
Dazu die Klartextliste `WaterPumpMode[] = {"Auto", "On", "Air purge", nullptr}`
320+
— sie deckt den Indexbereich `−1..2` des Dekodierers vollständig ab, wie es
321+
seit 3.9.0 für alle Listen gilt.
322+
323+
Am 2026-08-19 an Stufe 1 gemessen, bei stehender Wärmepumpe:
324+
325+
`set/WaterPump` | Byte 4 roh | Bits 3+4 | dekodiert | Pumpe
326+
---: | ---: | :--- | :--- | :---
327+
0 (Ausgangslage) | `0x55` | `01` | Auto | steht
328+
1 | `0x65` | `10` | **On** | läuft, 2300 1/min
329+
0 (zurück) | `0x55` | `01` | Auto | steht
308330

309-
Der Rest ist offen: `On` (`b10`) und `Air purge` (`b11`) gibt es nur über das
310-
Servicemenü. Sie zu messen hieße, die Umwälzpumpe einer laufenden Anlage von
311-
Hand einzuschalten oder eine Entlüftung auszulösen — das ist kein passiver
312-
Mitschnitt mehr und braucht eine bewusste Freigabe. Bis dahin steht es wie
313-
TOP102 `External_SW_State`, dessen zweiter Zustand an dieser Anlage ebenfalls
314-
nicht herstellbar ist: dokumentiert, halb belegt.
331+
Das Antwortbyte führt das Feld also, und der Wert `0x65` deckt sich mit der
332+
Referenz („Water pump on=65"). Dass die Pumpe dabei tatsächlich anlief, ist
333+
über TOP65, TOP92 und TOP1 belegt — das Bitfeld meldet keinen Wunsch, sondern
334+
den wirksamen Zustand.
315335

316-
Ein Rücklese-Topic wäre `getBit3and4` auf Byte 4 mit der Klartextliste
317-
`{"Auto", "On", "Air purge", nullptr}` — sie deckt den Indexbereich `−1..2` des
318-
Dekodierers vollständig ab, wie es seit 3.9.0 für alle Listen gilt.
336+
**Ungemessen bleibt `Air purge`** (`b11`, laut Referenz `0x75`). Diesen Zustand
337+
zu erzeugen hieße, an einer intakten Anlage eine Entlüftungsroutine
338+
auszulösen — dafür gibt es keinen Anlass. Der Eintrag in der Klartextliste
339+
stützt sich auf die Referenz, so wie der zweite Zustand von TOP102
340+
`External_SW_State`, der an dieser Anlage ebenfalls nicht herstellbar ist.
319341

320342
**3. `Heating_Mode` / `Cooling_Mode` als Set-Kommando (Byte 28).**
321343
Der größte praktische Gewinn. Heute muss beim Ausfall der Kaskadensteuerung
@@ -372,8 +394,9 @@ Suche gilt als abgeschlossen, siehe [`MQTT-Topics.md`](MQTT-Topics.md).
372394
* **Die Zuordnung ist aus dem Code abgeleitet, das meiste nicht durchgemessen.**
373395
Am Gerät belegt sind die Kurven-Kommandos SET27–SET34 (Rücklesen an beiden
374396
Anlagen, 2026-08-10/11), SET3, SET4 und SET9 im laufenden Betrieb
375-
(2026-08-15/16) sowie SET15 auf Byte 45 mit Änderung in beide Richtungen
376-
(2026-08-19, Abschnitt 4). Die übrigen Paare stützen sich auf die identische
397+
(2026-08-15/16) sowie SET14 auf Byte 4 und SET15 auf Byte 45, beide mit
398+
Änderung in beide Richtungen (2026-08-19, Abschnitt 4). Die übrigen Paare
399+
stützen sich auf die identische
377400
Byte-Position, die bei jedem einzelnen der 28 Paare zutrifft. Wo Zweifel an
378401
einer Zuordnung bestehen, klärt sie [`test/byte_monitor.py`](test/byte_monitor.py)
379402
in wenigen Minuten — Byte beobachten, Wert ändern, Flanke ansehen.

‎test/README.md‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,32 @@ verschiedene Werte konfiguriert (100 und 125), und Byte 45 zeigte an Stufe 2
292292
`0x7E` = 125. Wo zwei Stufen unterschiedlich eingestellt sind, ist der
293293
Stufenvergleich der billigste Nachweis - ganz ohne Schreibvorgang.
294294

295+
**Byte 4, Bits 3+4 (SET14 WaterPump)** am selben Tag an H1 gemessen, bei
296+
stehender Waermepumpe: `set/WaterPump` 0 -> 1 -> 0 liess Byte 4 von `0x55` auf
297+
`0x65` und zurueck gehen, die Bits 3+4 also von `b01` (Auto) auf `b10` (On).
298+
Der Wert `0x65` deckt sich mit der Referenz. Dass die Pumpe dabei wirklich
299+
anlief, zeigen TOP65 (2300 1/min), TOP1 (11,95 l/min) und TOP92 - das Bitfeld
300+
meldet den wirksamen Zustand, nicht nur den Wunsch. `Air purge` (`b11`) ist
301+
bewusst NICHT gemessen: Das haette an einer intakten Anlage eine
302+
Entlueftungsroutine ausgeloest.
303+
304+
**Die Bedeutung von Byte 45** faellt bei laufender Pumpe gleich mit ab. Mit
305+
eingeschalteter Pumpe die Grenze verstellen:
306+
307+
```
308+
Byte 45 (X-1) TOP92 Pump_Duty TOP65 Pump_Speed TOP1 Pump_Flow
309+
100 100 2300 1/min 11,95 l/min
310+
80 80 1500 1/min 6,93 l/min
311+
```
312+
313+
Die Pumpe laeuft im Handbetrieb genau bis zur konfigurierten Obergrenze. Byte
314+
45 ist damit als **maximaler Duty** belegt, nicht als Drehzahl - der Topic-Name
315+
`WaterPumpSpeed` fuehrt in die Irre, das Rueckleseziel heisst `Pump_Duty_Max`.
316+
317+
Nach jedem solchen Test die Sollwerte zuruecksetzen und nachsehen, dass die
318+
Anlage wieder steht (`Pump_Speed` und `Pump_Duty` auf 0). Node-RED zieht seinen
319+
5-min-Re-Assert zwar ohnehin nach, aber darauf ist kein Nachweis zu bauen.
320+
295321
Zwei Hinweise: Der Hexlog haengt am Telnet-Debugflag (`write_hex_log` schreibt
296322
ueber `write_telnet_log`) - steht `outputTelnetLog` auf false, kommt nichts an.
297323
Und `H` ist ein Umschalter: War der Hexlog schon an, schaltet der erste Druck

0 commit comments

Comments
 (0)