Loxone Link

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Loxone Link

Einführung

Der Loxone Link ist ein auf dem CAN-Bus basierender Bus. Er verbindet den Miniserver mit den sog. Extentions des österreichischen Herstellers Loxone. Dieser Bus stellt quasi das Rückgrat des Heimautomationssystems dar.

Leider ist das Protokoll dieses Busses nicht offengelegt, sodass es einiger Analyse bedarf, um trotzdem an entsprechende Informationen zu kommen.

Idee

Die Idee des Projektes ist, seine eigene Hardware direkt an den Loxone Link anschließen zu können ohne weitere Extentions zu benötigen. Auf der eigenen Hardware soll ein Mikrocontroller laufen, welcher mit dem Loxone Link bzw. dem Miniserver kommunizieren kann.

Natürlich könnte man fertige Extentions verwenden, allerdings ergeben sich da ein paar Nachteile, weswegen die Idee für dieses Projekt geboren wurde.

Nachteile der Relayextention:

-Man muss immer einen Relaisausgang verwenden, obwohl ein Transistorausgang (24V) ausreichen würde
-Zerstört man ein Relais ist die Extention nicht mehr vollständig brauchbar.
-Verschleißen die Relais, ist die Extention ebenfalls nicht mehr vollständig brauchbar
-Zum verdrahten wird relativ viel Platz benötigt, sitzen zwei Extentions übereinander in einem Verteiler, wird es schon mal eng
-Die Zweifachschraubklemmen sitzen sehr locker, stehen Adern mechanisch unter Spannung drohen die Klemmen rauszurutschen
-Das Gehäuse der Extention kann sich auch bei sanfter Krafteinwirkung relativ leich öffnen, die spannungsführende Platine hängt dann in der Luft und könnte berührt werden
-nicht beschriftete Klemmen sind bei einem professionellem Produkt ein NoGo

Nachteile der DI-Extention:

-preislich leider viel zu teuer
-nicht beschriftete Klemmen sind bei einem professionellem Produkt ein NoGo

Vorteile der Lösung mit Eigener HW:

+Es kann auf einem Controller mehr als eine Extention abgebildet werden
+Mischung aus Ein- und Ausgängen ist Möglich
+Trennung im Verteiler zwischen Niederspannung und Kleinspannung besser möglich
+Externe Koppelrelais sind vergleichsweise günstig, geht eins kapputt kann dieses einzeln getauscht werden
+I/O's lassen sich direkt in eigene Hardware integrieren
+freie Controllerwahl möglich

Setup des Versuchaufbaus

[Miniserver Go]--CAN--[RS485-Extention]--RS485--[Relaiskarte]

Der Miniserver Go und die RS485 Extention stammen beide von Loxone. Der Miniserver Go ist mit dem LAN verbunden und über Loxone Link mit der RS485-Extention. An der RS485-Extention hängt per RS485 eine Relaiskarte, welche mit 8 Relais bestückt und einem ATMega32 bestückt ist.

Zusätzlich zur RS485-Extention wurden eine Relayextention und eine DI-Extention untersucht.

Technische Details

Um zu sehen was auf dem Bus passiert, ist es naheliegend dessen Komunikation abzuhören. Zuerst stellt sich jedoch die Frage nach der Baudrate. CAN kann je nach Länge mit unterschiedlichen Baudraten betrieben werden.

Da der Hersteller für diesen Bus eine maximale Länge von 500m angibt, ist es naheliegend im Internet zu suchen, welche Baudraten bei CAN-Bussen welche max. 500m lang sind üblich sind.

Laut RN-Wissen wird für 500m eine max. Datenraten von 125kbit/s angegeben.

Mit dieser Information kann man nun versuchen am Bus zu horchen und versuchen irgendwelche Daten abzugreifen.

Um dies zu bewerkstelligen, wurde ein EvaBoard-CAN von der Firma e-lab verwendet. (Natürlich können auch andere Boards verwendet werden, dieses stand jedoch gerade zur Verfügung.)

