Integration einer Dimplex-Wärmepumpe in Home Assistant mit MQTT

Einleitung

Die Integration smarter Heizsysteme in eine Home-Automation-Lösung wie Home Assistant (HASS) ermöglicht nicht nur die zentrale Steuerung, sondern auch detaillierte Analysen und Automatisierungen. Dieser Beitrag zeigt, wie eine Dimplex-Wärmepumpe mit der NWPM Touch-Erweiterung über MQTT mit Home Assistant verbunden wird. Wir richten uns an fortgeschrittene Nutzer, die mit MQTT und YAML bereits vertraut sind.


Die Anleitung basiert auf den von Dimplex zur verfügung gestellten Informationen:
https://dimplex.atlassian.net/wiki/spaces/DW/pages/3021930597/MQTT+Anbindung

Voraussetzungen

Für die Integration benötigen Sie:

  1. Einen Home Assistant Server, idealerweise auf einem Raspberry Pi, Proxmox oder vergleichbarer Hardware.
  2. Eine Dimplex-Wärmepumpe mit Touch-Display und einer NWPM Touch-Erweiterung.
  3. Einen MQTT-Broker, z. B. Mosquitto, entweder als Standalone-Server oder auf der NWPM-Baugruppe.

Optional: Ein Broker-to-Broker-Setup, um einen externen Broker mit dem integrierten MQTT-Server der NWPM zu verbinden.


Besonderheiten bei meiner Dimplex-MQTT-Anbindung

Die Dimplex NWPM Touch-Erweiterung bietet einen eingebauten MQTT-Server, der entweder direkt genutzt oder wie bei mir über ein Broker-to-Broker-Setup mit einem externen Broker verbunden werden kann. Die Konfigurationsdatei für das Broker-to-Broker-Setup sieht beispielsweise so aus:

# connection dimplex
connection dimplex
address 192.168.x.x:61894
remote_username mqtt
remote_password <password>
try_private true
bridge_insecure true

topic # out 0
topic # in 0

In unserem Setup nutzen wir einen Mosquitto-Broker auf Proxmox in einem LXC-Container und empfehlen, diesen für mehr Flexibilität zu verwenden.

Derzeit nutze ich nur die Informationen aus der Wärmepumpe, die Steuerung werde ich zu einem späteren Zeitpunkt einrichten.


Schritt 1: MQTT in Home Assistant aktivieren

Stellen Sie sicher, dass der MQTT-Integration in Home Assistant aktiviert ist. Dies erfolgt über die configuration.yaml oder über die Benutzeroberfläche von Home Assistant.

Beispiel für die configuration.yaml:

mqtt:
  broker: 192.168.x.x  # IP-Adresse des MQTT-Brokers
  username: mqtt
  password: <password>

Starten Sie Home Assistant neu, um die Änderungen zu übernehmen.


Schritt 2: YAML-Konfiguration der Sensoren

