Skip to end of metadata
Go to start of metadata

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');
  • No labels

19 Comments

  1. Vielen Dank für die Erläuterungen. Wäre es möglich den kompletten Code für die Abfrage des Webservers zu bekommen?


    Gibt es auch eine Variante welche unter Python läuft?


    Gruss

    Stefan

    1. Hi Stefan,

      hier findes du den gesamten code als GitHub Repo, ist ein NodeRed modul.

      Für Python hab ich momentan nichts , wäre mir aber auch wesentlich lieber als nodejs. Evtl. findst du in diesem HomeAssistant Form Thread etwas das dir weiter hilft

  2. Besten Dank, Habe heute eine Verbindung mit Phyton hinbekommen.  Library:  https://www.willmcgugan.com/blog/tech/post/announcing-lomond/


    ws = WebSocket("ws://192.168.0.xxx:8214",protocols=['Lux_WS'])


    Gruss

    Stefan


  3. Hoi Bouni


    Das Senden von "REFRESH" bewirkt bei mir nichts. Wie bist Du eingentlich darauf gekommen?


    Zu meiner Uberraschung durfte ich feststellen da ich bei mir die Daten nach upgrade auf die SW V3.82.5 auch das "alte" Interface für das Abholen der Daten noch funktioniert.


    Gruss

    Stefan

    1. Durch Reverse Engineering.

      Vielleicht haben sie das alte Webinterface aus Gründen wieder aktiviert !?

  4. Hallo

    Ich blick nicht durch. Welche node benötige ich genau und wo. Wie werden sie konfiguriert?
    Wenn ich mich mit dem Browser verbinde auf das Webinterface sehe ich nach PW eingabe und anschliessendem klick auf Info, alles. Nur benötige ich die Daten in der Visu und nicht auf der Browserseite. Deshalb hab ich dir Anleitung versucht nachzubasteln. Ich hab Nodered, verstehe aber nicht genau was ich dort mache mit dem Websocket. Kannst du das noch grafisch zeigen. Auch mit den Einstellungen etc..

    Hab mal die Node (luxtronic2) installiert.

    Wird diese jetzt mit dem websocket verbunden? - wo ist denn die Texteingabe für den Code?

    und jetzt?

    Sorry für die blöden Fragen, bin noch neu..

    Besten Dank im Voraus.

    Grüsse

    1. Hier 2 mögliche Implementierungen für NodeRed:

      https://pastebin.com/cSjzCc11

      In der GUI siehts dann wie folgt aus:

      Der Websocket Node funktioniert recht gut, allerdings kannst du damit die Temperaturanhebung nicht realisieren.

      Die Konfiguration ist hingegen denkbar einfach:


      Für die Temperaturanpassungen bin ich auf das Java Interface ausgewichen - aus dem Dropdown wird der Wert getriggert und über die Function Blocks aufbereitet und über TCP requests versendet.

      Die HEX Werte findest du hier beschrieben:

      Java Webinterface

      Historie:

      Ich hab mir eine Fork vom https://github.com/Bouni/node-red-contrib-luxtronik2-ws source code erstellt (https://github.com/rafichris/node-red-contrib-luxtronik2-ws ) da die ausgegebenen Objekte fehlerhaft waren. (Info: der Luxtronik2 Node hat eine Abhängigkeit zu node-red-contrib-luxtronik2-ws). Die Datenpakete im Netzwerk können mit Wireshark analysiert werden. Nach getaner Arbeit bin ich draufgekommen, dass ich Temperaturanpassungen über das WS Interface nicht durchführen kann. :/ Daher die Zwitterimplementierung mit dem Java interface.
      Einige der Angaben hier im Wiki waren auch falsch bzw. nicht aktuell. Im Moment läuft bei mir der Fork, wobei ich auch sagen muss, dass es für den Standarduser einfacher ist die 2 oben angeführten Varianten einfach parallel zu betreiben.

      Mein Datenlogger sieht wie folgt aus:

      https://pastebin.com/c05dzjm8


      Viel Erfolg!


  5. WOW Danke Christoph!

    Echt Klasse! Vielen Dank!!!

    Ich kann die Daten auslesen. Steuern brauch ich nicht.

    Das loggen / trenden geht mei mir nicht, aber das ist auch egal.

    Zur Zeit steh ich etwas auf dem Schlauch wie ich diese Daten weiterleiten bzw verwenden kann. Du gibst sie ja in einem "Textnode" ans Dashboard raus. dort sind sie dann "gefangen"...(smile)
    Da ich die Daten aber zu meiner Visu von iobroker weiterleiten möchte, benötige ich ein anderes/weiteres? Node.
    Kennstdu etwas, bzw weisst auch wie dann konfigurieren?

    In meinen Augen benötige ich einen Zwischenschritt, zwischen deinem Funktionnode und meinem "iobroker out" node.

    Besten Dank schon mal im Voraus!

    Grüsse MArtin


    1. Ursprünglich hatte ich das die Trends zu 100% im NodeRed UI. Bei einem neuen "Deploy" gehen immer alle Daten verloren.
      Bei mir läuft daher eine InfluxDB mit Grafana als Visualisierung. Wenn alles läuft benötigt man das Logging nicht mehr wirklich.

      Da ich allerdings einige XY-MD02 Temperatur/Feuchtesensoren im Einsatz habe und ich Entfeuchter ansteuere und bei zu geringer Luftfeuchte die Lüftung nur mehr auf kleinster Stufe laufen lasse, ist der Log ganz hilfreich.

      Zu deinem Problem:

      In NodeRed gibt es eigene IOBroker Nodes, dort kannst du auf IOBroker Objekte zugreifen. In der Hilfe (Buch Icon im rechten Bereich findest du eine Beschreibung welcher Teil des NodeRed Objekts relevant ist (z.B: msg.payload).
      → Ich denke, dein Zwischenschritt ist hier ganz gut dokumentiert.
      Die Datenaufbereitung kannst du in einem Function Node (per Code) oder über den Change Node aufbereiten. Der DEBUG Node hilft hier.

      Zu VIS:
      Ich hab es mir bislang nicht genauer angesehen, aber für mich war eine dynamische Layoutanpassung wichtig.
      VIS ist hier anscheinend ziemlich statisch - mit dem NodeRed UI funktionierest am Laptop und auf den Mobiltelefonen.


  6. Hallo Christoph
    Besten Dank für deine Erläuterungen. Mir wird nur "Objekt" in die Werteliste geschriben, und nicht zb. die Vorlaufstemperatur.
    Ich habs so aufgebaut:

    In der Funktion node hab ich einfach den Code von deinem Textfile kopiert funtioniert allerdings nicht.

    Ich bin nicht geübt in JS und weiss echt nicht was für einen Code ich da reinschreiben muss damit es mir die Daten ausspuckt.


    1. Hallo,

      dein Problem ist, dass du nicht nur einen Wert (in dem Fall vom Typ Float) übergibst sondern ein komplettes Datenobjekt.

      Der einfachste Weg wäre wenn du deine Output Nodes beim ersten Ausgang vom nachstehenden Function Block verbindest. Der Wert wird direkt in msg.payload (dort sollte er für die Übergabe an ioBroker auch liegen) abgelegt.

      Hintergrundinfo:

      Du bekommst in den Function Blöcken immer ein Objekt msg und du musst auch immer ein (oder mehrere) msg Objekt ausgeben.

      Lass dir dazu einfach mal das gesamte Nachrichtenobjekt in den Debug Blöcken ausgeben (erkennst du wenn nur msg statt msg.payload angezeigt wird). Die Debug Blöcke musst du aktivieren - erkennbar an der Fahre an der rechten Seite. Über das kleine Käfersymbol in der rechten Leiste kommst du in den Debugging Modus. Mit dem Copy Path Symbol kannst du dir den Pfad kopieren und in den Function Node einfügen.

      Der Function Node muss folgendes beinhalten:

      return [{payload: parseFloat(msg.payload.Vorlauf)}];

      Damit sollte es klappen (wink)


      Hier findest noch weitere Varianten - 1 & 2 kannst direkt übernehmen, 3 und 4 würde passen wenn die Daten direkt vom Luxtronik Node kommen.

      // Variante 1: an der von dir angeführten Stelle
      return [{payload: parseFloat(msg.payload.Vorlauf)}];

      // Variante 2: wie Variatne 1, jedoch wird das alte msg Objekt modifiziert
      msg.payload = parseFloat(msg.payload.Vorlauf);
      return msg;

      // Variante 3: Direkt nach dem Luxtronik2 Node, "°C" wird noch angehängt
      return [{payload: msg.payload.Informationen.Temperaturen.Vorlauf}];
      // bei Umlaufen musst du klammern - Beispiel: Rücklauftemperatur
      // --> return [{payload: msg.payload.Informationen.Temperaturen.["Rücklauf"]}];

      // Variante 4: Wie Variante 3, direkt nach dem Luxtronik2 Node - nur der Zahlenwert
      return [{payload: parseFloat(msg.payload.Informationen.Temperaturen.Vorlauf)}];



  7. Hallo Christoph

    Nach langem tüfteln, hab ichs jetzt.:

    Besten Dank für deine Hilfe. Das Ergebnis lässt sich sehen:



    Falls noch Fragen von mir auftreten sollten, melde ich mich einfach wieder (smile)

    Gruss Martin

  8. Hallo Zusammen,

    ich nutze auch bei meiner Novelan Wärmepumpe
    das Node von Bouni bzw. habe ich das Christoph nun auch probiert.

    Es funktioniert auch alles tadellos, nur leider hängt/friert sich das Web-Interface ein.
    Das erstemal war es anfang Januar, das zweite mal mitte Januar (15 Tage), das dritte mal am 28.01,
    sowie heute morgen gegen 10 Uhr. Seit 28.01 habe ich das Node von Christoph probiert.

    Ist das bei euch auch schonmal aufgetreten? Ich hab mir auch die DTA kurz drauf gezogen,
    um hier evtl. iwelche aussetzer zu erkennen aber das ist auch nicht der Fall.

    Die Anlage läuft auch ganz normal weiter nur eben ist sie über die Ip-Adresse nicht mehr erreichbar.
    Ich muss dann die Heizung komplett stromlos schalten, damit das Webinterface wieder anspringt.

    bin um jede Hilfe dankbar

    LG Flo

    1. Ich hatte früher ein ähnliches Verhalten. Allerdings hat das Webinterface bereits nach wenigen Requests den Dienst verweigert.
      Ich denke die Requests waren dabei auch fehlerhaft.
      Mit dem SW Update auf V3.85.6 klappt alles
      Viel Erfolg

      1. den hätte ich noch dazu schreiben sollen ;-(

        SoftwarestandV3.85.6 (r6445)

        Ich hab mir mal den Quellcode vom Webinterface angeschaut.
        Ist ja nix anderes wie Jquery und ne WebSocket Verbindung, die im Sekundentakt (warning) ein REFRESH sendet.

        Der einzige Unterschied, das wir mit NodeRed jedesmal ein LOGIN senden.
        Was auch sein könnte das die WebSocket Libraries in Jquey und NodeRed unterschiedliche Requests machen.


        Laut deinen Kommentaren machst du ja auch alle 10 Sek ein Request? 

        1. WS Interface (https://www.loxwiki.eu/x/SwEWAQ)
            Zeitscheibe: 30s und auch über UI getriggert
            Funktion: WW/Heizung/Kühlen > AUS/AUTO
            Info: komfortabel aber mit Overhead

          Java Webinterface (https://www.loxwiki.eu/x/RgEWAQ)
            Zeitscheibe: 10s und auch über UI getriggert
            Funktion: WW/Heizung/Kühlen Temperaturen über Dropdown setzen
            Info: schlanker implementiert, dafür greift man tiefer in die Bits ein (wink)


          Wenn bei dir mit dem WS Interface nach 2 Wochen Probleme auftreten werde ich wohl mit 30 Sekunden nach 1 Jahr die Heizung neu starten müssen. (ist aber nur eine Vermutung)

          1. Hatte vorher 20Sek übers WS Interface, ich beobachte das ganze mal. Evtl. teste ich das ganze mal mit den Original JS-Code vom WebInterface.
            Werde mal den Traffic mit Wireshark anschauen.

            Hab auch grad gesehen das von Bouni das Home-Assistant HACS Addon stammt, das läuft über Port 8889, also über Java, da hatte ich die Probleme nicht.
            Allerdings muss ich hier jeden Wert einzeln loggen, beim NodeRed Node hab ich einfach alles pauschal zur InfluxDB geschickt.
            Mal schauen vllt. mach ich mir die Arbeit.

            Danke dir, schönen Sonntag noch!

          2. Moin,

            bei mir läuft das ganze jetzt seit längerer Zeit mit einem 31 Sek. Interval.
            Bisher musste ich die WP einmal neustaren, das war am 10. Mai.


            Christoph Rafetzedermusstes du auch mal neustarten?

  9. Hallo zusammen,

    gibt es auch eine Möglichkeit Fehlermeldungen der Luxtronik 2 per Websocket oder Java API zu quittieren, damit die Wärmepumpe wieder weiterläuft?

    Mit dem Fernwartungsvertrag von ait kann man dies für NOVELAN-Wärmepumpen machen. Also müsste ja auch irgendwo ne API existieren.