NEWS
Sonos-HTTP-API Installation für Newbies, Dummies und mich
-
Könnt mal jemand was ausprobieren?
#!/bin/bash SONOSAPI_USER=sonosapi SONOSAPI_DIR=/opt/sonosapi SONOSAPI_SERVICE=sonosapi SONOSAPI_SERVICE_FILE=/etc/systemd/system/$SONOSAPI_SERVICE.service sonosapi_user(){ useradd --system --home-dir $SONOSAPI_DIR --shell /bin/bash $SONOSAPI_USER mkdir -p $SONOSAPI_DIR chown $SONOSAPI_USER:$SONOSAPI_USER $SONOSAPI_DIR } sonosapi_install() { cd $SONOSAPI_DIR su -c 'wget https://github.com/jishi/node-sonos-http-api/archive/master.zip' $SONOSAPI_USER su -c 'unzip master.zip' $SONOSAPI_USER su -c 'cd node-sonos-http-api-master && npm install --production' $SONOSAPI_USER rm master.zip } sonosapi_service() { echo Writing $SONOSAPI_SERVICE_FILE cat << EOF > $SONOSAPI_SERVICE_FILE [Unit] Description=Sonos HTTP API Daemon After=syslog.target network.target [Service] Type=simple User=$SONOSAPI_USER ExecStart=/usr/bin/node $SONOSAPI_DIR/node-sonos-http-api-master/server.js Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF systemctl enable $SONOSAPI_SERVICE systemctl start $SONOSAPI_SERVICE } sonosapi_uninstall() { systemctl stop $SONOSAPI_SERVICE systemctl disable $SONOSAPI_SERVICE rm -rf $SONOSAPI_DIR userdel $SONOSAPI_USER rm $SONOSAPI_SERVICE_FILE } # sonosapi_uninstall sonosapi_user sonosapi_install sonosapi_service
Den Code oben auf der Linux Kiste als "sonosapi_install.sh" abspeichern. Das ist im Prinzip die Installationsanleitung als bash-script.
Dann ausführen mitsudo bash ./sonosapi_install.sh
Danach sollte "eigentlich" alles geritzt sein. Die API läuft dann im Verzeichnis /opt/sonosapi mit einem eigenen User "sonosapi", das bitte berücksichtigen, wenn man im Filesystem was reinspeichert ...
Ich hab das jetzt spaßeshalber mal auf ner Ubuntu 18.04 probiert, da klappts.
-
Du bist sicherlich um 1000% fitter als ich, aber bisher hat sich noch niemand über den autostart beschwert,
da macht doch Matten irgendwas falsch .... oder liegt es an der Linux Version ?? -
@skokarl ... Keine Ahnung, worans liegt.
Der Autostart funktioniert schon so, wie beschrieben, das passt schon. Ohne log-Ausgabe ist das nur Raten, das führt zu nix. Irgendwas ist da halt falsch zusammengestöpselt. -
morgen zusammen, ich nutze den adapter für die Sprachausgabe
In 4 Zimmern sind größten teils Sonos 1 und Playbar verbaut.
Ich lass mich über die Sonos Wecken in dem Musik abgespielt wird.
Davor wollte ich noch eine Sprachausgabe über alle Sonos in den unterschiedlichen Zonen ausgeben.
Laut Doku sieht dann die url wie folgt aus:http://IP:5005/sayall/Guten%20Morgen.%20Es%20ist:%206%20Uhr%20und%2044.%20Die%20Aktuelle%20Außentemperatur%20beträgt%20-4.3%20Grad%20Celsius.%20Achtung%20Wetterwarnung/de/20
manuell geht das ganze mal man sieht auch das alle Zonen zu einer zusammengefast werden, lief Musik wird diese unterbrochen, allerdings von 10 Versuchen geht es vielleicht 2 mal. Und es wird ein Text ausgegeben.
Schaue ich in den Sonos Controller sehe ich auch eine Datei die abgespielt werden soll aber es passiert nichts. -
@dwm Ich habe heute Morgen folgende Fehlermeldung in der Logdatei - was heißt das?
javascript.0 2020-02-12 07:09:37.885 error (3232) at endReadableNT (_stream_readable.js:1145:12) javascript.0 2020-02-12 07:09:37.885 error (3232) at IncomingMessage.emit (events.js:203:15) javascript.0 2020-02-12 07:09:37.884 error (3232) at Object.onceWrapper (events.js:286:20) javascript.0 2020-02-12 07:09:37.884 error (3232) at IncomingMessage.<anonymous> (/opt/iobroker/node_modules/request/request.js:1083:12) javascript.0 2020-02-12 07:09:37.883 error (3232) at Request.emit (events.js:198:13) javascript.0 2020-02-12 07:09:37.883 error (3232) at Request.<anonymous> (/opt/iobroker/node_modules/request/request.js:1161:10) javascript.0 2020-02-12 07:09:37.882 error (3232) at Request.emit (events.js:198:13) javascript.0 2020-02-12 07:09:37.882 error (3232) at Request.self.callback (/opt/iobroker/node_modules/request/request.js:185:22) javascript.0 2020-02-12 07:09:37.881 error (3232) at Request._callback (script.js.common.SonosApi.SonosAPI:81:21) javascript.0 2020-02-12 07:09:37.881 error (3232) at processPlaylists (script.js.common.SonosApi.SonosAPI:787:36) javascript.0 2020-02-12 07:09:37.878 error (3232) script.js.common.SonosApi.SonosAPI: TypeError: PlaylistData.join is not a function
-
@LJSven
Hm ... grundsätzlich gibts bei den Funktionen, die die Playlists abfragen die "PlaylistData" ... das ist ein array, das dann eine "join" Funktion hat.
In dem Fall war PlaylistData KEIN Array, also Typfehler.Nur einmal aufgetreten, oder öfters?
Was liefert den die API, wenn man "/playlists" fragt? -
@dwm sagte in [gelöst] Sonos-HTTP-API Installation für Newbies, Dummies und mich:
@LJSven
Hm ... grundsätzlich gibts bei den Funktionen, die die Playlists abfragen die "PlaylistData" ... das ist ein array, das dann eine "join" Funktion hat.
In dem Fall war PlaylistData KEIN Array, also Typfehler.Nur einmal aufgetreten, oder öfters?
Was liefert den die API, wenn man "/playlists" fragt?Bisher einmal - ich beobachte es mal weiter.
-
-
Danke für die Rückmeldung.
-
@dwm sagte in [gelöst] Sonos-HTTP-API Installation für Newbies, Dummies und mich:
@LJSven
Hm ... grundsätzlich gibts bei den Funktionen, die die Playlists abfragen die "PlaylistData" ... das ist ein array, das dann eine "join" Funktion hat.
In dem Fall war PlaylistData KEIN Array, also Typfehler.Nur einmal aufgetreten, oder öfters?
Was liefert den die API, wenn man "/playlists" fragt?Hallo @dwm,
der Fehler ist heute wieder aufgreteten - auch bei dem FavData.join
Woran kann das liegen? Kann ich da was gegen machen? Ich kann nicht mal einen Zusammenhang feststellen - weil zu dem Zeitpunkt kein Befehl abgesetzt wurde. Ich kann auch nciht sehen, welches Gerät dafür verantwortlich ist, oder?
-
@LJSven
Das sind die Sonos-Favoriten und die Sonos Playlists die da abgefragt werden, und zwar jede Minute einmal. Insofern ist da kein Gerät dafür verantwortlich, das kommt vom "Gesamtsystem Sonos". Trotzdem sollte die API natürlich den richtigen Datentyp liefern.
Ich hab jetzt mal ein Update hochgeladen, mit folgenden Änderungen:function processFavorites(FavData, cbParam ){ forceCreate=false; if (Array.isArray(FavData)){ var FavListStr = FavData.join(';'); // dwmlog ("Process Favorites Data: "+JSON.stringify(FavData,null,4)+" gives List "+FavListStr,5); createOrSetState(AdapterId+".SonosAPI.FavList",FavListStr,forceCreate,{ type: 'string', name: "Sonos Favorites list"}); } else { dwmlog("SonosAPI processFavorites got invalid data: "+JSON.stringify(FavData),2,"warn"); } } function processPlaylists(PlaylistData, cbParam ){ forceCreate=false; if (Array.isArray(PlaylistData)){ var PlayListStr = PlaylistData.join(';'); // dwmlog ("Process Favorites Data: "+JSON.stringify(FavData,null,4)+" gives List "+FavListStr,5); createOrSetState(AdapterId+".SonosAPI.Playlists",PlayListStr,forceCreate,{ type: 'string', name: "Sonos Playlist list"}); } else { dwmlog("SonosAPI processPlaylists got invalid data: "+JSON.stringify(PlaylistData),2,"warn"); } }
das härtet die beiden Funktionen gegen den falschen Datentyp, es wird dann eben eine Warnung ins Log geschrieben, aber die Exception passiert nicht mehr.
Ist irgendwie anscheinend ein Problem in der API selber. Wenns nur sporadisch auftritt, kann man's ignorieren, wie gesagt, die Synchronisierung von Playlists und Favoriten passiert einmal pro Minute. -
@dwm sagte in [gelöst] Sonos-HTTP-API Installation für Newbies, Dummies und mich:
@LJSven
Das sind die Sonos-Favoriten und die Sonos Playlists die da abgefragt werden, und zwar jede Minute einmal. Insofern ist da kein Gerät dafür verantwortlich, das kommt vom "Gesamtsystem Sonos". Trotzdem sollte die API natürlich den richtigen Datentyp liefern.
Ich hab jetzt mal ein Update hochgeladen, mit folgenden Änderungen:function processFavorites(FavData, cbParam ){ forceCreate=false; if (Array.isArray(FavData)){ var FavListStr = FavData.join(';'); // dwmlog ("Process Favorites Data: "+JSON.stringify(FavData,null,4)+" gives List "+FavListStr,5); createOrSetState(AdapterId+".SonosAPI.FavList",FavListStr,forceCreate,{ type: 'string', name: "Sonos Favorites list"}); } else { dwmlog("SonosAPI processFavorites got invalid data: "+JSON.stringify(FavData),2,"warn"); } } function processPlaylists(PlaylistData, cbParam ){ forceCreate=false; if (Array.isArray(PlaylistData)){ var PlayListStr = PlaylistData.join(';'); // dwmlog ("Process Favorites Data: "+JSON.stringify(FavData,null,4)+" gives List "+FavListStr,5); createOrSetState(AdapterId+".SonosAPI.Playlists",PlayListStr,forceCreate,{ type: 'string', name: "Sonos Playlist list"}); } else { dwmlog("SonosAPI processPlaylists got invalid data: "+JSON.stringify(PlaylistData),2,"warn"); } }
das härtet die beiden Funktionen gegen den falschen Datentyp, es wird dann eben eine Warnung ins Log geschrieben, aber die Exception passiert nicht mehr.
Ist irgendwie anscheinend ein Problem in der API selber. Wenns nur sporadisch auftritt, kann man's ignorieren, wie gesagt, die Synchronisierung von Playlists und Favoriten passiert einmal pro Minute.Wo finde ich das Update? Wie mache ich das?
-
In meinem Github Repository...
https://github.com/dwm66/iobroker-scripts/tree/master/SonosAPIEinfach Script mit neuer Version ersetzen.
-
Servus,
wie kann ich das Album-Cover auf der Sonos mit VIS aktualisieren? Oder wie kann ich VIS alle 5 Sekunden aktualisieren lassen? Das neue Album-Cover ist ja als Datenpunkt da und die Daten haben sich geändert, aber VIS ändert nichts, jedoch bei Spotify klappt es ;(
Soll ich es über einen eigenen Datenpunkt triggern? Danke
-
@dwm sagte in [gelöst] Sonos-HTTP-API Installation für Newbies, Dummies und mich:
In meinem Github Repository...
https://github.com/dwm66/iobroker-scripts/tree/master/SonosAPIEinfach Script mit neuer Version ersetzen.
Okay, erledigt - der Fehler oder das Warning ist bisher noch nicht wieder aufgetreten.
Andere Frage: Wenn der "PlaybackState" auf STOPPED geht, bleibt der "PlaybackStateSimple" auf true - ist das korrekt? Ausserdem springt der "playbackState" nach ca. 3 Minuten wieder um auf "PLAYING", wenn ich den Wert über die VIS ändere.
-
Seltsames Verhalten.
Im Prinzip ist das so verdrahtet, dass der PlaybackStateSimple auf false geht, wenn der PlaybackState nicht "PLAYING" ist.Wenn man den PlaybackStateSimple auf "true" setzt, sollte eine "PLAY" Action ausgeführt werden, bei false ein "PAUSE".
Was ich mir grad vorstellen könnte ist, dass das System durcheinanderkommt, wenn man die Kommandos sehr schnell hintereinander absetzt.
-
@Qlink sagte in [gelöst] Sonos-HTTP-API Installation für Newbies, Dummies und mich:
Hi Leute,
ich hab die Sonos-http-api Installation jetzt auch erfolgreich unter Windows hinbekommen inkl. Autostart.
Die Installationsschritte sind eigentlich fast identisch zu den oben genannten.
node-sonos-http-api-master.zip von github herunterladen und nach C:\ioBroker\node_modules\node-sonos-http-api-master bzw. eurem iobroker Verzeichnis entpacken
wie beschrieben mittels npm installieren
den autostart habe ich mit pm2 hinbekommen:
pm2 von github laden und ebenfalls wie sonos-http-api installieren https://github.com/Unitech/pm2dann autostart-sonos-http-api.bat erstellen und in einem beliebigen verzeichnis ablegen
in das .bat file folgendens cmd einfügenpm2 start c:\iobroker\node_modules\node-sonos-http-api-master\server.js -x --name "sonos-api"
Nun nur noch mittels Windows Task Scheduler eine neue Task erstellen, bei Trigger "at startup" und bei Action "start program" mit verweis auf das erstellte .bat file
und fertig
Beste Grüße
Danke für deine Anleitung! Ich habe das Ganze so installiert, wie du beschildert hast, allerdings funktioniert die Batch-Datei bei mir nicht. Meldung: "Der Befehl pm2 ist entweder falsch geschrieben, oder konnte nicht gefunden werden".
Pm2 habe ich ebenfalls in den node_modules Ordner meiners IO-Brokers installiert.Aktuell starte ich die API immer manuell und das funktioniert dann scheinbar auch. Das muss ich aber nach jedem Neustart ausführen.. Wäre besser, wenn das doch automatisch ginge...
Gruß surfer
-
hmm das klingt so als ob die pm2 installation nicht korrekt durchgelaufen wäre ...
kannst du den pm2 befehl manuell in der cli ausführen, oder geht das auch nicht ?
Bei mir funktioniert das problemlos ...
Beste Grüße
-
@Qlink Das hatte ich auch bereits versucht, funktioniert aber auch nicht.
-
Da hats wohl definitiv etwas mit der pm2 Installation.
Möglicherweise mag pm2 mit Server 2019 nicht ...Bei mir läuft alles aktuell unter Server 2016.
In den nächsten Wochen, wenn mein neuer Server in Betrieb geht werde ich allerdings auf Server 2019 migrieren und kann dazu dann mehr sagen ...Beste Grüße