Auslesen von Heizungsdaten aus einem ETA SH-2 Holzvergaser und Anzeige im Smarthomesystem Openhab 2
Notwendigkeit
Das Haus meiner Eltern wird durch einen ETA SH-20 Scheitholzvergaser beheizt. An den Holzvergaser ist ein Puffer mit 2000 Litern angeschlossen. Bei hohem Wasserverbrauch und sehr niedrigen Außentemperaturen ist der Pufferspeicher nach ca. 20 Stunden leer.
Die einzige „Benachrichtigung“, welche man bei einem leeren Pufferspeicher erhält, ist wenn es im Haus kalt wird. Nach erneuten Einheizten dauert es dann ungefähr eine Stunde bis die Heizkörper wieder warm werden.
Ziel dieses Projektes war es eine Benachrichtigung zu erhalten, wenn der Pufferladezustand unter einen gewissen Prozentsatz fällt, um rechtzeitig nachheizen zu können.
Struktur
Das System ist nur auf Datenübertragung in eine Richtung ausgelegt.
Theoretisch könnte man mit demselben Aufbau auch Befehle an die Heizung senden, dafür habe ich aber bisher keinen Anwendungsfall.
Hardware
Die folgende Hardware wurde verwendet:
- RS232 auf TTL Interface Schnittstelle mit MAX3232 Chip
-->zum übersetzten von TTL Pegeln (0V / 5V) zu RS232 Pegeln (-15V / 15V)
- WeMos D1 mini
-->zur Kommunikation mit der Heizung und weitersenden der Daten über Wlan
- RS-232 Kabel
- Stromversorgung für WeMos (5V USB Netzteil)
- Evtl. restart-Taster
-->Diesen habe ich in das Gehäuse integriert, um leichter den Micro-Controller resetten zu können, falls es zu Störungen kommen sollte (vom Strom trennen wäre jedoch genauso möglich)
Software
Im Folgenden das Programm, welches auf dem WeMos D1 mini läuft:
Anfangs werden die verwendeten Bibliotheken eingebunden und einige Konstanten festgelegt:
- Die IP-Adresse des MQTT-Servers
- Der Username auf dem MQTT-Server
- Das Password zu dem Usernamen
- Der Name des WLAN-Netzwerkes (SSID)
- Das Password für das WLAN-Netzwerk
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <MQTTClient.h>
const char* host = "MQTT_SERVER_IP";
const char* ssid = "WLAN_SSID";
const char* password = "WLAN_PASSWORD";
WiFiClient net;
MQTTClient mqtt;
byte buffer[30];
SoftwareSerial mySerial(D2, D1);
float Temperatur_Boiler;
float Temperatur_Aussen;
float Puffer_Ladezustand;
„connect“ ist eine Funktion, um die Verbindung mit dem WLAN-Netzwerk und dem MQTT-Server herzustellen
void connect() {
while(WiFi.waitForConnectResult() != WL_CONNECTED) {
WiFi.begin(ssid, password);
}
while (!mqtt.connect("Heizung",mqtt_user,mqtt_pwd)) {
mqtt.connect("Heizung",mqtt_user,mqtt_pwd);
}
}
„transmit_data“ ist zum Übertragen der Daten für die Boilertemperatur, Außentemperatur und den Pufferladezustand an den MQTT-Server da.
void transmit_data(){
if (!mqtt.connect("Heizung",mqtt_user,mqtt_pwd)) {
connect();
}
delay(1000);
mqtt.publish("Heizung/Temperatur_Boiler", String(Temperatur_Boiler));
mqtt.publish("Heizung/Temperatur_Aussen", String(Temperatur_Aussen));
mqtt.publish("Heizung/Pufferladezustand", String(Puffer_Ladezustand));
}
„request_data“ beantragt bei der Heizung die drei angefragten Werte. Der genaue Aufbau des „Request“ Arrays begründet sich aus einem Datenblatt der Firma ETA. Da ich dieses Datenblatt vermutlich nicht veröffentlichen darf, gibt es an dieser Stelle nur den Tipp, bei der Firma ETA nachzufragen, da diese sehr hilfsbereit sind und einem das Datenblatt per E-Mail zukommen lassen.
void request_data() {
byte Request[] = {'{','M','C',10,242,60,0x08,0x00,0x0d,0x08,0x00,75,0x08,0x00,70,'}'};
mySerial.write(Request,sizeof(Request));
}
„parse_data“ berechnet aus den übertragenen Bytes die Decimal Werte für die angefragten Werte.
void parse_data() {
Temperatur_Boiler = (buffer[8]*256+buffer[9]);
Temperatur_Aussen = (buffer[13]*256+buffer[14]);
Puffer_Ladezustand = (buffer[18]*256+buffer[19]);
Temperatur_Boiler = Temperatur_Boiler/10;
Temperatur_Aussen = Temperatur_Aussen/10;
}
„stop data“ wird verwendet, um der Heizung mitzuteilen, dass sie keine Daten mehr senden soll.
void stop_data() {
byte Command[] = {'{','M','E',0,0,'}'};
mySerial.write(Command,sizeof(Command));
}
Der „setup“ code wird einmalig beim start des Micro-Controllers ausgeführt, stellt die gewünschten Verbindungen her und fragt mithilfe der „request_data“ Funktion die Werte bei der Heizung an.
void setup() {
mySerial.begin(19200);
Serial.begin(19200);
delay(2000);
stop_data();
delay(6000);
request_data();
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
mqtt.begin(host, net);
connect();
}
Die „loop“ Funktion wird endlos ausgeführt. In dieser wird auf neue Daten von der Hetzung gewartet, die Daten ausgelesen, berechnet und an den MQTT-Server gesendet.
void loop() {
while (mySerial.available() == 0) {}
mySerial.readBytesUntil('}',buffer,30);
parse_data();
transmit_data();
delay(10000);
}
Hier kann der komplette Code heruntergeladen werden!
Smarthomesystem
Openhab, InfluxDB und Grafana
***Comming soon*** 