Modul FBTAM: Unterschied zwischen den Versionen

Aus FHEMWiki
(Die Seite wurde neu angelegt: „{{Infobox Modul |ModPurpose=Das Modul stellt eine komfortable Oberfläche bereit, um den Anrufbeantworter der FritzBox abzufragen und zu steuern |ModType=h |ModCmdRef=FBTAM |ModForumArea=Fritz!Box |ModTechName=72_FBTAM.pm |ModOwner=Prof. Dr. Peter A. Henning }} Für Supportanfragen bitte ''{{Link2Forum|Topic=142205.0|LinkText=diesen Forenthread}}'' verwenden. =Allgemeines= Das Modul ''72_Alarm.pm'' stellt eine komfortable Oberfläche bereit, um den Anruf…“)
 
 
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 10: Zeile 10:


=Allgemeines=
=Allgemeines=
Das Modul ''72_Alarm.pm'' stellt eine komfortable Oberfläche bereit, um den Anrufbeantworter der FritzBox abzufragen und zu steuern.
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.
Zur Einrichtung muss das Modul ''72_FBTAM.pm'' im Modulpfad installiert werden, ebenso die JavaScript-Datei ''fbtam.js'' in www/pgm2.


Zeile 33: Zeile 34:
* ''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.
* ''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:
Beispiel für diesen Attributwert:
  attr FritzBoxTAM Wav2MP3Fun system('ffmpeg -i INPUT OUTPUT')
  attr FritzBoxTAM Wav2MP3Fun system('ffmpeg -y -i INPUT OUTPUT')
 
== 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.
[[File:Fbtamtg1.png|800px]]
 
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_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
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
  }

Aktuelle Version vom 24. August 2025, 15:25 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 der String REC durch die Mailadresse des jeweiligen Empfängers, 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 der String REC durch die Mailadresse des jeweiligen Empfängers, der String FILE durch den Dateinamen der gespeicherten Nachrichtendatei ersetzt

Beispiel für diesen Attributwert:

attr FritzBoxTAM MsgrFun set TelegramBot sendMedia 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')

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_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 

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
 }