*Hilfe* Vallox 90SE Lüftungsanlage mittels RS485 auslesen

Guten Tag, liebe Gemeinde.

ich bin seit nunmehr etwas mehr als einem Jahr begeisterter Nutzer von IPS - und vor allem Mitleser hier im Forum.
Nahezu alle Probleme die mir begegnet sind, konnte ich mit Hilfe diverser Threads hier lösen.

Das Einbinden meiner Lüftungsanlage der Firma Vallox allerdings, stellt mich nach wie vor vor ungelöste Herausforderungen.

Bisher lese ich Temperaturen wie Zuluft und Abluft mittels eines HM Differenzsensors aus. Den habe ich mit einiger Friemelei in die Anlage eingebaut. Leider - was aber zu erwarten war - wird dieser so stark abgeschirmt, dass nur rudimentär Daten zur CCU2 übertragen werden. Für eine temperaturgesteuerte Lüftungsregelung nicht zu gebrauchen. Jetzt habe ich mir die Bedienungsanleitung nochmal zur Brust genommen und dort die Möglichkeit gefunden mittels einer RS485 Schnittstelle Zugriff auf den Bus zu bekommen.
Leider übersteigt das bei Weitem meine Kompetenz. Ich habe es zwar geschafft (dank Anleitung hier aus dem Forum) einen Wechselstromzähler mittels RS485 auf einen USB Wandler abzufragen, aber so etwas selbst zu programmieren schaffe ich nicht.

Speziell, weil - so wie ich das verstanden habe - man erst ein „Anfragedatenpaket“ schicken muss, um die Rückantwort mit den Werten zu bekommen.

Ich stelle jetzt einfach mal alle Infos, die ich zu der Lüftungsanlage gefunden habe, hier ins Forum. Evtl. hat ja bereits jemand den Zugriff realisiert bzw. hat jemand Interesse mir da Hilfestellung zu geben.

Ich weiß leider auch nicht, ob dies das korrekte Unterforum ist, da ich mich normalerweise nur mit Homematic herumschlage. :slight_smile:

Eine Anleitung ist auf Englisch die andere zu allem Überfluss auch noch auf Finnisch. :wink: Google Translate hatte mir da aber geholfen…

Anscheinend gibt es auch ein KNX Gateway. Mit KNX kenne ich mich aber überhaupt nicht aus… und es soll wohl auch ca 400€ kosten. Wäre mir zu viel für diese Informationen.

Auf jeden Fall herzlichen Dank für jeden der mir Rat und Antwort gibt.
Wäre ja zu cool… :slight_smile:

LG Peter

Digit_protocol_english_RS485 (2).pdf (48.5 KB)

KHT90se_D_170214.pdf (152 KB)

Vallox-RS485-Befehle-finnisch.pdf (65.1 KB)

Wäre dies denn grundsätzlich das richtige Forum für mein Problem? :confused:

Wenn nicht hier, wo dann.

Sieht nach Modbus aus…
Ich würde mal eine ser. Instance erstellem, mit der richtigen Boudrate. eine Registervariable darunter erstellen, ein Script mit so’n Testabfrage wie im PDF erstellen , zB

<?

COMPort_SendText(ComPortID, chr(0x01).chr(0x21).chr(0x11).chr(0x00).chr(0xA3).chr(0xC6));

?>

und mal im Debugfenster der ser. Schnittstelle schauen, ob das Teil antwortet.

Gruß Helmut

Hallo Helmut!

Ähm… ja. Erst mal herzlichen Dank, dass du dir die Mühe gemacht hast zu Antworten.

Ich werde sobald ich daheim bin, exakt nach deinen Vorgaben vorgehen. :smiley: Danke dass du das mal eben aus der Hand geschüttelt hast.
Ich bin gespannt und werde berichten…

LG Peter

Edit Wenn ich mir deine WWW Seite anschaue, glaube ich auch dass du eine Lösung finden können wirst… :wink:

Wenn ich mir meine Seite anschaue, würde ich es nicht denken :wink: ist von 98 mit immer mal eingeflickten Bildern.

