Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Hallo zusammen,

da es oft hilft, wenn man gemeinsam an etwas arbeitet, möchte ich hier einfach mal meine Lösung zur Integration einer Nibe Heizung vorstellen.

Das Ganze ist noch sehr stark WIP (work in progress). Also sicherlich an vielen Stellen noch unvollständig und wenig dokumentiert (weil das ja auch immer so riesig Spaß macht...). Wer aber selbst ein wenig mitdenkt, oder die nötigen Kenntnisse mitbringt oder sich nicht scheut einfach konkret nachzufragen  , bekommt das auf jeden Fall schon irgendwie ans Laufen!

Meine Bitte vorweg ist daher ganz dringend: Helft mit, korrigiert, hakt nach und habt Spaß damit!

Ziel / Warum?

Ich fand es gelinde gesagt sehr unsmart, dass meine Heizung und mein "Haus" nicht miteinander reden!
Nachdem ich es dann über die IFTTT-Integration des Nibe Uplinks bereits hinbekommen habe, dass Loxone seine Soll- und Ist-Temperaturen (Touch Tree) an die Heizung schickt, weiß diese ja schonmal, welche Vorlauftemperatur im Heizkreis nun sinnvoll wäre (Heizkurve war gestern).
Und über die Automatik und die eingestellte Außentemperatur (hier 18°C im 24h-Mittel) fängt sie beim Unterschreiten nun ja auch prima an, diese Temperatur auf den Heizkreis zu schicken.

Nur was hab ich davon, wenn im Haus/Loxone dann trotzdem noch die Sommerzeit herrscht und damit trotz Unterschreiten der Wunsch-Tenperatur von 23°C im Zimmer die FBH-Thermostate komplett zu lässt ;-) Dann hab ich eine Heizung die mich wegen Überdruck auf dem Heizkreis anschreit. :-)

Also war der Gedanke geboren, dass Loxone endlich smart damit umgeht und weg von den festen Zeiten die gleiche Logik fährt und bei Unterschreiten der besagten Außentemperatur auf den "Wintermodus" schaltet! Das hätte ich nun natürlich über den Wetter-Service lösen können, aber ob das so exakt auf die Berechnung der Heizung passt?
-> Also warum fragt mein Haus nicht einfach die Heizung nach dieser Außentemperatur?

Da ich aktuell leider keine Lust & Zeit hatte mit einen Modbus-Adapter zusammenzustricken (Hardware liegt da, aber ich bin Software-Entwickler und das würde wohl über den Winter dauern *g*), wollte ich die Nibe Uplink API dafür verwenden. Dumm war dort aber dann, dass diese oAuth2 verwendet -> also wurde ein passender Gateway nötig ... here we go!

Screenshots

Was wird benötigt

  • RaspberryPI (oder ähnlich) mit Webserver + php
  • Nibe Uplink (ich bin mir gerade nicht sicher, ob zwingend Premium nötig ist)
  • Eine Nibe Heizung (hier eine Nibe F-1245)
  • Loxone (nee ach...)

GitHub Projekt

https://github.com/DerFlash/Loxone-Nibe-Gateway