Auf Grund des verbauten ATCAN128 und der auf Steckerleisten geführten I/O-Pins war es relativ schnell möglich Ein- bzw. Ausgänge zum Testen zu verwenden.

Zum Anschluss an den Loxone Link wurden Link+ mit CAN-H und Link- mit CAN-L verbunden.

Variante zum ersten Testen: Als Software wurde das "can_spy_echo_example" aus der Atmel CAN-Lib verwendet.

Die Software wurde für den Test so modifiziert, das der UART fest auf die Baudrate 115200 Baud und der CAN-Bus fest auf 125kbit/s eingestellt ist.

Weiterhin wurden die Zeilen auskommentiert, in denen sich das Programm beendet, wenn die CAN-ID 0 empfangen wird. Zum Schluss wurde noch der Mode fest auf "Spy" einegstellt.

Nun muss nur noch die Software in den Controller des EvaBoards geflasht werden und es kann los gehen.

Nach einiger Zeit sieht man die ersten Telegramme. Wenn man es nicht auf den ersten Blick erkennt, wird man vielleicht beim zweiten Blick feststellen, das Seriennummern der Extentions gleich der CAN-ID sind.

Weiterhin wird man Daten wieder erkennen, die man als Befehl an seine RS485 Extention geschickt hat. Diese Daten scheinen jedoch nicht vollständig zu sein, wahrscheinlich muss man den Code für den CAN-Monitor von Atmel noch etwas anpassen um wirklich alle Daten zu sehen.

Bevorzugte Variante: Zum weiteren Testen habe ich einen USBtin von Thomas Fischl besorgt. Zusammen mit dem in Java geschriebenen USBtinViewer lässt sich einfach nachvollziehen, was auf dem Bus los ist. Das Schöne ist, das man mit dem USBtinViewer auch Telegramme auf den Bus schicken kann.

In Verbindung mit dem Debugmonitor in Loxone Config lassen sich so Telegramme beobachten und deren Funktion analysieren

Da es für den USBtin auch Beispielcode in C# gibt, ist es relativ einfach eine Extention bzw. deren Funktionen am PC zu simulieren, bzw. vorgefertigte Telegramme auf Knopfdruck auf den Bus zu senden.

Protokollanalyse

Allgemeines

Auf dem Loxone Link scheint es mehrere Typen von Telegrammen zu geben. Dies sind im wesentlichen Telegramme zur Systemverwaltung und Telegramme zur Übertragung von Nutzdaten.

Alle CAN-Telegramme sind grundsätzlich erweiterte Telegramme und der Data Lenght Code (DLC) ist immer 8. Alle Extentions werden über Ihre Seriennummer angeprochen, welche immer 0x0xxxxxx ist. Es gibt allerdings auch Telegramme welche mit 0x1xxxxxx beginnen, wobei xxxxxxx der individuelle Teil der Seriennummer ist. Diese Telegramme sind wahrscheinlich Antworttelegramme.

Außerdem geistern auf dem BUS noch CAN-IDs herum, welche mit keiner Seriennummer übereinstimmen, vermutlich werden über diese IDs allgemein gültige Informationen übertragen.

Der Miniserver wird scheinbar auch nicht über seine Seriennummer angesprochen sondern er lauscht permanent am Bus, um die für sich relevanten Telegramme "herauszufiltern".

Loxone scheint anhand der Seriennummern zu unterscheiden, um welche Art von Extention es sich handelt:

SN Art der Extention
0x01xxxxxx Extention
0x02xxxxxx Dimmer Extention
0x03xxxxxx EnOcean
0x04xxxxxx DMX
0x05xxxxxx 1-Wire
0x06xxxxxx RS232
0x07xxxxxx RS485
0x08xxxxxx IR
0x09xxxxxx Modbus
0x0Bxxxxxx Relais
0x0C00001 Air Base (Miniserver Go)
0x0Cxxxxxx Air Base
0x0Dxxxxxx DALI
0x0Fxxxxxx Fröhling
0x12xxxxxx Internorm
0x13xxxxxx Tree
0x14xxxxxx Digital Input (DI)

