Also.. wir wollen den Callmonitor aus freetz verwenden, um Telefoniebenachrichtigungen der Fritz!Box ans XBMC zu schicken.
[infobox]Voraussetzungen:
funktionierende Freetz-Firmware auf der Fritzbox, die den Callmonitor und curl enthält. Der Callmonitor sollte laufen und bereits grundlegend konfiguriert sein (Rückwärtssuche etc.).
Grundlegende Kenntnisse im Umgang mit einem Terminal
Ich werde im Folgenden nur den Editor vi verwenden. Es wird sehr helfen, sich vorher mit den grundlegenden Befehlen vertraut zu machen.
Die freetz-Konfigurationsoberfläche befindet sich auf http://fritz.box:81 [/infobox]
Schritt 1: Telnet auf der Fritzbox aktivieren
Telefoncode: #96*7*
oder
Freetz-Webinterface -> Status -> Dienste -> telnetd -> start
Schritt 2: Konsole auf der Fritzbox öffnen
Auf Unixartigen Betriebssystemen im Terminal
telnet root@fritz.box
Auf Windows kann z.B. Putty verwendet werden. Host Name: fritz.box; Connection type: telnet; Open
Beim ersten Login empfiehlt es sich das root-Passwort (default: freetz) zu ändern. passwd verwenden.
Schritt 3: Ins Callmonitor-Arbeitsverzeichnis wechseln
cd /var/tmp/flash/callmonitor/
Hier muss ein Verzeichnis "actions.local.d" angelegt werden, um shell-Skripte als Aktionen bei Anrufen verwenden zu können:
mkdir actions.local.d
und in das Verzeichnis wechseln
cd actions.local.d
Schritt 4: Das Callmonitor-Script anlegen
vi <beliebiger name>.sh
wobei <beliebiger name> alles mögliche sein kann. Bei mir heißt das Ganze notifications.sh
Hier kommen jetzt die ganzen Aktionen rein, die ausgeführt werden können.
Es gibt verschiedene Methoden, die den anzuzeigenden Text und die Anzeigedauer anhand von Callmonitor-Aktionen festlegen. Danach wird send_request aufgerufen, um das Paket ans XBMC (und/oder andere Geräte) zu schicken. in REQUEST steht am Ende die JSON-RPC-Anweisung, die am Ende mit curl abgeschickt wird. (hier kann man natürlich alles mögliche ans XBMC schicken.. http://wiki.xbmc.org/index.php?title=JSON-RPC_API/v6)
[expander]
set TITLE
set TEXT
set TIMEOUT
set ID
set UID
send_request() { REQUEST="{\"id\":\"$UID\",\"jsonrpc\":\"2.0\",\"method\":\"GUI.ShowNotification\",\"params\":{\"title\":\"${TITLE}\",\"message\":\"${TEXT}\",\"displaytime\":20000}}"
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d "$REQUEST" http://openelec.fritz.box/jsonrpc
}
# Eingehender Anruf
incoming() {
TITLE="Eingehender Anruf"
TEXT="$SOURCE_NAME ($SOURCE)"
TIMEOUT=20
UID="$SOURCE"
send_request
}
# Ausgehender Anruf
outgoing() {
TITLE="Ausgehender Anruf"
TEXT="$DEST_NAME ($DEST)"
TIMEOUT=20
UID="$DEST"
send_request
}
# Verbindung hergestellt
connect_in() {
TITLE="Verbunden"
TEXT="$SOURCE_NAME ($SOURCE)"
TIMEOUT=5
UID="$SOURCE"
send_request
}
connect_out() {
TITLE="Verbunden"
TEXT="$DEST_NAME ($DEST)"
TIMEOUT=5
UID="$DEST"
send_request
}
# Verbindung getrennt
disconnected() {
TITLE="Anruf beendet"
TEXT="Anrufdauer: $(f_duration $DURATION)"
TIMEOUT=10
send_request
}
# Eingehender Anruf abgebrochen (aufgelegt?)
incoming_canceled() {
TITLE="Anrufer hat aufgelegt"
TEXT="$SOURCE_NAME ($SOURCE)"
TIMEOUT=20
UID="$SOURCE"
send_request
}
# Ausgehender Anruf abgebrochen (aufgelegt?)
outgoing_canceled() {
TITLE="Anruf abgebrochen"
TEXT="$DEST_NAME ($DEST)"
TIMEOUT=5
UID="$DEST"
send_request
}
Alles anzeigen
[/expander]
Welche Variablen verwendet werden können und was die genau enthalten ist in der Callmonitor-Dokumentation auffindbar.
Die Adresse eures XBMC im Netzwerk und ggf. auch der Port muss vermutlich angepasst werden. Bei mir ist das http://openelec.fritz.box. Es geht aber genauso eine feste IP (http://xxx.xxx.xxx)Port kann über :<Portnummer> hinter der Adresse angegeben werden, also bspw. http://openelec.fritz.box:1234 für Port 1234; http://xxx.xxx.xxx:1234)
Das ganze speichern und vi schließen (":x")
[warnbox]Achtung! Wenn die Konfiguration einen Neustart der Fritzbox überleben soll, muss modsave aufgerufen werden, um die Änderungen aus dem Arbeitsspeicher in den Flash zu schreiben. Auch nach jeder weiteren Änderung, die bestehen bleiben soll, ist modsave erforderlich.[/warnbox]
Schritt 5: Callmonitor Regeln (Listeners) konfigurieren, die angelegten Aktionen zu verwenden.
Freetz-Webinterface öffnen -> Callmonitor -> Regeln
Damit für ein- und ausgehende Anrufe die oben angelegten Funktionen verwendet werden, könnte das z.B. so aussehen:
in:request ^ ^ incoming
out:request ^ ^ outgoing
in:connect ^ ^ connect_in
out:connect ^ ^ connect_out
in:cancel ^ ^ incoming_canceled
out:cancel ^ ^ outgoing_canceled
*:disconnect ^ ^ disconnected
Letztlich könnt ihr das frei konfigurieren. Das schöne mit dem Benachrichtigungsscript im Hintergrund ist, dass man pro Aktion nicht auf eine Zeile festgelegt ist. und wiederkehrenden Code schön kapseln kann.
Klick auf Übernehmen nicht vergessen
Schritt 6: Testen
Ein Testanruf ist recht praktisch, um zu sehen, ob die Einstellungen erfolgreich gewesen sind. Das geht zwar auch mit einem normalen Telefonanruf, doch bekommt man beim Testanruf auch Fehlermeldungen und Statusberichte angezeigt.
Freetz-Webinterface -> Callmonitor -> Testanruf
Hier könnt ihr jetzt für beliebige Ereignisse und beliebige Nummern Testen.
Für in:request würde eine erfolgreiche Konfiguration z.B. diese Ausgabe generieren (und im XBMC eine Benachrichtigung anzeigen):
[expander]
Testanruf von "01234567890" an "09876543210" [in:request]:
including /usr/lib/callmonitor/actions.d/config.sh
including /usr/lib/callmonitor/actions.d/dboxlcd.sh
including /usr/lib/callmonitor/actions.d/dial.sh
including /usr/lib/callmonitor/actions.d/mail.sh
including /usr/lib/callmonitor/actions.d/messages.sh
including /usr/lib/callmonitor/actions.d/musicpal.sh
including /usr/lib/callmonitor/actions.d/rc.sh
including /usr/lib/callmonitor/actions.d/roku.sh
including /usr/lib/callmonitor/actions.d/samsung.sh
including /var/tmp/flash/callmonitor/actions.local.d/notifications.sh
>>> in:request ID=1 TIMESTAMP=23.02.13 18:40 SOURCE=01234567890 DEST=09876543210 EXT=4 DURATION=16 PROVIDER=
wget: server returned error: HTTP/1.1 410 Gone
[0] event detected:
EVENT=in:request
SOURCE='01234567890'
DEST='09876543210'
[0+] detailed event data:
SOURCE_DISP='01234567890'
SOURCE_ENTRY=''
SOURCE_NAME=''
SOURCE_ADDRESS=''
DEST_DISP='09876543210'
DEST_ENTRY=''
DEST_NAME=''
DEST_ADDRESS=''
ID=1
EXT=4
DURATION=16
TIMESTAMP='23.02.13 18:40'
PROVIDER=
[0:2] processing rule 'in:connect' '^' '^' 'connect_in'
[0:2] event 'in:request' does NOT match pattern 'in:connect'
[0:2] FAILED
[0:3] processing rule 'out:connect' '^' '^' 'connect_out'
[0:3] event 'in:request' does NOT match pattern 'out:connect'
[0:3] FAILED
[0:4] processing rule 'in:cancel' '^' '^' 'incoming_canceled'
[0:4] event 'in:request' does NOT match pattern 'in:cancel'
[0:4] FAILED
[0:0] processing rule 'in:request' '^' '^' 'incoming'
[0:0] event 'in:request' matches pattern 'in:request'
[0:0] parameter SOURCE='01234567890' matches pattern '^'
[0:0] parameter DEST='09876543210' matches pattern '^'
[0:0] SUCCEEDED
[0:0] ACTION: 'incoming'
[0:1] processing rule 'out:request' '^' '^' 'outgoing'
[0:1] event 'in:request' does NOT match pattern 'out:request'
[0:1] FAILED
[0:6] processing rule '*:disconnect' '^' '^' 'disconnected'
[0:6] event 'in:request' does NOT match pattern '*:disconnect'
[0:6] FAILED
[0:5] processing rule 'out:cancel' '^' '^' 'outgoing_canceled'
[0:5] event 'in:request' does NOT match pattern 'out:cancel'
[0:5] FAILED
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0> POST /jsonrpc HTTP/1.1
> User-Agent: curl/7.21.7 (mipsel-unknown-linux-gnu) libcurl/7.21.7 OpenSSL/0.9.8r
> Host: openelec.fritz.box
> Accept: application/json
> Content-type: application/json
> Content-Length: 157
>
} [data not shown]
< HTTP/1.1 200 OK
< Content-Length: 50
< Content-Type: application/json
< Date: Sat, 23 Feb 2013 17:41:02 GMT
<
{ [data not shown]
100 207 100 50 100 157 225 707 --:--:-- --:--:-- --:--:-- 2180
{"id":"01234567890","jsonrpc":"2.0","result":"OK"}1
Alles anzeigen
Wie man sieht gab es ein OK zurück Winderbar.Die vielen FAILEDs werden nur angezeigt, weil die entsprechenden Regeln nicht erfüllt werden, das ist also normal.[/expander]
Wenn noch Fragen offen sind, einfach melden!