Anleitung

  1. RaspberryPI vorbereiten
    Je nach Notwendigkeit installieren:
    # sudo apt-get install apache2 php5-curl

  2. Gateway installieren
    Kopiere die Dateien aus dem Ordner raspberryPi aus dem GitHub Projekt ins Web-Server-Verzeichnis deines RaspberryPi.
    In meinem Fall liegen die Dateien index.php & token dann also in /var/www/html/nibe/
    Die Datei token muss vom Webserver geschrieben werden können:
    # chown www-data:www-data token
    # chmod 600 token

    Das Ganze ist dann beispielsweise im LAN wie folgt erreichbar: http://raspberrypi.fritz.box/nibe/
    Je nachdem, welche Adresse euer RaspberryPI in eurem Netzwerk hat, passt dies entsprechend an und versucht den Gateway einfach mal aufzurufen. Die URL benötigt ihr dann in Punkt 3.
    Es ist absolut ausreichend, dass diese Adresse nur von eurem internen Netz aufgerufen werden kann. Vielmehr rate ich sogar dazu.

  3. Nibe Uplink Vorbereiten
  4. Gateway anpassen
    Nun die index.php auf dem RaspberryPI wie folgt editieren:
    • <nibe_api_client_id> ersetzen durch den Identifier aus der erstellten Nibe Uplink Application
    • <nibe_api_client_secret> ersetzen durch das Secret aus der erstellten Nibe Uplink Application
    • ggf. auch hier wieder die Callback URL ($REDIRECT_URL) an eure Gegebenheiten anpassen

  5. Gateway verbinden
    Sofern ihr alles korrekt erledigt habt, ruft ihr nun erneut den Gateway im LAN auf. Ihr werdet dabei aufgefordert die Bridge mit der API zu verbinden (auf "here" klicken).
    Dabei werdet ihr auf die Nibe Uplink API weiter geleitet, die euch dann um Erlaubnis bittet, dass euer Gateway auf die API zugreifen darf. Der Gateway bekommt dann schließlich einen Token zurück, mit dem er nun auf die Uplink API zugreifen darf.
    FYI: Das Ganze nennt sich eine "oAuth2 Autorisierung" und muss grundsätzlich nur einmalig erfolgen. Mit dem Token bzw. einem ebenfalls bekommenen Refresh-Token hält der Gateway ab jetzt quasi die Verbindung zur API aufrecht (fordert also nach Ablauf des Tokens mit dem Refresh-Token einen Neuen an)...

    Sofern alles funktioniert hat, landet ihr auf der Gateway-Statusseite. Dort findet ihr auch eine erste Test-Antwort von der Uplink API mit hoffentlich euren Status-Informationen zu eurer Heizung ;-)
    Etwas weiter unten findet ihr auch den Link zur Uplink Doku und könnt über das Eingabefeld Anfragen an die API senden.

  6. Fast geschafft - Abfragen mit Loxone
    Jetzt kommt der klassische Teil: Die einzelnen Anfragen, die ihr über den Gateway nun jederzeit in Richtung Uplink API stellen könnt, liefern euch Antworten im JSON-Format. Daraus könnt ihr mit Hilfe von "Virtueller HTTP Eingang" und jeweiligen "Virtueller HTTP Eingang Befehl" in Loxone entsprechende Eingänge erstellen.

    Damit das Ganze flott geht, hab ich entsprechende Templates erstellt und ebenfalls im GitHub Projekt im Ordner "Loxone Vorlagen" hochgeladen.
    Diese XML Dateien kopiert ihr in den Ordner C:\ProgramData\Loxone\Loxone Config 9.0\Templates\VirtualIn\ (bei Windows 10 - je nach Windows-Version kann dies auch anders lauten).
    Danach solltet ihr die Eingänge bequem über den Menüpunkt "Vordefinierte HTTP-Geräte" importieren können.

    Achtung:
    Auch hier muss ggf. wieder die Adresse zum Gateway angepasst werden -> Parameter "URL" im jeweiligen Eingang!
    Was aber unbedingt angepasst werden muss, ist die SystemID (37034) innerhalb der URL. Diese findest du z.B. in der Test-Response der Gateway Statusseite.


Und nun viel Spaß damit!

