Mit der Heizungssteuerung reden

Posted on Mo 22 April 2024 in Computer & Electronics

Wie Ihr in vergangenen Posts lesen konntet, habe ich bereits meinen Gaszähler in meine Heimüberwachung integriert. Das ist sehr praktisch, um den Verbrauch zu überwachen. Aber eigentlich wäre es doch schön, auch etwas mehr über die Einstellung der Heizung selbst zu erfahren, denn moderne Heizungen haben natürlich eine digitale Steuerung und es wäre doch toll, die anzapfen zu können.

Und man kann! Im Zwischennetz bin ich schon vor einer ganzen Weile auf das BSB-LAN Projekt gestoßen, das genau das für viele gängige Heizungen realisiert. Und das wollen wir uns heute mal genauer ansehen.

Offenbar verwenden viele Hersteller sehr ähnliche Steuergeräte und die bieten eine Schnittstelle namens Boiler-System-Bus (BSB). Das scheint im Wesentlichen ein serielles Interface zu sein und alles was fehlt ist ein Adapter, um am Ende UART Signal-Pegel zu bekommen und eine Software, die das dazugehörige Protokoll beherrscht. Und genau das ist BSB-LAN.

Hardware

Eine Adapterplatine hatte ich schon vor längerer Zeit mal vom Autor bestellt. Deswegen habe ich die V2. Aktuell wäre V4.3, aber der Funktion tut das keinen Abbruch. Also los geht's. Zunächst mal die Adapterplatine bestücken, alles schön verlöten und nicht vergessen, sie für 3.3V zu jumpern (ESP!). Dann ein paar Pin-header auf den Adapter löten für die Verbindung zum Mikrocontroller-Board.

Ursprünglich wurde die Firmware für Arduino entwickelt, aber auch ESP32 wird unterstützt und so nehme ich lieber das. Konkret nehme ich so ein ESP Devkit v1 Modul, von denen ich noch einige in der Bastelkiste habe.

Das Ganze bauen wir in ein kleines Gehäuse ein. Mit der üblichen Methode: Plastik-Distanzhülsen anschrauben, Plastikkleber drauf und ins Gehäuse drücken. Leider gab es dabei ein Problem: die blöde ESP32-Devkit Platine hat zwar vier schöne Löcher, aber zwei davon sind nicht nutzbar, weil die beiden kleinen Taster so nah dran sind, dass kein Platz für die Schraubenköpfe bleibt. Grumpf! Also mussten die Taster weichen. Die brauche ich eh nicht. Und wenn doch kann man was anlöten, oder das mit einer Pinzette kurzschließen. Für den ESP32 nehmen wir Nylon-Schrauben, weil zumindest zwei davon direkt neben der Antenne sind und Metall dort Ärger machen kann.

Nun also einkleben und warten, bis der Kleber fest ist.

Nun Platinen kurz wieder ausbauen und Löcher ins Gehäuse machen, damit das USB-Kabel und eine Signalleitung für den Anschluss an die Heizung durchpassen.

Firmware bauen

Es gibt ein ausführliches Handbuch zur Soft- und Hardware. Ich gebe hier trotzdem mal meinen Installationsprozess wieder.

Erstmal das Repository clonen (alternativ ein Release-Zip herunterladen.):

git clone https://github.com/fredlcore/BSB-LAN.git --depth=1

Und dann ins Quellverzeichnis wechseln und dort die beiden *.default Dateien umbenennen:

cd BSB_LAN/BSB_LAN
mv BSB_LAN_custom_defs.h.default BSB_LAN_custom_defs.h
mv BSB_LAN_config.h.default BSB_LAN_config.h

In BSB_LAN_config.h müssen wir nun noch das WLAN aktivieren und SSID und Passwort setzen. Beides kommt ziemlich weit oben in BSB_LAN_config.h:

uint8_t network_type = WLAN;

und ein paar Zeilen später:

char wifi_ssid[32] = "YourWiFiNetwork"; // enter your WiFi network name (SSID) here
char wifi_pass[64] = "YourWiFiPassword";// enter your WiFi password here

Damit ist das ganze erstmal konfiguriert und wir können die Firmware bauen. Dazu brauchen wir die Arduino IDE. Schnell noch das ESP Board via USB-Kabel an den Computer anschließen und

