Smart-Home-Steuerung mit FHEM: Notzugang per Telefon

Telefonsteuerung

IM EINSATZ?

Dann schau dir UNSEREN LOXKURS an und profitiere von unserem Wissen!

Ein FHEM-basiertes Smart Home vernetzt und automatisiert eine Vielzahl von Geräten zu Komfort-, Sicherheits- oder Energiesparzwecken. Dabei agiert das Smart Home meist autark auf Basis von durch den Nutzer eingestellten Regeln und Abläufen. Ein fernsteuerndes Eingreifen z.B. per Smartphone App ist jedoch häufig trotzdem notwendig, um bestimmte Wunschszenarien zu aktivieren. Beispielsweise kann eine Anwesenheitssimulation je nach Bedarf per Smartphone App gestartet, die Heizung bereits vor Ankunft zuhause aktiviert oder einer bestimmter Verbraucher von unterwegs abgeschaltet werden. Das alles funktioniert über eine App auf dem Smartphone hervorragend, solange eine Internet-Verbindung besteht. Gerade im Urlaub ist diese Verbindung jedoch nicht immer gegeben, sodass ein dauerhafter Zugriff auf das Smart Home nicht möglich ist. Eine alternative, wenn auch stark beschränkte Zugriffsmöglichkeit, bietet das Telefon. Dieser Artikel erklärt, wie unter der Verwendung einer Fritz!Box, wie der Fritz!Box 7490 (Affiliate-Link), eine kostenlose, telefongesteuerte Smart-Home-Regelung für spezielle Einzelszenarien möglich ist.

Telefon per FritzBox in FHEM anbinden

Wer einen gängigen DSL-Tarif besitzt, hat heute meist eine digitale VoIP-Telefon-Leitung, die dann beispielsweise über die Fritz!Box 7490 (Affiliate-Link) eingebunden ist. Mit Hilfe des FHEM-Moduls “FB_CALLMONITOR” kann FHEM sämtliche Meta-Daten der Telefonaktivitäten einer Fritz!Box mitlesen. 

Damit dieses Modul verwendet werden kann, muss zunächst der Callmonitor der Fritz!Box aktiviert werden. Dazu wird auf einem an die Box angeschlossenen Telefon, z.B. einem “einfachen” Schnurlostelefon wie dem Bestseller Gigaset A415 (Affiliate-Link), die folgende “Telefonnummer” angerufen.

#96*5*

Aktivieren des Callmonitors

Darauf folgend kann das Telefon als Objekt in FHEM angelegt werden. Dies geschieht über den folgenden “define”-Ausdruck in der FHEM-Kommandozeile am oberen Bildrand.

define Telefon FB_CALLMONITOR 192.168.178.1

Hierdurch wird das Objekt “Telefon” (Name frei wählbar) angelegt, welches unter der IP-Adresse der FritzBox (hier: 192.168.187.1) zu finden ist. Zusätzlich wird dem Telefon mit Hilfe des “attr”-Ausdrucks noch ein Attribut vergeben, damit FHEM im weiteren Verlauf lediglich bei einer Statusänderung des Wertes “event” eine Aktion auslöst.

attr Telefon event-on-change-reading event

Nach einem Klick auf “Everything” in FHEM, sollte das Telefon auffindbar sein und in der Detailansicht etwa wie folgt aussehen.

FB_Callmonitor in FHEM

In den Readings sind bei eingehenden oder ausgehenden Anrufen alle wichtigen Informationen zu finden. Die direction zeigt die Richtung des Anrufes an, während external und internal number die Telefonnummern des Anrufers und des Angerufenen anzeigen. Die interne Nummer kann dabei auch unterschiedlich sein, wenn in der FritzBox mehr als eine Telefonnummer hinterlegt ist (z.B. bei Tarifen mit mehreren Inklusiv-Telefonnummern).

Bei Anruf Licht