27 Kommentare

  1. Christian sagt:

    Super Beitrag, Danke!

    Bei uns wird auch eine NIBE verbaut werden (dauert aber noch ein bisschen (Lächeln) ). Neben dem Gateway würde mich die angedeutete Integration der Soll-Ist-Werte per IFTTT interessieren. Hast du dafür auch ein HowTo?

    Grüße!

     

    1. Björn sagt:

      Hallo Christian,

      dank dir! Ich bin dann auf deine Erfahrungen gespannt (Lächeln)

      Ein HowTo für die IFTTT-Lösung kann ich auch gern mal zusammenstellen.

      Viele Grüße
      Björn 

    2. ich werde versuchen das ganze mal zu installieren.... aktuell parse ich mir die Seite....funktioniert (API ist natürlich besser)... bei Spannungslosen Pi wird die Verbidung auch wieder korrekt Aufgebaut und Daten übermittelt?

       

      Das ersetzen der Heizkurve hört sich interessant an... wäre nett wenn du nochmals darauf eingehen könntest (IFTTT)

      1. Björn sagt:

        Hallo Christoph,

        die Frage mit dem spannungslosen Pi brachte mich auf die Frage, was bei Ausfall Internet passiert. Mir fiel auf, dass das Script dann das Token aus Versehen leer überschreibt.

        Gefixt, danke für den Anstoß somit (Zwinkern)

        Ansonsten sollte ein Neustart des Pi hier grundsätzlich kein Problem machen. Es kommt ein wenig darauf an wie lange das Refresh-Token der Nibe-API gültig bleibt, mit welchem das Script zyklisch das Access-Token aktualisiert. Nibe schweigt dazu leider in seiner API Dokumentation, aber üblicherweise ist der Sinn des Tokens, dass es lange gültig bleibt (Lächeln)

         

        Viele Grüße
        Björn

  2. Hidde Beumer sagt:

    Cool! Aber warum kann das nicht direkt vom Miniserver gemacht werden? Warum ein RPi extra?

    1. Björn sagt:

      Hey,

      das Problem ist in erster Linie die benötigte oAuth-Authentifizierung. Hierbei muss man initial einmal manuell im Browser in Richtung Nibe API Seite abspringen, den Zugriff freigeben und bekommt den passenden Token. Mit diesem muss man aber dann erneut und auch sofort (innerhalb von wenigen Sekunden) die eigentliche Authentifizierung in Richtung Nibe API aufbauen. Daher der Rücksprung über die Callback URL zum eigenen Gateway, der dann diese Authentifizierung mit dem bekommenen sofort in Richtung Nibe API aufbaut und dies dann auch aufrecht erhält.

      All das kann der Loxone MS nicht. Er kann nur entweder über einen einzelnen direkten Request etwas abfragen oder über UDP etwas geschickt bekommen...


      Die Alternative ist hier das oft gesehene "Web Scraping", wo diverse Lösungen versuchen, einfach die Nibe Uplink Webseite abzurufen und zu "parsen". Das war jedoch aus diversen Gründen kein ausreichend stabiles Ziel für mich (Zwinkern)

  3. Hallo Björn,

    besten Dank für die tolle Anleitung. Hab meine Anlagendaten dank Dir sehr schnell in den Miniserver bekommen.

    Was ich aber noch nicht verstehe, wie die IFTTT Anbindung funktioniert. kannst Du mir eine kurze Anleitung zukommen lassen? 

    Besten Dank

    Jörg

  4. Björn sagt:

    Hallo Jörg,

    das IFTTT hab ich leider weiterhin nicht geschafft. Aber als ich mir gerade diesbezüglich 'nen Knoten ins Ohr machen wollte und in dem Zuge bemerkte, dass ich ja kürzlich einen Reset hatte, kam ich zufällig auf der Nibe API Doku vorbei.
    Und was sahen meine müden Augen? Nibe hat es geschafft die API um WRITE Zugriffe zu erweitern oO

    Man kann nun scheinbar jegliche Parameter schreiben, sogar den SmartHome-Service aktivieren und Thermostate erstellen/updaten. Damit also komplett ohne IFTTT möglich.

    Ich passe schnellstmöglich die Bridge an und werde das dann hier entsprechend erweitern!

     

    Falls der Ansatz über IFTTT dennoch interessant bleibt, kann ich da aber später auch nochmal schauen, endlich etwas Zeit zu finden..

  5. Hallo Björn,

    die IFTTT ist für mich nur die 2. Wahl. Wichtig ist mir, dass ich die Nibe steuern kann. Also hauptsächlich Brauchwasser, sowie Soll/Ist Temperaturen. 

    Wenn Du magst, können wir da auch was zusammen machen. Hab zwar keine Ahnung von PHP, aber hab eine Nibe zum testen und nicht das schlechteste technische Verständnis (Zwinkern)

     

    VG

    Jörg

  6. Hi Björn,

    hab heute mal ein wenig rumexperimentiert. Um die POST Requests absetzen zu können, muss der Scope auf "WRITESYSTEM" stehen.

    Ich habe die Zeile in Deinem Script wie folgt geändert: SCOPES = "READSYSTEM WRITESYSTEM";

    In der Request URL hab ich auch noch den Scope mitgegeben: ....smarthome/thermostats?scope=WRITESYSTEM&access_token=AAEAAC....

    Hab den Request manuell zusammengebaut und abgesetzt (nicht über Dein Script). Daher hab ich mir nur das Token geholt. Gute Idee mit der Statusseite und dem Token dort (Zwinkern)

    Bekomme nun im Response folgende Meldung: "The request is missing a required scope (Required scopes: WRITESYSTEM)"

    Bin mit meinem Latein grad am Ende. Sehe im Moment drei Fehlerquellen:

    1. Im Token müssen die validen Scopes mitgegeben werden. Was bei mir nicht funktioniert hat?!
    2. Im NibeUplink muss noch was freigeschaltet sein, was ich nicht gefunden habe
    3. Ich bin zu dumm den Request richtig zusammenzubauen ..

    Vielleicht kannst Du ja mit meinen Erkenntnissen was anfangen (Lächeln)

     

    Viele Grüße

    Jörg

  7. Hallo Björn,

    bist Du schon dazu gekommen, dir die Schnittstellenerweiterung anzusehen?

     

    Viele Grüße

    Jörg

  8. Hi zusammen, erstmals Danke für die tolle Zusammenstellung!

    ich habe gestern meinen loxberry welcher via vmware läuft um das Nibe Gateway erweitert...

    Werte auslesen; Statistik für die Werte aktivieren ist ja kein Problem.

    Werte schreiben wäre noch das I-Tüpfelchen; oder eben ein Plugin welches "nur" die paar Eingaben erfordert (Lächeln).

     

    mfG Gerhard

  9. Hallo zusammen!

    Ich hab die Anleitung durch, es funktioniert aber leider nicht.

    In Nibe-Uplink habe ich eine Application erstellt. Habe beschriebenen Daten in die index.php kopiert.

    Bei Schritt 5 hakts dann aber.

    Kann in Nibe-Uplink den benötigten Zugriff noch bestätigen, beim redirect auf meinen raspberry kommt dann eine Fehlermeldung "Http Error 500"

    Die Url auf die ich redirected werde ist folgende:

    http://IP/nibe/?code=DAKOMMTEINLANGERCODE&state=authorization

    Könnte mir bitte jemand einen Tipp geben?

    Vielen Dank, flump

    1. Björn sagt:

      Sorry für die späte Reaktion. Hast du es inzwischen hinbekommen?

      Wenn nein: anstelle der "IP" steht die IP deines RaspberryPI oder? Da du ja bei den Schritten davor schon von der Statusseite des Nibe Gateways auf dem RaspberryPI gestartet sein müsstest, sollte diese ja bekannt & aufrufbar sein.
      Vergleiche also mal die Adresse aus Punkt 2 mit dem Rücksprung aus Punkt 5.

  10. Björn sagt:

    Lang ist's her, dass ich hier voran kam. Eigentlich ist's ja sogar die falsche Zeit für eine Heizung, aber die Tage ging sie doch tatsächlich mal wieder an, als es so bitterhuh wurde (Zwinkern) Genau zu dem Zeitpunkt fiel mir mal wieder meine IFTTT Verbindung ständig aus, da IFTTT das entsprechende Applet immer wieder automatisch deaktiviert, sobald mal die NIBE-API nicht gleich antwortet...

    Zeit für mich also endlich mal den Gateway um die Schreibrechte zu erweitern!

    Gesagt getan... Für Bastler gibt's das Meiste bereits im GITHub Repo (aktualisierter Gateway, neues VirtualOut Template und ein Beispiel-Projekt für Loxone, ...)

    Ich versuche mir dann später hier noch etwas Zeit zu nehmen die Anleitung oben zu aktualisieren. Grundsätzlich hat sich am Vorgehen aber nichts geändert...


    Viele Grüße
    Björn

  11. Hallo Björn,

    klasse. Ich schau mir das in den nächsten Tagen an. Dann kann ich Dir Rückmeldung geben, ob es funktioniert. Hast du von Nibe ein Premium Abo, oder funktioniert das mit den Basisfunktionen?

    Grüße

    Jörg

    1. Björn sagt:

      Mein Abo lief die Tage sogar gerade ab. In dem Fall sind dann neben dem Zugriff auf Statistik und Remote-Einstellung über die NibeUplink-Seite auch die WRITE Requests über die API alle blockiert. Lesen klappte dagegen noch prima.

      1. Ahh, ok das erklärt auch, warum ich das nicht hinbekommen habe. Hab grad mal dein Skript angesehen. Sah ziemlich so aus, wie das was ich mir da zusammengebastelt hatte. Aber die Requests wurden abgelehnt. Aber scheinbar funktioniert das nicht ohne Abo (traurig)

  12. Das sind schon Säcke... für den Preis von so ner Pumpe kann man finde ich schon eine API ohne das Abo betreiben... 

    1. Ob das nun gerechtfertigt ist oder nicht, sollten wir hier nicht diskutieren. Ärgerlich finde ich, dass in der API Dokumentation nicht erwähnt ist, dass es sich bei den write-Funktionen um Premium-Features handelt.

  13. Ja das stimmt - sollte hier nicht Gegenstand sein, habe mich nur gerade so geärgert. Ich finde die Beschreibung der Smart Home Features allgemein recht dürftig. Es ist ja auch bei der IFTTT Anbindung nichts erwähnt ob Premium oder nicht. Ich habe dafür so viel probiert, jetzt ist klar, warum ich meine Lüftung nicht steuern kann...

    1. Ja, da würde ich davon ausgehen, dass es ebenfalls nur über Premium geht. Das gleiche Problem hatte ich auch ..

      Ich werde die 25€ investieren und das Skript ausprobieren. Wenn es dann läuft, liegt es tatsächlich am Abo. Bisher ists ja nur eine sehr naheliegende, nicht verifizierte Vermutung.

      Dann suche ich noch einen Mitstreiter, der es mit mir zusammen zu einem Loxberry Plugin macht. Hab mir bisher nur das HowTo angesehen. Scheint kein Hexenwerk zu sein. 

  14. Björn sagt:

    Dass das Write nur mit Premium geht, konnte ich schon verifizieren, wie gesagt. Man bekommt dann eigentlich auch prima eine Rückmeldung - zumindest bei den POST Requests (das PUT antwortet dagegen mit einem "204 No Content"). Im POST body stand dann so viel wie "This is a premium feature".

  15. Ah, ok. So eindeutig hatte ich das noch nicht verstanden gehabt. 

  16. Wie kommt es, dass mein raspberry immer mal wieder neu authentifiziert werden muss?

    Ich muss dann den schritt 5 neu ausführen...

    lg

    1. Hallo Roman,

      das hatte ich auch bei mir immer mal wieder. Das bei mir der PI aber nur zu Testzwecken lief, dachte ich, es liegt an meinem Aufbau.

      Ich habe das Skript aktuell in einem Loxberry Plugin laufen. Dort läuft das Skript ohne erneute manuelle Authentifizierung bereits seit 5 Tagen durch.

      Ich vermute daher, dass er manchmal das Token verliert. 

  17. Ich habe letzte Woche ein Loxberry Plugin erstellt. Siehe Nibe Uplink Bridge.

    Das Plugin basiert zu 100% auf dem hier beschriebenen und verwendeten Skript. Wer also Lust und Zeit hat, kann es gerne ausprobieren.


    Danke an Björnfür die Bereitstellung des Skriptes.