Abfrage & Steuerung von Viessmann Heizungen

Hallo,

nach einer ersten Testphase möchte ich hier meine derzeitige Integration einer Viessman Heizung (in meinem Fall einer Vitodens 200 mit Vitotronic 200 Steuerung) vorstellen.
Die Anbindung erfolgt einfach über die Serielle Schnittstelle (bei mir über einen USB Konverter) mittels des Optolink-Kabels von Viessmann. Sie verwendet die auf OpenV beschriebenen Details und basiert auf dem dort ebenfalls beschriebenen KW-Protokoll, welches die meisten Viessmann Steuerungen unterstützen und für mich am einfachsten in der Umsetzung war.
Leider stimmen nicht alle Adressen, die auf OpenV kommuniziert werden, so das ggf. nicht alle Werte abgefragt werden können. Bei mir funktioniert leider ausgerechnet die Sammelstörung nicht :(. Dafür aber alle Temperaturwerte und Betriebsmodi. Hier ist also noch etwas tüftelei angesagt. Da dies so ist habe ich die gesamte Lösung so angelegt, das man nur in einem XML File Änderungen vornehmen muss, um eine neue Adresse hinzuzufügen oder ausprobieren zu können.

Aber kommen wir zur Lösung selbst:

  1. [li]Benötigte Hardware
    [/li]Für die Anbindung ist das Optolink-Kabel von Viessmann erforderlich. Lieferanten werden auf OpenV benannt oder können leicht durch Google gefunden werden. Der Preis liegt bei ca. 100,-- €. Alternativ findet sich auf OpenV eine Bauanleitung. Ich habe das Originalkabel.
    Zusätzlich benötigt man noch ggf. einen RS232/USB Konverter für den Anschluss an den PC, so dass man die Kopplung über einen COM-Port vornehmen kann.


    [li]Instanzen und Variablen
    [/li]Für die Anbindung benötigt man nun zwei Instanzen (Serial Port, Register Variable) sowie vier Variablen.
    Zunächst legt man in IPS lden passenden Serial-Port mit den Werten [b]4800 8 E 2, ohne Handshake Protokoll[b], an. Den Port kurz zum testen öffnen, dann aber wieder schliessen!
    An diese Instanz hängt man nun eine Register Variable an. Ein Cutter wird nicht benötigt, da das Viessman-KW-Protokoll keine konstanten Längen oder Trennzeichen kennt!
    Jetzt noch 3 Variablen: „Kommando“, „Rückgabewert“ und „Steuerungstyp“. Alle vom Typ STRING. Dazu noch eine Variable „Verbindung ok“ vom Typ BOOLEAN.
    In meiner Installation sieht das ganze so aus (die Variable „Verbindung ok“ ist nicht auf dem Bild):



    [li]Anlegen der benötigte Skripte
    [/li]Man legt jetzt die im Anhang befindlichen Skripte wie folgt an. Dabei müssen als Skriptnamen keine IPS generierten Namen sondern die hier genannten Namen verwendet werden:


    [ul]
    [li]ViessmannDeviceTools.inc.php
    [/li]Muss nur im Skript-Verzeichnis vorhanden sein, da es für die Verwendung der Anbindung inkludiert werden muss.
    [li]ViessmannVariables.inc.php
    [/li]Das Skript muss prinzipiell auch nur im Skript-Verzeichnis vorhanden sein. Da es aber editiert werden muss, bietet es sich an, dieses Skript auch in IPS anzulegen.
    [li]ViessmannDeviceOutputHandlingKW.php
    [/li]Dieses Skript muss in IPS angelegt werden. Es handhabt die gesammte Kommunikation mit der Heizung über den COMPort und sollte nicht verändert werden (bei Fehlern mich bitte informieren ;))
    [/ul]

    Das war’s schon fast.


    [li]Verknüpfungen anlegen
    [/li]Es müssen nun im Skript ViessmannVariables.inc.php die zuvor in Schritt 2 angelegten Instanzen und Variablen bekannt gemacht werden. Dies dürfte selbsterklärend sein :wink:
    Anschliessend weisst man der in Schritt 2 angelegten RegisterVariable das Skript ViessmannDeviceOutputHandlingKW.php zu.


    [li]Erster Test
    [/li]Nachdem man all dies gemacht hat, kommt nun ein erster wichtiger Test. Das Problem bei der Viessmann-Anbindung ist, das es viele verschiedene Steuerungstypen gibt, die zudem unterschiedliche Adressen für die Ablage der Informationen verwenden. Aus diesem Grund muss man zunächst wissen, welche Steuerung man eigentlich hat. Glücklicherweise ist diese Funktion in Skript ViessmannDeviceOutputHandlingKW.php enthalten.
    Man öffnet jetzt einfach den COMPort zur Viessmann Heizung. Da die Variable „Steuerungstyp“ nicht gefüllt ist, wird automatisch versucht, den Typ der Steuerung auszulesen und in dieser Variable abzulegen. Sobald man diese in IPS sieht (sollte nicht länger als 5-10 sek. dauern), schliesst man den COMPort wieder.
    Sollte kein Steuerungstyp ermittelt worden sein, so stimmt etwas mit der Verbindung nicht. Als erster Schritt kann man sich im Debugger den Datenfluss auf der COM-Verbindung anschauen. Bei geöffneter Verbindung sollte dort ein hex 0x05 zu sehen sein…


    [li]Steuerungsdaten
    [/li]Ich habe leider nur die Steuerung 20CB - VScotHO1 zur Verfügung (Vitodens 200). Aus diesem Grund habe ich ein XML File für diese Steuerung erstellt und beigefügt: ViessmannDevice20DB.xml
    Diese Datei muss ebenfalls in das Skriptverzeichnis kopiert werden.
    Sollte man eine andere als die Steuerung 20CB haben, so muss man nun für seine eigene Steuerung eine passende XML Datei (Namenskonvention „ViessmanDevice<4stelliger Steuerungscode>.xml“ erstellen. Das Format der XML ist - denke ich - selbsterklärend. Im wesentlichen geht es um die 4-stelligen Adressen sowie die Antwortlänge und das Format. Näheres findet man ggf. auf OpenV. Das XML muss übrigens mit UTF-8 abgespeichert werden, da sonst der PHP Parser probleme machen könnte… (ich nute PSPAD als Editor).

    Man sollte jetzt also alle Skripte angelegt, den Steuerungstyp ermittelt sowie das passende XML in Skript-Verzeichnis abgelegt haben.


    [li]Abfragen von Werten
    [/li]Im XML werden diverse COMMANDs definiert. Mittels dieser kann man nun Werte der Heizung abfragen. Dazu legt man eine Zielvariable mit passendem Typ zum Kommando an (z.B. Float für Temperaturen, Integer für Count, Boolean für Boolean oder einfach String für sonstige). Ab jetzt ist’s dann ganz einfach:

    php // Variablen Includieren include( "ViessmannDeviceTools.inc.php" ); // Verbindung zur Heizung öffnen ViessmannOpen(); // Wert Abfragen ViessmannSetVariableByCommand( "AussentemperaturGedaempft", <IPS-ZielVariablenID> ); // Verbindung schliessen ViessmannClose();


    Das war’s. Die Funktion ViessmannSetVariableByCommand nutzt das im XML definierte Kommando „AussentemperaturGedaempft“ um anhand der hinterlegten Adresse den Wert auszulesen. Er wird anschliessend konvertiert und an die Variable „“ übergeben.

    [li]Setzen von Werten
    [/li]Das Setzen von Werte erfolgt analog zum Abfragen.

    php // Variablen Includieren include( "ViessmannDeviceTools.inc.php" ); // Verbindung zur Heizung öffnen ViessmannOpen(); // Partymodus für Kreis A1M1 aktivieren ViessmannSetData( "PartybetriebA1M1", chr(0x01) ); // Verbindung schliessen ViessmannClose();


    Das Kommando ViessmannSetData übergibt einen Wert (hier hex 0x01 (=true)) an die Adresse des Kommandos „PartybetriebA1M1“. Fertig.


    [li]Sonstiges
    [/li][ul]
    [li]Ein Blick in die ViessmannDeviceTools.inc.php lohnt sich ggf., da dort noch die eine oder andere praktische Function vorhanden ist.
    [/li]Zudem ist dort auch die Konvertierungsfunktion ViessmannConvertData zu finden, welche die Daten konvertiert. Da dies noch nicht für alle Formate der Fall ist (oder man ggf. anders konverieren möchte) wäre hier der Ansatzpunkt.
    [li]Das Öffnen und Schliessen des COMPorts ist notwendig, da sich ansonsten (zumindest bei mir) die Verbindung nach ca. 24h verabschiedet hat.
    [/li][li]Das Ändern eines Modus (z.B. auf Partybetrieb) wird an der Heizung verzögert visualisiert (ca. 1 min später).
    [/li][li]Wenn man an der Heizung direkt z.B. den Partybetrieb aktiviert, und dann den Sparbetrieb, so wird automatisch der Partybetrieb deaktiviert. Dies geschieht leider NICHT über die Anbindung. Man sollte also beim setzen eines Modi, einen ggf. anderen aktivieren Modus deaktivieren!
    [/li][/ul]

Mit dieser Anleitung sollte es möglich sein, seine Viessmann Heizung anzusprechen. Was jetzt noch fehlt sind die XML-Files für die unterschiedlichen Steuerungen. Diese kann man mir gerne zukommen lassen oder hier anhängen.

Fragen? Immer her damit.

Viel Spass
Coyote

Hi,

leider scheint im ZIP File eine Datei leer zu sein. Ich komme erst heute abend zu einem erneuten Upload… :frowning:

Die Schritte 1 - 6 (also bis zum ermitteln der Steuerungs-Kennung sowie das dann notwendige erstellen der benötigten XML Datei) sollten allerdings ohne die fehlende ViessmannDeviceTools.inc.php funktionieren. Nur die Schritte 7,8 und 9 gehen leider erst nach meinem Upload heute abend. Man kann also schon „vorarbeiten“.

Gruss
Coyote

Hier die (hoffentlich) kompletten Dateien.

ViessmannDevice.zip (3.1 KB)

ViessmannDevice.zip (4.82 KB)

Hallo Coyote,

hört sich gut an. Hattest du bereits ein Kabel von deiner Heizung zum PC liegen oder hast Du den PC direkt an der Heizung über ein Heimnetzwerk angebunden?

Ich habe auch eine Viessmann. Ich weis nur noch nicht wie ich die mit kleinem Aufwand anbinden soll.

Bis dann

Martin

Hi,

ich habe einen PC in der Küche in der Wand eingebaut inkl. Netzwerk-Anbindung. Über einen Silex SX-2000WG+ (das Plus ist wichtig!) kann man USB 2.0 über das Netzwerk verlängern (ich habe z.B. eine Audio-Karte sowie einen RS232/USB direkt an einem Verstärker im Keller, die so an diesen PC angebunden ist).
Die Heizung habe ich über ein weiteres direktes Kabel mittels eines Lindy-Passiv-RS232/USB(1.0) Extenders über RJ45 angebunden. Es gibt also diverse Möglichkeiten, solange du in die Nähe der Heizung mit einem Netzwerkkabel kommst :wink:

Gruss
Coyote

Hallo Coyote, Danke für deine Arbeit.

Ich habe auch eine VITODENS 200-W Typ WB2B ( steht auf der Serviceanleitung)

Da ich noch ein Anfänger mit IPS bin möchte ich ganz klein anfangen.
Ich habe schon alles nach deiner Beschreibung angelegt. Das Kabel ist bestellt.
Ich möchte aber vorerst nur Werte auslesen.
In der ViessmannDevice20CB.xml sind action='ReadOnly Angaben, damit kann ich doch anfangen ohne etwas zu zerstören, oder.
Oder kann ich als Anfänger noch einen großen Fehler machen.

Gruß

mkass

Hi,

lass zunächst einmal das Script deinen Steuerungstyp ermitteln. Dann kannst du ggf. schon mal Adressen mit OpenV abgleichen.

Generell: Der Befehl „ViessmannGetData“ oder „ViessmannSetVariableByCommand“ nutzt nur die auf OpenV angegebenen LESE Kommandos. Nur ViessmannSetData verwendet das Schreib-Kommando.

Die Angabe im XML (ReadOnly) wird nur sicherheitshalber verwendet. Wenn man nur die Lese-Kommandos verwendet, dann sollte(!) nichts passieren. Nur bekommt man bei falschen Adressen halt ggf. was falsches/ungültiges zurück.

Gruss
Coyote

Hallo Zusammen,

ich versuche gemäß Anleitung das Script zum Laufen zu bekommen, nur leider kommt immer folgende Fehlermeldung.

Notice: Undefined variable: IPS_VALUE in [ViessmannDeviceOutputHandlingKW.php] on line 37
R-0

Was ist falsch? Ein Original Optolink Kabel ist angeschlossen und V_Control liefert auch Daten. Im Debugger sehe ich immer Hex05 zurück kommen.

MfG Frank

Halo Coyote,

ich habe alles nach Deiner Anleitung gemacht - und mit openv funktioniert der Zugriff auch (via Moxa NPOrt 5100 TCP/IP<->RS232).

Leider bekomme ich beim AUsführen von ViessmannDeviceOutputHandlingKW folgende Fehler - IPS will wohl den Steuerungstyp nicht feststellen:

Notice: Use of undefined constant VIESSMANN_DEVICE_COMMAND - assumed ‚VIESSMANN_DEVICE_COMMAND‘ in C:\IP-Symcon\scripts\ViessmannDeviceOutputHandlingKW.php on line 20

Warning: Variable mit Namen „VIESSMANN_DEVICE_COMMAND“ existiert nicht in C:\IP-Symcon\scripts\ViessmannDeviceOutputHandlingKW.php on line 20

Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\ViessmannDeviceOutputHandlingKW.php on line 37
R-0

Ich wäre für einen Tipp sehr dankbar!
Gruß
Gunnar

Hallo,

Du hast wahrscheinlich Punkt 4 vergessen!
Verknüpfungen anlegen
Es müssen nun im Skript ViessmannVariables.inc.php die zuvor in Schritt 2 angelegten Instanzen und Variablen bekannt gemacht werden. Dies dürfte selbsterklärend sein
Anschliessend weisst man der in Schritt 2 angelegten RegisterVariable das Skript ViessmannDeviceOutputHandlingKW.php zu.

MfG Frank

Hallo Frank,

habe ich gemacht, alle IDs habe ich eingetragen. Funktioniert es bei Dir jetzt?

Danke + Grüße
Gunnar

Hallo Gunnar,

leider funktioniert es bei mir auch noch nicht, es bin mir derzeit auch nicht sicher ob die Schnittstelle immer geöffnet sein muss. Derzeit liefert der Debugger imme Hex05 von der Schnittstelle zurück.

MfG Frank

Notice: Use of undefined constant VIESSMANN_DEVICE_COMMAND - assumed ‚VIESSMANN_DEVICE_COMMAND‘ in C:\IP-Symcon\scripts\ViessmannDeviceOutputHandlingKW.php on line 20

Warning: Variable mit Namen „VIESSMANN_DEVICE_COMMAND“ existiert nicht in C:\IP-Symcon\scripts\ViessmannDeviceOutputHandlingKW.php on line 20

Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\ViessmannDeviceOutputHandlingKW.php on line 37
R-0

Ich wäre für einen Tipp sehr dankbar!
Gruß
Gunnar

Hallo lissy18 und jonny-flash,

das hatte ich auch zwei Dinge haben mir geholfen: den zweiten Download nehmen (im ersten ist eine Datei leer) und die Variablen IDs direkt in der ViessmannVariables.inc.php im Scripts-Verzeichnis eintragen. Bearbeiten der Datei über die IPS-Console hat nicht funktioniert.

Hallo wango,

alles probiert,funktioniert bei mir leider nicht…

Danke trotzdem!
Gunnar

Hallo Gunnar,

bei mir läuft es jetzt!

  1. Ich hatte vergessen der Registervariablen „Viessmann Heizung Output“ eine übergeordnete Instanz zuzuordnen, nämlich den Serial Port.

  2. Habe ich in ViessmannDeviceOutputhandlingKW.php folgende Änderung durchgeführt.
    // Constants
    define( „VIESSMANN_PING“, chr(0x05) );
    define( „VIESSMANN_KW_READ_PRAEFIX“, chr(0x01).chr(0xF7) );
    define( „VIESSMANN_KW_WRITE_PRAEFIX“, chr(0x01).chr(0xF4) );
    if (!isset($IPS_VALUE)) $IPS_VALUE ="";
    // init variables

MfG Frank

Hi,
Hat irgendjemand ne ahnung was der Rückgabewert bei den Pumpen zu bedeuten hat? Im XML file steht ja BooleanPercent. Ich bekomme da Werte um die 10000 zurück, teils noch viel größer (das höchste was ich gesehen habe war um die 24000)
Die Pumpen kann man in der Regel doch nur Ein-/Ausschalten? zum Drehzahl regeln müsste man die Pumpen ja mit unterschiedlicher Frequenz anfahren? Wird das gemacht? Im Script ist diese Umrechnung ja leider noch nicht implementiert.

Ich verwende zum auslesen auch nicht das Script sondern ich arbeite mit openv vcontrold habe aber auch eine VScotHO1 (ID 20CB). Die Addressen für die Temperaturen scheinen auch im großen und Ganzen zu passen nur eben mit den Pumpen hab ich noch das Problem.

PS. kann es sein das BetriebsstundenStufe1 nicht Addr. 0886 ist (geht bei mir nicht) sondern Addr. 08A7 (scheint bei mir richtig zu gehen)

Hallo Frank,

na das klingt ja schon mal gut, leider krieg ich das immer noch nicht zum laufen.
Ich habe von der Struktur her an und fürsich gleiche Konfiguation wie Coyote in der Doku bechrieben (siehe HardCopy im Anhang). Hast Du in der Konfiguration des Serial Ports auch 4800,8,2,Even ? Das Script ViessmannDeviceOutputHandlingKW habe ich auch nach Deinem Vorschlag angepasst. Beim Ausühren wird imme rnoch bemängelt, dass die Variable VIESSMANN_DEVICE_COMMAND nicht vorhanden ist.

Danke schonmal + Grüße
Gunnar

Hallo Gunnar,

sieht Deine ViessmannVariables.inc.php so aus?

– Cut Here -------------
<?

// IPS Variables -------------------------------------------------------------
define( „VIESSMANN_VARIABLE_DEVICE“ , 32277 );
define( „VIESSMANN_VARIABLE_COMMAND“ , 22475 );
define( „VIESSMANN_VARIABLE_RESULT“ , 27928 );
define( „VIESSMANN_VARIABLE_REGISTER“ , 44428 );
define( „VIESSMANN_VARIABLE_COMPORT“ , 42276 );
define( „VIESSMANN_VARIABLE_CONNECTOK“ , 34478 );

?>
– Cut Here -------------

MfG Frank

Hallo Frank,

genau so! Hab sie auch schon manuell (nicht in IPS KOnsole) editiert und gespeichert.

Grüße
Gunnar

Hallo Gunnar,

schreib mir mal ne PM, evtl. kann ich Dich mal remote übernehmen und dann mal schauen.

MfG Frank

Hi,

BooleanPercent ist in den Scripten noch nicht implementiert Ich kann mir aber auch nicht vorstellen, was das für ein Wert sein soll. Ich kenne es eigentlich nur so, dass 0%, 25%, 50%, 75% oder 100% Drehzahl gesteuert wird.

Habe heute festgestellt, das mein Nachbar so eine Heizung hat, wir brauchen auch die Werte (XML- File) Eine Mail von Dir wäre also Nett;-))
Wir wollen in den nächsten Tagen einmal einen Serial Analyser dazwischen hängen und dann schauen was an Daten über das V_Control Programm gesendet werrden.

Frage:
Ist openv vcontrold die Lösung für IPS v1.0 oder die Standalone Lösung ohne IPS?

MfG Frank

Hi,

schön, das es zu funktionieren scheint (wenn auch wohl noch nicht überall ;)).

Ich habe die „Datentypen“ aus der OPENV Homepage abgeleitet. Bei den Pumpen stehe ich auch auf dem Schlauch. Deshalb ist die umrechnung nicht implementiert.
Bei den Temperaturen sollte man mit Minus-Werten (Aussentemperatur) aufpassen. Da habe ich die Umrechnung anpassen müssen.

Bzgl. der Daten auf der COM-Schnittstelle sei auf das OpenV-Wiki verwiesen, wo das Protokoll detailliert erläutert wird.

@Jonny-Flash: Läuft es jetzt bei dir?

Gruss
Coyote