CallerID per lcdproc ausgeben

  • Um ohne Konflikte mit VDR eine Anruferidentifizierung über dessen LCD/VFD zu realisieren, habe ich mir folgendes überlegt:


    Auf Anruf warten ("CIDLOG:" sind hingegen verpasste):

    Zitat

    nc 192.168.2.1 3333|grep "^CID:"

    (Beispiel für den ncidd einer Vodafone Easybox 802)


    Rufnummer herauspräparieren und ins Handy-übliche Format bringen (um das SIM-Telefonbuch als Liste bekannter Anrufer recyclen zu können):

    Zitat

    cut -d"*" -f 9|sed s/^00/+/|sed s/^0/\+49/


    An LCDd übergeben und zum Ende der 30-sekündigen Anzeige Verbindung abbauen:

    Zitat

    echo -e 'hello\nscreen_add CallerID\nscreen_set CallerID -priority alert -timeout 240\nwidget_add CallerID Number scroller\nwidget_add CallerID Name scroller\nwidget_set CallerID Number 1 1 20 1 m 2 "+12345678901234567890 "\nwidget_set CallerID Name 1 2 20 2 m 2 "Firstname Middlename Lastname "'|nc localhost 13666 -w 14


    Nun fehlen mir noch ein paar "Zwischenstücke":

    • An die erste Befehlszeile kann nichts weiter per Pipe angehängt werden (nicht einmal z.B. testweise |more) - wahrscheinlich wegen des weiter horchenden netcat: Es gibt doch sicher ein Tool, das die Ausgabe zeilenweise aufgesplittet an Pipes weiterreicht?
    • Bessere Lösungen als "grep 01712345 Callers.txt|cut -d";" -f 2" zum Lookup des Namens in einer CSV-Tabelle?
    • Automatisches Verlassen der netcat-Verbindung bei Empfang von "ignore CallerID" durch Senden von "bye\n" oder durch Beenden der telnet-Session (statt nach experimentell bestimmtem Timeout)

    Ich dokumentiere das hier auch, weil sich auf gleichem Wege zahlreiche Daten (Wetter, Titel, News, Domotik etc.) recht einfach aufs LCD/VFD bringen lassen sollten, und danke schon vorab für Eure Hilfe zu den offenen Punkten.

  • Zitat

    Originally posted by TEN
    Um ohne Konflikte mit VDR eine Anruferidentifizierung über dessen LCD/VFD zu realisieren, habe ich mir folgendes überlegt:


    Auf Anruf warten [...,] Rufnummer herauspräparieren und ins Handy-übliche Format bringen (um das SIM-Telefonbuch als Liste bekannter Anrufer recyclen zu können) [...] fehlen mir noch ein paar "Zwischenstücke":

    • An die erste Befehlszeile kann nichts weiter per Pipe angehängt werden (nicht einmal z.B. testweise |more) - wahrscheinlich wegen des weiter horchenden netcat: Es gibt doch sicher ein Tool, das die Ausgabe zeilenweise aufgesplittet an Pipes weiterreicht?

    Musste ich's also selbst ausknobeln: :rolleyes: Wir lassen grep einfach nach 1 Zeile nicht mehr weiterlesen...

    Zitat

    nc 192.168.2.1 3333|grep -m 1 ^CID:|cut -d"*" -f 9|sed s/^00/+/|sed s/^0/\+49/

    ...und dann ab nach lcdproc damit (da echo wohl nicht den Standard Input in seine Ausgabe einbauen kann, lassen wir uns diesen von cat zurückgeben):

    Zitat

    nc 192.168.2.1 3333|grep -m 1 ^CID:|cut -d"*" -f 9|sed s/^00/+/|sed s/^0/\+49/|echo -e 'hello\nscreen_add CallerID\nscreen_set CallerID -priority alert -timeout 240\nwidget_add CallerID Number scroller\nwidget_add CallerID Name scroller\nwidget_set CallerID Number 1 1 20 1 m 2 '$(cat -)'\nwidget_set CallerID Name 1 2 20 2 m 2 "'$(grep $(cat -) Callers.txt|cut -d";" -f 2)' "'|nc localhost 13666 -w 14

    Hier kommt noch ein Problem auf:
    Wir können die Zeile mit der Rufnummer zwar z.B. per "tee -" verdoppeln, doch steht sie auch dann nach "cat -" oder auch weiterem "grep -m 1 ^+" etc. nicht mehr im Standard Input für das letzte grep zur Verfügung.

  • Zitat

    echo -e 'hello\nscreen_add CallerID\nscreen_set CallerID -priority alert -timeout 240\nwidget_add CallerID Number scroller\nwidget_add CallerID Name scroller\nwidget_set CallerID Number 1 1 20 1 m 2 "+12345678901234567890 "\nwidget_set CallerID Name 1 2 20 2 m 2 "Firstname Middlename Lastname "'|nc localhost 13666 -w 14

    Mit "hello" loggst du dich jedes mal als neuer Client bei LCDproc ein, das macht man normalerweise nicht.
    Wenn die Verbindung automatisch wider geschlossen wird sollte es aber trotzdem gehen, wenn nicht dürfte es irgendwann Probleme geben.


    Normalerweise öffnet man die die Verbindung zu LCDproc nur einmal und ändert dann die "priority" so, dass der Screen nur angezeigt wird, wenn er das auch soll.
    Ob das so aber mit netcat zu bewerkstelligen ist kann ich nicht sagen.

    Gruss
    SHF


  • Danke für die Unterstützung!


    In meinem Anwendungfall kann es vorkommen, dass nur alle paar Stunden für ca. 30 Sekunden ein Anrufer angezeigt werden soll, daher die jedes Mal neu aufgebaute Verbindung.


    Die Nachrichten sind als "alert" definiert, um während dieser kurzen Zeit VDR-Ausgaben von "normaler" Priorität zu überlagern.
    Lesbarer erhält lcdproc zum automatischen Verwerfen nach 30 Sekunden:


    ...wobei die einzige Datei eine Callers.txt nach folgendem Muster sein soll:

    Zitat

    +498003301000;Telekom
    +12345678901234567890;Firstname Middlename Lastname
    +49112;Flitze Feuerzahn


    Ich bin nun am Ende auf die Schwierigkeit gestoßen, daß im Ausgabestring für echo der Standard Input aus der Pipe zweimal verwendet werden muß (nämlich auch zum Lookup des Namens) - es in Bash aber keine Möglichkeit zu geben scheint, diesen z.B. per "tee -" auf zwei verschiedene Pipes aufzusplitten, und mir noch kein guter Weg eingefallen ist, die Verwendung von Pipes mit der Ablage in einer (Umgebungs-)Variablen zu vereinbaren.


    Eine Idee wäre daher, ihn nach Art von
    |perl -e '$caller=<>;exec "echo $caller"'
    zusammengebaut auszugeben, doch konnte ich es noch nicht hinbekommen, u.a. Variablenname und \n so zu escapen, daß sie ihre richtige Verwendung innerhalb von Perl finden.


    Der Grund für die Verwendung möglichst rudimentärer Bordmittel ist, dass der Prozess auch auf einem lüfterlosen Steckdosencomputerchen laufen können soll.

  • Der einfachste Weg könnte auch sed sein:

    Zitat

    echo +12345678901234567890|grep $(cat -) Callers.txt|sed 's/\([^;*]\);\(.*\)/\1/'


    Der Trick ist, dass die im Standard Output "verbrauchte" Nummer ja aus der CSV-Datei gleich als \1 wiedergewonnen werden kann.
    Allerdings funktioniert der reguläre Ausdruck noch nicht so, daß in \2 lediglich der Name (Substring nach dem Strichpunkt) statt nochmals der ganzen Zeile aus Callers.txt steht. Hat dazu jemand einen Vorschlag?


    Für unbekannte Rufnummern muß ich mir auch noch etwas einfallen lassen, damit diese nicht beim grep gegen Callers.txt verloren gehen.

  • Zitat

    In meinem Anwendungfall kann es vorkommen, dass nur alle paar Stunden für ca. 30 Sekunden ein Anrufer angezeigt werden soll, daher die jedes Mal neu aufgebaute Verbindung.

    Das dachte ich mir schon, ich hatte nur Bedenken, weil die Verbindung nicht wieder geschlossen wird. Wenn jedes mal eine neue, zusätzliche Verbindung geöffnet würde ist es nur eine Frage der Zeit, bis es kracht.


    Da kann ich aber Entwarnung geben, denke ich. Ich hab es eben mal schnell probiert und sobald der Netcat-Prozess geschlossen wir verschwindet auch die Anzeige, auch wenn sie länger angezeigt werden sollte, die Verbindung dürfte also korrekt getrennt sein.


    Zitat

    Musste ich's also selbst ausknobeln: Augen rollen Wir lassen grep einfach nach 1 Zeile nicht mehr weiterlesen...

    Bei mir klappt das nicht.
    Da würde nur eine einzige Anzeige kommen. Ich gehe aber mal davon aus, dass der Befehl weiter laufen soll bis er beendet wird.
    (Der Einfachheit hab ich das mal mit "tail -f" als Datenquelle probiert, das sollte aber egal sein.)

    Gruss
    SHF


  • Hast recht, beim zweiten Anruf wird alles inkl. netcat beendet.
    Dachte es beendet sich nur nach rechts die Pipe, aber so wäre das ein weiterer Stolperstein zuviel.
    Hilft dann wohl doch nur, alles in ein Perl-Skript zu packen... wobei mit der Idee, ncid und lcdproc zu verknubbeln, natürlich auch schon jemand früher dran war: http://ncid.sourceforge.net/ (bzw. weil die Download-Links von dort schon nicht mehr gehen: http://sourceforge.net/projects/ncid/, http://sourceforge.net/projects/ncid/files/lcdncid/0.8/).
    Leider ist der zweite Satz (aus der README) schon wieder Grund genug, doch etwas eigenes zu stricken oder diesen Ansatz eben umzubauen:

    Zitat

    LCDncid uses LCDproc to display Caller ID. It requires a 4-line LCD display.

  • Ich glaub, ich hab da noch eine Idee wie es doch mit bash gehen könnte. Ich hoffe ich hab am WE mal Zeit das zu probieren.

    Gruss
    SHF


  • Ich hab die Tage mal etwas gebastelt, die Seite zu LCDproc klappt schon, aber beim Einlesen von der Pipe hakt es noch.


    Das ist noch immer die Geschichte mit "grep -m 1". Ursache scheint das "echo" zu sein, was weiter hinten kommt. Ich bin momentan etwas Ratlos, wie man das Problem an besten umgeht.


    Der Versuch mit einem zweiten Fifo und einlesen einer Variablen mit "read" funktioniert bislang auch zufridenstellend.


    Ich hänge den Versuch mal an, dann kannst du auch weiter Probieren.

    Dateien

    Gruss
    SHF


  • Frohes neues Jahr!


    Ich hab da heute noch etwas gebastelt und die Version mit "read" hin bekommen. Mit "tail -f" als Eingabe läuft es, ich denke es sollte also gehen.
    Die Eingabe ist jetzt übrigens eine Variabele, das Problem mit "tee" sollte also auch gelöst sein.

    Dateien

    Gruss
    SHF


  • Zitat

    Clevere Idee mit dem FIFO - frohes neues Jahr und vielen Dank! :]

    Ich hatte schon länger vor mal einen LCDproc-Client in Bash zu schreiben, du warst dann der Anstoss die Sache ins rollen zu bringen.


    Das war bei netcat schon ganz schön tricky, das hat eine ganze Weile gebraucht, bis es ging.
    Warum die Umleitung nur mit "<>fifo" geht, hab ich keine Ahnung. Das Konstrukt hab ich auch sonst noch nie gesehen. Hauptsache ist aber, dass es geht.

    Gruss
    SHF


  • Komme leider erst jetzt zum Testen, erhalte aber keine Ausgabe auf dem LCD am DockStar:

    Die ersten 5 "success" werden gleich ausgegeben, der Rest beim ersten Klingeln (bzw. nach einiger Wartezeit), z.T. noch mit einem weiteren "success" zwischen "listen" und "ignore".


    Ich würde mal vermuten, dass man $FIFO2 erst flushen muß, bevor man in die (Warte-)Schleife geht, um etwaige mit "200 NCID" oder "CIDLOG:" beginnende Zeilen zu ignorieren.

  • Habe es nun mal so gepatched, scheint zu funktionieren:

    Allerdings auch nur für den ersten Anruf, ab dem zweiten wird ausgegeben:

  • So müsste es dauerhaft funktionieren (screen_add erst beim Anruf, da Screen "CallerID" einmal durch Timout "ignored" nicht mehr reaktiviert werden kann) - so fällt das Ganze dann "gracefully" mit lediglich auf der Konsole ausgegebenem "error: huh? Screen already exists" beim screen_add bzw. "huh? Screen already exists" beim screen_set wieder auf die Füsse, auch wenn ein zweiter Anruf noch während der Anzeige des ersten hereinkommt:

    Hinter die Scroller-Strings wurde jeweils noch ein Space gesetzt, damit sie -falls länger als das Display- nicht "aneinanderkleben".


    In /usr/local/etc/lcdproc.conf sollte man (auch bei Anwendung nur des VDR-Plugins selbst, mit dem sich diese Lösung ja das Display teilt) noch GoodBye="" setzen, da sonst eine hartcodierte Meldung im Display stehenbleibt, wenn lcdproc und/oder LCDd mal abschmieren.

  • Code
    echo -e 'screen_add CallerID\nscreen_set CallerID -priority alert -timeout 240' >$FIFO

    In der Zeile hab ich wohl noch versehentlich das "screen_add" drin gelassen.

    Code
    echo -e 'screen_set CallerID -priority alert -timeout 240' >$FIFO

    So sollte die folgende Meldung nicht mehr auftreten.

    Code
    huh? Screen already exists


    Zitat

    Allerdings auch nur für den ersten Anruf, ab dem zweiten wird ausgegeben:

    Da kann ich mir derzeit nicht so recht einen Reim drauf machen.
    Evtl. ist der wird auch der ganze Screen durch den timeout gelöscht, dann sollte es nach der oben vorgeschlagenen Änderung eine Meldung wie "Unknown screen id" geben. in dem Fall müssen die "screen_add" und "widget_add"-Befehle halt in die Schleife.

    Gruss
    SHF


Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!