Modul FBTAM: Unterschied zwischen den Versionen

Aus FHEMWiki
Zeile 64: Zeile 64:
  {FBTAM_renderTgTable($defs{'FritzBoxTAM'})
  {FBTAM_renderTgTable($defs{'FritzBoxTAM'})
und erhält als Rückgabewert etwas von der Form
und erhält als Rückgabewert etwas von der Form
   ([2*] Peter, 24.08.25:tam_line 0_0) ([1*] Paul, 23.08.25:tam_line 0_1) ([0] Mary, 22.08.25:tam_line 0_2) ENDMENU Anrufbeantworter=on, 2 neue / 1 alte Nachrichten  
   ([2*] Peter, 24.08.25:tam_line 0_2) ([1*] Paul, 23.08.25:tam_line 0_1) ([0] Mary, 22.08.25:tam_line 0_0) ENDMENU Anrufbeantworter=on, 2 neue / 1 alte Nachrichten  
Speichert man diesen Rückgabewert z.B. im Reading ''fbtamSource'' des Telegram-Bots, kann man mit dem nachfolgenden Codefragment eine Übersicht der gespeicherten Nachrichten als Telegram Inline-Keyboard erzeugen:
Speichert man diesen Rückgabewert z.B. im Reading ''fbtamSource'' des Telegram-Bots, kann man mit dem nachfolgenden Codefragment eine Übersicht der gespeicherten Nachrichten als Telegram Inline-Keyboard erzeugen:
     my $cmd = ReadingsVal("TelegramBot","fbtamSource","");
     my $cmd = ReadingsVal("TelegramBot","fbtamSource","");

Version vom 25. August 2025, 03:12 Uhr

FBTAM
Zweck / Funktion
Das Modul stellt eine komfortable Oberfläche bereit, um den Anrufbeantworter der FritzBox abzufragen und zu steuern
Allgemein
Typ Hilfsmodul
Details
Dokumentation EN / DE
Support (Forum) Fritz!Box
Modulname 72_FBTAM.pm
Ersteller Prof. Dr. Peter A. Henning
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!

Für Supportanfragen bitte diesen Forenthread verwenden.

Allgemeines

Das Modul 72_FBTAM.pm stellt eine komfortable Oberfläche bereit, um den Anrufbeantworter der FritzBox abzufragen und zu steuern.

Zur Einrichtung muss das Modul 72_FBTAM.pm im Modulpfad installiert werden, ebenso die JavaScript-Datei fbtam.js in www/pgm2.

Achtung: Derzeit geht das Modul davon aus, dass lokal (d.h. in derselben FHEM-Installation) ein Device vom Typ FRITZBOX existiert. Ggf. wird die in Kürze noch vereinfacht, so dass nur im lokalen Subnetz eine FritzBox existieren muss.

Definition

Das FHEM-Device wird in der folgenden Dokumentation mit dem Namen "FritzBoxTAM" verwendet und definiert als

define FritzBoxTAM FBTAM <Name des FRITZBOX-Devices> <Nummer des verwalteten Anrufbeantworters 1..4>

Das Device verfügt dann über die folgenden Attribute

  • username ist ein Benutzername der FritzBox, welcher das Recht zu Abfragen des Anrufbeantworters haben muss
  • passwordKey wird nach der Eingabe eines Passworts mit "set FritzBoxTAM password <...>" gesetzt, das Passwort wird versteckt gespeichert.
  • interval ist das Abfrageintervall bei der FritzBox, Default = 60 (Sekunden)
  • targetdir ist das Speicherverzeichnis für heruntergeladene Nachrichten, Default = /opt/fhem/www/audio
  • MailFun ist eine mit FHEM ausführbare Funktion zum Versand von Mails. In diesem Funktionstemplate wird beim Versand der String REC durch die Mailadresse des jeweiligen Empfängers, der String CAPTION durch die Metadaten der Nachricht und der String FILE durch den Dateinamen der gespeicherten Nachrichtendatei ersetzt
  • MailRecList ist eine durch Leerzeichen getrennte Liste von Mailadressen, an welche ggf. Emails betreffend die Nachrichten versandt werden sollen.
  • MsgrType ist eine Bezeichnung für den Instant Messenger, mit welchem Messages zu den Nachrichten versendet werden sollen.

Beispiel für diesen Attributwert:

attr FritzBoxTAM MsgrType Telegram
  • MsgrFun ist eine mit FHEM ausführbare Funktion zum Versand von Messages. In diesem Funktionstemplate wird beim Versand der String REC durch die Mailadresse des jeweiligen Empfängers, der String CAPTION durch die Metadaten der Nachricht und der String FILE durch den Dateinamen der gespeicherten Nachrichtendatei ersetzt

Beispiel für diesen Attributwert:

attr FritzBoxTAM MsgrFun set TelegramBot sendMedia REC FILE
  • MsgrRecList ist eine durch Leerzeichen getrennte Liste von Mailadressen, an welche ggf. Kurznachrichten betreffend die Nachrichten versandt werden sollen.
  • Wav2MP3Fun ist eine mit FHEM ausführbare Funktion zum Umwandeln von WAV-Dateien in MP§-Dateien. In diesem Funktionstemplate wird der String INPUT durch den Dateinamen der WAV-Datei, OUTPUT durch den Namen der zu erstellenden MP3-Datei ersetzt. Achtung: Oftmals wird für eine solche Konversion das Paket ffmpeg verwendet. Das kann ziemlich mächtig sein, obwohl für den speziellen Zweck nur ein Bructeil davon benötigt wird. In dem Wiki-Artikel Minimales_ffmpeg wird erläutert, wie man eine weniger als 2 MByte große Minimalversion des Konversionsprogramms erzeugen kann.

Beispiel für diesen Attributwert:

attr FritzBoxTAM Wav2MP3Fun system('ffmpeg -y -i INPUT OUTPUT')

Bedienung

Nach der Einrichtung wird regelmäßig die FritzBox nach den gespeicherten Nachrichten befragt. Falls Nachrichten vorhanden sind, erfolgt die Anzeige in einer Tabelle.

  • 1.Spalte: Index der Nachricht in der FritzBox = laufende Nummer beginnend bei 0. Ein "*" bei diesem Index zeigt an, dass die Nachricht "neu" ist und noch nicht abgehört wurde.
  • 2.Spalte: Datum, Uhrzeit und Dauer der Nachricht
  • 3.Spalte: Anrufername und Telefonnummer. Falls der Name nicht bekannt ist, wird die Nummer als Name verwendet
  • 4.Spalte: Aktionsbuttons für
    • den Versand per Instant Messenger (nur, wenn das Attribut MsgrFun gesetzt ist) an alle Empfänger in der MsgrRecList
    • den Versand per Email (nur, wenn das Attribut MailFun gesetzt ist) an alle Empfänger in der MailRecList
    • das Löschen der Nachricht
    • den Download der Nachricht in das durch das Attribut targetdir bestimmte Verzeichnis
  • Achtung: Die korrekte Funktion der Buttons ist nur sichergestellt, wenn die Datei fbtam.js im Verzeichnis /opt/fhem/www/pgm2 vorhanden ist.

Kommandozeilenbefehle (bzw. über den Button "set FritzBoxTAM ..." auswählbar sind

  • update für sofotiges manuelles Update der Anzeige
  • deleteMsg <Index der Nachricht> für das Löschen
  • downloadMsg <Index der Nachricht> für den Download
  • sendMessengerMsg <Index der Nachricht> [<Empfänger>]
  • sendEmailMsg <Index der Nachricht> [<Empfänger>]
  • on Einschalten, off Ausschalten des Anrufbeantworters
  • username <Username> und password <Passwort>

Verwendung mit Telegram

Mit den nachfolgend beschriebenen Codefragmenten kann der Anrufbeantworter über den Instant Messenger Telegram gesteuert und abgehört werden. Das sieht dann ungefähr so aus. Fbtamtg1.png

Das Modul 72_FBTAM.pm stellt eine interne Funktion FBTAM_renderTgTable, bereit, die als einziges Argument den Geräte-Hash des FBTAM-Devices benötigt. Von außen kann man diese Funktion also aufrufen als

{FBTAM_renderTgTable($defs{'FritzBoxTAM'})

und erhält als Rückgabewert etwas von der Form

 ([2*] Peter, 24.08.25:tam_line 0_2) ([1*] Paul, 23.08.25:tam_line 0_1) ([0] Mary, 22.08.25:tam_line 0_0) ENDMENU Anrufbeantworter=on, 2 neue / 1 alte Nachrichten 

Speichert man diesen Rückgabewert z.B. im Reading fbtamSource des Telegram-Bots, kann man mit dem nachfolgenden Codefragment eine Übersicht der gespeicherten Nachrichten als Telegram Inline-Keyboard erzeugen:

   my $cmd = ReadingsVal("TelegramBot","fbtamSource","");
   $cmd =~ s/ENDMENU/\(Kommunikation\) \(Hauptmenü\)/;
   if( $cmd =~ /=on/ ){
     $cmd = "(Ausschalten:tam_switch off) $cmd";
   }else{
     $cmd = "(Einschalten:tam_switch on) $cmd";
   }
   $cmd = "set TelegramBot queryEditInline $menuMsgId \@$queryPeer $cmd";
   fhem("$cmd");  

Dabei wird ENDMENU durch Menüeinträge des Inline-Keyboards ersetzt, die beim Anklicken auf eine höhere Ebene (z.B. "Kommunikation" oder "Hauptmenü" führen sollen. Außerdem wird an erster Stelle des erzeugten Telegram Keyboards ein Menüeintrag erzeut, mit dem man den Anrufbeantworter an- bzw. Ausschalten kann.

Klickt man nun in Telegram den Button für An- oder Ausschalten an, wird im Bot eine Message mit Nachrichteninhalt tam_switch <on/off> registriert. Klickt man nun in Telegram eine der angezeigten Einzelnachrichten an, wird im Bot eine Message mit Nachrichteninhalt tam_line <n>_<m> empfangen. Darin ist <n> der Index des Anrufbeantworters (0 für AB 1, 1 für AB2, ...) und <m> der Index der Nachricht. Diese Message kann man wiederum abfangen. Angenommen, das erste Wort des Nachrichteninhalt sein in $cb1 gespeichert, das zweite in $cb2, so kann das Codefragment

 ...
 #-- Level 4 - Hauptmenü->Kommunikation->Anrufbeantworter->An/ausschalten
 }elsif( $cb1 eq "tam_switch"){
   Log 1,"[telegramRecognition] Level 4 - Hauptmenü->Kommunikation->Anrufbeantworter->An/Ausschalten"
     if( $debug);
   fhem("set FritzBoxTAM $cb2");
   ... (hier weitere Aktionen, z.B. re-display der Daten)
   return;  
   
 #-- Level 4 - Hauptmenü->Kommunikation->Anrufbeantworter->Einzelnachricht
 }elsif( $cb1 =~ /tam_line/){
   Log 1,"[telegramRecognition] Level 4 - Hauptmenü->Kommunikation->Anrufbeantworter->Nachricht"
     if( $debug);
    #-- create array from raw list
    my $src   = ReadingsVal("TelegramBot","fbtamSource","");
    $src =~ s/^\(//;
    $src =~ s/\)\s\w.*$//;
    my @srces = split /\)\s*\(/,$src;
    #-- look up msgIndex in this array
    $cb2 =~ /(\d)_(\d+)/;
    my $tamIndex=$1;
    my $msgIndex=$2;
    my $found=0;
    my ($si,$sname,$sdate);
    for( my $i=0;$i< int(@srces);$i++){
      my $msg=$srces[$i];
      $msg =~/\[(\d+)\*?\] (\w.*)\, ([\d\.]*)\:.*/;
      $si=$1;
      $sname=$2;
      $sdate=$3;
      if( $si == $msgIndex){
        $found=1;
        last;
      }
    }
    if( $found ){    
      fhem("set TelegramBot queryEditInline $menuMsgId \@$queryPeer (Abhören:tam_read $cb2|Löschen:tam_delete $cb2) (Anrufbeantworter:tam_main) (Kommunikation) (Hauptmenü) Nachricht $msgIndex von $sname am $sdate;");
    }else{
      fhem("set TelegramBot queryEditInline $menuMsgId \@$queryPeer (Anrufbeantworter:tam_main) (Hauptmenü) Kommunikation;");
    }
    return;      

zunächst den Anrufbeantworter an- oder ausschalten oder eine Einzelnachricht anzeigen. Mit dem nachfolgenden Codefragment kann eine Nachricht dann gelöscht oder als MP3-Datei an den Client gesendet werden

#-- Level 5 - Hauptmenü->Kommunikation->Anrufbeantworter->Einzelnachricht->Abhören 
 }elsif( $cb1 eq "tam_read"){
   Log 1,"[telegramRecognition] Level 5 - Hauptmenü->Kommunikation->Anrufbeantworter->Einzelnachricht->Abhören"
     if( $debug);
   $cb2 =~ /(\d)_(\d+)/;
   my $tamIndex=$1;
   my $msgIndex=$2;
   fhem("set FritzBoxTAM sendMessengerMsg $msgIndex");
   return;
   
 #-- Level 5 - Hauptmenü->Kommunikation->Anrufbeantworter->Einzelnachricht->Löschen
 }elsif( $cb1 eq "tam_delete"){
   Log 1,"[telegramRecognition] Level 5 - Hauptmenü->Kommunikation->Anrufbeantworter->Einzelnachricht->Löschen"
     if( $debug);
   $cb2 =~ /(\d)_(\d+)/;
   my $tamIndex=$1;
   my $msgIndex=$2;
   fhem("set FritzBoxTAM deleteMsg $msgIndex");
   ... (weitere Aktionen, z.B. re-display)
   return
 }