Websockets Webinterface (ab FW 3.81)

In Arbeit



Seit Firmware Version 3.81 setzt die Luxtronik 2 für das Webinterface auf Websockets statt wie bisher auf ein Java Applet. Deshalb ist die herangehensweise zur Nutzung der Daten auch eine komplett andere.

Grundlagen

Die Grundlagen zu Websockets im Allgemeinen können bei Wikipedia nachgelesen werden.

Es ist wichtig zu wissen das (meines Wissens nach) von Loxone keine direkte Unterstützung von Websockets existiert, weshalb auf eine Gateway in Form von z.B. Node-RED zurückgegriffen werden muss.

Hier ist jedoch beschrieben wie das Protokoll aussieht, 

Verbindung aufbauen und authentifizieren

Die Verbindung erfordert IP Adresse und Port der Luxtronik, die IP ist variabel, der Port ist immer 8214. Ausserdem muss immer das verwendete Protokoll mit angegeben werden, in diesem Fall Lux_WS.

Hier ein Beispiel in NodeJS:
const ws = new WebSocket('ws://192.168.1.10:8214', 'Lux_WS');

Nachdem die Verbindung aufgebaut ist, muss ein Authentifizierungsrequest gesendet werden, dieser erfordert das auf der Luxtronik unter Webserver angegebene Passwort (Standard 999999):

ws.send('LOGIN;999999');

Daten anfordern

Um Daten anzufordern, sendet man zuerst ein Refresh Kommando:

ws.send('REFRESH');

Dieses liefert die Struktur der Daten im XML Format zurück:

<?xml version="1.0"?> <Navigation id="0x2931d8"> <item id="0x28dea0"> <name>Informationen</name> <item id="0x28d900"> <name>Temperaturen</name> </item> <item id="0x28d948"> <name>Eing&#xE4;nge</name> </item> <item id="0x28d990"> <name>Ausg&#xE4;nge</name> </item> <item id="0x28d9d8"> <name>Ablaufzeiten</name> </item> <item id="0x290008"> <name>Betriebsstunden</name> </item> <item id="0x28ff40"> <name>Fehlerspeicher</name> </item> <item id="0x28fef8"> <name>Abschaltungen</name> </item> <item id="0x28feb0"> <name>Anlagenstatus</name> </item> <item id="0x28fe68"> <name>W&#xE4;rmemenge </name> </item> <item id="0x28fe00"> <name>GLT</name> </item> </item> <item id="0x293780"> <name>Einstellungen</name> <item id="0x28be20"> <name>Betriebsart</name> </item> <item id="0x28b4b8"> <name>Temperaturen</name> </item> <item id="0x290498"> <name>System Einstellung</name> </item> </item> <item id="0x293220"> <name>Zugang: Benutzer</name> </item> </Navigation>

Aus diesem XML kann man dann die Daten zu den einzelnen items anfordern, dazu wird die entsprechende ID verwendet:

ws.send('GET;0x28d900');



Wichtig ist zu wissen, dass sich die IDs ändern. 2 "REFRESH" Befehle ergeben für jedes Item eine andere ID!

Daten senden

Aus diesem XML kann man erkennen das bestimmte Werte veränderbar sind. Diese können mit den ebenfalls aus dem Datensatz ersichtlichen Werten gesendet werden, dazu wird die entsprechende ID verwendet:

ws.send('SET;0x28d900;<value>');

Info: Für den Softwarestand V3.85.5 (r6309) einer Novelan WP ist der nachstehende Text zu senden. 

ws.send('SET;set_0x28d900;<raw>');

<raw> ist durch den zugehörigen Wert zu ersetzen. Für den Softwarestand V3.85.5 (r6309) hat der Request ws.send('GET;0x293780'); die nachstehende Rückmeldung ergeben (nicht setzbare Items sind durch ... ausgeblendet).

