Altherma 4 auslesen und steuern
Die Altherma 4 ist eine relativ neue Wärmepumpe. Bei meiner Einrichtung im ~Juni 2025 war vielerorts noch das Gerücht zu finden, dass diese sich nur über den Smart Home Hub auslesen ließe.
Tatsächlich lässt sich die Altherma 4 auch wunderbar via Modbus auslesen und steuern. Hier werden verschiedene Möglichkeiten des Zugriffs vorgestellt inklusive etwaiger Vor- und Nachteile.
Cloud API
Über das verbaute Gateway kommuniziert die Altherma 4 direkt mit der Onecta Cloud. Die Onecta Cloud API bietet auch die Möglichkeit, Werte auszulesen - bspw. aktuelle SetPointTemperature oder Verbrauchsdaten. Allerdings fehlen Informationen wie Durchflussmenge oder erzeugte thermische Energie, die interessant wären, um bspw. den COP des Systems zu berechnen.
Eine Anfrage dazu habe ich bei Daikin letztes Jahr bereits gestellt - leider ohne Antwort.
Serielle Schnittstelle

Die Altherma4 hat auch eine serielle Schnittstelle, die sich auslesen lässt. Das Projekt ESPAltherma zeigt, dass es mit einem ESP relativ einfach ist, an die benötigten Informationen zu bekommen. Bei meinen Tests fehlten zwar einige Daten (so dass ich Vorlauf und Rücklauf doch separat messen musste) - das kann aber auch gut mit meiner (damals noch) veralteten Firmware zusammenhängen.
Während die Schnittstelle gut funktioniert und es auch Freude bereitet, so ein kleines Projekt umzusetzen, fand ich die Vorstellung, bei zukünftigen Inspektionen immer erklären zu müssen, warum ich mit einer “Bastellösung” am Mainboard der Wärmepumpe hänge, nicht wirklich prickelnd.
Modbus

