meintechblog.de
30Nov/1320

Zwei FHEM-Server verbinden: FritzBox-Anwesenheitserkennung auf dem Raspberry Pi nutzen

Die quelloffene Hausautomation-Serversoftware FHEM kann grundsätzlich auf unterschiedlichen Hardware-Systemen betrieben werden. Meistens wird FHEM auf Grund der günstigen Hardware auf einem Raspberry Pi (Affiliate-Link) betrieben. Auch AVM FritzBoxen (z.B. die FritzBox 7390 (Affiliate-Link)) sind eine beliebte Server-Hardware zum Betrieb von FHEM. Verwendet man zwei verschiedene FHEM-Server, so gibt es die Möglichkeit, diese in Kombination miteinander zu betreiben. Dieser Artikel zeigt, wie von einem FHEM-Server auf einem Raspberry Pi Daten eines FHEM-Servers auf einer FritzBox 7390 abgefragt werden.

Fhem2Fhem verbindet Systeme

Das Helper-Module Fhem2Fhem (Standardkomponente von FHEM) beabsichtigt genau den hier beschriebenen Zweck: Es verbindet zwei separate FHEM-Installationen miteinander. Dabei existieren zwei verschiedene Modi: RAW und LOG.

  • Der RAW-Modus ermöglicht es, eine Remote-Installation von einer Hauptinstallation zu steuern (z.B. einen am Remoteserver angeschlossenen CUL). Hierauf wird in diesem Artikel nicht weiter eingegangen.
  • Der LOG-Modus ermöglicht es, sämtliche Events (z.B. Zustandsänderungen) von Geräten auf dem Remoteserver im Hauptserver zu erfassen, um beispielsweise davon abhängige Steuerungen zu generieren.

Die Verbindung der Systeme ist relativ simpel umzusetzen. Der Hauptserver erhält dazu lediglich die IP-Adresse des neu einzubindenden Remoteservers in folgender Form:

define Remoteserver FHEM2FHEM 192.168.178.1:7072 LOG:.*

Name (hier: Remoteserver) und IP-Adresse müssen dabei individuell angepasst werden. Diese Definition ist bereits ausreichend, um beide Instanzen zu verbinden. Der Status von Remoteserver sollte nun bereits auf "connected" stehen (siehe Screenshot).

Anwesenheitserkennung: Fhem auf Raspberry Pi mit Fhem auf FritzBox verbinden

Um eine Anwesenheitserkennung zu Hause umzusetzen, gibt es mehrere Möglichkeiten. Neben der Verwendung eines Bluetooth-Sticks (Affiliate-Link) am Raspberry Pi (Anleitung: Howto: Mit FHEM Push-Nachrichten aufs iPhone schicken (Update)) und einer Standard-Lan-Ping-Methode (absolut nicht zuverlässig), bietet die AVM FritzBox (z.B. die 7390 (Affiliate-Link)) die Möglichkeit, über besondere Bordmittel den Online-Status von Geräten sehr gut zu ermitteln. Daraus lässt sich für FritzBox-Besitzer hervorragend eine Anwesenheitserkennung in FHEM realisieren, die es ermöglicht, z.B. Heizungen, Lichter oder Beschattung in Abhängigkeit anwesender Personen zu steuern.