Zum finden von Extentions sendet der Miniserver an ID 0x00000000 { 0x0b, 0x00, 0x00, 0x00, 0x6e, 0x95, 0x6b, 0x00 }.

Befehlstabelle
Befehl Sender Empfänger D1 D2 D3 D4 D5 D6 D7 D8
Ident MS 0x0xxxxxxx 0x08 0x3b 0x00 0x00 0x00 0x00 0x00 0x00
Alive 0x0xxxxxxx MS 0x89 0x00 0x00 0x00 0x6e 0x95 0x6b 0x00
Alive Resp. MS 0x1xxxxxxx Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel
Online 0x0xxxxxxx MS Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel
Relais set. MS 0x0xxxxxxx 0x60 0x00 0x00 0x00 Rel. 1-7 Rel. 8-14 0x00 0x00
Relais stat. 0x0xxxxxxx MS 0xE0 0x01 0x00 0x00 St. Rel. 1-7 St. Rel 8-14 0x00 0x00
Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel
Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel Beispiel

Relais Extention

Die Relaisextention von Loxone besitzt 14 Relais. In vielen Fällen würden allerdings Transistorausgänge ausreichen, da man nicht für jede Anwendung immer ein Relais benötigt (Energie sparen) oder man sowieso ein Intallationsrelais zum entkoppeln zwischenschaltet, da ein kaputtes Koppelrelais billiger ist als eine Komplette Extention.

Relais - Byte Zuordnung
Relais Wertigkeit Byte
1 1 1
2 2 1
3 4 1
4 8 1
5 1 1
6 2 1
7 4 1
8 8 1
9 1 2
10 2 2
11 4 2
12 8 2
13 1 2
14 2 2

Für die Abbildung der Ausgangsstati und zum setzen der Relais werden also 4 Byte im CAN-Frame belegt. Es wird immer eine Bytefolgeübertragen, welche den Wert aller gesetzten Relais enthält. {0x60,0x00,0x44,0xce,0x3f,0xff,0x00,0x00} an die ID 0x1Bxxxxxx schaltet alle 14 Relais ein. Dabei scheinen die Datenfelder 1 und 2 eine Art Befehlskennung zu sein im Feld 5 stehen die Relais 1-8 und im Feld 6 die Relais 9-14, wobei das LSB das jeweils kleinste Relais ist.

Die Extention antwortet mit{0xe0,0x01,0x00,0x00,0xff,0x3f,0x00,0x00} mit der ID 0x0Bxxxxxx zeigt an, das alle Relais eingeschalet sind (Felder 5 und 6). In den Feldern 3 und 4 wird scheinbar die CPU-Temperatur übertragen.


Durch senden von {0x08,0x3b,0,0,0,0,0,0} an die ID der Extention wird diese zum blinken gebracht um diese in der Verteilung identifizieren zu können.

Zusätzlich sendet die Exention scheinbar zyklich eine Alive Nachricht mit der Firmwareversion auf den Bus.

  • Extention sendet Alive -> Bus { 0x89, 0x00, 0x00, 0x00, 0x6e, 0x95, 0x6b, 0x00 } mit eigener ID (die Felder 8-5 enthalten die FW-Version der Extention (705006))
  • Minierver sendet Alive -> Extention { 0x0f, 0x56, 0x8f, 0x21, 0xb0, 0x56, 0x8f, 0x21 } mit ID der 0x1xxxxxxx
  • Extention sendet Online -> Bus { 0x8f, 0x00, 0x00, 0x00, 0x6e, 0x95, 0x6b, 0x00 } mit eigener ID (die Felder 8-5 enthalten die FW-Version der Extention (705006))

Nachbau:

Für Nachbauwillige gibt es weitere Informationen hier.

Digital Input (DI)

