Hallo zusammen,
ich möchte mittels eines FS20 KSE die Telefone der FB klingeln lassen. Die fhem.cfg und die 99_Util.pm habe ich angepasst. Der KSE liefert die Events und laut Log soll **9 an die Box gesendet werden. Dort scheint der Befehl aber nicht anzukommen. Beim Kompilieren von Freetz habe ich (glaube ich) den Callmonitor nicht eingebunden.
Wird der zum Austausch von Infos von und zur FB benötigt oder habe ich etws anderes falsch gemacht?
Hier der Auszug aus meiner fhem.cfg:
# Klingel
#
define Klingel FS20 1060 00
attr Klingel room MAX
attr Klingel model FS20-KSE
define FileLog_Klingel FileLog ./log/Klingel-%m.log Klingel
attr FileLog_Klingel logtype text
attr FileLog_Klingel room Diagramm.log
#
define Klingel_on notify Klingel:.* {FBCall("**9")}
und hier die Ergänzung in der 99_Utill.pm:
sub
FBCall ($)
{
my ($callnr) = @_;
$callnr = "ATDT".$callnr."#";
my $ret = "ATD: " . `echo $callnr | nc 127.0.0.1 1011`;
InternalTimer(gettimeofday()+12, "FBHangOn", "", 0);
return;
}
sub FBHangOn ()
{
my $ret = " ATH: " . `echo "ATH" | nc 127.0.0.1 1011`;
$ret =~ s,[\r\n]*,,g;
return;
}
Wäre toll, wenn mir jemand helfen könnte, die Telefone klingeln zu lassen.
Viele Grüße
Harald
Hallo Harald,
ich kann Dir nur sagen, dass es mit folgendem Code
sub FritzBoxCallNr($)
{
my ($callnr) = @_;
$callnr = "ATDT".$callnr."#";
my $ret = "ATD: " . `echo $callnr | nc 127.0.0.1 1011`;
InternalTimer(gettimeofday()+20, "FritzBoxHangOn", "", 0);
return
}
sub FritzBoxHangOn()
{
my $ret = "ATH: " . `echo "ATH" | nc 127.0.0.1 1011` ;
$ret =~ s,[\r\n]*,,g; # remove CR from return-string
return
}
mit dem Aufruf
{FritzBoxCallNr('**9')}
in der Statuszeile auf der Fritz Box 7170 (ohne freetz, Firmware siehe Signatur) funktioniert (bis auf das Telefon 1 (**1), aber das bekomme ich auch noch hin ;-)).
Bin mir auch nie sicher, wann " und wann ' zu verwenden ist (einmal werden Zeichen interpretiert und dann wieder nicht) ...
Gruß PeMue
Hallo PeMue,
vielen Dank für die Antwort.
Genau mit diesen Befehlen habe ich das auch versucht. In fhem.cfg habe ich verbost auf 5 gesetzt. Dann sehe ich im Logfile, daß das Betätigen des Klingeltasters erkannt wird und ein cmd: >{FBCall("**9")}< durchgeführt wird. In der 99_Util.pm ist es wie oben beschrieben eingetragen. In der FB kommt aber anscheinend der Befehl nicht an. Jedenfalls klingeln die Telefone nicht und es wird auch nichts angezeigt.
Wenn es bei Dir ohne Freetz geht, kann es wohl kaum an dem Callmonitor liegen. Das mit den " oder ' oder ` habe ich auch alles ohne Erfolg und erkennbarem Unterschied ausprobiert.
Viele Grüße
Harald
Hallo zusammen,
ich hab's mit folgenden Änderungen in der 99_Util.pm hinbekommen:
sub FritzBoxCallNr($)
{
my ($callnr) = @_;
$callnr = "ATDT".$callnr."#";
my $ret = "ATP3: " . `echo $callnr | nc 127.0.0.1 1011`;
InternalTimer(gettimeofday()+20, "FritzBoxHangOn", "", 0);
return
}
sub FritzBoxHangOn()
{
my $ret = "ATH: " . `echo "ATH" | nc 127.0.0.1 1011` ;
$ret =~ s,[\r\n]*,,g; # remove CR from return-string
return
ATDT = ATtention, Dial, Tonwahl
ATP3 = ATtention, rufendes Telefon, Ruf-Nr. (hier 3)
ATH0 = ATtention, Hangup, 0= auflegen, 1=abnehmen
So klappt es bei mir.
Viele Grüße
Harald
Hallo Harald,
so richtig verstehe ich die Sache noch nicht. Die Betriebssystemfunktion wird mit `<befehl>` ausgeführt (die Alternative dazu wäre qx(<befehl>)).
In Deiner Version ist <befehl> folgendes:
my ($callnr) = @_;
$callnr = "ATDT".$callnr."#";
<befehl>=echo $callnr | nc 127.0.0.1 1011 z.B. echo ATDT**9# | nc 127.0.0.1 1011
Wenn man den <befehl> so auf der Konsole eingibt, müsste die Fritz Box etwas tun und danach ein ok melden.
In meinem Fall:
my ($callnr) = @_;
$callnr = "ATDT".$callnr."#";
<befehl>=echo $callnr | nc 127.0.0.1 1011
also exakt dasselbe.
Das ATP3 ist nur die Info für das zurückkommende ok, um zu wissen, was gerade passiert ist (was aber m.E. nirgends ausgewertet wird, weil die Variable nicht nach oben übergeben wird). Daher verstehe ich nicht, dass diese Änderung bei Dir funktioniert, aber man muss eben nicht immer alles verstehen ...
Was ich auch nicht verstehe, ist, dass beim HangOn das Return entfernt wird, aber beim Call nicht (aber vielleicht soll das Ganze am Ende in einer Zeile stehen).
Gruß PeMue
Hallo PeMue,
soweit ich weiß sagt der Befehl ATP3 der Fritzbox, das der Anruf vom Telefon 3 kommt. Ich habe das auf der Telnetkonsole ausprobiert. Sende ich echo "ATD**9"....., klingeln die Telefone bei mir nicht. Benutze ich aber echo "ATP3 ATD**9"...., dann melden sich alle Telefone.
Das gleiche habe ich früher schon so beobachtet, als ich das Klingeln über den Papierendekontakt eines Parallel/USB-Wandler realisiert hatte.
Warum das CR bei ATH0 abgeschnitten wird, weiß ich auch nicht. Ich habe den Code hier aus dem Forum "stibitzt" und für mich angepasst.
So weiß ich auch nicht, warum das # am Ende von ATD**9 steht. Ich weiß nur, dass beim Wählen einer Telefon-Nr. übers Internet das # sagt, die Nr. ist zu Ende, du kannst sie senden. Das verkürzt die Zeit, bis die Ruf-Nr. übermittelt wird. Ob das für den internen Ruf auch erforderlich ist, ist mir nicht bekannt.
Viele Grüße
Harald
Nachtrag: Ich habe meine alten Unterlagen über Modems und deren AT-Befehle durchsucht. Der Befehl ATPx scheint kein offizieller Befehl zu sein. Die Fritzbox versteht ihn aber, wie man das im IP-Phone-Forum unter Fritzbox und Türklingel, u.a. Seite 4-6 finden kann.
Hallo Harald,
Du meinst bestimmt diesen (//www.ip-phone-forum.de/showthread.php?t=174781&page=4&p=1452278&viewfull=1#post1452278) Thread, oder?
Meiner Ansicht nach müsste, wenn Du ATP3 mitsenden willst, der Befehl von
my $ret = "ATP3: " . `echo $callnr | nc 127.0.0.1 1011`;
auf
my $ret = `"ATP3: " . echo $callnr | nc 127.0.0.1 1011`;
geändert werden, damit ATP3 auch mitgesendet wird (entweder über das Verschieben des Hochkommas oder über die Variable $callnr.
Wenn ich echo ATP3 ATDT**9# | nc 127.0.0.1 1011 auf der Konsole eingebe, kommt zweimal ok und die Telefone klingeln, bei echo ATDT**9# | nc 127.0.0.1 1011 kommt nur einmal ok und sie klingeln auch (Fritz Box 7170). Ein ggf. vorhandener : stört nicht.
Gruß PeMue
Hallo PeMue,
genau diesen Tread meinte ich. Ich habe damals auch mit den Befehlen rum experimentiert. Zwischenzeitlich hatte ich ein FritzFon vergewaltigt, mittels eines Relaiskontaktes eine Nummer zu wählen (über Umweg die **9), die dann alle Telefone klingen ließ.
Jetzt soll es mit FHEM realisiert werden und es läuft ja auch. MasterBox, an der die Telefone hängen, ist die 6360, Slave die 7170, auf der auch FHEM auf dem USB-Stick läuft.
Es kann schon sein, dass Du recht hast. Bei mir kommen auch 2 OK, aber es klingelt - ohne ATP3 eben nicht. Der Telefon-Damon scheint es zu schlucken.
Außerdem erschließt sich mir nicht, was "my $ret = " bedeutet. Ich verstehe hoffentlich richtig, dass $ret eine Variable ist. Aber wo wird diese gefüllt und wo gelesen? Meine Perlkenntnisse sind sehr rudimentär. Das hat nur sehr wenig mit Assembler oder Basic zu tun. Damit kannte ich mich früher recht gut aus - aber Perl?
Hallo Harald,
ich muss Dir recht geben. Zumindest die Fritz Box 7170 braucht zuerst ein Kommando, von welchem Telefon sie anrufen soll (ATP<x>), sonst geht die Sache nur ab und zu. Das war auch der Grund, warum mein Telefon 1 nicht tat.
Anbei mein Code:
#------------------------------------------------------------------------------
# FritzBoxCallNr:
# calls a number from Fritz Box
#
# direct call in fhem console:
# {FritzBoxCallNr('**9')}
#
# programming/source:
# http://www.fhemwiki.de/wiki/FritzBox_Temperaturalarm_via_Telefon
#
# bugs/improvements:
# - Why is $ret not returned to calling routine?
#------------------------------------------------------------------------------
sub FritzBoxCallNr($)
{
my ($callnr) = @_;
# $callnr = "ATDT".$callnr."#"; # standard, do not use for Fritz Box 7170
$callnr = "ATP2 ATDT".$callnr."#"; # alternative for Fritz Box 7170 (uses phone 2)
my $ret = "ATD: " . `echo $callnr | nc 127.0.0.1 1011`;
# explanation of next line:
# =~ binds $ret to regular expression
# s ... search
# [\r\n]* ... all CR, LF
# ,, ... replace by nothing
# g ... global replace
$ret =~ s,[\r\n]*,,g; # remove CR from return string
InternalTimer(gettimeofday()+20, "FritzBoxHangOn", "", 0);
return;
}
sub FritzBoxHangOn()
{
my $ret = "ATH: " . `echo "ATH0" | nc 127.0.0.1 1011`;
$ret =~ s,[\r\n]*,,g; # remove CR from return string
return;
}
#----- FritzBoxCallNr ---------------------------------------------------------
Auch ein Aufruf der Routine über ein FS20 Schalter funktioniert.
Gruß PeMue
Danke PeMue für die genaue Auflistung und Erklärungen. Ich glaube, jetzt habe ich die Funktion der einzelnen Zeilen einigermaßen verstanden. Und ja, bei mir klingeln jetzt auch die Telefone wie gewünscht, wenn die Türklingel betätigt wird, nachdem ich die Schaltung des FS20 KSE so geändert habe, wie hier im Forum (//forum.fhem.de/index.php?t=msg&goto=53753&rid=1079&srch=fs20+kse#msg_53753) beschrieben wurde.
Für einen Experten sind solche Befehlsfolgen sonnenklar. Wenn man diese aber als Anfänger sieht, steht man oft da, wie der Ochs' vor'm neuen Tor, wenn keine Kommentare vorhanden sind. Ich habe damals beim Programmieren (nur für innerbetriebliche Zwecke) sehr viele Erklärungen eingefügt, damit ich und meine Kollegen auch nach längerer Zeit noch nachvollziehen konnten, was bewirkt werden sollte.
Vielen Dank nochmal und schönes Wochenende
Harald
PS: Wird der Wert der Variablen $ret an die aufrufende Prozedur bei der Rückkehr aus der Subroutine zurückgegeben oder was ist das für ein Ausdruck?
Hallo, als Anfänger brauch ich ev doch noch was Unterstützung.
Ich hab den Thread hier rauf und runtergelesen und per copy past den code auch kopiert. So hab ich nun nach und nach mein FHEM aufgebaut und das meiste auch verstanden. Damit ich hinterher noch weiß wo ich welche Infos her hab kopier ich mir auhc immer den Link in die Erklärungen rein, das hilft mir als Anfänger auch einige Tage später noch zurechtzukommen
meine fhem.cfg:
###################################################
## Türklingel
###################################################
#http://forum.fhem.de/index.php/topic,12959.msg79179.html#msg79179
define Klingel FS20 f322 00
attr Klingel model fs20kse
attr Klingel room FS20
attr Klingel showtime 1
define FileLog_Klingel FileLog ./log/Klingel-%Y.log Klingel
attr FileLog_Klingel logtype text
attr FileLog_Klingel room FS20
define Klingel_on notify Klingel:.* {FBCall("**9")}
1. die fs20kse Klingel sendet einwandfrei und ich bekomme auch einen Eintrag in der Gruppe FS20
Klingel 2013-11-10 09:53:27
Mein Logfile schreibt nun folgendes:
2013.11.10 09:53:26 3: Klingel_on return value: Undefined subroutine &main::FBCall called at (eval 1146) line 1.
2013.11.10 09:53:27 3: CUL_0: Unknown code 810b04xx0101a001f322010000, help me!
2013.11.10 09:53:27 3: Klingel_on return value: Undefined subroutine &main::FBCall called at (eval 1147) line 1.
2013.11.10 09:53:27 3: CUL_0: Unknown code 810b04xx0101a001f322010000, help me!
Muß ich noch was im Fritz.box Menue einstellen?