Um nun mit dem Telefon allein durch das eingehende Anrufsignal eine gewisse Aktion umzusetzen, ist ein klein wenig Programmcode in Form eines Notify nötig. Im nachfolgenden Beispiel wird per Anruf eine Anwesenheitssimulation aktiviert, die gerade jetzt in der dunklen Jahreszeit Einbrecher bei Abwesenheit abschrecken soll. Um das Beispiel möglichst einfach zu halten, wird hier nur eine Lichtquelle für eine gewisse Zeit aktiviert werden.

Das Licht kann mittels diverser Schaltaktoren in FHEM angelernt sein, wie z.B. dem HomeMatic Unterputz-Schaltaktor für Markenschalter (Affiliate-Link) oder der HomeMatic Funk-Steckdose mit Leistungsmessung (Affiliate-Link).

Mit dem folgenden Code, der über “Edit files” in die Datei “fhem.cfg” eingetragen wird, wird das Licht (hier: Wz.Licht) bei einem eingehendes Anruf einer bestimmten externen Nummer (hier: 01519876543) an eine bestimmte interne Nummer (hier: 9876543) für eine bestimmte Zeit (hier: 900 Sekunden = 15 Minuten) aktiviert.

define not_TelefonAnwesenheitssimulation notify Telefon {fhem ("set Wz.Licht on-for-timer 900") if (ReadingsVal("Telefon","internal_number","") eq "9876543" && ReadingsVal("Telefon","external_number","") eq "01519876543")}

Die Schaltung erfolgt dabei ausschliesslich auf Basis des eingehenden Anrufs, ohne dass eine Gesprächsverbindung aufgebaut werden muss. Das demonstrierte Beispiel funktioniert mit jedem in FHEM gängigen Befehl, also z.B. auch dem Aktivieren einer Heizung.

Aus meinem täglichen Leben

Ich habe eine “Doppel-Flat” von 1&1, bei der ich gleich drei Inklusiv-Telefonnummern erhalten habe. Für das tatsächliche Telefonieren nutze ich nur eine der Nummern, sodass die beiden Übrigen von mir für den Zugriff auf FHEM verwendet werden. Da in der Kombination aus externer und interner Nummer, wie im Beispiel oben gezeigt, immer nur das Hinterlegen einer einzelnen Aktion möglich ist, muss die Telefonsteuerung eher als eine Art Notzugang verstanden werden. Ich nutze die Anwesenheitssimulation mit der einen Nummer, während ich auf der anderen einen Push-Service hinterlegt habe, der mir die IP-Adresse meiner FritzBox per Pushover auf das Smartphone sendet. Letzt genannte Funktion nutze ich für den Fall, dass der DynDNS-Dienst einmal ausfällt (leider schon vorgekommen). Die Anbindung meiner Fritz!Box 7490 (Affiliate-Link) in FHEM als Notzugang ist zwar einfach aber in vielen Fällen äußerst effektiv!

