Genau. IPS redet per Telnet mit Raspb. und initiiert die Aktion. Raspi setzt dann um, inkl aller Protokollthemen.
Moin,
das hört sich ja sehr interessant an , könntest du Screenshots und das Script hier mal kurz teilen?
Ich habe das Problem ja auch und zusätzlich bekommt das IPS nen hänger wenn die Schaltung zur Viessmann mal hängt.Das nervt tierisch und einen Raspi hab ich da, die Anleitung für openV hab ich schon gefunden, das sieht machbar aus.
Hallo hcp,
wäre ebenfalls stark an dieser Anleitung/Skripten (einem Beispiel) interessiert.
Beste Grüße
hoep
Die IPS Skripte sind erst der zweite Schritt. Erstmal muss man openv auf Raspi zum Laufen bringen. Bin nach de Anleitung auf der openv Webseite vorgegangen. Das ging eigentlich ganz gut. Bin leider im Moment zu busy um das zu dokumentieren … bitte um Geduld …
Hi hcp,
Kennst du den exporter von Raketenschnecke? Damit geht’s in Sekunden
Gesendet von meinem iPhone mit Tapatalk
Hallo, bin neu hier und die Heizungssteuerung meiner V200KW2 läuft jetzt bereits seit einer Woche auf einem Raspberry Pi und ich kann auch fast alle Werte (ein paar muss ich noch finden) auslesen.
Aber eine Frage: Was genau sind „gedämpfte“ und „Tiefpass“-Temperaturen?
Im folgenden mal meine Erfahrungen mit der Remote-Anbindung eines RaspberryPI (auf dem vcontrold läuft) an einen IPS-Server (auf einem BananaPI). Der Text ist zwar wie eine kleine Anleitung aufgebaut, ich will jedoch nicht ausschließen, dass Ihr die eine oder andere Anpassung noch selbst durchführen müsst - aber vielleicht hilft’s dem einen oder anderen ja trotzdem.
Voraussetzung:
Der Openv-Daemon vcontrold sollte bereits erfolgreich auf dem RaspberryPI installiert sein. Eine Anleitung gibt es auf der openv-Seite openv - vcontrold mit Raspberry Pi.
Damit sollte es prinzipiell schon möglich sein, Daten aus der Viessman-Heizung auszulesen, also z.B.
- telnet <ip-adresse> 3002 (wobei 3002 der Default-Port ist, auf dem der vcontrold lauscht)
- in der Telnet-Session z.B. „getTempA“ eingeben, es sollte dann die Außentemperatur ausgegeben werden.
Wenn das funktioniert, können wir uns um die IPS-Seite kümmern:
(1) Wir erstellen zunächst als neue IO-Instanz einen Client Socket „Viessmann Client Socket“ mit der IP-Adresse des Raspberrys und dem Port 3002.
(2) Als nächsten erzeugen wir dann noch eine Splitter-Instanz „Cutter Viessmann“. In den Settings zu diesem Cutter unter „Benutze Zeichen für Schritte“ trägt man als rechte Trennzeichen die Hex-Werte "76 63 74 72 6C 64 3E " ein. Dabei handelt es sich in ASCII-Schreibweise um den Prompt „vctrld>“. Als übergeordnete Instanz wählt man den zuvor erstellten „Viessmann Client Socket“. Weitere Eintragungen sind hier nicht notwendig.
(3) Unterhalb des Cutters wird nun noch eine RegVar-Instanz „Viessmann InOut“ angelegt. Als übergeordnete Instanz wird der Cutter „Cutter Viessmann“ ausgewählt. Später werden wir in diesem Fomular noch das Target (Empfangsscript) anlegen.
(4) Ich habe dann im Symcon-Baum unter „Keller->Heizkeller“ ein Dummy-Device namens „Heizungsanlage“ angelegt, und folgende Variablen angelegt:
- Aussentemperatur (float)
- Brennerstarts (Int)
- Kesseltemperatur (float)
- Warmwassertemperatur (float)
-Warmwasser-Solltemperatur (float)
und außerdem zwei Scripte: - einen Empfangsscript mit dem Namen „receive_from_Viessmann“
<?
$KesselTempIst = 31695 /*[Keller\Heizkeller\Heizungsanlage\Kesseltemperatur]*/;
$WarmwasserTempIst = 15620 /*[Keller\Heizkeller\Heizungsanlage\Warmwassertemperatur]*/;
$Timetable = 57172 /*[Keller\Heizkeller\Heizungsanlage\Timetable]*/;
$Aussentemperatur = 18412 /*[Keller\Heizkeller\Heizungsanlage\Aussentemperatur]*/;
$Brennerstunden = 54779 /*[Keller\Heizkeller\Heizungsanlage\Brennerstunden]*/;
$Brennerstarts = 15873 /*[Keller\Heizkeller\Heizungsanlage\Brennerstarts]*/;
$WarmwasserTempSoll = 26141 /*[Keller\Heizkeller\Heizungsanlage\Warmwasser-Solltemperatur]*/;
$KesselTempSoll = 34669 /*[Keller\Heizkeller\Heizungsanlage\Kessel-Solltemperatur]*/;
$response = explode("|", $_IPS['VALUE']);
if($response[0] == "getTempKist") {
SetValue($KesselTempIst, (float)$response[1]);
}
else if($response[0] == "getTempWWist") {
SetValue($WarmwasserTempIst, (float)$response[1]);
}
else if($response[0] == "getTempA") {
SetValue($Aussentemperatur, (float)$response[1]);
}
else if($response[0] == "getTimerM2Mi") {
SetValue($Timetable, $response[1]);
}
else if($response[0] == "getBrennerStarts") {
SetValue($Brennerstarts, (int)$response[1]);
}
else if($response[0] == "getBrennerStunden1") {
SetValue($Brennerstunden, (float)$response[1]);
}
else if($response[0] == "getTempWWsoll") {
SetValue($WarmwasserTempSoll, (float)$response[1]);
}
else if($response[0] == "getTempKsoll") {
SetValue($KesselTempSoll, (float)$response[1]);
}
?>
und einen Sendescript „send_to_Viessmann“
<?
$socketId = 18819 /*[Viessmann Client Socket]*/;
$responseId = 31695 /*[Keller\Heizkeller\Heizungsanlage\Kesseltemperatur]*/;
if (IPS_GetProperty($socketId,'Open') == false)
{
IPS_SetProperty($socketId, "Open", true); // Socket öffnen
IPS_ApplyChanges($socketId); // IPS die Änderung durchführen lassen
IPS_Sleep(1000);
}
//CSCK_SendText($socketId, "getTimerM2Mi
"); // Kommando senden
CSCK_SendText($socketId, "getTempKist
"); // Kommando senden
IPS_Sleep(500);
CSCK_SendText($socketId, "getTempA
"); // Kommando senden
IPS_Sleep(500);
CSCK_SendText($socketId, "getTempWWist
"); // Kommando senden
IPS_Sleep(500);
CSCK_SendText($socketId, "getBrennerStarts
"); // Kommando senden
IPS_Sleep(500);
CSCK_SendText($socketId, "getBrennerStunden1
"); // Kommando senden
IPS_Sleep(500);
CSCK_SendText($socketId, "getTempWWsoll
"); // Kommando senden
IPS_Sleep(500);
CSCK_SendText($socketId, "getTempKsoll
"); // Kommando senden
?>
Das Sendescript lasse ich per Ereignis alle 3 min aufrufen, um die Daten zyklisch aus der Heizuingsanlage abzurufen.
(5) In der oben definierten RegisterVariablen wird nun noch das erstellte Empfangsscript als Target eingetragen.
(6) Auf dem Raspberry muss nun noch ein kleine Anpassung im Konfigurationscript ’ vcontrold.xml’ durchgeführt werden, damit der Daemon die Temperaturwerte ohne die Einheit (Grad Celsius) ausgibt. Macht am besten zunächst eine Sicherungskopie. In vcontrold.xml sucht Ihr dann Einträge mit " … ", die die Einheit „Grad Celsius“ aufweisen und löscht dort die Units raus, so dass nur noch „“ stehen bleibt. MIt dieser Ändeurng ist es dann möglich, in IPS die Temperaturwerte in logbare Float-Variaben zu übergeben.
(7) Nun wird’s leider etwas komplizierter, denn es muss eine kleinere Änderung im Quellcode des vcontrold-Daemons gemacht werden. Dieser Schritt ist nicht unbedingt notwendig, ihr müsstet dann aber das Empfangsscript selbst anpassen. Hintergrund ist, dass ich gerne an der Antwort des Daemons erkennen möchte, auf welchen Request sich die Antwort bezieht. Überlegung ist, dass bei mehreren aufeinanderfolgenden Requests an den Daemon ggf. auch mal eine Antwort verloren geht. In diesem Fall wäre es dann z.B. schwierig, eine empfangene Temperatur richtig zuzuordnen. Ich habe daher den Quellcode so geändert, dass in der Antwortzeile zunächst der Requestbefehl mit zurückgeschickt wird. Also z.B. „getTempA|15.30000“. Im Empfangsscript splitte ich die Anwort dann wieder mit „$response = explode(“|", $_IPS[‚VALUE‘]);" in Requestbefehl und Temperaturwert auf.
Folgendes ist zu ändern:
In der Datei openv/vcontrold-code/vcontrold/vcontrold.c sucht Ihr nach der Zeile 495:
snprintf(string, sizeof(string),"%s
",recvBuf);
und ändert diese in
snprintf(string, sizeof(string),"%s|%s
",readBuf,recvBuf);
Danach kompiliert Ihr den Daemon neu und installiert ihn, wie Ihr das schon nach der Erstinstallation gemacht habt:
make
sudo make install
danach einmal durchstarten:
/etc/init.d/vcontrold stop
/etc/init.d/vcontrold start
Sofern Ihr in IPS für das Sendescript noch kein Ereignis angelegt habt, ruft Ihr das Sendscript einmal manuell auf. Der Socket sollte anschließend aktiv sein (und bleiben). Je nach Heizungstyp kann es natürlich sein, dass nicht alle in den Scripten verwendeten Befehle unterstützt werden - dies müsstet Ihr da evt. anpassen. Wenn alles funktioniert, sollten die angelegten Float-Variablen nun mit Messwerten gefüllt sein.
Die Skripte selbst sind vermutlich noch optimierbar - mir ging’s erstmal um die generelle Machbarkeit.
Viele Grüße
Peter
Hallo,
nach dem Einrichten von der ersten Siete hier, um die Viessmann auszulesen sehe ich in IPS immer nur folgendes:
Ich hoffe ihr habt einen Tipp für mich.
Schönen Gruß
Hallo Peter,
erst einmal Danke für die Beschreibung der Anbindung von RaspberryPI.
Ich habe soweit nach deiner Anleitung alles Durchgeführt.
Sendescript manuell ausgeführt -> Socket ging anschließend auf „aktive“
Wenn ich das Empfangsscript ausführe erscheint folgender Fehler:
Notice: Undefined index: VALUE in D:\IP-Symcon\scripts\12092.ips.php on line 11
Was habe ich falsch gemacht?
Wenn ich per Telnet die abfragen mache, sieht das so aus(sieh Bild)
„Meine Vermutung liegt im Bereich des ändern von Zeile 495“
Habe ich aber durchgeführt…
Herzlichen Dank im Voraus
Grüße
Sascha
PS: ich hab erst vor zwei Monaten angefangen mit IPS, und komm eigentlich aus der Windows Welt…
Hallo Sascha,
Du kannst das Empfangsscript nicht (erfolgreich) manuell ausführen. Das ganze funktioniert folgendermaßen:
Wenn auf dem Socket Daten von der Heizung eintreffen, wird über den Cutter die Registervariable „Viessmann InOut“ mit den gesplitteten Empfangsdaten belegt. Diese Registervariable ruft nach Ihrer Aktualierung dann (automatisch) das Empfangsscript auf. Die Sytemvariable $_IPS[‚VALUE‘] bekommt nun den „Wert der auslösenden Variable zum Auslösezeitpunkt“ (s. IPS-Doku).
Wenn Du dagegen versuchst, das Empfangsscript manuell zu starten, ist die Systemvariable $_IPS[‚VALUE‘] nicht gesetzt/definiert und es kommt zu der erwähnten Fehlermeldung. Falls es nicht funktioniert, prüfe bitte mal, ob sich im IPS-Objektbaum das Datum des Empfangsscripts regelmäßig (oder nach manueller Ausführung des Sendescripts) aktualisiert. Wenn das nicht der Fall ist, wird das Empfangscript gar nicht aufgerufen. Dann am besten mal die Punkte 3 und 5 in meiner Anleitung überprüfen. Wenn das nicht hilft:
Die Daten gehen den Weg: Socket -> Cutter -> Registervariable.
In jeder dieser Objekte kannst Du den Debug-Modus einschalten und schauen, an welcher Stelle die Empfangsdaten noch erscheinen. Am besten führst Du das Sendescript nach Einschalten des Debugmodus manuell aus, um die Heizung zu veranlassen, zeitnah etwas auf die Anfrage zu senden. Wenn Du damit nicht weiterkommst, schreib noch mal, was die Fehlersuche erbracht hat.
Viele Grüße
Peter
Hallo Peter,
das scheint alles zu funktionieren.
Die Daten kann ich an den drei „stellen“ im Debug sehen.
Nur werden sie nicht an meine „Variablen“ übergeben
Hier mal die Bilder dazu und deinem Script mit den angepassten ID’s.

<?
$KesselTempIst = 43645 /*[Hardware\KG\Heizungsanlage\Heizung\Kesseltemperatur]*/;
$WarmwasserTempIst = 14565 /*[Hardware\KG\Heizungsanlage\Heizung\Warmwassertemperatur]*/;
$Timetable = 13288 /*[Hardware\KG\Heizungsanlage\Heizung\Timetable]*/;
$Aussentemperatur = 58432 /*[Hardware\KG\Heizungsanlage\Heizung\Aussentemperatur]*/;
$Brennerstunden = 53082 /*[Hardware\KG\Heizungsanlage\Heizung\Brennerstunden]*/;
$Brennerstarts = 16814 /*[Hardware\KG\Heizungsanlage\Heizung\Brennerstarts]*/;
$WarmwasserTempSoll = 27201 /*[Hardware\KG\Heizungsanlage\Heizung\Warmwasser-Solltemperatur]*/;
$KesselTempSoll = 16872 /*[Hardware\KG\Heizungsanlage\Heizung\Kesseltemperatur-Solltemperatur]*/;
$response = explode("|", $_IPS['VALUE']);
if($response[0] == "getTempKist") {
SetValue($KesselTempIst, (float)$response[1]);
}
else if($response[0] == "getTempWWist") {
SetValue($WarmwasserTempIst, (float)$response[1]);
}
else if($response[0] == "getTempA") {
SetValue($Aussentemperatur, (float)$response[1]);
}
else if($response[0] == "getTimerM2Mi") {
SetValue($Timetable, $response[1]);
}
else if($response[0] == "getBrennerStarts") {
SetValue($Brennerstarts, (int)$response[1]);
}
else if($response[0] == "getBrennerStunden1") {
SetValue($Brennerstunden, (float)$response[1]);
}
else if($response[0] == "getTempWWsoll") {
SetValue($WarmwasserTempSoll, (float)$response[1]);
}
else if($response[0] == "getTempKsoll") {
SetValue($KesselTempSoll, (float)$response[1]);
}
?>
Wie kommen die Daten von der „Viessmann InOut“ in die Variablen, wie finde ich da den Fehler am besten…?
(immer diese frischlinge… )
Die Uhrzeit von „receive_from_Viessmann“ ändert sich auch.
Herzlichen Dank nochmal für die Unterstützung
Grüße
Sascha
Hallo Sascha,
die empfangenen Daten (Debugausgabe im Socket) sind anders als bei mir. In der Antwort von der Heizung wird vor dem eigentlichen Wert noch der zuvor gesendete Befehl mit übertragen. Dieser Befehl fehlt bei Dir. Folglich kann das Empfangsskript dann bei den „if“ Abfragen kein positives Ergebnis finden. Hast Du den Schritt 7 meiner Anleitung durchgeführt?
Gruß
Peter
Hallo Peter,
die Zeile „495“ hatte ich angepasst, das war auch meine erste Vermutung…
danach habe ich, nach verlassen der Datei:
make
make install
ausgeführt.
hätte ich vielleicht „sudo make install“ ausführen müssen?
Wenn ich das richtig sehe, kann ich das einfach wiederholen, oder?
Ich probiere das nachher in einer ruhigen Minute noch einmal.
Werde vom ergebniss berichten…
Danke
Grüße
Sascha
Hallo Sascha,
prima - freut mich, dass es jetzt klappt. Und Du hast recht, „sudo“ sollte man voranstellen (ich habe es in der Anleitung ergänzt). Es war mir nicht aufgefallen, da ich auf den Raspberrys einen richtigen root-Account eingerichtet habe und daher das sudo nicht mehr benötige.
Gruß
Peter
Hallo Peter,
ich noch einmal.
Woran kann es liegen das die Abfrage über das Ereignis täglich „Stoppt“.
Die Abfrage bleibt dann stehen, bis ich das Script einmal manuell anstoße…
Der Stopp ist immer kurz vor Mitternacht, wenn ich das Zeitmuster auf 5 Minuten stelle, verschiebt sich die Zeit auf „23:55“
Herzlcihen Dank
Grüße
Sascha
Hallo Sascha,
hmm, einen wirlichen Tipp habe ich nicht. Du könntest beim Datumsmuster mal „täglich“ mit anklicken. Soweit ich das verstehe, sollte dies eigentlich nicht nötig sein.
Ansonsten:
Wenn Du Dir in der logischen Baumansicht die Zeile mit dem Ereignis anschaust: steht dort sowas wie „alle 1 Tage(n) alle 15 Minuten“?
Siehst Du im Meldungsfenster irgendwelche Fehlermeldungen?
Du könntest testweise mal ein einfaches Script erstellen (zB: „irgendeinen Wert in eine Variable schreiben“) und dieses dann mit einem gleichen Ereignis alle 15 min ausführen lassen. Wenn das Problem dort genauso auftaucht, ist es vielleicht ein Bug in IPS (?).
Gruß
Peter
mit diese Einstellung funktioniert es jetzt:
Danke
Grüße
Sascha
hat von euch schon einer die BetriebsartM2 verändern können.
Den Befehl setBetriebsartM2 gibt es ja nicht.
Hallo,
ich habe bereits ein paar Sachen abgefragt, aber nicht jeder Befehl funktioniert.
Kann mir vielleicht einer sagen wie ich die genaue Codierung herausfinde und welches Protokoll ich nehmen muss?
Also z.b. VHscot und GWG.
Vielen Dank
Gruß
yodaeichen