Mir war schon vor einiger Zeit ein LAN-Interface im Innengerät der Altherma aufgefallen. Bisher war es mir aber nicht gelungen, das in Gang zu setzen. Nach dem letzten Firmware-Update habe ich aber die entsprechende Einstellung im Innengerät gefunden: Erst nachdem das Modbus-Interface explizit aktiviert worden war, steht das Interface zur Verfügung. Dann lässt sich Modbus ganz regulär verbinden und verschiedene Register der Wärmepumpe lesen und schreiben.
In dieser Anleitung für den Smart Home Hub und dieser Anleitung für das MMI User Interface beschreibt Daikin die zur Verfügung stehenden Register.
Folgende Register nutze ich aktuell in meinem Setup:
Input Register (read-only)
Temperaturen
| Register | Adresse | Datatype | Beschreibung | Scale | Unit |
|---|---|---|---|---|---|
| leaving_water_temp | 40 | int16 | Vorlauftemperatur (PHE) | 0.01 | °C |
| return_water_temp | 42 | int16 | Rücklauftemperatur | 0.01 | °C |
| dhw_temp | 43 | int16 | Warmwassertemperatur | 0.01 | °C |
| outside_temp | 44 | int16 | Außentemperatur | 0.01 | °C |
| refrigerant_temp | 45 | int16 | Kältemitteltemperatur | 0.01 | °C |
| dhw_upper_temp | 76 | int16 | Warmwasser oben | 0.01 | °C |
| dhw_lower_temp | 77 | int16 | Warmwasser unten | 0.01 | °C |
| heating_cooling_target | 80 | int16 | Vorlauf-Sollwert (berechnet) | 0.01 | °C |
Druck & Durchfluss
| Register | Adresse | Datatype | Beschreibung | Scale | Unit |
|---|---|---|---|---|---|
| water_pressure | 79 | int16 | Wasserdruck | 0.01 | bar |
| flow_rate | 49 | uint16 | Durchfluss | 0.01 | L/min |
Leistung
| Register | Adresse | Datatype | Beschreibung | Scale | Unit |
|---|---|---|---|---|---|
| electric_power | 51 | uint16 | Elektrische Leistung | 10 | W |
Betriebsstatus
| Register | Adresse | Datatype | Beschreibung |
|---|---|---|---|
| unit_abnormality | 21 | uint16 | Gerätestatus / Fehler (0=OK, 1=Fault, 2=Warning) |
| operation_mode | 83 | uint16 | Betriebszustand (0=Stop, 1=Tank Heat Up, 2=Space Heating, 3=Space Cooling, 4=Actuator) |
| three_way_valve | 37 | uint16 | 3-Wege-Ventil (0=Space Heating, 1=DHW) |
| demand_response_mode | 65 | uint16 | SG-Ready Status (0=Free Running, 1=Forced Off, 2=Forced On, 3=Recommended On, 4=Reduced) |
Discrete Inputs (read-only, FC 02)
| Register | Adresse | Beschreibung |
|---|---|---|
| compressor_run | 11 | Kompressor läuft |
| circulation_pump | 25 | Umwälzpumpe läuft |
| booster_heater | 8 | Heizstab aktiv |
| defrost | 17 | Abtauung |
| dhw_running | 19 | Warmwasserbetrieb aktiv |
| main_zone_running | 20 | Hauptzone aktiv |
| holiday_mode | 13 | Urlaubsmodus aktiv |
| antifrost | 14 | Frostschutz aktiv |
| disinfection | 16 | Legionellenschutz aktiv |
| hot_start | 18 | Hot Start (nach Abtauung) |
| emergency_active | 24 | Notbetrieb aktiv |
Holding Register (read/write)
| Register | Adresse | Datatype | Beschreibung | Scale | Unit |
|---|---|---|---|---|---|
| heating_setpoint | 1 | int16 | Vorlauf-Sollwert Heizen | 1 | °C |
| cooling_setpoint | 2 | int16 | Vorlauf-Sollwert Kühlen | 1 | °C |
| operation_mode_rw | 3 | int16 | Betriebsmodus (0=Auto, 1=Heating, 2=Cooling) | - | - |
| space_heating_onoff | 4 | int16 | Heizen/Kühlen Ein/Aus (0=Off, 1=On) | - | - |
| quiet_mode | 9 | int16 | Leise-Modus (0=Off, 1=On Auto, 2=On Manual) | - | - |
| dhw_setpoint | 10 | int16 | Warmwasser-Solltemperatur | 1 | °C |
| dhw_booster | 13 | int16 | Warmwasser Boost (0=Off, 1=On) | - | - |
| dhw_mode | 80 | int16 | Warmwasser Modus (0=Reheat, 1=Schedule+Reheat, 2=Scheduled) | - | - |
| lwt_heating_offset | 54 | int16 | Vorlauf-Offset Heizen (Heizkurve) | 1 | °C |
| lwt_cooling_offset | 55 | int16 | Vorlauf-Offset Kühlen (Heizkurve) | 1 | °C |
| smart_grid_mode | 56 | int16 | Smart Grid Modus (0=Free Running, 1=Forced Off, 2=Recommended On, 3=Forced On) | - | - |
| power_limit | 58 | uint16 | Leistungsbegrenzung | 0.001 | kW |
| weather_dep_heating | 68 | int16 | Heizkurve Modus Heizen (0=Fixed, 1=Weather dependent) | - | - |
| weather_dep_cooling | 69 | int16 | Heizkurve Modus Kühlen (0=Fixed, 1=Weather dependent) | - | - |
Weitere Register (Optional / Diagnose)
| Register | Adresse | Datatype | Beschreibung | Scale | Unit |
|---|---|---|---|---|---|
| leaving_water_temp_buh | 41 | int16 | Vorlauftemperatur nach Backup-Heater (≈ leaving_water_temp) | 0.01 | °C |
| room_temp_remote | 50 | int16 | Raumtemperatur Fernbedienung (nur mit Modbus-Raumthermostat) | 0.01 | °C |
| lwt_outdoor | 74 | int16 | Vorlauftemperatur Außengerät | 0.01 | °C |
| lwt_tank_valve | 75 | int16 | Vorlauftemperatur Tankventil (nur während WW-Bereitung) | 0.01 | °C |
| bypass_valve_position | 66 | int16 | Bypass-Ventil Position | - | % |
| tank_valve_position | 67 | int16 | Tank-Ventil Position | - | % |
| circulation_pump_speed | 68 | int16 | Umwälzpumpe Drehzahl | - | L/min |
| room_heating_setpoint | 76 | int16 | Raumtemperatur-Sollwert Heizen (nur mit Modbus-Raumthermostat) | 1 | °C |
| room_cooling_setpoint | 77 | int16 | Raumtemperatur-Sollwert Kühlen (nur mit Modbus-Raumthermostat) | 1 | °C |
| operation_mode_ir38 | 38 | uint16 | Betriebsmodus (unzuverlässig - IR:83 bevorzugen) | - | - |
Darüber hinaus nutze ich folgende Logik um Temperatur-Delta und thermische Energie zu berechnen:
delta_t = leaving_water_temp - return_water_temp
thermal_power = flow_rate * delta_t * 69.77 # spez. Wärmekapazität Wasser (4181 J/(kg·K)) * Dichte (~1 kg/L) / 60 s
cop = thermal_power / electric_power
Über den operation_mode lässt sich dabei auch der COP für Brauchwasser und Heizwasser separat berechnen.
Modbus: Zwei Modi für Smart Grid
Auf Register 56 lässt sich der “Smart Grid Mode” setzen: “Freier Betrieb”, “Recommended On”, “Force on” und “Force off”. Dies erlaubt eine optimierte Steuerung der Wärmepumpe: Bspw. Einschalten und Puffern zu günstigen Strompreisen und Abschalten zu teuren Stunden.
Die Altherma 4 unterstützt hier drei verschiedene Steuerungen: Via Hardware-Kontakt, via Modbus und via Cloud. Für uns sind hier die ersten beiden relevant: Ist Modbus konfiguriert, lässt sich der Smart Grid Mode sehr einfach via Register schalten. Im Modus Hardware-Kontakt schaltet die Altherma 4 basierend auf zwei potenzialfreien Kontakten an der Wärmepumpe. Welche Steuerung gewünscht ist, lässt sich im Innengerät bequem konfigurieren; da der Installateur in meinem Fall die Hardware-Kontakte mit einem Shelly mit zwei Relays ausgestattet hat, nutze ich diese (etwas umständlichere) Steuerung, um nicht mit etwaigen Voreinstellungen des Installateurs zu kollidieren. Ich habe die Modbus-Steuerung ebenfalls getestet, und sie funktioniert einwandfrei.
Steuerung Altherma 4 via potenzialfreier Kontakte
| Kontakt 1 | Kontakt 2 | Modus |
|---|---|---|
| 0 | 0 | Free running |
| 0 | 1 | Forced off |
| 1 | 0 | Recommended on |
| 1 | 1 | Forced on |
Was ich damit gebaut habe
Durch die Steuerungsmöglichkeiten meines Wechselrichters und meiner Wärmepumpe in Kombination mit Strompreiskosten von Tibber und PV-Prognosen kann ich nun folgende smarte Steuerung realisieren:
- Zur günstigsten Stunde schaltet die WP in “Recommended On”. Hier wird also bei Bedarf etwas mehr geheizt.
- Zu den teuersten Stunden schaltet die WP in “Forced off”. Morgens und abends darf sie so jeweils zwei Stunden aussparen.
- Je nach Ertragsprognose wird mein Haus-Akku geladen - unter Berücksichtigung von Ladeverlusten und Verschleiß.

