Zum Inhalt

Fritzbox: Info über den letzten Anrufer

Aufgrund der bisher schlechten Umsetzung der Fritz!Phone App (iPhone) habe ich mir eine eigene Lösung mit openHAB gebaut.
Zum einen sehe ich den letzten Anrufer inkl. Name auf meiner Sitemap, weiterhin erhalten abwesende Bewohner eine Nachricht über den verpassten Anruf.
Genauso erhalten alle Bewohner eine Nachricht wenn Urlaub aktiv ist.

Für die Umsetzung dieser Aufgabe müssen ein paar Voraussetzungen erfüllt werden.
Diese findet Ihr im Beitrag: Fritz!Box zur Erkennung der Anwesenheit


Items:

Folgende Items habe ich zur Umsetzung im Einsatz:

/* Fritz!Box */
Switch fbKlingel "Telefon klingel [%s]" <phone> {fritzboxtr064="callmonitor_ringing"}
Call fbAnruf "Anruf von [%1$s]" <phone> {fritzboxtr064="callmonitor_ringing"}
Call fbAnrufName "Anruf von [%1$s]" <phone> {fritzboxtr064="callmonitor_ringing:resolveName"}
String fbLastNumber "Letzter Anrufer: [%s]" <phone>
String fbLastName "Letzter Anrufer: [%s]" <phone>

Davon werden folgende auf der Sitemap dargestellt:

Text item=fbLastNumber
Text item=fbLastName

Die Regel:

Jetzt wird es ein wenig komplex.
Die Regel deckt einige zusätzliche Möglichkeiten wie Abwesenheit und Urlaub ab.
Für den Urlaub habe ich bisher nur einen manuellen Switch der vor und nach dem Urlaub betätigt werden muss.
Evtl. werde ich hier noch eine zeitliche Prüfung einbauen, beispielsweise nach 1 Tag Abwesenheit den Urlaub aktivieren.

import org.openhab.library.tel.types.CallType
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

rule "Eingehender Anruf"

when

  Item fbKlingel changed from OFF to ON

then

  // Daten des CallType auslesen
  val CallType call = fbAnruf.state as CallType
  // Die Variablen anlegen und mit der Nummer bzw. Namen des Anrufers füllen
  val String LastCallNumber = call.destNum.toString()
  val String LastCallName   = fbAnrufName.state.toString()
  // Die eigene Rufnummer aus der Variable entfernen
  LastCallName = LastCallName.removeStart("1234567##")
  // Prüfen ob der Anrufer unbekannt ist
  if(LastCallName.startsWith("Name not found for"))
  {
    // Den Namen mit Unbekannt füllen und die Daten in die Items eintragen
    LastCallName = "Unbekannt"
    postUpdate(fbLastNumber, LastCallNumber)
    postUpdate(fbLastName, LastCallName)
    logInfo("RuleLastCall", "Der Anruf von " + LastCallNumber + " (" + LastCallName + ")" + " wurde als Letzter Anrufer gespeichert.")
  }
  else
  {
    // Die Daten in die Items eintragen
    postUpdate(fbLastNumber, LastCallNumber)
    postUpdate(fbLastName, LastCallName)
    logInfo("RuleLastCall", "Der Anruf von " + LastCallNumber + " (" + LastCallName + ")" + " wurde als Letzter Anrufer gespeichert.")
  }

  // Prüfen ob Michael zuhause ist
  if(fbMichael.state == CLOSED && itmAlarm.state == OPEN)
  {
    if(itmHoliday.state == OFF)
    {
    logInfo("RuleLastCall", "Es wird eine Nachricht an Michael versendet.")
    var LastCallTextDoor = "Folgender Anruf wurde verpasst: "
    LastCallTextDoor = LastCallTextDoor + LastCallNumber + " (" + LastCallName + ")"
    sendTelegram("bot1", LastCallTextDoor)
    }
  }

  // Prüfen ob Johanna zuhause ist
  if(fbJohanna.state == CLOSED && itmAlarm.state == OPEN)
  {
    if(itmHoliday.state == OFF)
    {
    logInfo("RuleLastCall", "Es wird eine Nachricht an Johanna versendet.")
    var LastCallTextDoor = "Folgender Anruf wurde verpasst: "
    LastCallTextDoor = LastCallTextDoor + LastCallNumber + " (" + LastCallName + ")"
    sendTelegram("bot2", LastCallTextDoor)
    }
  }

  // Prüfen ob Urlaub aktiv ist
  if(itmHoliday.state == OFF)
  {
    // Prüfen ob die Tür abgeschlossen ist
    if(itmAlarm.state == CLOSED)
    {
      // Nachricht mit Nummer und Name des Anrufers per Telegram versenden, wenn die Tür abgeschlossen ist
      logInfo("RuleLastCall", "Es wird eine Nachricht versendet, die Tür ist abgeschlossen.")
      var LastCallTextDoor = "<Abwesend> Folgender Anruf wurde verpasst: "
      LastCallTextDoor = LastCallTextDoor + LastCallNumber + " (" + LastCallName + ")"
      sendTelegram("bot1", LastCallTextDoor)
      sendTelegram("bot2", LastCallTextDoor)
      return (false)
    }
    // Keine Nachricht senden wenn Urlaub aktiv ist
    // logInfo("RuleLastCall", "Es wird keine Nachricht versendet, Urlaub ist nicht aktiv.")
  }
  else
  {
    // Nachricht mit Nummer und Name des Anrufers per Telegram versenden, wenn Urlaub aktiv ist
    logInfo("RuleLastCall", "Es wird eine Nachricht versendet, Urlaub ist aktiv.")
    var LastCallText = "<Urlaub> Folgender Anruf wurde verpasst: "
    LastCallText = LastCallText + LastCallNumber + " (" + LastCallName + ")"
    sendTelegram("bot1", LastCallText)
    sendTelegram("bot2", LastCallText)
  }

end

Hier gibt es ein paar Variablen zu füllen:
1234567 ist eure eigene Rufnummer ohne Vorwahl, diese wird standardmäßig mit angezeigt.
— Dies ist vorallem in Umgebungen mit mehr als einer Rufnummer sinnvoll, so können wir die Regel nur für definierte Rufnummern durchführen.
— In meinem Fall gibt es nur eine Rufnummer und diese soll aus der Info entfernt werden.

– Die Telegram Bots!
— Mehr dazu im Beitrag: openHAB und Telegram

– Die gewünschten Texte
— LastCallText ist in diesem Fall der Text welcher zusammen mit Nummer und Name aus dem Adressbuch per Telegram versendet wird.

Weiterhin nutze ich noch den Urlaubsschalter, den Riegelschaltkontakt und die Anwesenheit.
Sollte jemand abwesend sein, so erhält nur er eine Nachricht.
Ist Urlaub aktiv erhalten beide eine Nachricht.
Ist Urlaub nicht aktiv und die Tür abgeschlossen wird ebenfalls eine Nachricht versendet.

Published inAllgemein

Schreibe den ersten Kommentar

Schreibe einen Kommentar

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