Die DI-Extention bietet dem Anwender 20 Digitale Eingänge. Diese Eingänge können bspw. Schalter oder Taster sein, die im Gebäude verbaut wurden. Mittels der DI-Extention lassen sich Gebäude die mit Installationsrelais realisiert sind recht einfach smart machen. Die DI-Extention wird genauso wie die Relais Extention an eine Stromversorgung von 24V und den Loxone-Link (CAN-Bus) angeschlossen.

Nachfolgender Protokollmitschnitt zeigt die Zuordnung der Eingänge zu den einzelnen Bytes.

Loxone scheint bei der DI-Extention einen Art Adressumetzung zu verwenden, sodass die ID, die verwendet wird nicht gleich der ID der Extention ist. Wie diese Umsetzung auf beiden Seiten funktioniert ist noch unklar.

B1 beinhaltet den sog NAT-Index. In meinem Fall hat die erste DI-Extention den NAT-Index 04 und die zweite 06.

Die Adresse, an welche die Eingangsbytes geschickt werden, wird also

für NAT-ID 04:
    1000 0080
 OR 0000 0400
  = 1000 0480
oder für NAT-ID 05:
    1000 0080
 OR 0000 0500
  = 1000 0580

berechnet.

Bespiel-Telegramme für je ein einzelnes Eingangsbit (I1-I20), NAT-ID: 6 Bei mehreren gesetzten Bits werden die Wertigkeiten in den Felden B5, B6 und B8 entsprechend addiert.

I1-8			      B1 B2 B3 B4 B5 B6 B7 B8
----         		      -----------------------
ID: 10006080;		 Msg: 06 00 00 00 01 00 00 00
ID: 10006080;		 Msg: 06 00 00 00 02 00 00 00
ID: 10006080;		 Msg: 06 00 00 00 04 00 00 00
ID: 10006080;		 Msg: 06 00 00 00 08 00 00 00
ID: 10006080;		 Msg: 06 00 00 00 10 00 00 00
ID: 10006080;		 Msg: 06 00 00 00 20 00 00 00
ID: 10006080;		 Msg: 06 00 00 00 40 00 00 00
ID: 10006080;		 Msg: 06 00 00 00 80 00 00 00

I9-16
-----
ID: 10006080;		 Msg: 06 00 00 00 00 01 00 00
ID: 10006080;		 Msg: 06 00 00 00 00 02 00 00
ID: 10006080;		 Msg: 06 00 00 00 00 04 00 00
ID: 10006080;		 Msg: 06 00 00 00 00 08 00 00
ID: 10006080;		 Msg: 06 00 00 00 00 10 00 00
ID: 10006080;		 Msg: 06 00 00 00 00 20 00 00
ID: 10006080;		 Msg: 06 00 00 00 00 40 00 00
ID: 10006080;		 Msg: 06 00 00 00 00 80 00 00

I17-20
------
ID: 10006080;		 Msg: 06 00 00 00 00 00 01 00
ID: 10006080;		 Msg: 06 00 00 00 00 00 02 00
ID: 10006080;		 Msg: 06 00 00 00 00 00 04 00
ID: 10006080;		 Msg: 06 00 00 00 00 00 08 00

Die DI-Extention scheint zyklich den Zustand der Eingänge an den Miniserver zu senden. Ein entsprechendes Telegramm sieht bspw. so aus:

ID: 10606008;		 Msg: 00 05 00 00 00 00 00 00

Quellcode

Zum entwickeln wurde AtmelStudio verwendet, das Projekt sollte sich problemlos für den AT90CAN128 übersetzen lassen. Einstellungen bezüglich der ID der Extention sind in der config.h vorzunehmen. Die ID hat für eine Relaisextention immer mit 0x0B zu beginnen. Sollte ein MCP2515 verwendet werden, ist in den Projekteinstellungen die libcan durch libcan_mcp2515 zu ersetzen. Der MCP2515 ist mit 16Mhz zu takten. Sollte man weitergehende EInstellung bezüglich des CAN-Controllers ändern wollen oder müssen, dann muss die canlib selbst übersetzt werden. Die Quellen gibt es hier: Fabian Greif avr-can-lib.

Das Projekt zum herunterladen: coming soon.