Wenn Du’s probierst und was bekommst, dann mach mal Hardcopy’s von dem Baum, der ser. Instanze/Debug und von Deinem Sendescript.

Gruß Helmut

Ohh, noch jemand mit ner 90SE.

Ich hab es bis jetzt so gelöst das ich in die 4 Rohre (Zuluft, Fortluft, Abl…, …) gemodette1-Wire Tenmpfühler gesteckt habe und in der Anlage selbst auch noch welche verteilt (nach dem Vorheizer,…). Die 4 Stk. in den ISOPipe habe ich in Aluröhrchen gesteckt , am oderen Ende Aluknete reingedrückt um es luftdicht zu bekommen. Das Röhrchen in ein zu klein gebohrtes Loch ins Rohr gesteckt.
Die Senoren in dem Gerät sind mit aus den vorhandenen Gummipfropfen geführt.

Gruß

Jan

So, da haben wir nun den (Daten)Salat… :smiley:

Serielle Instanz angelegt, mit den Daten des pdf gefüttert (9600,8,1,keine) und deine Scriptzeile druntergehängt:


COMPort_SendText(32981, chr(0x01).chr(0x21).chr(0x11).chr(0x00).chr(0xA3).chr(0xC6));

Debug gestartet und schon wurde ich schon VOR starten des Scripts mit Daten erschlagen. Zu sehen in der dump.txt

dump.txt (16.9 KB)

Ich schätze, dass die Polls von dem Wandsteuerungsgerät erzeugt werden, das ja auch an der Lüftungsanlage hängt. Ich habe den USB<->RS485 Stick in Reihe dahinter gehängt (zumindest habe ich das so aus der Anleitung erschlossen).
In der Mitte des Dump sieht man dann den von mir gesendeten Wert…

Nur… was fange ich jetzt an mit den Informationen??? :eek::cool::D:D

Lieben Dank wenn mir weiterhin jemand behilflich ist!
LG
Peter

Hallo Jan!

Schön zu hören, dass noch jemand hier im Forum die Anlage besitzt. Hast du auch schon versucht an die Daten des Bus zu kommen?

Leider ist meine Lüftungsanlage hinter einer Regipswand verbaut und ist nur durch einen Revisionsschacht für den Filterwechsel erreichbar. Das macht es mir ein bisschen schwerer an der Anlage rumzubasteln. Ich würde auch nur ungern in die Verkleidung bohren. :rolleyes:
Falls alle Stricke reißen, wird mir aber nicht anderes übrig bleiben…

Auf jeden Fall vielen Dank für die Idee mit den 1wire Fühlern.
Ich hoffe aber noch auf die elegante Variante… :cool:

LG

Dann schau mal,
ich habe das Textfile von Dir mal angefangen auf Info’s zu trimmen.

Jetzt mußt Du herausfinden, laut PDF was es bedeutet. Das Datenformat fängt mit was an und hat so und soviel Zeichen.

…26 7E 14 52 22 00 29 31 0B 14 51 A4 4A B4 FF
01 21 11 00 35 68
01 11 21 35 91 F9
01 21 11 00 A3 D6
01 11 21 A3 81 57
01 21 11 00 71 A4
01 11 21 71 00 A4
01 21 11 00 A3 D6
01 11 21 A3 81 57
01 21 11 00 29 5C
01 11 21 29 1F 7B
01 21 11 00 35 68
01 11 21 35 93 FB
01 21 11 00 A3 D6
01 11 21 A3 81 57
01 21 11 00 71 A4
01 11 21 71 00 A4
01 11 20 2B 00 5D
01 11 20 2C 00 5E
01 11 20 35 93 FA

12.11.2014 14:13:11.00 | RECEIVED | 01 11 20 34 9F 05
12.11.2014 14:13:11.00 | RECEIVED | 01 11 20 32 88 EC
12.11.2014 14:13:11.00 | RECEIVED | 01 11
12.11.2014 14:13:11.00 | RECEIVED | 20 33 8C F1
12.11.2014 14:13:11.00 | RECEIVED | 01 11 20 2A 29 85
12.11.2014 14:13:14.00 | RECEIVED | 01 21 11 00 A3
12.11.2014 14:13:14.00 | RECEIVED | D6 01 11 21 A3 81 57 01 21 11

