Anrufsignalisierung per PI & LED

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    wie im Projektmachbarkeitsthread schon beschrieben, möchte ich bei einem Anruf auf meinem Festnetztelefon meine LED-Schreibtischbeleuchtung als Signalisierung blinken lassen.

    dbv wies mich auf ein ähnliches Projekt hin. Allerdings werden bei mir, nach Anpassung des Codes, die LED nur bei Beginn des Klingelns geschaltet, das IF-Statement wird also anscheinend nicht durchlaufend ausgewertet.
    Zur Ansteuerung der LED-nutze ich den pi-blaster von sarfata, da ich diesen auch schon woanders verwendet habe und um saubere Fades durchzuführen.
    Es folgt mein krümeliger Versuch, den ursprünglichen Code abzuändern.

    TL,DR: Warum wird die innnere if-Schleife bei einem Anruf nur einmal ausgeführt?


  • Von pi-blaster hab ich leider keinen Dunst - aber hab das ganze mal ohne Fritzbox etwas dirty nachgebaut, indem ich das schalten des GPIO manuell über das virtuelle filesys /sys/class/gpio/ verwende.

    Hab den Code nur minimal verändert, eben ein bisschen python-konformer gestaltet sowie ne Möglichkeit gegeben die while sauber zu beenden usw.

    Das dient aber auch nur zur Veranschaulichung - da ich keine Fritzbox mit Phone hab kann ich das leider nicht genauer testen was genau passiert bzw wie oft edata überhaupt etwas enthällt
    Die Ausgabe sieht wie folgt aus:


    Es sollte aber wenn möglich anstatt os.system lieber subprocess.call verwendet werden, worauf ich aber jetzt aus "einfacher zu verstehen"-Gründen verzichtet hab.
    (was der Unterschied is wird zB > hier < erklärt)

  • Danke meigrafd!

    Leider funktioniert es immer noch nicht recht. Dein Code funktioniert, allerdings klappt genau das Gleiche mit telnet.read_until(...) anstelle deine vorgegebenen Eventstrings nicht.
    Das Telnetlog zur Fritzbox sieht an der Stelle so aus:

    Code
    20.06.14 18:51:04;RING;0;0123456789;09876543210;SIP0;
    20.06.14 18:51:06;DISCONNECT;0;0;


    Ich habe das Gefühl, das Telnet.read_until(...) wartet, bis ein Event existiert und nicht fortlaufend ausgeführt wird. Leider fehlen mir die Programmierkentnisse, um das Problem zu beseitigen.
    Kann mir jemand von Euch helfen?

    Einmal editiert, zuletzt von xjazzor (20. Juni 2014 um 18:55)

  • Hm, ich hab das jetzt mal versucht zu debuggen ( aber eben ohne Fritzbox über einen kleinen Trick ) und hab das wie folgt gemacht:
    (siehe Spoiler)

    Spoiler anzeigen


    Zunächst müssen wir temporär (kann nach dem Test wieder deinstalliert werden) einen Dienst installieren der uns ein Script ausführt sobald eine Verbindung auf einem bestimmten Port aufgebaut wird:

    Code
    apt-get install xinetd

    Temporäres Script /tmp/fritz.sh mit folgendem Inhalt erstellen:

    Bash
    #!/bin/bash
    /bin/echo "21.06.14 16:25:00;RING;0;0123456789;09876543210;SIP0;"

    Script ausführbar machen:

    Code
    chmod +x /tmp/fritz.sh

    Sicherstellen das der Port den wir hierfür temporär auf dem PI, verwenden wollen noch nicht belegt ist:

    Code
    grep 1012 /etc/services

    Keine Ausgabe? gut!

    Jetzt noch einen Port und Servicename festlegen:

    Code
    nano /etc/services

    Dort bis nach ganz unten scrollen (STRG+v gedrückt halten bis nix mehr geht) und folgendes einfügen:

    Code
    fritztest       1012/tcp                        # fritzbox blinkcall test, delete when finished

    Nun noch eine Konfigurationsdatei für diesen Service in /etc/xinetd.d erstellen, namentlich bietet sich für das File fritz an ;) nano /etc/xinetd.d/fritz

    Jetzt starten wir den xinetd Dienst neu damit die neue Konfigurationsdatei beachtet wird:

    Code
    /etc/init.d/xinetd restart


    Wenn man nun eine Telnetverbindung (zB mit PuTTY) auf die IP des RaspberryPI's und Port 1012 herstellt, kriegt man bei jeder Verbindung die echo Zeile aus dem Script /tmp/fritz.sh angezeigt. Man kann das auch über die RaspberryPI Konsole testen:

    Code
    nc localhost 1012

    Soweit sogut...

    Nun mein Script mit den Telnet Zeilen ergänzen:

    Und ausführen:

    Tja, wieso er nun einfach zum "except EOFError" springt ist echt eine gute Frage... Unser fritztest Service ist auf jedenfall noch am laufen...

    Der nächste Test war /tmp/fritz.sh um ein "sleep 10" zu erweitern, weil ich vermutet hab "oke, das beendet sich warscheinlich und deshalb die Meldung..":

    Bash
    #!/bin/bash
    /bin/echo "21.06.14 16:25:00;RING;0;0123456789;09876543210;SIP0;"
    sleep 10

    Damit beendet sich das Python Script nicht sofort aber dann eben nach 10 Sekunden ... Also auch nicht das was wir wollen :(

    :denker: :s da muss ich jetzt erst noch ein bisschen drüber nachdenken woran das liegt - bin noch nicht sooo fit was python betrifft... Aber vielleicht kann das ja nun jemand anderes debuggen und helfen :huh:


    //EDIT:

    Spoiler anzeigen


    Das nächste was ich gemacht hab ist das python Script etwas zu verändern und tn einfach in die while rein zu setzen - und dann dreht er sich tatsächlich immer im Kreis, allerdings weiß ich nun nicht was passiert wenn der Anruf aufhört :s

    Ausgabe:


    //EDIT2:

    Spoiler anzeigen


    So, nun war meine Vermutung das dieses "DISCONNECT" bedeutet das der Anrufer aufgelegt hat und es dann ja aufhören kann zu blinken?

    Also /tmp/fritz.sh nochmals verändert und die DISCONNECT Zeile eingefügt:

    Bash
    #!/bin/bash
    /bin/echo "21.06.14 16:25:00;RING;0;0123456789;09876543210;SIP0;"
    /bin/echo "21.06.14 16:25:06;DISCONNECT;0;0;"

    So jetzt aber das Problem dass das Python Script beim print( edata ) die DISCONNECT Zeile niemalsnie anzeigt - nu bin ich baff :(

  • meigrafd: Danke für deine Mühen, auch wenn es (noch) nicht klappt. :)
    Ich habe nochmal in die Dokumentation von python gesdchaut, und read_until wartet wohl wirklich bis sich eine Änderung ergibt. Habe gerade noch eine Idee gehabt, werde das später mal testen.

  • kleines Update: Habe heute morgen herausgefunden, dass sich das Problem mit Threads in den Griff bekommen lässt. Habe aber nur quick n' dirty getestet. Werde die Tage mal den Code polieren und Euch dann hier zeigen.

  • Wie im letzten Beitrag schon beschrieben, habe ich das Problem mit Threads in den Griff bekommen.
    Meine LEDs blinken nun bei einem Anruf von mir und meiner Frau grün, bei anderen Leuten rot ;)

    Die Unterscheidung erfolgt anhand einer kleinen Zusatzdatei, genannt Anrufer.list, deren Aufbau wie folgt ist:

    Code
    123456, John, 00FF00
    987654, Jane, FF0000



    Der restliche Code läuft per Cron als python Script und folgt unten. Wird sicher nochmal ausgebaut, aber so gibt es für Andere schonmal Rückmeldungen, falls es sie interessiert :)

    Einmal editiert, zuletzt von xjazzor (25. Juni 2014 um 21:16)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!