openHAB Fritzbox TR064 Binding zur Anwesenheitserkennung

Wie openHAB auf Windows oder einem Raspberry Pi installiert wird, habe ich bereits in vorherigen Beiträgen erläutert.

Nun ist es an der Zeit ein Add-on zu installieren und zu konfigurieren. Da viele meiner Automatisierungsregeln darauf basieren, ob wir zuhause sind oder nicht, gehe ich in diesem Beitrag darauf ein, wie das “Fritzbox TR064” Binding installiert wird um die Anwesenheit von einigen Personen im Haus zu erkennen, anhand der Information ob die Smartphones dieser Personen im WLAN eingebucht sind oder nicht. Dazu wird die Fritzbox direkt kontaktiert und abgefragt. Wie der Name schon sagt, ist das Add-on für die AVM Fritz!Box gemacht und funktioniert mit anderen Routern nicht. Es gibt aber auch andere Methoden der Anwesenheitserkennung, die infrage kämen, z.B. das “Network Health Binding“, das ebenfalls nach dem “im WLAN” Prinzip arbeitet.

Es gibt aktuell drei ähnlich klingende Bindings:

Ich nutzt das TR064 Binding, weil es keine besonders aufwändige Fritzbox-Konfiguration benötigt und auch genau für die Anwesenheitserkennung geeignet ist. Das Add-on kann aber noch mehr, als ich nutze.

Fritzbox für TR064 Binding vorbereiten

Erstmal muss in der Fritzbox ein Benutzer angelegt und eine kleine Einstellung durchgeführt werden. Dazu navigiert ihr zu http://fritz.box und loggt euch ggf. ein.

Falls noch die Standardansicht aktiviert ist (das sieht man ganz unten links bei aktuellen Firmwareversionen), klickt ihr einmal darauf, damit aus “Ansicht: Standard” ein “Ansicht: Erweitert” wird. Also aus

wird

Als nächstes navigiert ihr zu “Heimnetz” -> “Heimnetzübersicht” -> “Netzwerkeinstellungen” und aktiviert die Option “Zugriff für Anwendungen zulassen”.

Der nun noch benötigte Benutzer wird unter “System” -> “FRITZ!Box-Benutzer” angelegt und kann “openhab” heißen, muss aber nicht.

Wenn ihr auf “Benutzer hinzufügen” klickt oder auf den Stift bei einem bestehenden Benutzer, könnt ihr den Benutzernamen, Passwort und die Berechtigungen vergeben. Dort bei Berechtigungen muss mindestens “FRITZ!Box Einstellungen” gesetzt sein, oder auch mehr, je nach belieben und was ihr noch damit machen wollt.

Fritzbox TR064 Binding installieren

Nun installieren wir das Fritzbox TR064 Binding über die openHAB 2 Paper UI unter Add-ons:

Ist das geschehen und “INSTALL” hat sich zu “UNINSTALL” geändert, muss das Binding nun configuriert werden. Das kann über eine (selbst anzulegende) Datei \conf\services\fritzboxtr064.cfg geschehen oder über die Paper UI. Die Datei würde so aussehen:

Nur die Zeilen, die nicht mit einer Raute anfangen, werden vom System betrachtet, der Rest kann also ignoriert werden und muss nicht in die Datei.

fritzboxtr064:url – hier muss die IP-Adresse oder Hostname der Fritzbox eingefügt werden, mit :49000 oder :49443 am Ende, je nachdem ob in der URL http oder https verwendet wird. Https ist natürlich immer die bessere Wahl, da die Kommunikation gesichert erfolgt.

fritzboxtr064:user – der Benutzername, der in der Fritzbox angegeben/angelegt wurde.

fritzboxtr064:pass – das ist das Passwort, das der openhab-Benutzer bekommen hat.

Alternativ kann die Konfiguration über die Paper UI unter Configuration -> Bindings erfolgen, was sicher einfacher ist (aber dann nicht einfach von System zu System kopiert werden kann wenn man ein Testsystem hat, wie ich).

