Modul FBTAM
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_Alarm.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 -i INPUT OUTPUT')
Verwendung mit Telegram
Das Modul 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
([0*] Peter, 24.08.25:tam_line 0_0) ([1*] Paul, 23.08.25:tam_line 0_1) ([2] 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 }