Alright, here we go!
Disclaimer: Das ist eine, von mir erweiterte, Step-by-Step Anleitung wie ich den Sonos-Kids-Controller mit Spotify auf meinem System zum laufen gebracht habe, ohne Ansprüche auf eine Allgemeingültigkeit. Bitte Info an mich, falls du hier einen Fehler entdeckst.
NICHTS hiervon ist von mir, ich habe es nur aus den verschiedenen Quellen zusammengetragen. Diese Quellen waren vor allem:
Ausführlichere Infos, und nach einer gewissen Zeit sicher auch die aktuelleren, findest du natürlich dort.
Mein System:
Bevor wir also loslegen, die Grundlagen:
Ich habe die SD-Karte über den Pi Imager auf meinem Mac bespielt. Den Pi Imager gibt es aber auch für Windows und Ubuntu.
Im Anschluss zeigt der Finder die Karte nicht an, man muss sie einmal aus- und wieder einstecken. Am besten ist es, dann gleich das eigene WLAN zu konfigurieren. Das machst du, indem du eine Textdatei (ich empfehle Textastic für OSX oder Notepad++ für Windows) mit dem folgenden Inhalt erstellst (vergiss nicht deine WLAN-Daten einzufügen) und unter dem Namen wpa_supplicant.conf direkt im Hauptverzeichnis der SD-Karte abspeicherst. Beim nächsten Boot wird sie erkannt, eingepflegt und aus dem Boot-Folder gelöscht.
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
network={
ssid="wlan-bezeichnung"
psk="passwort"
key_mgmt=WPA-PSK
}
Anmerkung von kle: Du kannst auch noch eine leere Textdatei mit dem Namen ssh.txt in den Boot-Folder ablegen, um SSH gleich zu aktivieren. Dann brauchst du es später nicht mehr in der Raspi-config aktivieren und kannst dich gleich nach dem Boot draufschalten.
Jetzt bootest du dein System mit einem Bildschirm/Fernseher am HDMI-Port und einer USB-Tastatur.
Nachdem du dich mit den Standard-Zugangsdaten angemeldet hast (User: pi Passwort: raspberry), rufst du erst einmal die folgenden Befehle auf, um dein System auf den neuesten Stand zu bringen:
apt-get update
apt-get upgrade
Und bitte gleich noch das Standardpasswort ändern, mit dem eingeloggten User pi und:
Jetzt gehts in die Raspi-config um SSH und den Autologin zu konfigurieren:
1. System Options --> S4 Hostname (muss nicht, aber falls du deinem Raspi einen anderen Namen geben möchtest.
2. System Options --> S5 Boot / Auto Login --> B2 Console Autologin (brauchen wir später für den Kiosk-Mode).
3. Interface Options --> P2 SSH enable Wenn du nicht weisst, was du damit anstellst, solltest du es vielleicht erst einmal nachlesen
5. Localisation Options --> L1 Locale --> bis de_DE.UTF-8 scrollen und aktivieren.
5. Localisation Options -->L2 Timezone --> Europe --> Berlin
<Finish>
Reboot tut nicht nur Windows gut, also bitte einmal neu starten mit
Wer ebenfalls ein Pimorony Hyperpixel sein Eigen nennt, installiert es über den nächsten Schritt. Ansonsten bitte überspringen und bei Upgrade Node weiterlesen:
Installation Hyperpixel Display:
curl -sSL https://get.pimoroni.com/hyperpixel4 | bash
//0 auswählen: Rectangular Pi 3B+ or older
Wer es gerne so gedreht haben möchte, dass die Ports oben liegen:
Und jetzt einmal neustarten, schon sollte das Display mit Touch funktionieren:
Upgrade Node
Diese Schritte habe ich mir von hier kopiert.
curl -sL https://deb.nodesource.com/setup_15.x | sudo -E bash -
sudo apt-get install -y nodejs
Einmal verifizieren, ob es funktioniert hat:
Bei mir ist die aktuelle Version 15.5.0.
Jetzt müssen wir uns darum kümmern, dass die Node-sonos-http-api installiert wird. Dazu gehen wir ins Hauptverzeichnis des Users pi (in welchem wir uns eigentlich schon die ganze Zeit befinden müssten )
git clone https://github.com/Thyraz/node-sonos-http-api
In das Verzeichnis wechseln:
...und installieren dort npm:
Bei mir tauchten nach der Installation ein paar rot markierte Fehler auf, weshalb ich diese noch mit
(Größtenteils) behoben habe. Die noch übrigen Fehler waren aber anscheinend nicht so tragisch, als dass ich nicht hätte weitermachen können.
Jetzt sollte es mit
Funktionieren, ohne dass eine Fehlermeldung erscheint.
Wir wechseln das Verzeichnis in /presets/ und erstellen die preset.json mit dem Editor nano erstellen.
In diese Datei muss nun der Raumnamen der Sonos Box eingepflegt werden. In meinem Beispiel ist es die Box mit dem Namen "Büro".
{
"players": [
{ "roomName": "Büro", "volume": 25}
],
"state": "stopped",
"favorite": "Favoriten",
"uri": "x-rincon-stream:RINCON_0000000000001400",
"playMode": {
"shuffle": true
},
"pauseOthers": true
"sleep": 600
}
Alles anzeigen
mit strg+x und zweimaligen Bestätigen speichern wir die Datei.
Jetzt müssen wir uns erst einmal bei Spotify mit unserem Account hier anmelden und eine Spotify App erstellen. Dadurch erhalten wir die client keys (ClientID und das ClientSecret).
Bei dem folgenden Schritt bin ich mir nicht sicher, ob er wirklich notwendig ist. Aber er schadet jedenfalls auch nicht. Die Spotify-Keys brauchen wir so oder so...
Im Stammverzeichnis der node-sonos-http-api eine neue Datei namens "settings.json" anlegen,
Und mit dem folgenden Inhalt bestücken:
{
"spotify": {
"clientId": "XXXX",
"clientSecret": "XXXXX"
},
"library": {
"randomQueueLimit": 50
}
}
Wieder speichern und nano beenden.
Installation des Sonos-Kids-Controllers:
Zurück im Home-Verzeichnis des pi-Users diese Befehle, einen nach dem anderen, ausführen:
sudo npm install -g @ionic/cli
wget https://github.com/Thyraz/Sonos-Kids-Controller/archive/master.zip
unzip master.zip
rm master.zip
cd Sonos-Kids-Controller-master
npm install
npm audit fix
ionic build --prod
Falls der build mit "Unbekannte Argumente_ use-program-dependencies..." fehlschlägt, wird folgender fix von timo.beil empfohlen:
ls -lisa //findet die Datei "tsconfig-json"
nano tsconfig.json
In dem Inhalt der Datei hinter anhängen:
"strictInjectionParameters":true",
"enableIvy":false
Nicht das Komma hinter dem vorherigen Parameter "true," vergessen! und speichern.
Falls die Kompilierung mit der folgenden Fehlermeldung abbricht, was bei mir der Fall war:
FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
Das hier ausführen:
export NODE_OPTIONS=--max-old-space-size=3072
Anschließend noch einmal
Ausführen und die Daumen drücken. Das dauert ein wenig.
Kompilierung erfolgreich? SUPER! Dann:
cd server/config
cp config-example.json config.json
Jetzt die /server/config/config.json mit nano editieren und darin die Sonos-Box, spotify ClientID und clientSecret eintragen. Wie im obigen Beispiel, lautet der Name der Box bei mir "Büro". Da wir vorhin die node-sonos-htttp-api auf dem selben Raspi installiert haben, lautet die IP-Adresse des Servers 127.0.0.1 (eigenes Gerät). Wer es auf einem anderen Raspi installiert hat, muss hier die IP des anderen Geräts angeben.
{
"node-sonos-http-api": {
"server": "127.0.0.1",
"port": "5005",
"rooms": [
"Büro"
]
},
"spotify": {
"clientId": "XXX",
"clientSecret": "XXX"
}
}
Alles anzeigen
Fast fertig!
Mal schauen, ob es läuft:
Sollte der Server starten, kannst du von deinem PC aus den Raspi ansurfen und solltest ein schwarzes User Interface sehen. Die Adresse lautet:
http://ip-adresse-des-raspis:8200
Jetzt kannst du deine Alben einpflegen. Wie das geht, steht im GitHub-Manual.
Jetzt muss noch der Autostart konfiguriert werden:
Hier erhielt ich Warnmeldungen, auf eine neuere Version von npm zu updaten.
Jetzt bauen wir uns ein kleines Startup Script was ja funktionieren sollte, da der pi-user sich automatisch beim booten einloggt. Wichtig ist, diesen ersten Befehl NICHT mit sudo zu starten:
Die jetzt folgende Ausgabe zeigt einen Befehl, welchen es zu kopieren und auszuführen gibt. Diesmal mit "sudo". Bei mir sieht er so aus:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
Jetzt in das Verzeichnis vom node-sonos-http-api wechseln und folgendes ausführen:
pm2 start server.js
pm2 save
Anschließend wieder in das Verzeichnis vom Sonos-Kids Controller wechseln:
pm2 start server.js
pm2 save
Openbox als window Manager installieren
sudo apt-get install --no-install-recommends xserver-xorg x11-xserver-utils xinit openbox
Chromium installieren
sudo apt-get install --no-install-recommends chromium-browser
Wenn node-sonos-http-api auf demselben pi installiert ist, was in dieser Anleitung der Fall ist, den automatischen start von Openbox und Chromium editieren:
sudo nano /etc/xdg/openbox/autostart
folgenden Inhalt hinein schreiben:
# Disable screen saver / power management
xset s off
xset s noblank
xset -dpms
# Start Chromium
sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' ~/.config/chromium/'Local State'
sed -i 's/"exited_cleanly":false/"exited_cleanly":true/; s/"exit_type":"[^"]\+"/"exit_type":"Normal"/' ~/.config/chromium/Default/Preferences
chromium-browser --disable-infobars --kiosk 'http://IP-Adresse-Des-Raspi:8200'
Jetzt muss noch im home-verzeichnis des users pi die Datei .bash_profile erstellt , und mit dem automatischen startbefehl ausgestattet werden:
cd /home/pi
sudo nano .bash_profile
Den folgenden Inhalt in die leere Datei kopieren:
[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && startx -- -nocursor
Jetzt neustarten und Daumen drücken!
FERTIG!!!
Sollte nach einer bestimmten Zeit eine Blase in Chromium erscheinen, diesen workaround nutzen:
sudo touch /etc/chromium-browser/customizations/01-disable-update-check;echo CHROMIUM_FLAGS=\"\$\{CHROMIUM_FLAGS\} --check-for-update-interval=31536000\" | sudo tee /etc/chromium-browser/customizations/01-disable-update-check