Um die Daten der Wärmepumpe in Home Assistant anzuzeigen, fügen Sie die Sensoren in der configuration.yaml hinzu. Hier ist eine Übersicht wichtiger Sensoren:

  sensor:
    - name: "Wärmepumpe Außentemperatur (R1)"
      unique_id: '1301a_temperature'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1301a'] }}"
      unit_of_measurement: "°C"
      device_class: temperature
      qos: 1
    - name: "Wärmepumpe Temperatur Ruecklauf (R2)"
      unique_id: '1294a_temperature'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['1294a']['value_batch']['1294a']['value'] }}"
      unit_of_measurement: "°C"
      device_class: temperature
      qos: 1
    - name: "Wärmepumpe Temperatur Vorlauf (R9)"
      unique_id: '1300a_temperature'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['1300-1301a']['value_batch']['1300a']['value'] }}"
      unit_of_measurement: "°C"
      device_class: temperature
      qos: 1
    - name: "Wärmepumpe Temperatur Warmwassersoll"
      unique_id: '1042i_temperature'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1042i'] }}"
      unit_of_measurement: "°C"
      device_class: temperature
      qos: 1
    - name: "Wärmepumpe Temperatur Warmwassersoll Max"
      unique_id: '1044i_temperature'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1044i'] }}"
      unit_of_measurement: "°C"
      device_class: temperature
      qos: 1
    - name: "Wärmepumpe Temperatur Warmwassersoll Min"
      unique_id: '1045i_temperature'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1045i'] }}"
      unit_of_measurement: "°C"
      device_class: temperature
      qos: 1
    - name: "Wärmepumpe Temperatur Warmwasser (R3)"
      unique_id: '1305a_temperature'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['1305a']['value_batch']['1305a']['value'] }}"
      unit_of_measurement: "°C"
      device_class: temperature
      qos: 1      
    - name: "Wärmepumpe Status (Telemetry)"
      unique_id: '530u_status_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['530i'] }}"
      qos: 1         

    - name: "Wärmepumpe Sperrmeldungen (Telemetry)"
      unique_id: '533i_sperrmeldungen_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['533i'] }}"
      qos: 1        

    - name: "Wärmepumpe Störmeldungen (Telemetry)"
      unique_id: '531i_stoermeldungen_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['531i'] }}"
      qos: 1        

    - name: "Wärmepumpe Sensorfehler (Telemetry)"
      unique_id: '532i_sensorfehler_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['532i'] }}"
      qos: 1        
      
    - name: "Wärmepumpe Status"
      unique_id: '530i_status'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['530-533i']['value_batch']['530i']['value'] }}"
      qos: 1   
 
    - name: "Wärmepumpe Verdichter 1"
      unique_id: '1500d_status_telemetry'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['1500d']['value_batch']['1500d']['value'] }}"
      qos: 1

    - name: "Wärmepumpe Verdichter 2"
      unique_id: '1501i_status_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1501i'] }}"
      qos: 1

    - name: "Wärmepumpe Ventilator (M2)"
      unique_id: '1502d_status_telemetry'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['1502-1505d']['value_batch']['1502d']['value'] }}"
      qos: 1

    - name: "Wärmepumpe Primärpumpe (M11)"
      unique_id: '1506d_status_telemetry'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['1505-1507d']['value_batch']['1506d']['value'] }}"
      qos: 1

    - name: "Wärmepumpe Heizungspumpe (M13)"
      unique_id: '1512d_status_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1512d'] }}"
      qos: 1

    - name: "Wärmepumpe Warmwasserpumpe (M18)"
      unique_id: '1517d_status_telemetry'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['1516-1517d']['value_batch']['1517d']['value'] }}"
      qos: 1

    - name: "Wärmepumpe Zusatzumwälzpumpe (M16)"
      unique_id: '1516d_status_telemetry'
      state_topic: "gateway/broadcast/changed_on/modbus"
      value_template: "{{ value_json['1516-1517d']['value_batch']['1516d']['value'] }}"
      qos: 1

    - name: "Wärmepumpe Heizungspumpe (M15)"
      unique_id: '1514d_status_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1514d'] }}"
      qos: 1

    - name: "Wärmepumpe Sammelstörmeldung (H5)"
      unique_id: '1523d_status_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1523d'] }}"
      qos: 1

    - name: "Wärmepumpe Heizungspumpe (M20)"
      unique_id: '1515d_status_telemetry'
      state_topic: "extern/broadcast/twin_reported_state"
      value_template: "{{ value_json.telemetry['1515d'] }}"
      qos: 1

Weitere Sensoren, wie für Warmwassersolltemperaturen, Sperrmeldungen oder Pumpenstatus, können auf ähnliche Weise hinzugefügt werden. Ich habe noch nicht alle Werte zu 100% geprüft und je nach ausstattung der Wärmepumpe z.B. mit 2. Heizkreislauf, Solar oder Schwimbad anbindung gibt es auch noch mehr Werte die Interessant sein können. Dazu kann man die Adressen auf der Wiki Seite von Dimplex nachschlagen.

Hier ist eine detaillierte Erklärung der einzelnen Elemente anhand des Beispielsensors „Wärmepumpe Außentemperatur (R1)“:


YAML-Abschnitt:

sensor:
  - name: "Wärmepumpe Außentemperatur (R1)"
    unique_id: '1301a_temperature'
    state_topic: "extern/broadcast/twin_reported_state"
    value_template: "{{ value_json.telemetry['1301a'] }}"
    unit_of_measurement: "°C"
    device_class: temperature
    qos: 1

1. sensor

Die oberste Ebene definiert einen oder mehrere Sensoren. In diesem Fall wird eine Liste von Sensoren definiert, daher wird ein - verwendet, um den einzelnen Sensor zu beschreiben.


2. name

