FritzBox API mit ESP32

So werden DECT!200 und andere Smart Home Geräte über Arduino und FritzBox API mit ESP32 gesteuert

FritzBox API mit ESP32

Die FritzBox bietet eine Schnittstelle, mit der man diverse Daten auslesen bzw. steuern kann. So lassen sich zum Beispiel Anruflisten und Netzwerkdaten auslesen, oder auch die AVM eigenen SmartHome Geräte steuern.

FritzBox einrichten

Zunächst muss ein Benutzer auf der FritzBox mit entsprechenden Rechten eingerichtet werden. Dazu müssen wir im Webinterface unter System/FRITZ!Box-Benutzer einen Benutzer erstellen bzw. die Rechte zuweisen. Zum Testen am besten die Haken für „Fritz!Box Einstellungen“, „Sprachnachrichten, Faxnachrichten…“ und „Smart Home“ setzen. Benutzername und Passwort für diesen Nutzer brauchen wir später im Arduino Sketch.

Zum Steuern einer FritzDect200 Steckdose benötigen wir noch dessen AIN (Aktor Identifikationsnummer). Diese finden wir im FritzBox Webinterface unter Smart Home/Geräteverwaltung, wenn wir beim entsprechenden Eintrag auf „Bearbeiten“ klicken.

Arduino

In der Arduino IDE benötigen wir die „TR-064 SOAP Library“, damit uns jegliche Protokollarbeit abgenommen wird. Die Bibliothek lässt sich über den Bibliotheksverwalter einfach finden und installieren.

Jetzt können wir mit diesem kleinen Arduino Sketch loslegen, um eine Steckdose zu schalten. Dazu die oben ermittelten FritzBox Daten und die AIN der FritzDect200 Steckdose eintragen. Der Beispielsketch schaltet die Steckdose über die Kommandos „on“ bzw. „off“ per Terminaleingabe. Wer einen Taster zum Schalten benutzten will, kann auch einen Toggle Befehl senden, dann wird automatisch zwischen an und aus umgeschaltet. Außerdem können mit dem Befehl „info“ Temperatur und Stromverbrauch ausgelesen werden.

Fazit

Das ganze ist natürlich nur ein Beispiel und soll nur einen einfachen Einblick in die Thematik darstellen. Die FritzBox API ermöglicht nahe zu alles abzufragen und einzustellen was die FritzBox zu bieten hat. Eine genaue Beschreibung über alle Funktionen bietet der Hersteller selbst hier an: https://avm.de/service/schnittstellen. Im Abschnitt zur TR-064 Schnittstelle findet sich zu jeder Kategorie eine PDF. Die Möglichkeiten der Smart Home Geräte ist in folgendem Dokument beschrieben:
https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_homeauto.pdf
Mit der FritzBox API und dem ESP32 lassen sich also sehr schnell kleine Smart Home Gadgets entwickeln.

Eine eigenen Abfrage erstellen

Die größten Schwierigkeiten treten wahrscheinlich dabei auf, die nötigen Daten für eine Abfrage zusammenzustellen. Hierfür müssen wir uns in der avm Dokumentation als erstes den richtigen Service heraussuchen. Einen Überblick über alle Möglichkeiten erhält man am besten in diesem Dokument:
https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_TR-064_first_steps.pdf
Für jeden Service gibt es dann, wie oben beschrieben, ein separates Dokument, in dem die einzelnen Funktionen beschrieben sind. Als nächstes benötigen wir die Ressource. Der Teil ist etwas verwirrend, weil diese nicht im beschreibenden Dokument steht. Im Beispiel für den Smart Home Service steht ganz oben in der Dokumentation die Service ID „urn:X_AVM-DE_Homeauto-com:serviceId:X_AVM-DE_Homeauto1“. Diese suchen wir dann in der Schnittstellenbeschreibung http://fritz.box:49000/tr64desc.xml und finden direkt darüber den benötigten Service Type „urn:dslforum-org:service:X_AVM-DE_Homeauto:1“. Hiermit starten wir den Aufbau eines Requests.