Viele Nutzer (und auch ich) besitzen zwar eine FritzBox, nutzen FHEM allerdings auf einem separaten Raspberry Pi. Hier soll nun gezeigt werden, wie die "Fritzbox"-Anwesenheitserkennung für eine FHEM-Installation auf einem Raspberry Pi genutzt werden kann. Zunächst wird FHEM auf der FritzBox installiert und an den Haupt-FHEM-Server angebunden.

  • Die Installation muss mit dem von FHEM bereitgestellten Fritzbox Image (Informationen und Direktdownload) bewerkstelligt werden. Das Image-File wird dabei im Webinterface der FritzBox als "manuelles" Update hochgeladen. Nach einem Reboot der Box ist FHEM über den Port 8083 erreichbar (http://fritz.box:8083/fhem).
  • Anschließend benötigt FHEM Root-Rechte. Dazu wird eine Telnet-Verbindung mit der FritzBox hergestellt und in den Ordner "/var/media/ftp/fhem/" gewechselt, wo die Datei "startfhem" geändert wird. Anschließend wird ALLES zwischen den Zeilen "## START:fhem-user" und "## END:fhem-user" durch wiederholtes Drücken der Taste "D" gelöscht. Anschließend ESC und ":wq!":
    - cd /var/media/ftp/fhem/
    - vi  startfhem
    - Löschen mit "D"
    - [ESC] und "wq!"
  • Der neue FHEM-Server auf der FritzBox wird jetzt mit dem Hauptserver, wie oben beschrieben, mit Fhem2Fhem gekoppelt. (Anmerkung: Der nachfolgende Eintrag muss in die fhem.cfg des Raspberry Pi eingetragen werden.)

B003108AZI

Hauptserver: define Remoteserver FHEM2FHEM 192.168.178.1:7072 LOG:.*

Nun kann damit begonnen werden, auf dem FritzBox-Server (Remoteserver) die Anwesenheitserkennung umzusetzen. (Anmerkung: Der nachfolgende Eintrag muss in die fhem.cfg der FritzBox eingetragen werden.)

Remoteserver: define Christoph PRESENCE fritzbox iPhone5Christoph 10 30

Dieser Befehl installiert eine neue Presence-Instanz, der meine Anwesenheit an Hand meines Mobiltelefone prüft. Wichtig ist dabei, dass der Mobiltelefon-Name dem aus dem FritzBox-Webinterface exakt entspricht. Die beiden Zahlen (10 30) am Ende der Definition geben die Prüf-Zeitintervalle an (hier 10 und 30 Sekunden). Damit erfolgt eine Abfrage alle 10 Sekunden bei Abwesenheit und danach alle 30 Sekunden, sobald das Smartphone anwesend ist. Je höher die gewählten Werte, desto weniger wird am Akku gezerrt. Je geringer die Werte, desto genauer (Zeitbezug) ist die Erkennung. Hier empfielt es sich, einen Watchdog einzusetzen, welcher erst nach einigen Minuten "erkannter" Abwesenheit den Status auf absent ändert, um kurzfristige Empfangsprobleme zu kompensieren. Wie das genau funktioniert, wird u.A. im Artikel Howto: Mit FHEM Push-Nachrichten aufs iPhone schicken (Update) beschrieben. Zur Kontrolle sollte die Definition im Anschluss geprüft werden. Sie sollte entweder "present" oder "absent" als Status besitzen.

Jetzt soll dieser Status alle 10 Sekunden an den Raspberry Pi (Affiliate-Link) (Haupt-Server) übertragen werden. Daher wird dort zunächst einmal ein Dummy angelegt:

Hauptserver: define ChrisAnwesend dummy

Dieser Dummy soll den Status der Presence-Definition auf der FritzBox erhalten. Dazu wird wie folgt vorgegangen: Auf dem Hauptserver wird ein Notify angelegt, der auf ein Dummy (DummyA) am Remoteserver reagiert und mit dem Befehl fhem "%" ALLES genauso in den Hauptserver schreibt, wie es im Remoteserver geschrieben wird.

Hauptserver (ab Version 5.7): define Datentransfer notify DummyA { fhem "%" } define Datentransfer notify DummyA { fhem "$EVENT" }
(Danke Tim & Pascal für den Hinweis!)

Remoteserver: define DummyA dummy

Jetzt wird lediglich noch ein Notify am Remoteserver angelegt, welches den aktuellen Status der Anwesenheitserkennung nimmt, als Variable speichert und in folgender Form an das Dummy "DummyA" übermittelt, welches dann wiederum den relevanten Befehl ausführt, der das Dummy "ChrisAnwesend" auf dem Hauptserver aktualisiert.

Remoteserver: define ChrisNotiPresence notify Christoph {my $chrisstate=ReadingsVal("Christoph","state",0) fhem ("set DummyA set ChrisAnwesend $chrisstate")}

Der Zusammenhang ist also wie folgt. Der Dummy (DummyA) fungiert hier quasi als Befehlsträger, indem er den Status "set ChrisAnwesend $chrisstate" erhält. Sein Status, der ja eigentlich ein Befehl ist, wird dank des auf dem Hauptserver eingerichteten Notifies mit "%" übernommen, also dort als Befehl umgesetzt. Um es zusammenzufassen: Die Anwesenheitserkennung auf der FritzBox 7390 (Affiliate-Link) schreibt einen "set"-Befehl in einen Dummy auf der FritzBox, der über ein Notify vom Raspberry Pi übernommen wird und daraufhin einen Dummy auf dem Raspberry Pi mit dem Anwesenheitsstatus beschreibt.

Erfahrungswerte haben gezeigt, dass eine Anwesenheit nach etwa einer Minute erkannt wird und Abwesenheit nach etwa 5 Minuten einsetzt. Diese Form der Anwesenheitserkennung eignet sich daher NICHT für beispielsweise Türöffnung mit dem KeyMatic Set aus der HomeMatic-Serie, da eben erst mit einer gewissen Verzögerung reagiert wird. Hier reagiert die Bluetooth-Variante insgesamt schneller.

Aus meinem täglichen Leben

Die Anwesenheitserkennung der FritzBox eignet sich hervorragend für unterschiedliche Szenarien. Ich nutze diese z.B. um bei Abwesenheit alle Lichter und Verbraucher im Haushalt auszuschalten. Der Verbund zweier FHEM-Instanzen (eine auf dem Raspberry Pi und eine auf FritzBox 7390) funktioniert dabei reibungslos. Künftig möchte ich auf diese Weise auch weitere Daten der FritzBox nutzen, um sie in meinem Haupt-Server einzubinden (z.B. Telefondaten der FritzBox etc.)

Affiliate-Links

 

Wir haben dir mit diesem Artikel weitergeholfen? Dann zeig dich erkenntlich und gib uns einen Kaffee aus. Vielen Dank schon mal!




Fragen zu FHEM? Unser neues E-Book hilft dir weiter!

Verpasse keine Inhalte mehr! Trage dich in unseren Newsletter ein und folge meintechblog auf Facebook oder Twitter.

Share Button
Christoph

Christoph

berichtet seit Juni 2012 auf meintechblog.de über seine Erfahrungen zu Smart Home und Hausautomation und beschäftigt sich außerdem mit Smart Grids. Mehr Infos
Christoph
Kommentare (20)
  1. Hallo Christoph,
    sehr schöne Lösung - nur funktioniert sie bei mir leider nicht. Ich bekomme zwar auf der FB ein "present" - abder der DummyA hat als status immer nur "???" - wenn ich es richtig verstehe, bedeutet dies, dass der Presence Wert nicht an DummyA übergeben wird und damit dann nicht an den Hauptserver (Rasp).

    Ich habe zuerst mit einem eigenen Namen probiert - hat nicht funktioniert - dann habe ich deine Lösung 1:1 mittelös copy&paste übertragen - trotzdem ist dummyA immer noch "???" auf der FB

    • Ich habe es auch nach der Anleitung gemacht, und habe es hinbekommen,
      es funktioniert.
      Du hast bestimmt einmal Remote und Hauptserver verwechselt, ggf IP überprüfen.

    • Hallo Sascha,

      geht es mittlerweile?

      Viele Grüße
      CHristoph

  2. Hallo Christoph,
    heute las ich deinen Beitrag zur Verbindung zweier fhems.
    Evtuell kannst du mir helfen:
    hab' eine Fritzbox und ein Raspi in Betrieb - beide mit fhem. Für das fhem auf der Fritzbox benötige ich eine Temperaur von der Raspi-fhem.
    Hierfür steht das Modul fhemtofhem zur Verfügung.
    Beide wurden verbunden mit folgender Definition - define ds1 FHEM2FHEM 192.168.10.42:7072 LOG:.*
    Auf der Telnet-Seite (FritzBox mit putty) sind sogleich alle Werte beider fhem-Programme sichtbar.

    Problem: wie lautet die Syntax für die Abfrage in fhem? Wenn ich in fhem auf der FritzBox z.B. get Trphs (eine 1wire Temperatur auf dem Raspi) eingebe - kommt die Botschaft "define Trphs first".
    Letztendlich möchte ich den Wert in einer PID-Reglung als Istwert verwenden.
    Hat jemand eine Lösung?

    Grüße

  3. Ist das ganze auch mit dem neuen Fritz OS 6.01 möglich?

    • Hallo Miro,

      getestet habe ich es mit FRITZ!OS 06.00. Da es allerdings nicht um FritzOS-Spezifika geht, sondern um FHEM, sollte es auch mit V 6.1 funktionieren.

      VG
      CHristoph

  4. Könntest du den entsprechenden Downloadlink zur 6.x bereitstellen? Man findet überall nur das FHEM Image der 5.x.

    • Hallo Miro,

      auf fhem.de findest Du direkt alle Images, die du benötigst. Hier ist auch ein Image direkt für die FritzBox dabei. Die Version (aktuell 5.5) ist die Nummer von FHEM und hat mit der Version von FritzOS nichts zu tun.

      Viele Grüße
      Christoph

  5. Hallo Christoph,

    vielen Dank für die Anleitung! Hat soweit funktioniert...

    Nur eines funktioniert nicht => notify. Ich komme nicht auf die Lösung. Und hoffe Du kannst mir evtl helfen...

    Wenn ich {my $chrisstate=ReadingsVal("Christoph","state",0);; fhem ("set DummyA set ChrisAnwesend $chrisstate")} in dem Eingabefeld auf der FHEM Seite eingebe (natürlich auf meine Geräte und Umgebung angepassst) wird der Status auf der FritzBox und auf dem Hauptserver geändert. Nur macht der FHEM es selber nicht wenn sich der Status des Telefons ändert.

    Hast du vielleicht ein Ansatz?

    Vielen Dank im Voraus!

    MfG

    Anatoli

  6. Echt toller Blogpost! Hab hier schon verdammt viel aufgeschnappt :-D
    Nun meine Frage, ich habe deine "FHEM-NUC" Anleitung umgesetzt, da mir der Raspi zu langsam ist. Ist es möglich über die hier beschriebene Variante den RPI als eine Art CUL zu nutzen? Habe bereits einen HMlan Adapter und möchte lediglich das 433MHz Bereich (Funksteckdose, etc) damit ansprechen.

    Ein Tipp wäre toll!

    ps. über CUL + Culfw bin ich mir bewusst, trotzdem wäre eine preisgünstige Variante eine tolle Sache ^^

    Liebe Grüße

    • Hi, wie soll der RPI denn mit den 433ern kommunizieren? Hast du einen Sender über GPIO dran?
      VG
      Christoph

  7. Hallo Christoph,
    ich habe es erfolgreich nach Deiner Anleitung umgesetzt, scheitere aber daran dass es anscheinend Probleme gibt wenn man einen Repeater (bei mir FRITZ!WLAN Repeater 300E) im Einsatz hat...
    ich werde weiter testen..

    Grüße,
    Carsten

  8. Hallo Christoph,
    auch ich bin gerade ein blutiger Anfänger in sachen Raspi + mit Cul 868, 433 inkl. Fritz 7390 an Fritz 6360.
    Ich habe alles nach deiner Anleitung oben gemacht und 3 mal kontrolliert.
    Leider ist auch bei mir bei Werner_Anwesend auf dem HauptFhem und auf der Fritzbox 7390 der DummyA ein ??? gesetzt.
    Was kann ich machen um diesen Fehler zu beheben ??
    Gruß Werner

  9. Moin Moin,

    Erstmal vielen Dank für all die tollen Tutorials! Habe mir auch das eBook gekauft von dem ich sehr begeistert bin.

    Ich habe das Tutorial zur WLAN-Anwesnheitserkennung umgesetzt jedoch wird der Status auf meinem Raspi nicht gesetzt. Ich habe lediglich den Hostname meines Smartphones angepasst.

    Raspi fhem.cfg:
    define FritzBox FHEM2FHEM picloud:7072 LOG:.*
    define ChrisAnwesend dummy
    define Datentransfer notify DummyA { fhem "%" }

    Fritzbox fhem.cfg:
    define Christoph PRESENCE fritzbox android-c9cab0d8fd29416 10 30
    define DummyA dummy
    define ChrisNotiPresence notify Christoph {my $chrisstate=ReadingsVal("Christoph","state",0);; fhem ("set DummyA set ChrisAnwesend $chrisstate")}

    Der Status wird in der Fritzbox richtig angezeigt, DummyA ist gleich "set ChrisAnwesend present", ChrisNotiPresence ist active.
    Auf dem Raspi wird die FritzBox als connected angezeigt, Datentransfer ist active jedoch ist ChrisAnwesend = ???

    Kann mir jemand den Fehler aufzeigen?

    Gruß
    Wolfgang

    • Hallo Wolfgang,

      eigentlich ist das so alles richtig. Hast du das Problem mittlerweile lösen können?
      Ich würde sonst versuchen, an beiden FHEM-Systemen noch einem ein "update" durchzuführen.

      Gib noch einmal Bescheid!
      Viele Grüße
      Christoph

    • Hach wie peinlich...

      Der Fehler lag in der Zeile
      define FritzBox FHEM2FHEM picloud:7072 LOG:.*

      Natürlich muss sie
      define FritzBox FHEM2FHEM fritz.box:7072 LOG:.*
      lauten.

      Danke für die Hilfsbereitschaft!

    • Hallo Wolfgang,

      ich dachte mir schon, dass es dann an dieser einen Zeile liegen muss, die Du verändert hast. Viel Spaß mit der Anwesenheitserkennung.

      Viele Grüße
      Christoph

  10. Hi,

    nach etwas rumwurschteln muss der Datentransfer Dummy seit FHEM Version 5.7 jetzt folgendermaßen definiert werden:

    define Datentransfer notify DummyA { fhem "$EVENT" }

    Vielleicht kann das aktualisiert werden und es müssen nicht andere so lange suchen wie ich :)

    Gruß Pascal

  11. Hallo Christoph,

    danke für die tolle Anleitung. Bei mir wird der Presence Status von Christoph richtig angezeigt, aber für das dummy "DummyA" wird auf dem Remoteserver nur "???" ausgegeben. Die Verbindung vom Hauptserver zum Remoteserver ist "connected".
    Wo kann der Fehler liegen, habe es zuerst mit eigenen Namen probiert und dann mit den Vorgaben (copy+paste). Nachfolgend die Eintragungen aus den Config Dateien:
    1.) Remoteserver FritzBox 7390 fhem.cfg:

    define Christoph PRESENCE fritzbox 12-Detlef-Handy-Note1 10 30
    define DummyA dummy
    define ChrisNotiPresence notify Christoph {my $chrisstate=ReadingsVal("Christoph","state",0) fhem ("set DummyA set ChrisAnwesend $chrisstate")}

    2.) und hier die fhem.cfg von dem Raspi:
    define Remoteserver FHEM2FHEM 192.168.66.1:7072 LOG:.*
    define ChrisAnwesend dummy
    define Datentransfer notify DummyA { fhem "$EVENT" }


Dein Kommentar

Trackbacks sind deaktiviert.