name: "Wärmepumpe Außentemperatur (R1)"
  • Beschreibung: Der Anzeigename des Sensors, der in der Benutzeroberfläche von Home Assistant erscheint.
  • Empfehlung: Wählen Sie einen klaren und eindeutigen Namen, um den Sensor einfach zu identifizieren.

3. unique_id

unique_id: '1301a_temperature'
  • Beschreibung: Eine eindeutige ID für den Sensor. Sie ermöglicht es Home Assistant, den Sensor auch nach Änderungen in der Konfiguration wiederzuerkennen.
  • Hinweis: Verwenden Sie eine konsistente Struktur, idealerweise basierend auf der Datenquelle. Hier wurde der Modbus-Registercode 1301a verwendet, ergänzt durch _temperature zur besseren Lesbarkeit.

4. state_topic

state_topic: "extern/broadcast/twin_reported_state"
  • Beschreibung: Das MQTT-Topic, aus dem der Sensor seine Daten bezieht.
  • Beispiel: In diesem Fall hört der Sensor auf Nachrichten im Topic extern/broadcast/twin_reported_state.
  • Wichtig: Die Topics müssen exakt mit denen übereinstimmen, die die NWPM-Baugruppe sendet.

5. value_template

value_template: "{{ value_json.telemetry['1301a'] }}"
  • Beschreibung: Ein Template, um die empfangenen Daten aus dem MQTT-Payload zu extrahieren.
  • Details:
    • value_json: Nimmt an, dass die empfangene Nachricht ein JSON-Format hat.
    • telemetry['1301a']: Greift auf das Feld 1301a innerhalb der telemetry-Struktur zu. Dieses Feld enthält den Wert für die Außentemperatur.
  • Empfehlung: Überprüfen Sie die MQTT-Nachrichtenstruktur mit Tools wie MQTT Explorer, um sicherzustellen, dass der Zugriff korrekt definiert ist.

6. unit_of_measurement

unit_of_measurement: "°C"
  • Beschreibung: Gibt die Einheit an, in der der Wert dargestellt wird.
  • Beispiel: In diesem Fall wird die Temperatur in Grad Celsius (°C) angezeigt.
  • Wichtig: Home Assistant verwendet diese Einheit auch für Konvertierungen und Darstellungen in Diagrammen.

7. device_class

device_class: temperature
  • Beschreibung: Definiert die Art des Sensors (z. B. Temperatur, Feuchtigkeit, Batterie).
  • Beispiel: Der Wert temperature signalisiert Home Assistant, dass der Sensor Temperaturdaten liefert. Dies beeinflusst, wie die Daten dargestellt werden (z. B. mit einem Thermometer-Symbol).

8. qos

qos: 1
  • Beschreibung: Die Quality of Service (QoS)-Stufe für MQTT-Nachrichten.
    • 0 (Default): Keine Zustellungsgarantie.
    • 1: Mindestens einmalige Zustellung (empfohlen für wichtige Daten).
    • 2: Genau einmalige Zustellung (weniger häufig verwendet).
  • Empfehlung: Für Sensoren, bei denen Datenintegrität wichtig ist, sollte mindestens QoS 1 verwendet werden.

Zusätzliche Hinweise zur Konfiguration

  • Validierung: Nach der Einrichtung der YAML-Datei kann die Konfiguration in Home Assistant über Einstellungen → Einstellungen prüfen validiert werden.
  • Fehlerbehebung: Falls der Sensor nicht funktioniert, überprüfen Sie:
    1. Ob MQTT-Nachrichten im definierten Topic empfangen werden (z. B. mit MQTT Explorer).
    2. Ob das value_template korrekt auf die JSON-Daten zugreift.
    3. Ob die Verbindung zum Broker korrekt eingerichtet ist.

Mit dieser detaillierten Erklärung können Sie ähnliche Sensoren für andere Werte der Wärmepumpe einrichten.


Schritt 3: Zusätzliche Status-Mappings