arduino BSB_LAN.ino

In der GUI müssen wir nun das korrekte Board auswählen (tools > board > ESP32 > ESP32 Dev Module), sowie das korrekte serial device (tools > Port > ttyUSB0) und die Baudrate (tools > Upload Speed > 115200).

Nun sollte alles richtig eingestellt sein und wir können complieren und flashen (Sketch > Upload). Und wenn alles gutgegangen ist, dann sollten wir ihn über die serielle Schnittstelle belauschen können:

❯ cu -l /dev/ttyUSB0 -s 115200 
Microcontroller: ESP32/NodeMCU
Using RX/TX pins 16, 17
Bus type defined in config: BSB
PPS settings:
Starting network connection via WiFi/WLAN
...
Setting up WiFi interfaceNetwork-Event 2
......Network-Event 4
Network-Event 7
.
Start scanning for SSID philnet
Network-Event 5
Network-Event 1
Scan done.2 networks found:
0: BSSID: 3C:37:86:6E:15:A2  -51dBm,  98%  encrypted  philnet
1: BSSID: B0:39:56:E4:E5:E5  -81dBm,  38%  encrypted  philnet
SSID match found at 0. Connecting...
Attempting to connect to WPA SSID: philnetNetwork-Event 4
Network-Event 7

You're connected to the network:
SSID: philnet
BSSID: 3C:37:86:6E:15:A2
IP Address: 192.168.0.43
Signal strength (RSSI): -51Bm
Waiting 3 seconds to give Ethernet shield time to get ready...
Trying to get NTP time...
[...]

Und schon ist er per Ping erreichbar

❯ ping 192.168.0.43
PING 192.168.0.43 (192.168.0.43) 56(84) bytes of data.
64 bytes from 192.168.0.43: icmp_seq=1 ttl=255 time=233 ms
64 bytes from 192.168.0.43: icmp_seq=2 ttl=255 time=256 ms
64 bytes from 192.168.0.43: icmp_seq=3 ttl=255 time=278 ms

Und nun kann man mit dem Browser die IP-Adresse aufrufen (achtung: nur http, kein https!):

Die Inhalte kann ich Euch noch nicht zeigen, denn wir haben uns ja noch nicht mit der Heizungssteuerung verbunden. Und das holen wir jetzt nach.

An die Heizung anschließen

Für die ersten Tests verwenden wir die Diagnostik-Buchse an der Front:

Die Pinbelegung (von oben nach unten) lautet:

Pin Signal
Pin 1 ?
Pin 2 CL+
Pin 3 CL-
Pin 4 ?

Also improvisieren wir schnell ein Kabel und stecken es hier an.

Den ESP versorgen wir direkt vom Laptop über USB, dann können wir auch gleich schauen, was passiert. Also:

  • Heizung aus
  • Adapter an die Buchse an die Heizung anschließen
  • Heizung wieder an und schnell auf Empfang gehen:
❯ cu -l /dev/ttyUSB0 -s 115200
Connected.
HFEPROM option 59: 2050
Size of cmdtbl: 3752
free RAM: 251948
BSB-LAN version: 3.4.4-20240331020948
Microcontroller: ESP32/NodeMCU
Using RX/TX pins 16, 17
Bus type defined in config: BSB
PPS settings:
Starting network connection via WiFi/WLAN
...
Setting up WiFi interfaceNetwork-Event 2
.....Network-Event 4
Network-Event 7
.
Start scanning for SSID philnet
Network-Event 5
Network-Event 1
Scan done.4 networks found:
0: BSSID: B0:39:56:E4:E5:E5  -76dBm,  48%  encrypted  philnet
1: BSSID: B0:39:56:E4:E5:EE  -78dBm,  44%  encrypted  philnet
2: BSSID: 5E:49:79:6C:62:67  -81dBm,  38%  encrypted  FritzAM Gastzugang
3: BSSID: 5C:49:79:6C:62:67  -82dBm,  36%  encrypted  FritzAM
SSID match found at 0. Connecting...
Attempting to connect to WPA SSID: philnetNetwork-Event 4
Network-Event 7