Die erscheinende Maske fragt nach genau den oben beschriebenen Informationen:

Nach einem Klick auf “Save” ist es eingerichtet.

Viele Bindings suchen automatisch nach passenden Geräten oder versuchen sich damit zu verbinden und die Schalt-Optionen auszulesen. In meinem Fall passiert es nicht, es taucht also auch nach mehreren Minuten nichts unter Inbox in der Paper UI auf.

openHAB Items konfigurieren

Daher ist der nächste Schritt die Items zu erstellen und zu konfigurieren, also an das Binding “anzuschließen”. Dazu können wir eine beliebig heißende .items Datei unter conf\items\ anlegen, z.B. fritzbox.items.

Darin erstellen wir dann die Variablen, man könnte auch schalter sagen, die vom System entsprechend gesetzt werden wenn jemand daheim ist oder eben nicht.

Bevor wir das tun, macht es aber Sinn noch eine .map Datei anzulegen, damit wir später in der Oberfläche “Offline” sehen und nicht “CLOSED”, was der systeminterne Status wäre. Also folgende Datei unter conf\transform\ ablegen und die .txt Endung entfernen, damit sie nur noch “presence.map” heißt:

presence.map

Außerdem muss das Map Transformation Add-on installiert werden:

Nun legen wir die erwähnte fritzbox.items unter conf\items an (einfach eine Textdatei). Diese muss dann “Contact”-Switches enthalten, denen neben den normalen Eigenschaften auch die MAC-Adresse der Geräte mitgegeben wird:

Ihr seht ich habe im Anzeigenamen auf die presence.map Datei gezeigt, damit der Status von dort genommen wird. Die MAC-Adressen hinten müssen mit Bindestrichen angegeben werden, und nicht mit Doppelpunkten wie sonst üblich. Die Syntax bei der Anbindung an das Binding ist von Binding zu Binding unterschiedlich.

Theoretisch reicht dort ein Gerät, ich habe aber noch einige mehr mit reingenommen, die ich evtl. später in der Sitemap anzeigen möchte.

Wer nicht weiß wie er an die MAC kommt, kann das über die Fritzbox-Oberfläche herausfinden:

“Heimnetz” -> “Heimnetzübersicht” -> Beim passenden Gerät auf “Details” rechts.

Wie gesagt ist sie hier aber mit Doppelpunkten angegeben, diese müssen durch Bindestriche (Minus) ersetzt werden.

In .items Dateien un in der Sitemap werden Zeilen mit zwei Slashes am Anfang “//” ignoriert. Ebenfalls können ganze Abschnitte als Kommentar gekennzeichnet werden. Der Abschnitt beginnt mit /* und endet mit */

Nun benötigen wir noch eine Variable pro Person, die anzeigt ob die jeweilige Person zuhause ist oder nicht. Das kann man ebenfalls in der fritzbox.items hinzufügen, oder in einer anderen. Ich entscheide mich dafür eine system.items anzulegen, in der ich viele (allgemeine) Variablen und Gruppen anlegen kann:

 

Diese items habe ich auch in eine Gruppe gAdmin hinzugefügt, die ich dann in der Sitemap einfügen kann.

openHAB items in Sitemap einfügen

Um die erstellten items auf einer Sitemap anzuzeigen, gibt es zwei Möglichkeiten:

  • Einfügen der einzelnen Items in einem Frame
  • Einfügen der Gruppe in einem Frame

Einzelne items haben den Vorteil, dass man entscheiden kann welche items in welcher Reihenfolge angezeigt werden. Des Weiteren können in dem Fall auch Anzeigeregeln erstellt werden (zeige das Element nur an, wenn Schalter X auf AN steht), sowie Farben definiert werden.