Um die rohen Statuswerte der Wärmepumpe besser lesbar zu machen, können Sie benutzerdefinierte Templates in YAML definieren. Ein Beispiel für das Mapping des Betriebsstatus:

  - sensor:
      - name: "Dimplex Status"
        unique_id: "dimplex_status_mapped"
        state: >
          {% set mapping = {
            0: "Aus",
            1: "Aus",
            2: "Heizen",
            3: "Schwimmbad",
            4: "Warmwasser",
            5: "Kühlen",
            10: "Abtauen",
            11: "Durchflussüberwachung",
            24: "Verzögerung Betriebsmodusumschaltung"
          } %}
          {{ mapping.get(states('sensor.warmepumpe_status_telemetry') | int, "Unbekannt") }}
  - sensor:
      - name: "Dimplex Sperrmeldungen"
        unique_id: "dimplex_Sperrmeldungen_mapped"
        state: >
          {% set mapping = {
            0: "keine Sperre",
            2: "Volumenstrom",
            5: "Funktionskontrolle",
            6: "Einsatzgrenze HT",
            7: "Systemkontrolle",
            8: "Verzögerung Umschaltung Kühlen",
            9: "Pumpenvorlauf",
            10: "Mindeststandzeit",
            11: "Netzbelastung",
            12: "Schaltspielsperre",
            13: "Warmwasser Nacherwärmung",
            14: "Regenerativ",
            15: "EVU-Sperre",
            16: "Sanftanlasser",
            17: "Durchfluss",
            18: "Einsatzgrenze Wärmepumpe",
            19: "Hochdruck",
            20: "Niederdruck",
            21: "Einsatzgrenze Wärmequelle",
            23: "System Grenze",
            24: "Last Primärkreis",
            25: "Sperre Extern",
            31: "Aufwärmen",
            33: "EvD Initialisierung",
            34: "2. Wärmeerzeuger freigegeben",
            35: "Störung (siehe Kapitel Störmeldungen)"
          } %}
          {{ mapping.get(states('sensor.warmepumpe_sperrmeldungen_telemetry') | int, "Unbekannt") }}
  - sensor:
      - name: "Dimplex Störmeldung"
        unique_id: "dimplex_stoermeldung_mapped"
        state: >
          {% set mapping = {
            0: "kein Fehler",
            1: "Fehler N17.1",
            2: "Fehler N17.2",
            3: "Fehler N17.3",
            4: "Fehler N17.4",
            6: "Elektronisches Ex.Ventil",
            10: "WPIO",
            12: "Inverter",
            13: "WQIF",
            15: "Sensorik (siehe Kapitel Sensorfehler)",
            16: "Niederdruck Sole",
            19: "!Primärkreis",
            20: "!Abtauen",
            21: "!Niederdruck Sole",
            22: "!Warmwasser",
            23: "!Last Verdichter",
            24: "!Codierung",
            25: "!Niederdruck",
            26: "!Frostschutz",
            28: "!Hochdruck",
            29: "!Temperatur Differenz",
            30: "!Heißgasthermostat",
            31: "!Durchfluss"
          } %}
          {{ mapping.get(states('sensor.warmepumpe_stormeldungen_telemetry') | int, "Unbekannt") }}
  - sensor:
      - name: "Dimplex Sensorfehler"
        unique_id: "dimplex_sensorfehler_mapped"
        state: >
          {% set mapping = {
            0: "kein Fehler",
            1: "Außenfühler (R1)",
            2: "Rücklauffühler (R2)",
            3: "Warmwasserfühler (R3)",
            4: "Codierung (R7)",
            5: "Vorlauffühler (R9)",
            6: "2. Heizkreisfühler (R5)",
            7: "3. Heizkreisfühler (R13)",
            8: "Regenerativfühler (R13)",
            9: "Raumfühler 1",
            10: "Raumfühler 2",
            11: "Fühler Wärmequellenaustritt (R6)",
            12: "Fühler Wärmequelleneintritt (R24)*",
            14: "Kollektorfühler (R23)",
            15: "Niederdrucksensor (R25)",
            16: "Hochdrucksensor (R26)",
            17: "Raumfeuchte 1",
            18: "Raumfeuchte 2",
            19: "Fühler Frostschutz-Kälte",
            20: "Heißgas",
            21: "Rücklauffühler (R2.1)",
            22: "Schwimmbadfühler (R20)",
            23: "Vorlauffühler Kühlen Passiv (R11)",
            24: "Rücklauffühler Kühlen Passiv (R4)",
            26: "Fühler Solarspeicher (R22)",
            28: "Anforderungsfühler Heizen (R2.2)",
            29: "RTM Econ",
            30: "Anforderungsfühler Kühlen (R39)"
          } %}
          {{ mapping.get(states('sensor.warmepumpe_sensorfehler_telemetry') | int, "Unbekannt") }}

