BathPi reloaded [Update]

BathPi reloaded [Update]

Updates zum Post sind ganz unten.

Erst vor kurzem berichtete ich über mein WLAN-Radio im Bad. Allerdings war ich mit der Umsetzung nicht 100%ig zufrieden, so dass ich einen zweiten Versuch unternahm. Nun auch mit einem veränderten Aufbau.

Hardware

Raspberry Pi Modell A+ mit Coupé Royale Pibow

Raspberry Pi Modell A+ mit Coupé Royale Pibow und Display-O-Tron 3000

Aufbau und Einrichtung

Nachdem der Raspberry Pi im Gehäuse aufgebaut war, richtete ich ihn wieder (wie im obigen Artikel beschrieben) ein.

Da ich generell die Raspberry Pis ohne Zuhilfenahme von Tastatur und Maus, sondern per SSH einrichte, erfolgte die Installation und Ersteinrichtung auch auf einem Raspberry Pi Modell B+. Die fertig konfigurierte microSD-Karte lässt sich dann einfach in dem anderen Modell betreiben.

Für das Display-O-Tron 3000 gibt es ein Github-Repository. Die Installation des Displays geht schnell und einfach mit einem Einzeiler:

curl get.pimoroni.com/dot3k | bash

Dieser Installer führt durch die notwendigen Schritte und installiert die benötigten Software-Pakete.

Zusätzlich müssen noch mpd und mpc installiert werden.

sudo apt-get install mpd mpc

Sollte es bisher noch nicht erfolgt sein, wäre spätestens jetzt ein guter Zeitpunkt um das System auf den aktuellen Stand zu bringen.

sudo apt-get update && sudo apt-get dist-upgrade
sudo rpi-update
sudo reboot

Das Radio

In den Beispielen zum Display-O-Tron findet sich auch der Quelltext für ein Radio. Dieses entsprach aber nicht ganz meinen Vorstellungen, so dass ich mir mein eigenes programmiert habe.

Ich gehe davon aus, dass im Benutzerordner des Benutzers pi das Verzeichnis PiRadio angelegt ist. Hier erstellst du die folgenden zwei Dateien.

newradio.py

import atexit
import time
from dot3k import backlight, joystick
from myradio import Radio

radio = Radio()

def clean_shutdown():
    radio.off()

atexit.register(clean_shutdown)

@joystick.on(joystick.UP)
def handle_up(pin):
    radio.up()

@joystick.on(joystick.DOWN)
def handle_down(pin):
    radio.down()

@joystick.on(joystick.LEFT)
def handle_left(pin):
    radio.left()

@joystick.on(joystick.RIGHT)
def handle_right(pin):
    radio.right()

backlight.left_rgb(255, 0, 0)
backlight.mid_rgb(255, 0, 255)
backlight.right_rgb(0, 0, 255)

while 1:
    radio.redraw()
    time.sleep(0.2)

myradio.py

import os
import psutil
import subprocess
import time
from dot3k import backlight, lcd

class Radio():
    def __init__(self):
        self.channel_links = 
        	[
            "http://radiolausitz.mp3.green.ch:80",
            "http://c22033-ls.i.core.cdn.streamfarm.net/" +
            	"T3R6XGogC9922033/22033mdr/live/app2128740352/" +
            	"w2128904194/live_de_128.mp3",
            "http://c22033-ls.i.core.cdn.streamfarm.net/" + 
            	"UjIe753Ui9922033/22033mdr/live/app2128740352/" + 
                "w2128904195/live_de_128.mp3",
			"http://tuner.radiopaloma.de:80",
			"http://stream.hoerradar.de/sunshinelive-mp3-192",
			"http://rbb-mp3-fritz-m.akacast.akamaistream.net/7/799/" +
            	"292093/v1/gnl.akacast.akamaistream.net/rbb_mp3_fritz_m"
            ]
        self.channel_names = ["Radio Lausitz", "MDR Jump", "MDR Sputnik", "Radio Paloma", "Sunshine Live", "Fritz"]
        self.selected_station = 0
        self.start()

    def redraw(self):
        volume = subprocess.check_output("mpc status | grep volume", shell=True, stderr=subprocess.STDOUT)
        volume = volume[7:volume.find("%")]

        lcd.clear()
        lcd.set_cursor_position(0, 0)
        lcd.write(self.channel_names[self.selected_station])

        lcd.set_cursor_position(0, 1)
        lcd.write(time.strftime("%d.%m. %H:%M:%S"))

        lcd.set_cursor_position(0, 2)
        lcd.write('Volume:' + volume + ' %')

        cpu = psutil.cpu_percent()
        backlight.set_graph(float(cpu) / 100.0)

    def start(self):
    	os.system("sudo mpc clear")

        for channel in self.channel_links:
            os.system("mpc add " + channel)
    
        os.system('mpc play 1')

    def up(self):
        os.system('mpc volume +5')

    def down(self):
        os.system('mpc volume -5')

    def right(self):
        self.selected_station += 1
        if self.selected_station >= len(self.channel_links):
            self.selected_station = 0
        self.play_selected_station()

    def left(self):
        self.selected_station -= 1
        if self.selected_station < 0:
            self.selected_station = len(self.channel_links) - 1
        self.play_selected_station()

    def play_selected_station(self):
        os.system('mpc play ' + str(self.selected_station + 1))

    def off(self):
        os.system('mpc stop')
        backlight.set_graph(0)
        backlight.rgb(0, 0, 0)
        lcd.clear()