<?xml version="1.0" encoding="UTF-8"?> <Content> <item id="0x9ecf5c"> <name>Betriebsart</name> <item id="0xa30874"> <name>Heizkreis</name> <option value="0">Automatik</option> <option value="1">Zus. Wärmeerz</option> <option value="2">Party</option> <option value="3">Ferien</option> <option value="4">Aus</option> <raw>0</raw> <value>Automatik</value> </item> <item id="0xa35bec"> <name>Warmwasser</name> <option value="0">Automatik</option> <option value="1">Zus. Wärmeerz</option> <option value="2">Party</option> <option value="3">Ferien</option> <option value="4">Aus</option> <raw>0</raw> <value>Automatik</value> </item> <item id="0xa1b4c4"> <name>Kühlung</name> <option value="0">Aus</option> <option value="1">Automatik</option> <raw>0</raw> <value>Aus</value> </item> <name>Einstellungen</name> </item> <item id="0x9d4eac"> <name>Temperaturen</name> <item id="0xa35c3c"> <name>Rückl.-Begr.</name> <value>45.0°C</value> </item> ... <item id="0x9d8f2c"> <name>TDI-Solltemp</name> <min>500</min> <max>700</max> <step>10</step> <unit>°C</unit> <div>10.00</div> <raw>650</raw> <value>65.0°C</value> </item> ... <item id="0x9decf4"> <name>Absenk. bis</name> <min>-200</min> <max>100</max> <step>5</step> <unit>°C</unit> <div>10.00</div> <raw>50</raw> <value>5.0°C</value> </item> ... <item id="0x99bc7c"> <name>Min. Rückl.Solltemp.</name> <min>150</min> <max>300</max> <step>5</step> <unit>°C</unit> <div>10.00</div> <raw>150</raw> <value>15.0°C</value> </item> ... <name>Temperaturen</name> </item> <item id="0xa1a94c"> <name>System Einstellung</name> ... <item id="0xa4474c"> <name>Raumstation</name> <option value="0">Nein</option> <option value="4">RBE</option> <option value="6">Smart</option> <raw>0</raw> <value>Nein</value> </item> ... <item id="0xa37434"> <name>Warmwasser1</name> <option value="0">Fuehler</option> <option value="1">Therm.</option> <raw>0</raw> <value>Fuehler</value> </item> ... <item id="0xa1d9bc"> <name>WW+WP max</name> <min>0</min> <max>80</max> <step>5</step> <unit>h</unit> <div>10.00</div> <raw>60</raw> <value>6.0 h</value> </item> <item id="0xa1e41c"> <name>Pumpenoptim.</name> <option value="0">Nein</option> <option value="1">Ja</option> <raw>1</raw> <value>Ja</value> </item> ... <item id="0xa4078c"> <name>Kühlung</name> <option value="0">Festt.</option> <option value="1">AT-Abh.</option> <raw>0</raw> <value>Festt.</value> </item> <item id="0xa02674"> <name>Ausheizen</name> <option value="0">m. Misch</option> <option value="1">o. Misch</option> <raw>0</raw> <value>m. Misch</value> </item> ... <item id="0xa3fe14"> <name>Heizgrenze</name> <option value="0">Nein</option> <option value="1">Ja</option> <raw>1</raw> <value>Ja</value> </item> ... <item id="0xa34614"> <name>Fernwartung</name> <option value="0">Nein</option> <option value="1">Ja</option> <raw>0</raw> <value>Nein</value> </item> <item id="0x9df39c"> <name>Pumpenoptim. Zeit</name> <min>5</min> <max>180</max> <step>5</step> <unit>min</unit> <div>1.00</div> <raw>180</raw> <value>180 min</value> </item> ... <item id="0x9ea344"> <name>Warmw. Nachheizung</name> <option value="0">Nein</option> <option value="1">Ja</option> <raw>0</raw> <value>Nein</value> </item> <item id="0x83526c"> <name>Warmw. Nachh. max</name> <min>10</min> <max>100</max> <step>5</step> <unit>h</unit> <div>10.00</div> <raw>50</raw> <value>5.0 h</value> </item> ... <item id="0xa1e18c"> <name>Regelung MK1</name> <option value="0">schnell</option> <option value="1">mittel</option> <option value="2">langsam</option> <raw>0</raw> <value>schnell</value> </item> <name>Einstellungen</name> </item> </Content>

Die gesendet Daten müssen anschliessend noch gespeichert werden:

ws.send('SAVE;1');

Alternativ kann man die geänderten Werte auch verwerfen:

ws.send('SAVE;0');