Dieses Mapping wird im Frontend von Home Assistant als Klartext angezeigt und verbessert die Benutzerfreundlichkeit.


Schritt 4: Test der Integration

Nachdem die YAML-Konfiguration hinzugefügt wurde, starten Sie Home Assistant neu. Die Sensoren sollten nun in der Übersicht auftauchen. Überprüfen Sie, ob die Werte korrekt sind und sich aktualisieren.


Besonderheiten und Tipps

  • Broker-to-Broker-Setup: Wenn der direkte Zugriff auf den NWPM-MQTT-Server nicht möglich oder gewünscht ist, sorgt ein Broker-to-Broker-Setup für die Weiterleitung der Daten.
  • Debugging: Nutzen Sie Tools wie MQTT Explorer, um die Nachrichtenströme zwischen Broker und Home Assistant zu überwachen.

Mit dieser Integration können Sie die Wärmepumpe effizient in Ihre Home Assistant Umgebung einbinden und Daten für Automatisierungen und Analysen nutzen. Viel Erfolg!


Falls noch etwas fehlt oder du weitere Details ergänzt haben möchtest, lass es mich wissen!

WEMOS D1 MINI

As described in my post before i will start with a short description of the WEMOS D1 MINI, one of my first ESP8266 boards.

Basically i user the mini as test board and in varius combinations as sensor base in my home automation setup.

Basic features:

  • integrated usb-serial connector
  • integrated voltage regulator
  • powered by usb 5V or direct via pin 5V & 3.3V
  • reset button (pin RST)
  • onboard led (pin D4)
  • integrated 4MB memory
  •  

Most of my wemos i use with DHT22 or BME260 sensors and tasmota: https://github.com/arendst/Sonoff-Tasmota/wiki/Wemos-D1-Mini

Some i also use with one or two DS18B20 temperature sensors.

In all use cases i connect via mqtt and use node-red to push the mqtt values to an influxDB.

The mini has the advantage that it´s compact/small but have more exposed GPIOs like the ESP-01 for example. It´s also possible to make small setups with a connected D0 -> RST for deep sleep scenarios with very low effort while you have to soldering very small structures on the ESP-01.

Powering the mini with a 18560 battery and a deep sleep cycle of about 3600sec allows operation for several weeks or month without a fixed power source.

 

 

 

 


Links:

One of the best pinout descriptions and detail sites i know for the esp8266:

ESP8266 Pinout Reference: Which GPIO pins should you use?

 

Save Google API via Node-Red in influxDB & visualize with grafana

I was inspired by a video from Csongor Varga for a new project idea with my Node-Red. Basically he uses Node-Red for requesting the Google API and getting the travel time form home to work. My idea was then to request the data from the Google API and save them in my InfluxDB for further analytics.

I start with a Big Timer to limit the requests to a timeslot from 4:30am to 10:30am. Then i use the Switch and Join elements to limit the request to any tenth trigger. After that there is the http get with the Google API call.

For the following three change elements which extracts the values i want to save i use a json element for transforming the output of the http call.

The last join than aggregates the values to a new json which is than forwarded to the influxdb in a database called statistics.

The output than looks like this in the influxDB

> select * from travel_allach ORDER BY time DESC limit 1;
name: travel_allach
time distance duration duration_in_traffic value
---- -------- -------- ------------------- -----
1570212851482806984 60696 3331 3143
>

This is the output of the Grafana Visualization:


Links:

 

ESP Overview

Actual it´s nearly impossible to count all the variations of the actual ESP8266 and ESP32 developer boards availaible at amazon, bangoods and ali express. Neverthe less i´ll try to document some of the boards i actual use and what they´re good for in some of the next posts.  Over the time i´ve collected many of the „standard“ representatives and also some of the more unusual types. They all have in common that they´re available for hobby developer and electronics nerds.

The power supply for most of them needs  3.3V or 5V depends on if there are voltage converters included or not. The main use cases most people see in this little boards are building cheap little IoT devices on their own.

The start of my short introduction round will be the:

WEMOS D1 MINI

which was the first ESP8266 i´ve started with.

Over the time I collected several other devices, like the Sonoff Basic, Sonoff Mini, NodeMCU ESP8266, ESP01, ESP32, OBI WIFI plugs, LILYGO TTGO T-Journal ESP32, Geekcreit® ESP32-CAM WiFi + bluetooth Camera Module, HiGrow ESP32 and some others i will also try to describe and how or for what i´m using this.