Vitotronic 200 (Viessmann Heizungssteuerung)

Aus FHEMWiki
Wechseln zu: Navigation, Suche
X mark.svg Die Verwendung des VCONTROL zur Ansteuerung eines Heizungssystems kann dieses bei unsachgemäßer Anwendung beschädigen. Für unmittelbare oder mittelbare Folgen, die sich aus dem Nachbau des Interfaces oder der Verwendung der hier zur Verfügung gestellten Information ergeben, übernimmt der Autor keine Haftung.

Eine angebundene Vitotronic 200 (Viessmann Heizungssteuerung) wird von FHEM über das Modul 89_VCONTROL.pm sowie das Modul 89_VCONTROL300.pm unterstützt. Beide Module senden direkt an die Viessmann-Anlage. Es gibt ein drittes Modul 89_VCLIENT.pm (hier der Forenthread), das auf dem Daemon vcontrold (siehe diesen Link) aufbaut und mit dem sich, wenn vcontrold läuft, ebenfalls die Anlage auslesen und steuern lässt. 89_VCONTROL.pm und 89_VCONTROL300.pm benötigen den Daemon nicht.

Einleitung


VCONTROL, VCONTROL300 und VCLIENT
Zweck / Funktion
Anbindung einer Viessmann Heizung
Allgemein
Typ Gerätemodul
Details
Dokumentation VCONTROL300 und VCLIENT EN / VCONTROL300 und VCLIENT DE
Thema
Support (Forum) Heizungssteuerung/Raumklima
Modulname 89_VCONTROL.pm
Ersteller adamwit (Forum /Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!

Mit Hilfe verschiedener Zusatzgeräte ist es möglich, bei einer Viessmann-Heizung die Temperaturen, Timern, Verbrauch usw. auszulesen und verschiedene Heizungszustände (Heizen, Warm Wasser, Spar Modus, Party Modus) zu steuern.

Hardware

Bevor die Heizung an FHEM angebunden werden kann, muss eine entsprechende Hardware vorliegen. Die Vitotronic weist zwei LEDs sowie ein eingefrästes Viessmann-V auf, das Bestandteil der Steuerung ist. Eine der beiden Diode dient der Steuerung als Empfangsgerät, während die andere Diode Signale sendet. Durch das eingefräste V kann ein entsprechend konstruiertes Gerät passgenau an die Heizung angeschlossen werden. Derzeit sind folgende Geräte bekannt, die mit der Vitotronic kommunzieren können:

  • Optolink-Kabel (Originalbauteil Nr. 7856059, relativ teuer: um 100 €[1] bzw. ca. 60 €[2])
  • selbstgebaute Geräte (zum Teil kommerziell angeboten, Eigenbau ist sehr preiswert - erfordert aber Lötmaterialien)

Der Eigenbau wird auf der eigens dazu errichteten Webseite openv genauer beschrieben. Man muss sich beim Eigenbau insbesondere mit der Frage befassen, über welche Schnittstelle die Hardware dann mit FHEM kommuniziert. Derzeit sind folgende Schnittstellen realisiert, deren Einbindung nach Aussage verschiedener Forenteilnehmer auch geglückt ist:

  • USB
  • seriell (Anschluss an RPi, dort RxTx)
  • WLAN
  • LAN

Die serielle Schnittstelle kann mit Hilfe des Programms ser2net auch auf eine LAN-Schnittstelle gemappt werden. Derzeit (Herbst 2017) entwickelt der Forumsteilnehmer PeMue ein allgemeines Modul, das sowohl per WLAN, USB als auch seriell an die Heizung angeschlossen werden kann: Optolink Adapterplatine.

Bevor die Software angeschlossen wird, sollte man sich Informationen bezüglich der verwendeten Heizung sowie der entsprechenden Steuerung besorgen. Diese Angaben müssen bei der Definition des Gerätes sowie in der Konfigurationsdatei in FHEM angegeben werden.

Software: Einbindung in FHEM

Es existieren momentan (2017) drei verschiedene Module, die eine Einbindung der Heizung in FHEM sicherstellen:

  1. 89_VCONTROL.pm,
  2. 89_VCONTROL300.pm
  3. 89_VCLIENT.pm

Das zweite Modul scheint eine schnellere Kommunikation zu ermöglichen und wird derzeit (Herbst 2017) aktiv weiterentwickelt.

Das dritte Modul setzt einen laufenden vcontrold-Daemon voraus, der die Kommunikation mit Viessmann übernimmt (siehe dazu diesen Foreneintrag).

Die Definition des Gerätes erfolgt bei den beiden ersten Modulen typischerweise wie folgt.

Info green.png Weiterentwicklung

In diesem Forenthread wird über Korrekturen und Bereinigungen im Modul berichtet.

defmod <name> VCONTROL300 <IP-Adresse>:3002 /opt/fhem/FHEM/VScotHO1_300.cfg 300 kw

In dem hier vorliegenden Fall wird das Modul 89_VCONTROL300.pm verwendet. Dieses kommuniziert mit einer LAN-Schnittstelle auf Port 3002 an der angegebenen IP-Adresse mit der Hardware. Im Fall eines USB-Anschluss muss der entsprechende Pfad auf die USB-Schnittstelle angegeben werden. Es wird alle 300 Sekunden abgefragt, das verwendete Protokoll lautet kw (eine andere Option besteht darin, das neuere Protokoll 300 zu verwenden).


Konfiguration VCONTROL und VCONTROL300

Zur Konfiguration wird die Datei /opt/fhem/FHEM/VScotHO1_300.cfg verwendet. Details zu dieser Datei und ihrer Funktion werden im nächsten Abschnitt erläutert.

Um die Heizung mit FHEM zu verbinden, müssen die Daten zwischen der Heizungssteuerung und dem Perl-Server ausgetauscht werden. Die Werte in der Heizungssteuerung werden an speziellen Speicheradressen (die durch vierstellige Hexadezimalzahlen beschrieben werden) gesichert, im Viessmann-device befinden sich die entsprechenden Werte dagegen in Readings. Beide Werte müssen nun eindeutig einander zugeordnet werden. Diese Zuordnung gelingt durch die im define genannte Konfigurationsdatei *.cfg, die sowohl die Speicheradressen als auch die Readingsnamen enthält. Die Datei ist zeilenweise aufgebaut (je Zeile eine Zuordnung). Dabei wird noch zwischen Lesezugriff und Schreibzugriff unterschieden, da möglicherweise verschiedene Speicheradressen involviert sind.

Informationen zu den Speicheradressen findet man ebenfalls im Forum https://github.com/openv/openv/issues, in diesem Forum sind die Adressen teilweise als XML-Datei hinterlegt und müssen entsprechend übertragen werden. In der im Forum geposteten Datei Viessmann-Software-Config.zip sind XML Dateien der original Viessmann-Software enthalten. Diese können nützlich sein, um Adressen für den eigenen Heizungstyp zu finden.

Daten lesen

Die Konfiguration geschieht mit Hilfe einer cfg-Datei, die von FHEM eingelesen wird. Die Einträge in dieser Datei sind von folgendem Format (wir beschränken uns hier auf das Modul VCONTROL300, für das Modul VCONTROL sind die Einträge analog aufgebaut - dort ist allerdings ein etwas erweitertes Adressformat zu verwenden):

POLL, <adresse>, <parse-methode>, <divisor>, <reading>, <kumulationsmethode>

Dies ist wie folgt zu verstehen. POLL zeigt an, dass Daten geholt werden. <adresse> ist die interne Viessmann-Adresse, die die zu holende Variable beherbergt. Dies ist typischerweise eine Hexadezimalzahl mit vier Stellen; beispielsweise findet man unter der Adresse 00F8 die Gerätekennung. Zum Teil können diese Adressen aus Dokumentation bezogen werden, ein Teil der Adressen ist auf der Webseite von openv dokumentiert. Nicht alle Adressen sind dabei korrekt, hier muss viel probiert werden.

<divisor> beschreibt, ob die Größe durch eben diesen Divisor dividiert werden soll (Temperaturangaben sind etwa in Zehntelgrad), <reading> nennt den Namen des FHEM-Readings. <kumulationsmethode> kennt die Einträge - (nicht kumulieren) und "day" (über den Tag hinweg addieren). Im letzten Fall werden dann jeweils nach Mitternacht die Werte des letzten Tages ebenfalls als Readings in das Device eingetragen; bei den Readingnamen wird dann jeweils DayStart,Today und LastDay angehangen. Diese Bezeichnungen können mit Readings des Devices angepasst werden.

<parse-methode> hat die folgenden Auswahlmöglichkeiten

  • "1ByteS": Größe 1 Byte mit Vorzeichen,
  • "2ByteS": Größe 2 Byte mit Vorzeichen
  • "2ByteU": Größe 2 Byte ohne Vorzeichen
  • "2ByteU_1stByte": Größe 2 Byte ohne Vorzeichen, 1.tes Byte (allerdings im Thread nicht angegeben)
  • "2ByteU_2ndByte": Größe 2 Byte ohne Vorzeichen, 1.tes Byte
  • "1ByteH": Größe 1 Byte, vermutlich (im Thread nicht angegeben) hexadezimalkodiert
  • "2ByteH": Größe 2 Byte, vermutlich (im Thread nicht angegeben) hexadezimalkodiert
  • "2BytePercent": nicht implementiert
  • "4Byte": Größe 4 Byte
  • "mode": einer der beiden Werte on, off
  • "date": 8 Byte Datumswert (Beispiel: Do,28.09.2017 17:01:12)
  • "timer": 8 Byte Timer Wert

Alle Größen, die mit timer kodiert sind, müssen mit einem expliziten Get-Befehl geholt werden und werden nicht automatisch gepollt. Ein User berichtet, dass diese Timerzeiten nur geholt werden konnten, nachdem das automatische Ausfüllen ("Mo-Fr automatic") in der Steuerung ausgeschaltet und jedem Tag ein individueller Wert zugewiesen wurde.

Ein Beispiel soll einen Eintrag in der cfg-Datei beschreiben:

POLL, 2306, 1ByteU, 1, Temperatur_Haus  , -

Die Viessmann-Steuerung enthält an der Speicheradresse 0x2306 den Wert für die Solltemperatur des Hauptheizkreises (oft als M1 bezeichnet). Dieser Wert hat die Größe eines unsignierten Bytes (deshalb 1ByteU). Der Wert soll in FHEM im Reading Temperatur_Haus gespeichert werden. Es soll nur der aktuelle Wert gespeichert werden, die Werte werden über den Tag hinweg nicht addiert/kumuliert (deshalb der Strich am Ende).

Daten schreiben

Will man Daten senden, so ist folgendes Kommando zu verwenden

SET, <adresse>, <adresstyp>, <multiplikator>, <setname>, <nextset oder day>

Dies ist wie folgt zu verstehen. SET zeigt an, dass Daten gesendet werden. <adresse> ist die interne Viessmann-Adresse (oft, aber nicht immer, sind die Adressen der SET-Kommandos read/write; hier muss man in den Dokumentationen nachschauen). Wieder ist dies eine Hexadezimalzahl mit vier Stellen. Adresstyp entspricht der <parse-methode> oben und gibt an, ob es sich um eine 2Byte-, eine 1Byte- oder was auch immer -Adresse handelt. Als <multiplikator> wird oft 1 verwendet; setzt man hier eine Zahl ein, so wird der zu sendende Wert mit eben diesem Multiplikator multipliziert. Beim Kennwort "mode" und "state" für <multiplikator> können auch Zustände gesendet werden (unklar, wie genau). <setname> ist der Name, mit dem in FHEMWEB auf den Wert zugegriffen wird.

Dazu ein Beispiel. Im Reading "Temperatur_Haus" wird die Soll-Temperatur des Hauses gespeichert, die dazugehörige Kodierung sei 2306. Der entsprechende POLL-Eintrag in der *.cfg würde dann lauten

POLL, 2306, 1ByteU, 1, Temperatur_Haus  , -

(sowohl die Adresse als auch die Übergabeform der Daten, hier 1ByteU, muss natürlich korrekt sein). Nun soll innerhalb von FHEM durch ein Befehl der Form

set <Viessmanndevice> Temperatur_Haus 25   

versucht werden, die Temperatur auf 25 Grad einzustellen. Damit dies möglich ist, muss in der *.cfg folgende Zeile stehen (auch hier gilt: die Adresse muss korrekt sein und es muss möglich sein, in die Steuerung zu schreiben)

SET, 2306, 1ByteU, 1, Temperatur_Haus, <nextset oder day>

Nextset bedeutet, dass nach diesem SET-Befehl unmittelbar ein weiterer Setbefehl ausgelöst wird (und zwar genau der, der an dieser Stelle zu finden ist). Day wird nur dann verwendet, wenn der Adresstyp "time" war. In diesem Fall gibt day an, um welchen Wochentag, der einzustellen ist, es sich handelt. Hier sind nur Einträge der Form MO, DI bis SO möglich. Beispielsweise bedeutet

SET,  2028  ,  timer,      1, TIMER_Haus_SA         , SA

dass das Reading TIMER_Haus_SA die Zeiten für die Heizung Samstags enthält, es sich um den Adresstyp timer handelt, die Daten in der Adresse 2028 kodiert sind und die von FHEM gesendeten Daten für Samstag festgeschrieben werden. Der FHEM-Befehl sähe dann so aus

set Heizung TIMER_Haus_SA 08:00,23:00,--,--,--,--,--,--,

Auslesen kann man die Daten dann mit

POLL, 2028, timer,  1     , TIMER_Haus_SA            , -

Etwas umständlicher wird es, wenn eine Auswahlmöglichkeit mit vordefinierten Werten angegeben werden soll. Der Betriebszustand einer Vitotronic 100 HO1A beispielsweise kann nur die Werte 0 (nur_Warmwasser), 3 (Normalbetrieb) und 5 (Frostschutz) annehmen. Die entsprechende Adresse sei 3301. Ziel ist eine Dropdown-Liste in FHEM. Dies muss dann wie folgt in der cfg beschrieben werden

SET,  3301,   mode, Betriebsart_Fussb , -  
SET,  330100, 1ByteU, 1, nur_Warmwasser , -
SET,  330103, 1ByteU, 1, Normalbetrieb ,  -
SET,  330105, 1ByteU, 1, Frostschutz , - 

Einige User haben bereits Ihre Heizungen mit der Hilfe diese Moduls angebunden:


Konfiguration VCLIENT

VCLIENT basiert auf dem (extern) laufenden Daemon vcontrold. Die Viessmann-Heizung wird ausschließlich durch vcontrold kontrolliert. Dieses Modul verbindet sich nur mit vcontrold und stellt gewissermaßen einen vcontrold-Klienten für FHEM dar. Wenn ein Befehl nicht das tut, was er soll, liegt es an vcontrold, nicht aber an VCLIENT. Zur Installation und Inbetriebnahme von vcontrold sowie dem dazugehörigen Optolink-Kabel siehe die Webseite https://github.com/openv/openv

Konfigurationsdatei

VCLIENT setzt eine Konfigurationsdatei voraus. In dieser Datei befinden sich zeilenweise Einträge. Jeder Eintrag ordnet einem vcontrold -Befehl einen Readingnamen zu. Wird der in der Zeile genannte Befehl ausgeführt, so wird das durch vcontrold erhaltene Ergebnis in das entsprechende Reading geschrieben. Eine typische Zeile in der Konfigurationsdatei sieht wie folgt aus:

 ###### VCLIENT-Konfigurationsdatei #########
 #Dies ist eine Kommentarzeile
 getTempA Aussentemperatur
 getTempBrennerstarts Brennerstarts
 getTempBrennerstarts BrennerstartsBisGestern daily
 #bisher standen get-Befehle da, nun folgen set-Befehle
 getTimerWWMo Warmwasser_1Montag manually
 setTimerWWMo WW_1Mo_spaet 08:00-10:00|12:00-12:30|| 
 setTempWW WarmwasserTemp 70,65,60,55

Get-Befehle: Zuerst muss der vcontrold-Befehl in der Zeile stehen, er muss das Wort get enthalten (zB getTempWW). Die Rückgabe des vcontrold-Befehls "getTempA" wird dann in das VCLIENT-Reading Aussentemperatur geschrieben. Bitte für jeden Befehl eine eigene Zeile verwenden. Soll ein Kommando nur einmal am Tag ausgeführt werden, muss als weiteres (drittes) Wort in der cfg-Datei "daily" stehen. Soll ein Kommando nur manuell ausgeführt werden, so muss als weiteres (drittes) Wort in der cfg-Datei "manually" stehen. Das Format von Zeitbefehlen (so genannte timer) wird automatisch erkannt.

Set-Befehle: Zuerst muss der vcontrold-Befehl in der Zeile stehen, er muss das Wort set enthalten (zB setTempWW). Dann erfolgt der Name, der im FHEM-Set-Befehl auftauchen soll, hier WarmwasserTemp (der komplette FHEM-Befehl hieße dann set <name> WarmwasserTemp 65). Zuletzt stehen die möglichen Auswahlen einer dropdown-Liste in der Zeile. Es ist unabdingbar, dass die auszuwählenden Werte kommagetrennt und ohne Leerzeichen geschrieben werden. Timer-Befehle machen hier eine Ausnahme. Wieder erfolgt zuerst der vcontrold-Befehl (hier setTimerWWMo), danach folgt der Befehl, mit dem die Angaben in FHEM ausgelöst werden (hier wäre das set <name> WW_1Mo_spaet). In FHEM werden die Zeiten aber nicht eingegeben, dies geschieht vielmehr in der cfg-Datei. Dazu werden die Zeiten, die an die Anlage zu senden sind, in der Datei eingetragen. Es muss sich um eine gerade Anzahl von Zeitangaben, höchstens acht, handeln. Die Zeitangaben sind durch genau drei Trennzeichen | voneinander zu separieren. Die Zeiten wiederum sind durch Angaben HH:MM-HH:MM zu notieren. Dabei sind nur Minuten zulässig, die Vielfache von 10 sind; weiter müssen die Zeitangaben von links nach rechts wachsen und dürfen nicht fallen. Die Zeitangaben wie auch der Set-Befehl dürfen keine Leerzeichen enthalten.

Definition

Das Gerät wird wie folgt definiert

define <name> VCLIENT <host> <port> <configfilename> <interval> 
<host> ist der Host, auf dem vcontrold läuft. 
<port> ist der Port, unter dem vcontrold ansprechbar ist (sehr oft 3002). 
<configfilename> ist die vorbereitete Konfigurationsdatei, siehe hierzu oben. 
<interval> ist die Zeitspanne in Sekunden, in denen regelmäßige Abfragen erfolgen sollen. Der Wert 0 (nur manuelle Abfragen) ist möglich. 

Set-Kommandos

set <name> reload_command_file <configfilename> 

Ändert den Namen und/oder Pfad der Konfigurationsdatei. Die Datei muss existieren, sonst erfolgt eine Fehlermeldung (vollständigen Pfad angeben).

set <name> <vcontrold/FHEM-Kommando> args 

Es können mit dem set-Befehl auch vcontrold-Kommandos ausgeführt werden. Diese Kommandos müssen vorab in der cfg-Konfigurationsdatei definiert werden. Schaut man auf das obige Beispiel einer Konfigurationsdatei, so würde ein FHEM-Befehl der Form set <name> WarmwasserTemp 70 intern an die Heizung bzw vcontrold den Befehl setTempWW 70 absetzen, der dann die Warmwassertemperatur auf 70 Grad Celsius setzt. Im Reading last_set_cmd muss ein OK erscheinen, wenn der Befehl erfolgreich ausgeführt wurde. Analog können komplexere Zeitangaben für Timer gesetzt werden. Leider ist es momentan wohl so, dass beim Setzen von timer-Angaben vcontrold eine Fehlermeldung zurück gibt - obwohl die Angaben korrekt übertragen wurden.

Get-Kommandos

get <name> update 

Führt die in der Konfigurationsdatei genannten vcontrold-Befehle aus und schreibt die Ergebnisse in die dort angegebenen Readings. Sind diese nicht vorhanden, so werden sie angelegt. update_manually

get <name> update_manually 

Führt die in der Konfigurationsdatei genannten vcontrold-Befehle für sämtliche manuellen Einträge aus und schreibt die Ergebnisse in die dort angegebenen Readings. Sind diese nicht vorhanden, so werden sie angelegt.

Attribute

attr <name> <timeout> 1 

Jeder Zugriff auf einen entfernten Host ist nicht blockierend, muss aber dennoch die Möglichkeit eines Abbruches beinhalten (falls partout keine Antwort erfolgt). Timeout beschreibt, nach wie viel Sekunden die Abfrage erfolglos abgebrochen werden soll. In einem solchen Fall wird auch die gesamte Abfrageliste beendet. Beachten Sie: Ein zu kurzer Timeout ist problematisch, weil dann uU noch keine Rückmeldung von der Heizung erfolgen konnte. Voreinstellung (wenn kein Attribut gesetzt) ist 1 Sekunde.

attr <name> <internal_update_interval> 0.1

Hier handelt es sich um ein Attribut, das nur verwendet werden sollte, wenn trotz intensiver Suche immer noch Probleme bei der Ansteuerung der Anlage auftreten. Normalerweise ist es nicht nötig, dieses Attribut zu setzen.

Zwei verschiedene Kommandos können nicht gleichzeitig an die Anlage geschickt werden, weil dann bei einer Antwort nicht klar ist, auf welche Frage sich das Ergebnis bezieht. Dies wird intern so umgesetzt, indem VCLIENT darauf achtet, dass zwischen zwei Kommandos eine kleine Zeitspanne liegt. Diese Zeitspanne ist nun ein genaues Vielfaches von $internal_update_interval. $internal_update_interval ist intern auf 0.1 Sekunden eingestellt; dies sollte normalerweise genügen. $internal_update_interval muss größer als Null sein. Ein größerer Wert führt zu einer längeren Abfragedauer für alle Readings, ein kleinerer Wert verkürzt unter Umständen die gesamte Abfragedauer, könnte aber auch zu Instabilitäten führen.

Links

Quellen