Das Ausführen eines Requests wird durch folgende Parameter beschrieben:
Ressource: Der wie oben ermittelte Service Type
Action: Der Funktionsname, der aufgerufen wird
Eingabeparameter: Werte die der Funktion übermittelt werden (Nicht alle Funktionen benötigen Eingabeparameter)
Anzahl Eingabeparameter: Die Anzahl der übergebenen Parameter. In diesem Fall ist {„NewAIN“, AIN} ein Parameter.
Rückabeparameter: Ein Aufruf kann eine ganze Menge Werte zurückliefern. Hier werden nur die Parameter eingetragen die als Rückgabe erwünscht sind. (Nicht alle Funktionen liefern Werte zurück)
Anzahl Rückgabeparameter: In diesem Beispiel sind {„NewMultimeterPower“, „“}, {„NewTemperatureCelsius“, „“} zwei Parameter.

Die Rückgabewerte werden uns automatisch in das Array was wir übergeben haben geschrieben. Das Array reqb[ ][ ] sieht beispielsweise nach dem Abruf der Daten so aus: [[„NewMultimeterPower“, „6513“], [„NewTemperatureCelsius“, „235“]]. Um an die Werte zu kommen, greifen wir wie folgt auf das zweidimensionale Array zu:
pwr = regb[0][1] // Rückgabe des ersten Parameter (6513)
temp = regb[1][1] // Rückgabe des zweiten Parameter (235)