You're connected to the network:
SSID: philnet
BSSID: B0:39:56:E4:E5:E5
IP Address: 192.168.0.43
Signal strength (RSSI): -77Bm
Waiting 3 seconds to give Ethernet shield time to get ready...
Trying to get NTP time...
Date and time acquired: 03.04.24 22:10:07
Device family: 162
Device variant: 5
Start network services
Starting MDNS service with hostname BSB-LAN
Setup complete
DSP1->FUNK QUR      053D0064 
DC 8A 32 0B 06 3D 05 00 64 8F 8C
HEIZ->ALL  INF      05000219 02 6F 00 00 1E 84 FF FF FF FF 00 0C
DC 80 7F 17 02 05 00 02 19 02 6F 00 00 1E 84 FF FF FF FF 00 0C 1E 34
HEIZ->EM1 INF      05040254 00 00 00 64 00 00 00 64 00 00 00 00 00 00 00 00
DC 80 03 1B 02 05 04 02 54 00 00 00 64 00 00 00 64 00 00 00 00 00 00 00 00 AA 11
DSP1->FUNK QUR      053D0064 
DC 8A 32 0B 06 3D 05 00 64 8F 8C
HEIZ->ALL  QINF      05000229 
[...]

Und schon bekommen wir auch im Web-Interface was zu sehen:

Cool!

Konfiguration

Nun ist es an der Zeit, mal unsere Heizung zu befragen, was sie so alles an Parametern unterstützt und dann eine entsprechend angepasste Konfiguration zu basteln. Dazu geht man im Web-Interface auf Reglerspezifische Parameterliste und dort auf Download. Das dauert gefühlt ewig (etliche Minuten) – also nicht die Geduld verlieren. Am Ende hat man dann eine Textdatei mit jeder Menge Hex Codes drin. Um daraus eine funktionierende Konfiguration für die Firmware zu bauen, muss man sie an die Autoren der Software senden und die Konvertieren das dann...

... und zwar wie der Wind. Schon Tags drauf hatte ich mein selbstpersönliches BSB_LAN_custom_defs.h File. Cool!

Also in den source Ordner kopieren, Firmware neu complieren und flashen. Wieder an die Heizung anschließen und einen Blick ins Web interface werfen. Wow! Nun haben ich Zugriff auf eine gefühlte Million Parameter:

Jede Zeile repräsentiert ein weiteres Menü in dem man dann einen Haufen Parameter angezeigt bekommt und teils auch verändern kann. Allerdings beschränke ich mich fürs Erste auf Daten-Lesen, bevor ich mich traue, an irgendwelchen Werten rumzudrehen, deren Bedeutung ich momentan noch nicht verstehe.

In Homeasistant einbinden

Nun ist es an der Zeit, das Ganze in Homeassistant einzubinden. Und tatsächlich gibt es eine BSB-LAN Integration. Leider ist das kein guter Weg, denn diese Integration unterstützt nur uralte Versionen der BSB-LAN Firmware. Aber das macht nix, denn BSB-LAN spricht MQTT und so müssen wir nur die Zugangsdaten für unseren MQTT-Server konfigurieren und schon haben wir einen Kommunikationsweg. Details dazu gibt es wieder im BSB-LAN Handbuch. Das logging-Format setze ich auf Rich JSON und die logging Periode auf 60s. Dann noch die gewünschten Parameter auswählen:

Schnell auf Speichern drücken und schon kann es losgehen. Also gleich mal lauschen:

❯ mosquitto_sub -h hal -u phil -P verysecretpassword -t 'BSB-LAN/#' -v
BSB-LAN/status online
BSB-LAN/json {"BSB-LAN":{"id":8700,"name":"Aussentemperatur","value": "4.6","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8743,"name":"Vorlauftemperatur Istwert Heizkreis 1","value": "33.4","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8773,"name":"Vorlauftemperatur Istwert Heizkreis 2","value": "---","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8314,"name":"Rücklauftemperatur-Istwert","value": "55.1","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8310,"name":"Kesseltemperatur-Istwert","value": "65.2","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":6700,"name":"Fehlermeldung","value": "000000000000000000000000","desc": "","unit": "","error": 260}}
BSB-LAN/json {"BSB-LAN":{"id":8830,"name":"Trinkwassertemperatur-Istwert Oben (B3)","value": "48.8","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8700,"name":"Aussentemperatur","value": "4.6","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8743,"name":"Vorlauftemperatur Istwert Heizkreis 1","value": "33.4","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8773,"name":"Vorlauftemperatur Istwert Heizkreis 2","value": "---","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8314,"name":"Rücklauftemperatur-Istwert","value": "55.2","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":8310,"name":"Kesseltemperatur-Istwert","value": "65.0","desc": "","unit": "°C","error": 0}}
BSB-LAN/json {"BSB-LAN":{"id":6700,"name":"Fehlermeldung","value": "000000000000000000000000","desc": "","unit": "","error": 260}}
BSB-LAN/json {"BSB-LAN":{"id":8830,"name":"Trinkwassertemperatur-Istwert Oben (B3)","value": "48.8","desc": "","unit": "°C","error": 0}}

