Auf die Gefahr hin, mich unbeliebt zu machen, wenn ich einen alten Thread wieder ausgrabe
. Ich möchte gerne meine Lösung zur Türklingel vorstellen, die seit längerer Zeit bei mir auf einer FB 7270 und 7490 stabil läuft.
Dafür ist kein Drucker-Adapter oder Ähnliches notwendig. Der Code, der in die debug.cfg eingefügt werden muss, ist aber komplizierter.
In meinem Fall hat die Türsprechanlage ein Relais, welches für 2 Sekunden durchschaltet, wenn geklingelt wird. Die vorgestellte Lösung sollte aber auch mit einem normalen Klingeltaster funktionieren.
Die beiden Klingelleitungen habe ich einfach an den Port Fon2 der Fritzbox angeschlossen, ohne jegliche Zusatzhardware.
Kernidee ist nun, diesen Port per Kommando "dtrace" zu überwachen (Skript siehe unten). Damit das funktioniert, muss in der FB-Oberfläche ein
Analogtelefon am Port Fon2 eingerichtet werden. Dafür eine Rufnummer ausdenken, die es nicht gibt (ich habe - quasi per Zufall - 587125897 gewählt). Bei den Eigenschaften einstellen, dass nur auf diese Nummer reagiert werden soll. Siehe Screenshots:
Außerdem ist Folgendes in der debug.cfg einzufügen (nvi /var/flash/debug.cfg):
Code:
# Datei klingel.sh erstellen
cat > /var/tmp/klingel.sh <<HERE
#!/bin/sh
TTY=4
oldDate=0
# Prozess vor Beendigung schuetzen
trap '' SIGHUP
# Input aus Pseudo-TTY lesen (kommt von dtrace)
cat /dev/ptyp\${TTY} | while read -r line
do
case \${line} in
# die imaginäre Rufnummer
*"587125897"*)
newDate=\$(date +%s)
let diff=\$newDate-\$oldDate
# mindestens 15 Sekunden Abstand zwischen Calls
[[ \$diff -lt 15 ]] && continue
oldDate=\$newDate
# warten, bis frei
while echo "ATP2 ATD**9" | nc 127.0.0.1 1011 | grep ERROR ; do usleep 100000 ; done
sleep 5
while echo "ATP2 ATH0" | nc 127.0.0.1 1011 | grep ERROR ; do usleep 100000 ; done
date >> /var/tmp/klingelliste.txt
;;
esac
done
HERE
# Datei klingeldtrace.sh erstellen
cat > /var/tmp/klingeldtrace.sh <<HERE
#!/bin/sh
TTY=4
TTY2=5
# Prozess vor Beendigung schuetzen
trap '' SIGHUP
while true
do
# dtrace mit Input aus Pseudo-TTY fuettern, sonst funktioniert es nicht
# Ausgabe ebenfalls auf Pseudo-TTY umleiten
dtrace -c5 -s < /dev/ptyp\${TTY2}
done > /dev/ttyp\${TTY}
HERE
# Startsequenz fuer die Klingel-Skripte
cd /var/tmp
chmod 755 klingel.sh
chmod 755 klingeldtrace.sh
/var/tmp/klingel.sh &
sleep 5
/var/tmp/klingeldtrace.sh &
cd /
Dies erstellt die beiden Skripte /var/tmp/klingel.sh und /var/tmp/klingeldtrace.sh und startet sie beim Booten der FB. Sobald geklingelt wird (aus FB-Sicht wird der Hörer abgehoben), emittiert dtrace einige Zeilen, die auch die vorher definierte Rufnummer enthält. Wenn diese auftaucht, wird der AT-Befehl "ATP2 ATD**9" ausgelöst - ein Internruf auf alle Telefone. Soll ein spezielles Telefon angerufen werden, ist der Befehl entsprechend zu ändern, z.B. **1 statt **9.
Zu Dokumentationszwecken wird bei jedem Klingeln Datum und Zeit in die Datei /var/tmp/klingelliste.txt geschrieben.
Für Interessierte - es gab einige Einschränkungen, die ein paar Nerven gekostet haben:
1. dtrace braucht ein Terminal als Standardeingabe/STDIN, sonst funktioniert es nicht. Lösung: Standardeingabe auf Pseudo-Terminal setzen.
2. Pufferung der Ausgabe von dtrace. Da dtrace nicht regelmäßig die Ausgabe "flusht", erfolgt die Datenausgabe u.U. verzögert, wenn die Ausgabe von einem Skript weiterverarbeitet wird. Lösung hier: Ausgabe auf ein weiteres Pseudo-Terminal umleiten und dann in einem separaten Skript verarbeiten.
3. Mit "trap '' SIGHUP" in den einzelnen Skripten wird verhindert, dass das Skript gestoppt wird, sobald die debug.cfg komplett ausgeführt wurde. "nohup" funktioniert nicht.
4. Wenn die Fon2-Leitung noch belegt ist (d.h. während die Klingeltaste noch gedrückt ist), kann kein Internruf ausgelöst werden. Daher versucht obiges Skript den Internruf solange auszulösen, bis er erfolgreich ist.
Das Ganze wurde
hier auch schon mal diskutiert, aber irgendwie habe ich es damals versäumt, eine "Komplettlösung" zu posten.