Eine Gruppe ist einfacher einzufügen (da nur ein Eintrag) und zeigt dann immer alle Elemente dieser Gruppe an. Und zwar in der Reihenfolge, in der sie in der .items-Datei stehen. Sind die Elemente aus mehreren .items-Dateien, wird es schon schwieriger mit der Reihenfolge. Außerdem kann eine Gruppe keine andere Gruppen darunter anzeigen, was mit einem normalen Frame aber möglich ist. Ich selbst habe eine Mischung aus Gruppen und einzelnen items in Frames in meiner Sitemap. Nachdem ich die Fritzbox Gruppe eingefügt habe, sieht es so aus:

Nun wird in der Basic UI die Gruppe angezeigt und mit einem Klick darauf können die Inhalte angesehen werden:

Automatisieren durch Regeln

Jetzt haben wir alle items angelegt, aber noch passiert damit nichts, außer, dass wir sehen wessen Telefon im WLAN ist. Drum lege ich unter conf\rules\ eine Datei “out-of-home-detection.rules” an.

Sobald ein Gerät Offline gegangen ist, prüft diese Regel dann mehrere Male ob dieses immer noch offline ist (und nicht nur die Verbindung kurz weg war) und setzt dann die entsprechende Außer-Haus-Variable auf ON. Und umgekehrt, sobald ein Gerät wieder online ist, wird die Variable auf OFF gesetzt.

Programmiertechnisch ist es nicht wunderschön, Schleifen mit Zählern wären da besser, anstatt stumpf mehrfach hintereinander abzufragen, aber es funktioniert und erfüllt seinen Zweck.

Und sobald alle außer Haus sind, wird die Variable vAlleAusserHaus auf ON gesetzt, auf die ich dann ebenfalls reagieren kann (z.B. Heizung runterdrehen, Licht aus falls vergessen).

Hier die komplette Datei, wieder mit .txt Endung, die weg muss!

out-of-home-detection.rules

Dazu noch einige Kommentare von mir:

Die vom Designer angemerkten Fehler sind fälschlicherweise als Fehler markiert. In diesen Fällen! Manchmal stimmt es natürlich auch.

Regeln reagieren auf Änderungen einer Variable, könnten aber auch auf einen Zeitpunkt reagieren. Fragt man diese aber weiter in der Regel ab, so muss man .state abfragen, da die Variable selbst ein Objekt ist.

  • In einer weiteren Datei out-of-home-actions.rules kann nun auf die Alle-Außer-Haus Variable reagiert werden. Beispielsweise:
  • Wenn man Kontaktsensoren an den Türen hat, kann man sich benachrichtigen lassen, wenn eine Tür offen sein sollte.
  • Die Heizung kann runtergedreht werden
  • TV ausschalten, falls an
  • Lichter ausschalten, falls an

So schaut die Datei bei mir aus, dort habe ich noch mehr Variablen verwendet, die ich noch nicht erklärt habe:

In meinen nächsten Beiträgen werde ich jedoch nicht mehr so ganz ausführlich auf die einzelnen Dateien eingehen, sondern eher auf die Regeln selbst. Das Prinzip ändert sich dann ja nicht.

Ich hoffe ich konnte euch das Thema näher bringen und freue mich natürlich auf euer Feedback in den Kommentaren!

