Vor ca. 2 Jahren habe ich meine erst Lösung hier vorgestellt. Ich habe mit einer sogenannten WiFiSerialBridge die Infrarotschnittstelle der Heizung angesteuert. Dazu war aber eine Art Backend nötig, damit ich die entsprechenden ByteCodes an die Schnittstelle senden konnte. Der Mikrocontroller hat in der Variante nichts weiter gemacht als die Bytes von WiFi auf seriell (Infrarot) und zurück zu senden.
bertmelis hat sich jedoch die Arbeit gemacht und das Kommunikationsprotokoll der Heizung in eine flexible aber auch einfache Library für ESP8266 and ESP32 gepackt. Das Schmuckstück nenn sich VitoWiFi.
In Kombination mit MQTT möchte ich nun etwas eleganter die Heizungsdaten an EDOMI senden.
An der Hardware hat sich technisch nichts verändert. Ich nutze immer noch einen 10 KOhm und einen 180 Ohm Widerstand, einen IR-Transistor (SFH 309 FA) und eine IR-LED (SFH 487P OSO). Das ganze Konstrukt habe ich aber diesmal etwas sauberer und kompakter auf eine Lochrasterplatine gelötet. Dazu habe ich mir im 3D-Drucker eine Halterung gedruckt.
Blender- und STL-Dateien zum Download
Die Halterung ist sicherlich noch verbesserungsfähig, aber hält alles zuverlässig am Platz.
Programmiert habe ich das Ganze wie immer in VS Code mit Platform.IO Plugin. Das Projekt habe ich auf Github hochgeladen:
https://github.com/empty88/OptoLink
Alle 10 Sekunden werden insgesamt 42 Werte gelesen und an einen MQTT-Broker gesendet. Die Fehlercodes der Heizungsanlage werden in lesbare Fehlermeldungen umgewandelt.
Hi eMpTy,
danke für die tolle Umsetzung, möchte ich 1:1 von dir übernehmen. Leider kann ich nicht kompilieren, bekomme fehler wegen Softwareserial -> Hardwareserial. Habe auch ein Issue im Github geöffnet. Kannst du mir helfen?
Danke
Hi Dominic,
den Issue habe ich gesehen. Weiß auch schon, warum du nicht kompilieren kannst. Hatte noch keine Zeit das anzupassen.
Kurze Info vorab: Ich musste bei mir VitoWiFi an wenigen Stellen anpassen, damit es mit SoftwareSerial funktioniert.
Mehr dazu später 😉
Viele Grüße
eMpTy
Musste noch die OptolinkKW.cpp und .hpp identisch anpassen. Läuft. Vielen Dank. Hatte mich auch in die Richtung vorgetastet, aber irgendwo noch was übersehen, und wenn die Erfahrung fehlt ist man sich nicht so sicher ob man nicht auf dem Holzweg ist. Gruß
Danke für den Hinweis, habe noch einen Commit nachgeschoben.
Hoffe bei dir klappt dann jetzt alles!
Hi Dominic,
habe das Projekt auf Github angepasst.
Build sollte jetzt gehen.
Viele Grüße
eMpTy
Hi eMpTy,
wollte das Protokoll auf KW umstellen, leider bekomme ich dann beim Build einen Fehler, hast du zufälligerweise eine Idee woran es liegen kann?
Grüße Zwi!
Hi Zwi,
du musst das Protokoll in beiden Dateien anpassen:
viessmann.h
viessmann.cpp
Dann sollte es gehen.
Viele Grüße
eMpTy
Hi eMp Ty,
ich habe das Projekt gerade nachgebaut, bislang lief eine andere Software (auf Basis der gleichen lib) auf meinem ESP.
Ich hätte eine Anmerkung und eine Frage zu deiner Version:
1. die Warmwasser-Solltemperatur wird bei mir als 4,5°C statt 45°C übertragen, ich vermute, es müsste der Datentyp DPTempS angewendet werden -> eine Anpassung viessmann.cpp blieb aber ohne Effekt.
2. meine Anlage hat zwei Heizkreise und ich würde gerne die jeweiligen Soll-Raumtemperaturen sehen.
3. da ich keine Solarthermie nutze, brauchen diese Datenpunkte auch nicht abgefragt werden.
Kurzum, ich habe auch in der viessmann.cpp ein paar Zeilen eingefügt und andere auskommentiert, was aber ebenfalls ohne Effekt blieb.
Ich hab mich durch den Code gegraben, aber das ist für mich zu hohe Programmierkunst. Wärst du so nett, mich mit der Nase drauf zu schubsen? 🙂
Danke und Gruß
Maren
Hi Maren,
zu 1: DPTemp liest 2 bytes und teilt den Wert durch 10 (conv2_10_F), DTempS liest nur 1 byte teilt den Wert nicht, und gibt nur ganze Zahlen zurück (conv1_1_US). Daher hättest du schon einen Unterschied bemerken müssen. Wenn der Wert trotzdem nicht passt, hast du folgende zwei Möglichkeiten:
zu 2: Die Adressen zu diesen Datenpunkten habe ich nicht parat. Guck mal hier ob du fündig wirst.
zu 3: wenn du Datenpunkte nicht benötigst, kannst du diese oben in der viessmann.cpp löschen/auskommentieren und in der function setupVito(), wenn vorhanden, das setzen des CallbackHandlers auf den Datenpunk löschen/auskommentieren.
Viele Grüße
eMpTy
Hi eMp Ty,
danke für die schnelle Antwort!
DPTempS ist die richtige Funktiont, mit der anderen Firmware bekomme ich damit korrekte 45°C zurück. Ich habe jetzt nur Zeile 19 in der viessmann.cpp angepasst – ohne Auswirkung.
Die Adresse habe ich alle, das ist kein Problem.
Ich habe in der viessmann.cpp genau diese Datenpunkte ergänzt und rund um Zeile 30 den ganzen Solar-spezifischen Kram auskommentiert. Seltsamerweise hatte beides null Einfluss!?
Was ich noch nicht ganz verstanden habe, ist wo im Programm die Abfrage der einzelnen Messwerte/Datenpunkte getriggert wird.
Im anderen Programm musste ich a) die Datenpunkte mit Typ und Adresse angeben und dann noch den Callbackhandler explizit für jeden Datenpunkt aufrufen. Das machst du ja nicht, nur für eine kleine Anzahl an Datenpunkten. Ergo, der Rest muss irgendwo anders aufgerufen werden und das habe ich noch nicht kapiert..
Hi Maren,
ich nutze setGlobalCallback. Der dort definierte CallbackHandler wird für alle Datenpunkte verwendet. Außer bei den Datenpunkten, wo ich explizit einen Anderen verwende. Bei Temperaturen habe ich zum Beispiel immer den tempCallbackHandler gesetzt, damit bekommt man dann auch Werte mit Nachkommastellen.
Viele Grüße
eMpTy
Ich finde das Projekt mega spannend und werde es kommendes Wochenende umsetzen! Zwei Fragen habe ich:
1. Sind 10 Sek. nicht zu häufig zum abfragen? Habe mal irgendwo gelesen dass die Heizung durch zu häufige Abfragen „durcheinander“ kommen kann.
2. Wenn ich es verstanden habe, dann fragst du Werte nur ab. Steuern tust du es aber nicht, richtig?
Habe schon selbst einen NodeMCU mit VitoWifi laufen, aber teilweise habe ich festgestellt, dass Werte ab und zu mal falsch übermittelt werden. Deine Lösung wirkt erstmal schöner und es sind wesentlich mehr Werte verfügbar.
Hi Fit,
zu 1.: Ich habe jetzt seit 2 Jahren keine Probleme mit der Abfrage alle 10 Sekunden. Nach einem Stromausfall konnte die Heizung anfangs nicht starten solange das Lesemodul aufgesteckt war. Das habe ich aber durch eine Pause von 60 Sekunden nach einem fehlgeschlagenen Leseversuch gelöst.
zu 2.: Richtig, ich frage nur ab, bisher habe ich keine Notwenigkeit dazu gesehen. Funktionieren sollte es bei entsprechender Umsetzung.
Fehlerhafte Werte hatte ich bisher noch nie, das läuft ziemlich gut.
Viele Grüße
eMpTy
Danke für die Reckmeldung.
Leider verzweifle ich gerade mein Gerät auszulesen. Anstelle eines D1 Mini nutze ich einen NodeMCU 12E … verbunden ist mein Lesekopf direkt an RX und TX.
Wenn ich es richtig erkenne, dann sprichst du mit:
swSer.begin(4800, SWSERIAL_8E2, D2, D1);
den D2 und D1 des Wemos an. Diese entferne ich bei mir, um RX und TX direkt anzusprechen…
Aber es will einfach nicht. Mein Log wird mit „Skipped…“ gespamt, was laut deinem Code für fehlende Daten steht.
Was mach ich falsch? 🙁
Hat sich erledigt. D2 und D1 mussten bei mir gegen D9 und D10 ersetzt werden! 🙂
Ich hatte mit RX und TX auch meine Probleme. Vermutung waren interne Widerstände an den Pins. Daher habe ich bei mir mit SoftwareSerial D1 und D2 verwendet. Super, dass es jetzt bei dir geklappt hat!
Versuche das ganze ans laufen zu bringen aber es kalppt nicht.
Bitte Bild von Schaltschema einfügen, ich mache irgendwas falsch. Danke
Hi Jean,
Schaltschema findest du im Wiki von openv hier
Lies dir auch mal meinenersten Blogeintrag und die Kommentare durch.
Vielleicht wirst du fündig.
Viele Grüße
eMpTy
Danke für die schnelle Antwort.
dieses Schaltschema passt aber leider nicht zu der Software serial variante.
hier wie ich es angeschlossen habe
3,3V |–>180R–>Anode IR Led 800nm Kathode –> D1 Softwareserial TX
|
|–>10K–Kollektor Fototransistor Emitor |–> GND
|
|–D2 Sofwareserial RX
Sind die Widerstände falsch?
Welche Werte haben Sie verwendet?
Wo liegt mein Fehler?
Danke für ihre Hilfe
Da hast du Recht, da ich ja auch Folgendes in meinem ersten Blogbeitrag geschrieben habe:
Welche Pins du wie verwendest, steht dir frei. Du könntest auch D7 und D8 nehmen, musst das nur mit SoftwareSerial auch so angeben und natürlich entsprechend anschließen.
Widerstandswerte findest du genauso im Text wie den Typ der IR LED und den Typ des IR Fototransistors. Ich kann natürlich nichts dazu sagen, falls du andere Bauelemente nutzen solltest.
Vielleicht solltest du erstmal mit einer Handykamera prüfen ob deine Schaltung per IR sendet. Das Blinken der LED muss sehr deutlich sichtbar sein. Auf der anderen Seite kannst du prüfen ob du denn den Heartbeat (P300: alle 2s 0x05), der von der Heizung gesendet wird, über SoftwareSerial sehen kannst. Info dazu findest du auch im Wiki von openv
Ich bekomme jetzt Daten heraus über MQTT.
jedoch nur Abgastemperatur, Aussenteperatur, Betriebsstunden,LadespeicherObenTemp und error.
Wo kann ich einstellen was über MQTT ausgegeben wird?
Es ist auch keine Webseite mit Daten vorhaden wie auf ihren Schreeenshot.
im vorrausbesten Dank.
Das klingt ja schonmal gut!
Die verwendeten Adressen sind für das Modell VScotHO1, daher kann es sein, dass du für manche Werte andere Adressen nehmen musst.
Da kann ich auch wieder das Wiki vom openv Projekt empfehlen.
Adressen
Wenn du die aktuelle Version verwendest, sollten alle Werte, die erfolgreich von der Heizung empfangen wurden, automatisch per MQTT gesendet und im Webinterface aufgelistet werden.
Konfigurieren brauchst du nur die Datenpunkte in der viessmann.cpp, falls die nicht passen sollten.
Ich habe folgendes festgestellt.
Ich bekomme ungefähr 1 Minute lang alle Werte
danach werden nur mehr die oben genannte Werte ausgegeben.
Protokoll ist KW
irgendeine Idee woran das leigen könnte.
Danke für ihre Hilfe
Hallo,
gibt es eine Möglichkeit für den MQTT auch einen User und ein Passwort anzugeben?
Viele Grüße
Markus
Moin, kann man damit die Heizung auch aus der Ferne wieder Starten? Unsere (etwas über 4 Jahre alt) geht von Anfang an alle paar Tage in Störung („Feuerungsautomat EE“). Also runter in den Spinnenkeller, [R] drücken und gut. Selbst die Heizungsbauer sind überfragt. Vermutlich Unterdimensioniert heißt es. Das wäre in der Tat ein sehr geiles Feature. Aber es würde auch reichen, wenn oben eine Störung ankommen würde und man es nicht erst merkt, wenn es kalt wird.
Gruß,
der Peter
Hallo Peter,
ob man die Heizung damit resetten kann, weiß ich leider nicht. Grundsätzlich kann man auf die Infrarotschnittstelle auch schreiben, also Einstellungen lassen sich ändern. Das habe ich aber nicht umgesetzt, weil mir das nicht hilft.
Die Fehlermeldung solltest du aber auf jeden Fall sehen können.
EDIT: Vielleicht hilft es die Betriebsart auf Abschaltbetrieb zu setzen und anschließend wieder auf Normalbetrieb. Das sollte über die Schnittstelle funktionieren.
Viele Grüße
eMpTy
Hallo,
Ich bin gerade auf dein Projekt gestoßen und würde das gerne bei mir umsetzen.
Kannst du mir vielleicht kurz erklären wie ich Werte schreiben kann z. B. die Vorlauftemperatur.
Was müsste dafür geändert werden?
Vielen Dank im Voraus.
Hallo Andreas,
VitoWifi bietet folgende Methode:
bool write(Datapoint datapoint, T value)
Write value with type T to datapoint. Make sure to use the correct type. consult the table with types in the "Datapoints" section.
Habe ich jedoch selbst nie benutzt.
Viele Grüße
eMpTy
Vielen Dank für die Antwort.
Ich bin leider überhaupt nicht der Profi im Programmieren.
Hast du eine Idee wie ich das in die Weboberfläche bekomme?