Smarte Steuerung: Ein zweischneidiges Schwert
Tatsächlich ist das Ganze in vielen Fällen nicht so offensichtlich rentabel, wie man es gerne hätte. Unter Berücksichtigung von Ladeverlusten und Verschleiß lade ich meinen Akku bspw. nur bei mehr als 7ct Preisdifferenz. Und gerade das Bestimmen des möglichen PV-Ertrags und das Timen von Lade- und Entladezeiten ist doch komplexer, als man meinen könnte: Bei 10kWh Kapazität sind die Ersparnisse oft auch überschaubar: Haben wir bspw. 7ct Preisdifferenz, tritt der Mehrertrag auch wirklich nur ein, wenn man zur günstigsten Stunde lädt und zur teuersten Stunde entlädt. Um das zu erreichen, müsste der Akku eigentlich großräumig zu weniger optimalen Stunden gesperrt werden - was wiederum dann ärgerlich ist, wenn bspw. die Wärmepumpe doch in der Zwischenzeit mehr Energie braucht.

Auch die smarte WP-Steuerung ist ähnlichen Kalkülen unterworfen: Sperre ich abends die WP für zwei Stunden, muss später nachgeheizt werden um Pufferspeicher und Haus ggf. wieder auf Temperatur zu bringen. Auch wenn es kein merkbares Auskühlen gibt, zeigt sich, dass die WP nach den Sperrzeiten mehr Leistung erbringt als im Normalbetrieb. Das muss finanziell kein Nachteil sein - hier fehlen mir schlicht noch Daten, um das vergleichbar zu machen.
Auch der COP spielt für mich eine Rolle: Wenn ich das Ziel habe, die Wärmepumpe möglichst effizient zu betreiben, kann es kontraproduktiv sein, nach Sperrzeiten und “Recommended On” höhere Leistung von der WP abzurufen. Das wiederum ist aber auch witterungsabhängig: Bei frühlingshaften Außentemperaturen neigt die WP ohnehin zum Takten und läuft nicht im Optimalbereich. Sperrzeiten können hier mutmaßlich sogar hilfreich sein. Bei Tiefsttemperaturen wird die Anlage wiederum vielleicht so dimensioniert sein, dass sie das Haus über 24 Stunden hinweg auf die Wunschtemperatur bringt (auch aus Effizienzgründen). Hier könnten 2x 2 Stunden Sperrzeit wiederum dazu führen, dass die Wärmepumpe außerhalb dieser Zeiten das Haus nicht ausreichend heizt und/oder ineffizienter läuft.
Fazit
Ob man die Wärmepumpe programmatisch steuern möchte oder nicht: Allein aus Sicht der Daten finde ich es sehr spannend, die Wärmepumpe auszulesen und die Daten historisiert zu speichern. So lassen sich bspw. (S)COPs automatisch berechnen und das Verhalten der Wärmepumpe bei unterschiedlichen Temperaturen genauer nachvollziehen.
Die smarte Steuerung selbst sehe ich aktuell eher als Experiment: Die Einsparungen durch Sperrzeiten und gezieltes Laden sind real, aber kleiner als erhofft - und die Komplexität der Optimierung (Wetter, COP, Taktverhalten, Akku-Verschleiß) darf man nicht unterschätzen. Wer Modbus an der Altherma 4 nutzen möchte: Es funktioniert zuverlässig und ist der sauberste Weg, an die Daten zu kommen.