Dann brauchst Du eine Splitterinstance und ein Script, welches die Hexzeichen an der entsprechender Stelle umcodiert.

Gruß Helmut

Ich breche ab… Sollte das so einfach gewesen sein?? :cool::eek:

Nicht dass ich schon selbst einen Splitter eingerichtet hätte… aber ich werde mich gleich mal dransetzen.

Wow…

Ich halte euch auf dem Laufenden bzw. poste die Lösung falls es klappt! :loveips:

LG Peter

Hallo Helmut.

Nur nochmal zum Verständnis bitte, da ich wirklich noch nie mit Splitter/Cutter gearbeitet habe.

Ich habe mir jetzt einen Cutter auf die Serielle Schnittstelle verlinkt.
Aktiviert habe ich „Benutze feste Schnitte“ und Sync Zeichen 01 11 20 mit Eingabelänge 6…
Im Debug kommen jetzt unter SENDCHUNK nur die wesentlichen Schnipsel an (z:B. 01 11 20 34 A7 0D -> Inside Temp: 22°C).

Ist das die schlauste Methode??

Wie wäre das weitere vorgehen? Eine Register Variable auf ein Script?
Und dann im Script den Input zerlegen und eine if Abfrage auf die einzelnen Datenpunkte?
Oder geht das schlauer bzw. automatisierter?

Eine letzte Frage:
Die Temperaturwerte werden ja auch in HEX übergeben. Anbei ist so eine Umrechnungstabelle von HEX in DEC und dann auf einen bestimmten Temperaturwert.
Muss ich die Liste Punkt für Punkt eingeben um die Umrechnung zu ermöglichen oder gibt es dahinter auch eine Logik?

Wirklich vielen lieben Dank für alle Hilfe bis jetzt…
Hoffentlich interessiert dieses Thema auf lange Sicht noch mehrere Nutzer.

LG
Peter

Ja, Du kannst es doch :wink:
Leider mußt Du Dir so’ne Umrechnungsgeschichte basteln.

Scheinbar ist es die Kommunikation im Gerät, die Du mit loggst.

Du brauchst also kein Befehl zur Sendeanforderung.

Ich mach’ das auch nicht so oft, aber ich würde die Registervariable auf den Cutter ziehen und in der Registervariable das Script aufrufen, welches die Dekodierung macht.

Vorher ein paar passende Variablen erstellen :wink:

Gruß Helmut
PS @JAN hilft Dir bestimmt, er könnte es ja auch gebrauchen ;=)

Ja, ich helfe gern. Nur hast Du mich da auf der falschen Seite erwischt, ich hab vieeeel Probleme mit dem Programmieren und mache lieber in Hardware - siehe 1-Wire statt die Schnittstelle.
Bei mir hab ich die KWL in einen Küchenhängeschrank eingebaut, komme also von vorne gut ran (wenn die Schranktür ausgehängt ist). Für die Fühler hab ich in der Anlage keine Bohrungen gemacht sondern mit durch die vorhanden Gummipfropfen gefädelt. Die Vier in den ISO-Pipe Rohren haben ein kleines Loch.

Wenn Du Fragen hast oder ich etwas ausprobieren soll mach ich natürlich gern mit:)

Jan

Guten Morgen!

Erst mal vorweg… ES LÄUFT!!!
Mit minimalem Aufwand lässt sich nun alles auslesen, was ich brauche.
An dieser Stelle ein HERZLICHES Dankeschön an Helmut für die richtigen Inputs und an Jan vor die alternativen Ideen!

Serielle Schnittstelle -> Cutter -> Reg Variable auf das Ausleseskript. Und schon werden alle Temperaturwerte ausgelesen.
Wirklich geil.

Jan, oder natürlich jeder andere auch: Wenn Interesse an dem Skript besteht, werde ich es sofort online stellen.

:loveips::loveips:

Vielen Herzlichen Dank für die Lösung eines wirklich alten Problems!

VG

Peter

Super, das ging ja schnell. Mit meiner Programmierkunst hätt ich Monate gebraucht (ohne Übertreibung).

