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

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…

Hallo zusammen,

ich weiss, dieser Thread ist schon älter und ich benutze auch gar kein IP-Symcon, aber ich hoffe trotzdem, mir kann jemand helfen, denn die Beiträge in diesem Thread hören sich so an, als hätten mehrere mein Problem schon mal gelöst…

Ich habe bei mir zu Hause eine Wago SPS 750-880 verbaut. Darüber hinaus habe ich eine Vallox ValloPlus 510 SE Lüftungsanlage mit je einer Fernbedienung (FBD 382-LCD) im EG und OG, die laut Dokumentation über eine RS485-Schnittstelle angeschlossen sind, allerdings mit 5 Drähten. Nun möchte ich die KWL mit Hilfe einer Klemme 750-652 (serielle Schnittstelle) an die SPS anbinden.

Ich habe die Schnittstellendokumentation der RS485-Schnittstelle so verstanden, dass diese einen Zweidrahtbetrieb plus common ground vorsieht. I. d. R. sind die Anschlüsse des Busses mit A und B bezeichnet.

Die Wago Klemme verfügt über die 5 Anschlüsse A und B, Y und Z sowie Masse. Sie kann in verschiedenen Modi betrieben werden, u. a. als RS485 oder RS422. In der Doku der Klemme sind im RS485-Modus die beiden Anschlüsse Y und Z direkt mit den Anschlüssen A und B verbunden. Die Anschlüsse Y und Z sind nur im RS422-Modus separat verdrahtet.

Die Lüftungsanlage hat wie schon geschrieben 5 Anschlüsse: A, B, +, - und M. M wird in der Doku auch mit „Metall“ bezeichnet, darum gehe ich davon aus, dass es sich um common ground handelt. Wofür aber sind die Anschlüsse + und -, die zusätzlich zu A und B separat angeschlossen sind? Handelt es sich doch um eine RS422 Schnittstelle?

Kann mir jemand sagen, wie ich die KWL an die Klemme anschließen muss?

Vielen Dank im Voraus!

Andreas

Ich hatte parallel auch Vallox angeschrieben. Die haben mir eben folgendes geschrieben:
„wie Sie schon richtig schreiben besteht der RS485 aus den Anschlüssen A/B und M als Masse. Die Klemmen Plus und Minus sind die Betriebsspannung für die Bauteile wie Bedienteil, Feuchte und Co² Fühler.“ Hätte ich auch eigentlich selbst drauf kommen können, dass die Fernbedienung Strom braucht unabhängig von den Busleitungen… :rolleyes:

In diesem Zusammenhang bin ich noch auf folgendes Projekt gestossen, das vielleicht für den einen oder anderen interessant sein könne:

home · Tom-Bom-badil/helios Wiki · GitHub

Hallo Gruppe,

leider besitze ich nur sehr rudimentäre IP-Symcon Kenntnisse.

Gerne möchte ich meine Vallox Digit SE Anlage daran anbinden.
Gibt es noch jemanden, der mich dabei unterstützen kann bzw. eine DAU Anleitung zur Verfügung stellt?

Vielen Dank für Eure Hilfe!

Hä, hä, genau 4 Jahre nach dem ich geschrieben habe das ich das auch machen will, hab ich es tatsächlich auch mal, mit Hilfe der Vorarbeit von Peter, angegangen :rolleyes:

Bei mir wollt ich ja eine vorhandene Serielle vom Motherboard nehmen, habe aber doch einen RS485 --> USB in der Bucht besorgt.
Es geht nicht nur das auslesen der 4 Temps und der Lüfterstufe, sondern ich setze auch die gewünschte Lüfterstufe. Es geht bestimmt auch eine weitere Programmierung, die ich aber erst mal nicht probiert habe.

Hier eine kurze Aufdröselung des Protokolls (siehe Anhänge im ersten Beitrag von Peter)

01 21 11 29 01 5D

01 = Anfang der der Übertragung
21 = Sender (Bedienteil 1)
11 = Empfänger (Masterboard)
29 = Welcher Wert (Lüfterstufe)
01 = Wert (Stufe 1)
5D = Prüfsumme

Einige Mögliche Werte…

Sender
11 = Mastermainbord
21-29 = Bedienfelder

Empfänger
10 = Slavemainboards
11 = Mastermainboard
20 = alle Bedinfelder
21-29 = Bedienfelder

welcher Wert
00 = Frage nach Wert
29 = Lüfterstufe
32 = Aussentemp
33 = Fortluft Temp
34 = Absaug Temp
35 = Zuluft Temp

Prüfsumme
Summe der vorherigen Werte in 8Bit

Ich habe erst mal so getan als ob ich das vorhandene Bedienfeld wäre und habe als „21“ gesendet. Die Lüfterstufe wird eingestellt, und kommt als Bestätigung zurück - und damit dann auch im Display des Bedienfelds angezeigt.

Dann wollt ich mal als weiteres Bedienfeld agieren. Habe damit folgende Befehle gesendet und habe dann eine Antwort vom 11 an das 22 bekommen. Kurz danach ging die Info auch an alle Bedienfelder 20 vom 11 raus.

COMPort_SendText(ComPortID, chr(0x01).chr(0x22).chr(0x11).chr(0x29).chr(0x01).chr(0x5E));

01 22 11 29 01 5E - also Display 22 sendet an Motherboard 11 Lüftersufe 29 den Wert 01 Checksumme 5E
KWL schaltet auf stufe 1

01 22 11 29 01 5E - Stufe 1
01 22 11 29 03 60 - Stufe 2
01 22 11 29 07 64 - Stufe 3
01 22 11 29 0F 6C - Stufe 4
01 22 11 29 1F 7C - Stufe 5
01 22 11 29 3F 9C - Stufe 6
01 22 11 29 7F DC - Stufe 7
01 22 11 29 FF 5C - Stufe 8

01 22 11 00 29 5D
Das Bedienfeld 22, fordert 00, von Masterboard 11, die Info der Lüfterstufe 29, Prüfsumme 5D