Funktion FB_RULswitch für Fritzbox Rufumleitung EIN/AUS mit Beispiel

416 views
Skip to first unread message

horchundkuck

unread,
Nov 11, 2012, 5:44:23 PM11/11/12
to fhem-...@googlegroups.com
Trübes Wetter habe ich für FHEM genutzt.
In Anlehnung an die WLAN EIN/AUS Funktion FB_WLANswitch, die seit Version 5.3 Bestandteil von FritzBoxUtils.pm ist, habe ich diese angepasst, um ein Rufumleitung durch FHEM ein- oder ausschalten zu lassen. Damit konnte ich mir nun den Wunsch erfüllen, bei Abwesenheit eine Rufumleitung aufs Smartphone zu legen und diese bei "atHome" wieder automatisch zu deaktivieren.
Man könnte auch die Rufnummer, zu der umgeleitet werden soll, mit übergeben, oder den AnschlussPort.Da das für meine Zwecke nicht nötig ist, habe ich mal klein angefangen und mich vorerst auf das Ein- und Ausschalten der Rufumleitung (RUL) beschränkt.
Aufgerufen werden kann die Funktion mit einem notify mit {FB_RULswitch("%")}, wobei on,ON,off,OFF,Anwesend und Abwesend gültige Argumente sind.
"Anwesend" und "Abwesend" sind Rückgabewerte aus der WerIstZuHause Funktion. Daher wird bei "Abwesend" ein RUL "on" und bei "Anwesend" ein RUL "off" generiert.

Getestet auf einer Fritzbox 7390 (FHEM-Image-5.3) und freiem FON1-Port. RUL in der FB eingerichtet. Die Routine kann wieder in die 99_myUtils.pm eingefügt werden:

##########################################################
# Einfügen in 99_myUtils.pm
#
######## Switch FB Rufumleitung on/off ###################
# abgeleitet aus der Funktion FB_WLANswitch (wiki)
# call from notify with {FB_RULswitch("%")}
# define RULeinaus notify RUL {FB_RULswitch("%")}
use FritzBoxUtils;
sub
FB_RULswitch($) {
 my $cmd = shift;
 my $ret = "";
 if ($cmd eq "Anwesend"){$cmd="off"};    # WLAN-Status umsetzen
 if ($cmd eq "Abwesend"){$cmd="on"};    # WLAN-Status umsetzen
 if ($cmd =~ m"on"i) {                  # on or ON
  $ret .= "ATD: " . `echo "ATD#411**" | nc 127.0.0.1 1011` ;
  sleep 1 ;
  $ret .= " ATH: " . `echo "ATH" | nc 127.0.0.1 1011` ;
 }
 if ($cmd =~ m"off"i) {                 # off or OFF
  $ret .= "ATD: " . `echo "ATD#401**" | nc 127.0.0.1 1011` ;
  sleep 1 ;
  $ret .= " ATH: " . `echo "ATH" | nc 127.0.0.1 1011` ;
 }
 $ret =~ s,[\r\n]*,,g;                  # remove CR from return-string
 Log 1, "FB_RULswitch($cmd) returned: $ret";
}
########## Ende 99_myUtils.pm ##############################

########## Aufruf aus fhem.cfg #############################
#
# mit der Funktion {FB_RULswitch("%")}
#
############################################################

Beispiel.cfg für das automatische Ein- und Ausschalten der Rufumleitung in Abhängigkeit vom WerIstZuHause-Status
Die Rufumleitung wird ganz normal in der FB angelegt. Ich benutze dazu einen freien analogen Port, hier: FON1.
(Man könnte auch eine Rufnummer und/oder den Port mit übergeben. Hier die einfache Variante)
Wenn mein_Handy per WLAN mit der FB verbunden ist (ich bin zu Hause), dann soll die RUL deaktiviert werden.
Sollte mein_Handy das Haus verlassen, wird die Rufumleitung aktiviert. In FHEMWEB wird der Status der RUL angezeigt.

# Definition vom mein_Handy
define mein_Handy dummy
attr mein_Handy room WerIstZuHause
attr mein_Handy setList Anwesend Abwesend
#
# Definition von RUL als Dummy, um den Status anzeigen zu können. Für die eigentliche Funktion wird er nicht gebraucht.
define RUL dummy
attr RUL alias Rufumleitung
attr RUL eventMap Anwesend:Aus Abwesend:Ein # übersetzen der Ergebnisse aus FB_WLANswitch in Ein und Aus
attr RUL icon RUL.Ein
attr RUL room WerIstZuHause
#
# Bekannte Ermittlung des WerIstZuHause-Status via ping (wiki)
define WerDa notify WerDa {FhemLanStat("192.168.xxx.xxx","mein_Handy")} # xxx.xxx = IP vom Handy (aus FB auslesen)
#
# Nun der eigentliche "Akt" und Setzen des dummy-Status.
define RULeinaus notify mein_Handy {FB_RULswitch("%")}{fhem "set RUL %"}
#
############################################################

Freuen, wenns klappt.

VG Heinz
RUL.Aus.png
RUL.Aus_bei_Anwesenheit.png
RUL.Ein.png
RUL.Ein_bei_Abwesenheit.png
RUL.Aus.PIC.png
RUL.Ein.PIC.png

UliM