Aber sicher! Am liebsten in allen oben beschriebenen Einzelheiten, für Skriptdummies:o
Damit wird dann wohl die 10. und letzte freie serielle Schnittstelle am PC belegt:cool:

Zeigt se noch mehr an als die Temps?

Jan

Danke Jan

Aber gerne doch!

Also, geht los mit einem USB->RS485 Adapter. Ich benutze jetzt schon den zweiten von in-circuit - bezogen über Amazon für 20€.

Angeschlossen hab ich dann das Ganze an meine Wandsteuerung. Selbsterklärend A->A B->B M->GND.
Abschlusswiderstand wird offensichtlich nicht benötigt.

Den USB Adapter auf eine freie COM Schnittstelle gelegt und in IPS einen Serial Port mit folgenden Einstellungen eingerichtet:
Baud Rate: 9600
Datenbits: 8
Stopbits: 1
Parität:keine

Dann einen Cutter eingerichtet, mit Verweis auf die Serielle Schnittstelle.
Einstellungen des Cutters:
Benutze feste Schritte
Eingabelänge: 6
Sync Zeichen: 01 11 20
Setzen und Übernehmen

Dann eine beliebige Kategorie erstellt, darin ein Skript eingerichtet. Inhalt folgt am Ende.
In der Kategorie 4 Float Variablen erstellt.
Zuluft
Abluft
Aussenluft
Fortluft

Eine Integervariable
Lüftungsstufe

Zurück zum Cutter: Unterhalb des Cutters eine Register Variable
Target: Unser (noch) leeres Skript (Auslesescript)
Übergeordnete Instanz: Der CUTTER!!!

Übernehmen.

Jetzt zum Inhalt des Skriptes:
Das Wichtigste… bitte nicht lachen! :wink: Ich habe es mit meinen rudimentären Programmierkenntnissen geschrieben.
Aber es tut was es soll. :wink:
Zu ändern sind natürlich noch einige Stellen - aber nur Variablen IDs.


$Aussen = GetValue(43821 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Aussenluft]*/ );    //32
$Zu = GetValue(38071 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Zuluft]*/ );            //35
$Ab = GetValue(13267 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Abluft]*/ );            //34
$Fort = GetValue(30072 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Fortluft]*/ );        //33

$data = $IPS_VALUE;

$Data = bin2hex($data);

$id = substr($Data,6,2);
$value = substr($Data,8,2);
print_r($value);
switch($id)
{
case "32":
$temp = ConvertTemp($value);
	if ($Aussen != $temp && $temp != 0){
	SetValueFloat (43821 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Aussenluft]*/, $temp);
	}
break;
case "33":
$temp = ConvertTemp($value);
   if ($Fort != $temp && $temp != 0){
	SetValueFloat (30072 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Fortluft]*/, $temp);
	}
break;
case "34":
$temp = ConvertTemp($value);
   if ($Ab != $temp && $temp != 0){
	SetValueFloat (13267 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Abluft]*/, $temp);
	}
break;
case "35":
$temp = ConvertTemp($value);
   if ($Zu != $temp && $temp != 0){
	SetValueFloat (38071 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Zuluft]*/, $temp);
	}
break;
case "29":
	switch($value){
	case "01":
	SetValueInteger (42695 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Stufe]*/ , 1);
	break;
	case "03":
	SetValueInteger (42695 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Stufe]*/ , 2);
	break;
	case "07":
	SetValueInteger (42695 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Stufe]*/ , 3);
	break;
	case "0f":
	SetValueInteger (42695 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Stufe]*/ , 4);
	break;
	case "1f":
	SetValueInteger (42695 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Stufe]*/ , 5);
	break;
	case "3f":
	SetValueInteger (42695 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Stufe]*/ , 6);
	break;
	case "7f":
	SetValueInteger (42695 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Stufe]*/ , 7);
	break;
	case "ff":
	SetValueInteger (42695 /*[Räume\HWR\Lüftungsanlage\Busauslesung\Stufe]*/ , 8);
	break;
	}
default:
break;
}

// Ab hier gibt es nichts mehr zu ändern