13 Antworten auf „openHAB Fritzbox TR064 Binding zur Anwesenheitserkennung“

  1. Hallo,
    vielen Dank für die tolle Anleitung !!
    Ich habe ein Problem – wenn ich bei meinem iPhone 6 WLAN deaktiviere geht es nach einiger Zeit in der Fritzbox in den Status “nicht aktive Verbindung” .. im openhab bleibt der Status weiterhin online .. habe ich was übersehen ?

    1. Hi Klaus,
      bleibt es auch nach mehreren Minuten so?
      Schau mal in die Logdateien, eventuell siehst du dort Fehler… Wo die Logs zu finden sind findest du in meinem Beitrag vom 12.01.2017.

      Grüße

  2. Hallo, vielen Dank für die Anleitung.
    Ich habe das Problem, dass, wenn ich in der Sitemap ein Mapping anlege (z.B.: “Abwesenheit [MAP(presence.map): %d”), die openHAB2-Apps (sowohl IOS, als auch Android) auf den mobilen Geräten nicht mehr starten, bzw. eine Fehlermeldung ausgeben.

    Nemen ich -MAP(presence.map):- wieder aus der Sitemap raus, startet die App wieder.

    Haben Sie dazu eventuell eine Erfahrung/Lösung?

    Sehr vielen Dank.

    PJHaucke

    1. PS: Ich muss noch anfügen, dass es in der BasicUI einwandfrei angezeigt wird, wenn das Mapping eingetragen ist.
      PJHaucke

      1. Jetzt habe ich es doch noch gefunden:
        Wird als Ausgabevariable “%d” gewählt (und dann mit 0=Abwesend) gemapped, starten die Apps nicht.

        Wird mit “%s” (und dann CLOSED=Abwesend) gemapped, klappt es.

        Schöne Grüsse. PJH

  3. Vielen Dank für ausführlich beschriebenen Beitrag. Es war für mich sehr nützlich. Um ehrlich zu sein ist für mich alles, was mit Technik verbunden ist, ein Geheimnis. Deswegen suche ich immer detaillierten Unterricht.
    Danke!

  4. Vielen Dank für die Anleitung.
    Das Binding scheint allerdings nicht zu funktionieren, wenn das Handy über einen Repeater im Netzwerk angemeldet ist (zumindest wird es dann bei mir immer als offline angezeigt). Lt. https://wiki.fhem.de/wiki/FRITZBOX#Anwesenheitserkennung_.C3.BCber_mehrere_Fritzboxen_oder_AVM_Repeater_und_Fritzbox sollte das aber grundsätzlich gehen.
    Hast du zufällig eine Idee, wie man das in OpenHab realisieren könnte?

  5. Hi, wirklich gute Anleitung. Damit hat die Installation super funktioniert! Mehr davon bitte… 🙂

    Eine Frage habe ich:
    Habe die Rules für mein und das Handy meiner Frau erstellt. Allerdings feuert die Regel für das Handy meiner Frau ab und zu ohne ersichtlichen Grund einfach los und ich bekomme, manchmal sofort hintereinander oder manchmal wil durcheinander, die Nachrichten, dass meine Frau Abwesend und dann wieder Anwesend ist.

    Woran kann das liegen bzw wie ich kann ich Fehlersuche betreiben?

    Danke im Voraus für deine Hilfe.

    Gruß
    Christopher

    1. Hi Christopher,
      manchmal funktioniert es mit dem WLAN nicht ganz zuverlässig. Die Smartphones loggen sich zum Teil vom WLAN aus um Strom zu sparen…
      Ich habe es für mich nun auch überarbeitet. Es gibt nun ein iCloud-Binding, das über das iPhone die Lokation erkennt. So kann man sich das dann zusätzlich zu nutze machen. Hier sind einige interessante Links dazu:
      https://docs.openhab.org/addons/bindings/icloud/readme.html
      https://community.openhab.org/t/icloud-device-data-integration-in-openhab/32329/350
      https://community.openhab.org/t/compare-lastupdate-to-now/38666/9

  6. Hallo,
    wirklich ein toller Beitrag. Ich bin ein absoluter Anfänger daher entschuldige bitte meine Frage, aber welche Syntax schreibst du in die “presence.map”?

    Danke dir!
    JInFin

  7. ganz toller Beitrag!

    Habe lange mit diesem Codeschnipsel hier gekämpft:

    if(vXXXAusserHaus.state == ON && vYYYAusserHaus.state == ON) {
    logInfo(“RULE”, “–> Alle außer Haus ON”)
    postUpdate(vAlleAusserHaus, ON)
    }

    Mein Problem war: Solange nicht alle Variablen einen Wert zugewiesen haben bleiben diese NULL und die Variable vAlleAusserHaus kann nie gesetzt werden.

    Ich habe dann “== ON” gegen “!=OFF” getauscht. Somit wird NULL als “außer Haus” interpretiert.

Schreibe einen Kommentar

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