unread,
Nov 12, 2012, 1:30:27 AM11/12/12
to fhem-...@googlegroups.com
Moin!
Gute Idee - stellst Du's ins Wiki?
Gruß Uli

horchundkuck

unread,
Nov 12, 2012, 10:34:23 AM11/12/12
to fhem-...@googlegroups.com

Gute Idee - stellst Du's ins Wiki?

Gerne, bin noch am verbessern. Ich suche noch ne Möglichkeit, atd xxx an eine bestimmte Nebenstelle zu senden. Muss noch etwas querlesen ;)

horchundkuck

unread,
Nov 14, 2012, 7:18:35 PM11/14/12
to fhem-...@googlegroups.com
Hier nun die überarbeitete Rufumleitungsfunktion. Neu ist die Möglichkeit, die Art der Rufumleitung (verzögert oder Parallelruf o.ä), die Nummer der Nebenstelle und die Zielrufnummer als Argument mit zu übergeben. Damit könnte man, bei Bedarf, das Umleitungsziel in Abhängigkeit von irgendwas wechseln. Hinzugekommen ist auch eine Fehlerbehandlung. Der Aufruf kann entweder mit einem Argument wie "Anwesend" oder "abwesend", ein oder AUS mit {FB_RULswitch("%")} oder  direkt durch die "WerIstZuHause"-Funktion oder ähnliches erfolgen. Wobei "anwesend" bedeutet, dass die RUL deaktiviert wird. Alternativ über die FHEM-Weboberfläche manuell mit dummy oder durch die "RUL-Anlege-Funktion" {FB_RULswitch('Rufumleitungsart','Nebenstelle',"Zielrufnummer")}. Hab im Script versucht, möglichst viel zu kommentieren. Vielleicht kann es jemand  gebrauchen. Die FritzBox Weboberfläche muss also zum Anlegen einer RUL nicht mehr benutzt werden. An den Einschränkungen "arbeite" ich noch.
Freue mich auch über Hinweise und Anregungen. Besser geht immer.

Und dran denken: Anfänger!!!
VG Heinz

######## Switch FB Rufumleitung on/off ############################################################################
#
# Aufruf mit {FB_RULswitch("%")} oder {FB_RULswitch('Rufumleitungsart','Nebenstelle',"Zielrufnummer")}
# mögliche Kommandos für "%" zum Deaktivieren der Rufumleitung: 0,oFF,AUS,ANwesend (Groß-/Kleinschreibung egal)
#                  zum Aktivieren der Rufumleitung: z.Bsp. 1,On,Ein,Abwesend
# define RUL FS20
# attr RUL dummy 1

# define RULeinaus notify RUL {FB_RULswitch("%")}
sub
FB_RULswitch($@) {
 my $out = "";
 my $ret = "";
 my $cmd = "";              # RUL deaktivieren: off,aus,anwesend; RUL aktivieren: z.Bsp. 1,on,ein,abwesend
 my $art = "1";                # Art: 1=sofort 2=verzögert 3=besetzt 4=2oder3 5=Parallelruf 6=bei Klingelsperre(0=Aus)
 my $nst = "1";                # Nebenstelle, die umgeleitet werden soll 1=FON1  2=FON2 3=FON3
 my $ziel = "0123456789";  # ZielRufnummer, auf die umgeleitet wird
 my  $laenge = @_;

return "Anzahl Parameter nicht korrekt. Erlaubt sind 1 oder 3, nicht aber $laenge!" if (($laenge ne 1)and($laenge ne 3));

 if ($laenge eq 3){
  $art  = $_[0];
  $nst  = $_[1];
  $ziel = $_[2];

return "Ungueltiges Datenformat!" if (($art !~/^[0-6]$/)|($nst !~/^[123]$/)|($ziel =~/\D/));
}
  $cmd  = $_[0];

#############################################################################
 if (($cmd =~ /Off/i)|($cmd =~ /Anwesend/i)|($cmd =~ /Aus/i)|($cmd eq 0)) { # Schreibweise ignorieren
      $art = "0";                                                           # RUL Aus
 }                                                                          # sonst RUL ein
 $out =  "ATD#4" . "$art$nst" . "*" . "$ziel" . "*";                        # Wählstring zusammensetzen
 $ret .= "ATD: " . `echo "$out" | nc 127.0.0.1 1011`;                       # wählen
 sleep 1 ;                                                               #
 $ret .= " ATH: " . `echo "ATH" | nc 127.0.0.1 1011` ;                     # auflegen

 $ret =~ s,[\r\n]*,,g;                                                  # remove CR from return-string
 Log 1, "FB_RULswitch($cmd) send: $out returned: $ret";                    # Ergebnis in Logdatei
}                                                                        #
#############################################################################
1;

horchundkuck

unread,
Nov 14, 2012, 7:30:21 PM11/14/12
to fhem-...@googlegroups.com
... und weil die Formatierung hier eigentlich gar keine ist, hänge ich die Scriptdatei an.
N8, oder Morjen
VG Heinz
FB_RULswitch.pm

horchundkuck

unread,
Nov 22, 2012, 5:02:06 PM11/22/12
to fhem-...@googlegroups.com
Hab die Funktion ins wiki gestellt. Danke an Alle, die Händchen gehalten haben ;-)
Anregungen oder Hinweise: Gerne
Reply all
Reply to author
Forward
0 new messages