22 Antworten auf FritzBox API mit ESP32

  1. Stephan Stabrey

    Vielen Dank für die super Beschreibung und den Beispielcode. Ich wollte darauf mit AVM FRITZ!DECT 301 Heizungsthermostaten aufbauen, habe aber leider schon das Originalbeispiel mit einer AVM FRITZ!DECT 200 nicht zum Laufen bekommen. Thermostat und Funksteckdose laufen bei mir an einer Fritz!Box 7530 mit aktuellem Fritz!OS 7.28. Ich bin der Anleitung exakt gefolgt und habe den Code mit der TR-064 SOAP Library Version 1.1.0 kompiliert.
    Im DEBUG_VERBOSE mode sieht das Ende einer „info“ abfrage so aus:



    s:Client
    UPnPError

    503
    Auth. failed

    ———————————

    [action] Response status: Unauthenticated
    [action] Giving up the request
    Stromverbrauch: 0.0W
    Temperatur: 0.0*C

    In der Fritz!Box GUI sehe ich, dass die WLAN-Verbindung zum esp32-arduino steht, im Ereignisprotokoll steht folgender Eintrag:
    Anmeldung einer App mit unbekanntem Anmeldenamen von IP-Adresse 192.168.178.56 gescheitert.

    Hatten Sie evtl. beim Ausprobieren ähnliche Probleme und können ggf. Hinweise geben, warum es offenbar mit der Authentifizierung nicht klappt? Auf github sieht es so aus, als würde an der Library nicht mehr entwickelt, drum setze ich meine Hoffnung auf ihre Erfahrungen.

    Viele Grüße und besten Dank im Voraus für etwaige Hinweise!,
    Stephan Stabrey

    Antworten
  2. Paul Fay Artikelautor

    Wenn gar nichts funktioniert, hört sich das nach einem Einstellungsproblem in der FritzBox an. Die Einstellungen habe ich aber ja beschrieben. Mir ist noch ein Fehler bekannt, dass es nicht funktioniert wenn auf FritzBox Weboberfläche kein Passwort gesetzt ist.
    Ansonsten wäre ich da auch erstmal ratlos.

    Antworten
    1. Stephan Stabrey

      Passwort war ein guter Hinweis. Habe sowohl den Benutzernamen als auch das Passwort geändert und siehe da, jetzt funktioniert es! Möglicherweise stellt das Authentifizierungsverfahren irgendwelche Mindestanforderungen an Benutzername und Passwort. Beide sind jetzt länger.
      Cool – jetzt kann es losgehen 🙂

      Antworten
        1. Stephan Stabrey

          moin moin mac,
          habe die frage hier gerade eher zufällig entdeckt – daher auch mit was delay – und bin recht unbedarft in sachen code posten und so …
          wohin damit? für ’nen kommentar vielleicht ein bisschen zu lang und selbstredend nicht besonders gut dokumentiert 😉
          grüße eher vom anderen ende der republik,
          stephan

          Antworten
  3. Max Winkel

    Hi, wie kann beispielsweise ein Wert, welchen der ESP einliest, an die Fritzbox gesendet werden, um ihn in der Smart-Home-Übersicht anzuzeigen? Kann der ESP beispielsweise als Sensor fungieren?

    Antworten
    1. Paul Fay Artikelautor

      Nein, das geht denke ich nicht. Die Fritzbox ist ja kein offener Smart Home Server, wo man Herstellerfremde Geräte rein bekommt. Dafür müsste man wahrscheinlich existierende Hardware emulieren.

      Antworten
    2. Ben

      Das wäre eher bei „Homematic CCU2“ oder „Homematic CCU3“ möglich.
      Diese sind speziell für Smarte Geräte konzipiert. Neuerdings können auch manche Herstellerfremde Geräte eingebunden werden.

      Antworten
  4. Uwe

    Hallo Paul,
    Vielen Dank für die detaillierte Anleitung.
    Ich habe nur den Teil mit dem Auslesen der Steckdosendaten übernommen aber der hat dann auch sofort funktioniert. Mir ist nur aufgefallen, dass die Anforderung an die Fritzbox etwa 20 Sekunden benötigt.
    Ist das normal für diese Schnittstelle ???
    Viele Grüße
    Uwe

    Antworten
    1. Paul Fay Artikelautor

      Nein, das ist nicht normal. Wäre verwunderlich, wenn andere Netzwerkanfragen dann schneller gingen bei dir. Wenn sich der ESP bei dir direkt mit der Fritzbox verbindet, ist wohl eher das WLAN allgemein schlecht oder etwas anderes faul. Also mal die Bedingungen verbessern, bzw. andere Sachen auf ähnliche Probleme testen.

      Antworten
      1. Uwe

        Hallo Paul,
        ich frage mit dem Arduino ausserdem auch noch einen Wechselrichter meiner PV Anlage mit HTTP ab und schicke dann alle Daten gemeinsam an einen MQTT Broker. Für alle drei API’s verwende ich den gleichen WiFi Client. Laut meiner Log kommt das Delay wirklich nur von der TR-064 Abfrage.
        Ich habe auch mal versucht die TR-064 Abfrage in einer Schleife zu wiederholen ohne zwischendurch die anderen API’s aufzurufen. Nach dem ersten Aufruf welcher 20 Sekunden dauert, brauchen alle weiteren Aufrufe nur 10 Sekunden. Für meine Anwendung ist das aber leider immer noch zu langsam.
        Welche Response-Zeit hat denn Deine FritzBox ?
        In meiner Verzweiflung habe ich mein Projekt mittlerweile geklont und statt TR-064 die AHA HTTP API der FritzBox probiert. Es hat mich zwar ein paar Stunden gekostet, die ArduinoFritzApi von ESP12 auf ESP8266 umzubauen aber nun funktioniert alles und die HTTP Abfrage dauert nur noch zwei Sekunden. Ausserdem, sind die API Funktionen etwas übersichtlicher weshalb ich wohl bei der jetzigen Lösung bleiben werde.
        Trotzdem vielen Dank für die guten Anregungen auf Deiner Seite
        Uwe

        Antworten
        1. Paul Fay Artikelautor

          Hallo Uwe,
          bei mir waren das definitiv ganz normale Zugriffszeiten, habe aber auch aktuell kein System davon im Einsatz. Fällt mir spontan auch nichts ein, woran das liegen könnte.

          Antworten
  5. Pale

    Hallo,
    ein sehr schönes Beispiel, nur leider bringe ich es auf meinem MKR1010 nicht zum Laufen. Vielleicht liegt es auch daran, dass ich ein blutiger Anfänger bin…
    Ich bekomme immer die Fehlermeldung, dass die MD5Builder.h Library nicht gefunden wird. In der Bibliotheksverwaltung finde ich sie nicht. Wenn ich sie über Github ins Verzeichnis kopiere, bleibt es bei der Fehlermeldung.
    Was mache ich falsch? Wie geschrieben bin ich blutiger Anfänger, also banale Fehler bitte nachsehen und Danke im Voraus.
    Pale

    Antworten
    1. Paul Fay Artikelautor

      Hallo,

      die TR-064 Library ist ja für ESP8266/ESP32 entwickelt. Das Ganze auf einem anderen Prozessortyp zum Laufen zu bekommen, bedarf wohl etwas mehr Anpassung. Kann ich aber auch nicht überschauen Es wäre sicher einfacher, das Board zu wechseln, wenn es keinen driftigen Grund gibt, weshalb es das MKR1010 sein muss.

      Antworten
      1. Pale

        Hallo,
        bin erst jetzt dazu gekommen, mit dem neuen Board zu testen. Und siehe da, nach ein paar kleineren Anlaufschwieirgkeiten kann ich jetzt alles Mögliche aus der FritzBox auslesen und auch die Steckdose ansprechen.

        Vielen Dank!

        Pale

        Antworten
  6. Dietmar

    Hallo Paul,
    habe das Beispiel übernommen…funktioniert schaltet eine Powerline 546E Steckdose…
    aber. Allerdings dauert es ca. 4-6s ehe die Aktion ausgeführt wird.
    Es scheint so als würde das Programm im void setSwitch solange zu hängen, da keine andere Funktionen im Main Programm ausgeführt werden in der Zeit?
    WLAN ist o.k. …
    Hast du eine Idee?
    Dietmar

    Antworten
    1. Paul Fay Artikelautor

      Hallo,
      die Frage war hier schon mal. Ich kann dazu leider nichts sagen, bei mir hat es eigentlich problemlos funktioniert.

      Antworten
  7. Markus

    Wow, das ist der Hammer, hat bei mir auf Anhieb funktioniert! Danke!
    Als nächstes möchte ich gern einen DECT-Türfensterkontakt (HAN-FUN) auslesen, der an der FritzBox! schon gut funktioniert, aber hier scheitere ich.

    Antworten
    1. Paul Fay Artikelautor

      Ist auch etwas tricky sich das mit dem ESP zu erarbeiten. Kann hier auch nichts zu beitragen, würde aber hier eher über einen Raspberry Pi oder ähnliches die Struktur erforschen.

      Antworten
  8. Ben

    Hi, ich habe versucht es 1 zu 1 nachzubauen bekomme aber leider folgende Fehlermeldung und habe schon alles versucht es zu lösen und komme nicht drauf:

    21:43:37.380 -> [TR064][action] with extraction
    21:43:37.381 -> [TR064][cleanOldServiceName] searching for prefix in servicename: urn:dslforum-org:service:X_AVM-DE_Homeauto:1
    21:43:37.412 -> [TR064][action_raw] with parameter, NewAIN
    21:43:37.412 -> [TR064][action_raw] with parametervalue, 11657 0551398
    21:43:37.412 -> [TR064][findServiceURL] Services NOT Loaded.
    21:43:37.412 -> [TR064][httpRequest] URL is empty, abort http request.
    21:43:37.412 -> [TR064][action] Request Failed

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert