RPi, Python, Internetradio, MPoD, Interupt

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich habe mir ein kleines Pyhton Programm geschrieben um verschiedene Radioprogramme aus dem Internet
    über meinem Raspberry Pi zu empfangen. Die Senderanzeige erfolgt über ein LCD Display und
    die ganze Bedienung über eine alte Infrarot Fernsteuerung (LIRC).
    Wenn nun die MPod App meines iPads auf die Adresse des RPi’s zugreift, kann ich die über MPC geladenen
    Stationen sehen und verändern.
    Ich würden nun gerne diese Sender-Änderung auch auf dem am RPi angeschlossenen LCD aktualisieren,
    die sich sonst nur über die IR-Fernsteuerung ändert.
    Man könnte z.B. über eine regelmäßige ‚MPC current‘ den laufenden Sender abfragen und ggf. aktualisieren,
    das finde ich aber nicht optimal.
    Der bessere Weg wäre, wenn ich irgendwo abfragen könnte, ob vom MPod/iPad eine MPD/MPC Aktion eingeleitet wird.

    Ich wäre sehr dankbar über eine Idee.

    Grüße,
    Thomas

  • In python-mpd2 [1] gibt es MPDClient.idle([subsystems]). Ich bin python-Anfänger, aber soweit ich das verstanden habe, kann man mit dem Befehl einfach so lange warten, bis sich bei mpd irgendetwas geändert hat, zB der aktuelle Titel, und in weiterer Folge daraufhin etwas machen, zB die Displayanzeige aktualisieren. Das könnte man dann in einer Endlosschleife laufen lassen.

    Oder du machst es dir einfacher und verwendest mpdlcd [2] in Kombination mit lcdproc/LCDd [3]. Dann musst du eigentlich nur noch LCDd konfigurieren (und ihm die Ansteuerung des LCD überlassen), mpdlcd starten und fertig.

    [1] http://pythonhosted.org/python-mpd2/topics/commands.html
    [2] https://pypi.python.org/pypi/mpdlcd/0.4.0
    [3] http://lcdproc.omnipotent.net/

  • Vielen Dank für die Tipps. Ich habe mal einen kleinen Test mit client.send_idle () gemacht:


    Das Ergebnis:


    Wenn man dann nur den [‚player‘] output weiterverarbeitet, kann man gut damit leben.

    Die nächste Frage ist nun, wie ich
    client.send_idle ()
    events = client.fetch_idle ()
    in ein vorhandenes Programm einsetzen kann, denn eigentlich sollte man nicht mit einem 2ten Programm auf
    ein LCD zugreifen.
    Das vorhandene Programm:


    Noch mal wieder einen schönen Dank im Voraus
    Thomas

  • Nach dem Lesen einiger Blogeinträge und Links:
    Laufendem Skript Parameter übergeben Hier wird eine Client Server Lösung beschrieben.
    Python in einfachen Beispielen : Socketprogrammierung
    Socket Programming HOWTO — Python 2.7.9 documentation
    habe ich mein Internet-Radio auf 3 Python Scripts aufgeteilt:
    tmadio_client.py Hier werden über eine Fernsteuerung (LIRC) die Sender ausgewählt.
    mpd_client.py Hier wird per ‘client.send_idle’ und ‘events = client.fetch_idle’ bei einem
    mpd event laufender Sender und laufende Titel abgefragt und an den LCD_Server übergeben.
    So können sowohl die Änderungen über die Fernsteuerung, Tastatur und die Änderungen
    per iPad (MPoD) angezeigt werden.
    lcd_server.py Hier werden Sender und Infos auf dem LCD Display angezeigt

    Nun möchte ich noch die Titelzeile von links nach rechts scrollen, weiß aber nicht, wie die Scroll Routine abgebrochen werden kann.
    Im mpd_client.py Script ist es nicht möglich während des Wartens auf eine mpd Event etwas anders, z:B. eine Scroll Routine ablaufen zu lassen.
    Wobei ich zugeben muss, dass ich mpd Client nicht richtig verstanden habe.
    while True:
    ...
    client.send_idle ()
    events = client.fetch_idle ()


    Ich könne das Scrollen auch in die lcd_server.py Routine verlegen, weiß aber auch hier nicht, wie das Scrollen abgebrochen wird,
    wen vom Client die Zeile3 (nur diese wird gescrollt) erneut übertragen wird.
    (Die Scroll-Zeilen sind unten eingefügt)

    Kann mir hier noch mal jemand mit einer Idee weiterhelfen.
    Vielen Dank schon mal im Voraus.
    Thomas

Jetzt mitmachen!

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