function ConvertTemp($wert){
$Temp = "";
switch ($wert){

case "83":
$Temp = 10;
break;
case "84":
$Temp = 10.3;
break;
case "85":
$Temp = 10.6;
break;

case "86":
$Temp = 11;
break;
case "87":
$Temp = 11.3;
break;
case "88":
$Temp = 11.6;
break;

case "89":
$Temp = 12;
break;
case "8a":
$Temp = 12.3;
break;
case "8b":
$Temp = 12.6;
break;

case "8c":
$Temp = 13;
break;
case "8d":
$Temp = 13.3;
break;
case "8e":
$Temp = 13.6;
break;

case "8f":
$Temp = 14;
break;
case "90":
$Temp = 14.3;
break;
case "91":
$Temp = 14.6;
break;

case "92":
$Temp = 15;
break;
case "93":
$Temp = 15.3;
break;
case "94":
$Temp = 15.6;
break;

case "95":
$Temp = 16;
break;
case "96":
$Temp = 16.3;
break;
case "97":
$Temp = 16.6;
break;

case "98":
$Temp = 17;
break;
case "99":
$Temp = 17.5;
break;

case "9a":
$Temp = 18;
break;
case "9b":
$Temp = 18.3;
break;
case "9c":
$Temp = 18.6;
break;

case "9d":
$Temp = 19;
break;
case "9e":
$Temp = 19.3;
break;
case "9f":
$Temp = 19.6;
break;

case "a0":
$Temp = 20;
break;
case "a1":
$Temp = 20.5;
break;

case "a2":
$Temp = 21;
break;
case "a3":
$Temp = 21.3;
break;
case "a4":
$Temp = 21.6;
break;

case "a5":
$Temp = 22;
break;
case "a6":
$Temp = 22.3;
break;
case "a7":
$Temp = 22.6;
break;

case "a8":
$Temp = 23;
break;
case "a9":
$Temp = 23.5;
break;

case "aa":
$Temp = 24;
break;
case "ab":
$Temp = 24.3;
break;
case "ac":
$Temp = 24.6;
break;


case "ad":
$Temp = 25;
break;
case "ae":
$Temp = 25.5;
break;

case "af":
$Temp = 26;
break;
case "b0":
$Temp = 26.5;
break;

case "b1":
$Temp = 27;
break;
case "b2":
$Temp = 27.3;
break;
case "b3":
$Temp = 27.6;
break;

case "b4":
$Temp = 28;
break;
case "b5":
$Temp = 28.5;
break;

case "b6":
$Temp = 29;
break;
case "b7":
$Temp = 29.5;
break;

case "b8":
$Temp = 30;
break;
case "b9":
$Temp = 30.5;
break;

default:
break;
}
return $Temp;
}

Ich hoffe ich habe ein weing von der Hilfe, die ich erhalten habe, zurückgeben können. Bei Fragen stehe ich jederzeit zur Verfügung.

LG
Peter

Ich habe jetzt erst mal Temperaturen von 10 bis 30 Grad eingegeben. Werde ich aber bald noch erweitern - bzw ist ja nicht so schwer das selbst dazuzufügen.

Es werden theoretisch alle Werte aus em pdf im ersten Thread ausgelesen. Manche jedoch nur auf explizite Anfrage per Script bzw. bei Änderung.

VG

Das Wichtigste… bitte nicht lachen! Ich habe es mit meinen rudimentären Programmierkenntnissen geschrieben.

Naa, Ehre wem Ehre gebührt.

Deine bzw. Rudi’s mentäre Kenntnisse sind schon nicht schlecht.

Fein Fein und freut mich dass ich Dir helfen konnte.

Gruß Helmut

Vielen Dank für die ausführliche Beschreibung. Ich hoffe das ich am Wochenende Zeit finde das mal auszuprobieren.

Hallo gemeinde, bin noch neu und unerfahren bei IPS.

Habe der Anleitung soweit folgen können, jedoch scheitere ich daran, dass ich unterhalb des angelegten Cutters keine Register Variable anlegen kann.
Was mache ich falsch?

Oder liegt es an der Tatsache, dass ich noch im Demo Betrieb unterwegs bin…