Sehr schön – das ist doch erfreulich! Aber nun setzen wir das Logging-Format wieder zurück auf Plain Text, denn das ist in HASSIO einfacher zu konfigurieren.

BSB-LAN/status online
BSB-LAN/8700 5.7
BSB-LAN/8743 37.9
BSB-LAN/8773 ---
BSB-LAN/8314 53.0
BSB-LAN/8310 58.8
BSB-LAN/6700 000000000000000000000000
BSB-LAN/8830 47.4

Nun müssen wir noch entsprechende Sensoren für HASSIO anlegen:

mqtt:
  sensor:
    - name: "Aussentemperatur"
      state_topic: "BSB-LAN/8700"
      unit_of_measurement: "°C"
    - name: "Ionisationsstrom"
      state_topic: "BSB-LAN/8329"
      unit_of_measurement: "µA"
    - name: "Kesseltemperatur"
      state_topic: "BSB-LAN/8310"
      unit_of_measurement: "°C"
    - name: "Vorlauftemperatur HK1"
      state_topic: "BSB-LAN/8743"
      unit_of_measurement: "°C"
    - name: "Vorlauftemperatur HK2"
      state_topic: "BSB-LAN/8773"
      unit_of_measurement: "°C"
    - name: "Rücklauftemperatur"
      state_topic: "BSB-LAN/8314"
      unit_of_measurement: "°C"
    - name: "Trinkwassertemperatur"
      state_topic: "BSB-LAN/8830"
      unit_of_measurement: "°C"
    - name: "BSB Fehler"
      state_topic: "BSB-LAN/6700"

Und schon können wir das in Hassio verwenden. Erstmal alle Sensoren in eine Karte im Dashboard einbinden:

Und dort kann man dann auch auf den Verlauf zugreifen:

Finalisieren

Nun da alles funktioniert, bleiben noch ein paar Aufräumarbeiten. Z.B. sollten wir die Hardware nun richtig mit der Steuerung verbinden, anstatt die Service-Buchse zu verwenden. Zunächst suchen wir mal das Steuergerät. Also Haube runter und umschauen. Zuerst muss nun die Schraube oben in der Mitte raus:

Und dann kann man die Steuereinheit herunterklappen:

Seitlich sind dann je zwei Klipps rechts und links. Die muss man lösen und dann geht die Rückseite ab und man bekommt freie Sicht auf das Steuergerät:

Die beiden mit FB beschrifteten Buchsen oben links sind unser Ziel. Hier kommt der Bus raus. Und die Steckerbelegung steht freundlicherweise auf dem Aufkleber, der auf der Rückwand war:

Kabelschuhe tun es, aber ich habe mir einen richtigen Stecker bestellt und installiert:

Nun noch das Kabel durch die Gummi-Durchführung stopfen, rein in unser Projektgehäuse und an den BSB-LAN Adapter anklemmen. Kabelbinder als Zugentlastung fest draufzurren – fertig.

Fazit

BSB-LAN ist wirklich cool! Ich bin schon sehr gespannt darauf, diverse Heizungsparameter langfristig im Blick zu haben und vielleicht kann man darauf aufbauend ja sogar ein bisschen den Energieverbrauch optimieren. Noch überblicke ich die Vielzahl der Parameter nichtmal ansatzweise, aber ich werde mich nun Stück für Stück durch die Liste wühlen – immer auf der Suche nach etwas interessantem.