Zum besseren Nachvollziehen habe ich eine kommentierte Version in meine Cloud geladen.

Gestartet wird das Radio dann einfach über

sudo python /home/pi/PiRadio/newradio.py

Damit es auch direkt beim Neustart des Raspberry Pi gestartet wird, fügst du einfach diese Zeile

sudo python /home/pi/PiRadio/newradio.py &

in die Datei /etc/init.d/rc.local ein.

Hinweise

Für mpc ist es notwendig, dass mp3-Streams zu der Playlist hinzugefügt werden und keine Playlisten im m3u- oder pls-Format. Man kann aber aus der m3u auch den entsprechenden Quellstream ermitteln. So ist es bspw. beim Stream von MDR Jump der Fall. Hier wird die Playlist mit http://www.jumpradio.de/static/webchannel/ jump_live_channel_high.m3u angegeben.

Nun gehst du wie folgt vor

pi@bathpi ~ $ wget http://www.jumpradio.de/static/webchannel/jump_live_channel_high.m3u
--2015-02-13 21:41:19--  http://www.jumpradio.de/static/webchannel/jump_live_channel_high.m3u
Auflösen des Hostnamen »www.jumpradio.de (www.jumpradio.de)«... 193.22.36.164
Verbindungsaufbau zu www.jumpradio.de (www.jumpradio.de)|193.22.36.164|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 254 [audio/x-mpegurl]
In »»jump_live_channel_high.m3u«« speichern.

100%[======================================>] 254         --.-K/s   in 0s

2015-02-13 21:41:19 (3,19 MB/s) - »»jump_live_channel_high.m3u«« gespeichert [254/254]

pi@bathpi ~ $ cat jump_live_channel_high.m3u
#EXTM3U
#EXTINF:-1,http://c22033-ls.i.core.cdn.streamfarm.net/T3R6XGogC9922033/
22033mdr/live/app2128740352/w2128904194/live_de_128.mp3
http://c22033-ls.i.core.cdn.streamfarm.net/T3R6XGogC9922033/22033mdr/
live/app2128740352/w2128904194/live_de_128.mp3

In der letzten Zeile steht nun die eigentliche Stream-URL (http://c22033-ls.i.core.cdn.streamfarm.net/T3R6XGogC9922033/22033mdr/ live/app2128740352/w2128904194/live_de_128.mp3), die nun in mpc hinzugefügt werden kann.

Fertig

Updates

13. Mai 2015

Wie auch bei dem Projekt der Wetterstation habe ich meinen Code auf einem GitHub-Repository hochgeladen, wo die weiteren Modifikationen zu finden sind.
Es steht jedem frei, den Code zu verwenden und auch Änderungen vorzunehmen.
Fragen und Anmerkungen dazu natürlich gern auch hier.

Zusätzlich habe ich noch eine Änderung eingebaut, so dass sich der Pi nun merkt, welcher Kanal zuletzt gespielt wurde. Beim nächsten Starten wird dieser Kanal dann auch direkt wieder gestartet.