13 Kommentare
  1. Hallo Christoph
    Wie genau hast du Push service eingerichtet, der dir die IP deiner Fritzbox meldet, hatte nämlich schon etliche Male das gleiche Problem.
    Gruss Richi

  2. Hallo Christoph
    Da ich bis anhin nicht von dir gehört habe, habe ich ich selber einige Versuche mit:
    “wget -q -O – http://checkip.dyndns.org | sed -e ‘s/.*: //’ -e ‘s/<.*$//'"
    unternommen. Die IP wird zwar im log File angezeigt, aber ich kriege diese nicht als Wert in mein
    define meineIP dummy
    rein.
    Hast du mir einen Rat?
    Grüsse Richi

    1. Hallo Richi,

      sorry, dass wir es aktuell nicht mehr schaffen, täglich auf Kommentare zu antworten. Was ich gemacht habe, ist Folgendes. Im Ordner /opt/fhem habe ich ein Unix-Skript angelegt (“ippush.sh). Der Inhalt ist wie folgt:

      #!/bin/bash

      ip=$(ip -f inet -o addr show eth0|cut -d\ -f 7 | cut -d/ -f 1)
      #echo "ip: $ip"

      curl -s -F "token=aoA123456789m72g4wrBatE9Tk" -F "user=u12345678912345u1ad2YBRpkn" -F "message=IP-Adresse: $ip" https://api.pushover.net/1/messages.json

      Das Skript muss mit “sudo chmod +x ippush.sh” ausführbar gemacht werden. Dann kann fhem das Skript starten.
      VG
      Christoph

  3. Hallo Christoph,

    Herzlichen Dank für deinen Anstoss, hat perfekt geklappt, habe das Skript wenig geändert, jetzt krieg ich die IP von meinen beiden Fritzboxen via push gemeldet.

    Gruss Richi

  4. auch hier wieder eine schöne Sache 🙂

    Ich hab nach dem oben erklärten Muster ein notify eingerichtet, welches bei jeglichem eingehenden Anruf (event=ring) ein Licht am Telefon aktiviert … nun muss man nicht mehr im Halbdunkel hinstolpern 😉

  5. Hallo,

    erstmal vielen Dank für diesen Blog. Ich wäre ohne mit meiner FHEM-Installation definitiv nicht so weit wie ich jetzt bin. Die ‘Trockner fertig’-Aktion ist z. B. etwas worauf ich nie gekommen wäre, und das im Alltag wirklich praktisch ist.
    Da auch in den Kommentaren immer mal wieder etwas hilfreiches dabei ist, möchte ich auch mal meinen Senf dazugeben.
    Bei dieser Aktion kam mir gleich die Idee, dass wenn ich sowieso die Anrufe aus der Fritzbox auslese, ich mir ja bei entgangenen Anrufen auch gleich eine Pushnachricht zukommen lassen kann. Das ganze sieht jetzt wie folgt aus:

    define FritzBox FB_CALLMONITOR 192.168.178.1
    attr FritzBox event-on-change-reading event
    attr FritzBox room Technik
    attr FritzBox group Fritzbox
    define TelefonAnruf notify FritzBox {SCR_TelefonAnruf}
    attr TelefonAnruf room Ereignisse
    attr TelefonAnruf group notify Fritzbox

    define FritzboxStatus dummy
    attr FritzboxStatus room Technik
    attr FritzboxStatus group Fritzbox

    sub SCR_TelefonAnruf()
    {
    my $NummerIntern = ReadingsVal(‘FritzBox’, ‘internal_number’, “”);
    my $InternCon = ReadingsVal(‘FritzBox’, ‘internal_connection’, “”);
    my $NummerExtern = ReadingsVal(‘FritzBox’, ‘external_number’, “”);
    my $NummerMissed = ReadingsVal(‘FritzBox’, ‘missed_call’, “”);
    my $Status = ReadingsVal(‘FritzBox’, ‘event’, “”);
    my $LeereNummer = “empty”;
    fhem( “set FritzboxStatus $Status” );

    if($Status eq “disconnect”)
    {
    if($NummerIntern eq “09999999” && $NummerExtern eq “0888888888”)
    {
    fhem( “set STR_Heizungen desired-temp 20.0” );
    fhem (“setreading FritzBox missed_call $LeereNummer”);
    fhem (“setreading FritzBox internal_connection $LeereNummer”);
    }
    elsif($InternCon eq “Answering_Machine_1”)
    {
    fhem(“set PushoverTerk msg ‘FHEM Entgangener Anruf’ ‘Anruf von $NummerExtern. Nachricht auf AB.’ ” 0 ””);
    fhem (“setreading FritzBox internal_connection $LeereNummer”);
    }
    elsif($NummerMissed ne “empty”)
    {
    fhem(“set PushoverTerk msg ‘FHEM Entgangener Anruf’ ‘Anruf von $NummerMissed. Keine Nachricht hinterlassen.’ ” 0 ””);
    fhem (“setreading FritzBox missed_call $LeereNummer”);
    }
    }
    }

    Da die Fritzbox nicht immer alle readings setzt und sie gar nicht leert, musste ich da selbst Hand anlegen. Das ganze geht vielleicht noch eleganter, aber es funktioniert jedenfalls.Der FritzboxStatus-Dummy wird nicht benötigt. Den habe ich nur für Anzeigezwecke eingerichtet.

    mfg
    Tom

  6. Hallo Christoph,

    Irgendetwas funktioniert da bei mir nicht. Ich erhalte folgende Fehlermeldung nach dem Sichern der fhem.cfg:

    Unknown command &, try help. Unknown command ReadingsVal(“Telefon”,”external_number”,””), try help.

    Was ist falsch? Vielen Dank und beste Grüße

    Maria

    1. Hallo Maria,

      ich habe den Code gerade eben noch einmal auf einem “frischen” FHEM-Server in die Kommandozeile am oberen Bildrand eingefügt und abgesendet – ohne Fehlermeldung. Hast du den gesamten Code kopiert oder vielleicht nur einen Teil davon?

      Viele Grüße
      Christoph

  7. ich hatte die fehlermeldungen auch bei folgendem Syntax:
    define not_TelefonAnwesenheitssimulation notify Telefon {fhem (“set Wz.Licht on-for-timer 900“) if (ReadingsVal(“Telefon”,”internal_number”,””) eq “9876543” && ReadingsVal(“Telefon”,”external_number”,””) eq “01519876543“)}

    habe die string sachen entfernt und seit dem klappt es. bsp:

    #schaltet heizung auf automatik wenn anruf 01745… an 22472
    define not_TelefonAnwesenheitssimulation notify Telefon {fhem (“set HCAutomatik on”) if (ReadingsVal(“Telefon”,”internal_number”,””) eq “22472” && ReadingsVal(“Telefon”,”external_number”,””) eq “01745214”)}

  8. #schaltet heizung auf automatik wenn anruf 01745… an 22472
    define not_TelefonAnwesenheitssimulation notify Telefon {fhem (“set HCAutomatik on”) if (ReadingsVal(“Telefon”,”internal_number”,””) eq “22472” && ReadingsVal(“Telefon”,”external_number”,””) eq “01745214”)}

    Ich habe die Nummern mal durch mmeine ersetzt und das set einfach mal meine Steckerleiste anschalten lassen. Allerdings beim Anruf klappt das nicht. Das set in der Kommandozeile funtioniert, auch der FB Callmontior klappt. Nur das Zusammenspiel nicht.

  9. Hallo zusammen,

    wenn jemand mich anruft, dann wird das Event zweimal aufgerufen! Dadurch bekomme ich zwei Benachrichtigungen!?! Wie kann ich es verhindern, dass das Event nur einmal ausgelöst wird bzw. nur eine Benachrichtigung rausgeschickt wird?

    define Anrufer notify Anrufliste {\
    my $extNr = ReadingsVal(“Anrufliste”,”external_number”,””);;\
    fhem (“set PushService send $extNr”);;\
    }

    Vielen Dank im Voraus. 🙂

    1. Du musst die Zeile um ein drittes If erweitern. Wenn Telefon event = ring
      Hab das gleiche Problem bei mir gehabt.
      defmod NTF_TelefonStellplatz notify FritzCallMonitor {fhem (“set HMW_IO_12_Sw145 an”) if (ReadingsVal(“FritzCallMonitor”,”internal_number”,””) eq “9825567” && (ReadingsVal(“FritzCallMonitor”,”event”,””) eq “ring”) && ReadingsVal(“FritzCallMonitor”,”external_number”,””) eq “017012345678”)}

Schreibe einen Kommentar zu Bösenberg Antworten abbrechen

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

Das könnte dir auch gefallen