Zum Hauptinhalt springen

Snapcast Smart-Home-Integration, kostenlos und Open Source

Snapcast-Integration für Gladys Assistant

Multiroom-Audio mit Snapcast: Lautstärke und Stummschaltung pro Raum, Streams, Gruppen, Szenen.

Snapcast spielt denselben Ton synchron in allen Räumen: ein snapserver empfängt die Streams (Spotify über librespot, AirPlay, MPD, ein Radio, eine Pipe…) und schickt sie an die snapclients, einen pro Raum. Diese Integration bringt den Server in Gladys: die Lautstärke und Stummschaltung jedes Raums, welcher Stream in welchem Raum läuft, die Raumgruppen und Szenen, wenn ein Lautsprecher offline geht oder ein Stream startet.

Die Integration spielt selbst keine Musik: Die Musik kommt aus den Quellen deines Snapcast-Servers (MPD, Spotify…). Getestet mit snapserver und snapclient 0.31 in Docker, ohne Lautsprecher: Rückmeldungen sind willkommen.

Voraussetzungen​

  • Ein Snapcast-Server (snapserver 0.26 oder neuer; 0.31 getestet), den Gladys im lokalen Netzwerk erreicht.
  • Sein JSON-RPC-Steuerport über TCP, standardmäßig 1705, aktiviert (das ist er, außer der Abschnitt [tcp] von snapserver.conf sagt enabled = false).
  • Gladys 5.3 oder neuer (Musik-Player; Version 1.0 der Integration bleibt für Gladys 5.1 und 5.2).

Konfiguration​

  1. Öffne in Gladys Integrationen, suche Snapcast und installiere sie.
  2. Serveradresse: die IP-Adresse oder der Hostname des Rechners, auf dem snapserver läuft, zum Beispiel 192.168.1.20. Ergänze :Port oder fülle Steuerport aus, wenn es nicht 1705 ist (nicht der HTTP-Port 1780 von Snapweb).
  3. Sprache: die Sprache der Funktionsnamen und der Texte, die die Integration erzeugt. Die Namen werden beim Hinzufügen eines Geräts festgelegt: wähle sie, bevor du die Geräte hinzufügst.
  4. Speichere. Die Integration verbindet sich und zeigt dann jeden Client und jeden Stream im Tab Erkennung der Integration: füge die gewünschten hinzu.

Die Integration hält eine Verbindung zum Server offen und folgt jeder Änderung live: Eine in Snapweb oder einer anderen App geänderte Lautstärke erscheint sofort in Gladys. Die Integration liest den ganzen Zustand jede Minute und nach jeder Wiederverbindung neu.

Geräte​

Clients (Räume)​

Jeder snapclient ist ein Gerät, mit dem Namen, den du ihm in Snapweb gegeben hast (sonst dem Namen seines Rechners).

FunktionWas sie tut
Lautstärke0 bis 100, in beide Richtungen
StummEin = Ton aus, in beide Richtungen (Stummschaltung des Musik-Players)
VerbundenOb der snapclient mit dem Server verbunden ist
StreamDer Stream des Raums; ein anderer schaltet seine ganze Gruppe um
WiedergabestatusWiedergabe (1), Pause (0) oder gestoppt (2), nach dem Stream des Raums; Befehle wirken, wenn der Stream ein Steuerskript hat
Aktuelle WiedergabeInterpret und Titel, wenn der Stream sie meldet, sonst Name und Status des Streams
Wiedergabe, PauseWirken auf den Stream des Raums, wenn ein Steuerskript ihn steuert (siehe Streams)
Vorheriger Titel, Nächster TitelEbenso
Titel, Interpret, Album, CoverWas der Stream des Raums spielt (siehe Musik-Player)
Dauer, PositionDes aktuellen Titels; die Position lässt sich setzen, wenn der Stream springen kann
Zufallswiedergabe, WiederholenWenn ein Stream des Servers sie meldet; wirken auf den Stream des Raums

Ein Client ist ein Player für die Gladys-Box Musik: Füge die Box einem Dashboard hinzu und wähle den Raum (siehe Musik-Player von Gladys 5.3).

Streams​

Jeder Stream des Servers ist auch ein Gerät: sein Wiedergabestatus (1 Wiedergabe, 0 Pause, 2 gestoppt) und was er spielt (aktuelle Wiedergabe). Ein Stream mit Steuerskript (librespot, MPD über meta_mpd.py, AirPlay, Plexamp… siehe Snapcast-Dokumentation) hat außerdem die Tasten Wiedergabe, Pause, Vorheriger Titel und Nächster Titel. Eine einfache Pipe hat keine: Snapcast kann nicht pausieren, was es nicht steuert.

Es gibt kein Gerät pro Gruppe: Snapcast löscht eine geleerte Gruppe und gibt einer neuen eine neue Kennung, was verwaiste Geräte in Gladys hinterlassen würde. Gruppen werden über ihre Clients gesteuert (Stream-Wahl, Aktionen unten).

Musik-Player von Gladys 5.3​

Seit Gladys 5.3 ist die Dashboard-Box Musik ein echter Player. Wähle einen Raum (einen Client): Die Box zeigt, was der Stream seiner Gruppe spielt (Cover, Titel, Interpret, Album, Fortschrittsbalken), mit Wiedergabe / Pause, zurück / weiter, Zufallswiedergabe, Wiederholen sowie Lautstärke und Stummschaltung des Raums.

  • Titel, Interpret, Album, Dauer, Position und Cover kommen vom Steuerskript des Streams (librespot, Mopidy über meta_mopidy.py, MPD über meta_mpd.py, AirPlay…). Eine einfache Pipe meldet nichts davon: Die Box zeigt den Namen des Streams als Titel, live, ohne Fortschrittsbalken.
  • Wiedergabe, Position, Zufallswiedergabe und Wiederholen wirken auf den Stream des Raums, also auf alle Räume seiner Gruppe; Lautstärke und Stummschaltung bleiben die des Raums.
  • Was sich steuern lässt, hängt von deinen Streams ab: Wiedergabe, Pause und Stopp, wenn der Stream des Raums ein Steuerskript hat, die Position, wenn er springen kann; Zufallswiedergabe und Wiederholen erscheinen, sobald ein Stream des Servers sie meldet. Ein Befehl, den der Stream des Raums nicht ausführen kann, wird mit einer Meldung abgelehnt.
  • Das Cover ist die Adresse aus dem Skript oder das im Stream gesendete Bild (AirPlay). Ein zu großes Bild wird verkleinert; das SVG-Logo von librespot wird nicht angezeigt (Gladys lehnt das Format ab).
  • Keine Bibliothek, keine Suche, keine Warteschlange: Snapcast hat keine. Wähle die Musik in der App deiner Quelle.

Bereits hinzugefügte Geräte: Klicke im Tab Erkennung der Integration bei jedem Raum und jedem Stream auf Aktualisieren. Der Raum erhält die neuen Funktionen, und seine Stummschaltung wird die des Musik-Players (gleiche Funktion: Szenen, die sie setzen oder überwachen, laufen weiter; eine Szene, die sie mit der Aktion „Schalter ein / aus“ umschaltete, ist mit „Gerät steuern“ neu anzulegen). Das Angebot kommt wieder, wenn ein Stream Zufallswiedergabe oder Wiederholen meldet. Der Wiedergabestatus ist jetzt 2, wenn nichts spielt, statt 0: Eine Szene auf „Wiedergabestatus = 0“ läuft nur noch bei einer Pause. Aktuelle Wiedergabe bleibt erhalten.

Dashboard-Widget​

Snapcast-Räume:

  • ohne gewählten Raum: jeder Client mit dem, was er spielt, und seiner Lautstärke (oder „Stumm“, „Offline“), dazu eine Taste Alle stumm / Alle Ton an;
  • mit gewähltem Raum: sein Status und seine Lautstärke, die Tasten Leiser, Lauter, Stumm / Ton an, und Abspielen / Pause, wenn sich sein Stream steuern lässt, sonst Nächster Stream.

Szenen-Auslöser​

AuslöserWannVariablen
Client getrenntEin snapclient verlässt den Server (Lautsprecher aus, Netzwerk weg)Client-Name
Client verbundenEin snapclient verbindet sich wieder mit dem ServerClient-Name
Stream gestartetAuf einem Stream kommt Ton an (jemand spielt über Spotify…)Stream, Titel, Interpret
Stream gestopptEin Stream hört auf zu spielen (pausiert, kein Ton mehr)Stream, Titel, Interpret

Jeder Auslöser lässt sich auf einen Client oder einen Stream beschränken. Nichts wird ausgelöst für das, was passiert, während der Server selbst nicht erreichbar ist.

Szenen-Aktionen​

AktionWas sie tut
Lautstärke eines Raums einstellenLautstärke eines Clients, 0 bis 100
Überall stumm schalten oder Ton anAlle Clients des Servers; gibt zurück, wie viele geändert wurden
Anderen Stream in einem Raum spielenDie Gruppe des Clients wechselt auf den gewählten Stream
Stream steuernAbspielen, Pause, Abspielen/Pause, weiter, zurück, bei einem Stream oder dem eines Raums
Zwei Räume gruppierenDer erste Client tritt der Gruppe des zweiten bei, synchron
Raum aus der Gruppe lösenDer Client bildet eine eigene Gruppe, gleicher Stream

Lautstärke, Stummschaltung und Stream eines Raums lassen sich auch mit der Standardaktion „Gerätewert setzen“ von Gladys einstellen.

Szenen-Beispiele​

  • Ruhige Nacht: um 23 Uhr „Überall stumm schalten oder Ton an“ → Stumm. Um 7 Uhr Ton an.
  • Morgenradio: werktags um 7 Uhr „Anderen Stream in einem Raum spielen“ → Küche, Stream Radio, dann „Lautstärke eines Raums einstellen“ → Küche, 30.
  • Die Musik folgt dir: bei „Stream gestartet“ von Spotify „Zwei Räume gruppieren“ → das Wohnzimmer tritt der Küche bei.
  • Lautsprecher ausgesteckt: bei „Client getrennt“ im Bad eine Nachricht senden.

Fehlerbehebung​

  • „Der Snapcast-Server antwortet nicht“: Prüfe die Adresse, ob snapserver läuft und ob der Port der TCP-Steuerport ist (standardmäßig 1705), weder der Stream-Port 1704 noch der HTTP-Port 1780. Eine Firewall muss Gladys durchlassen.
  • Ein Raum zeigt „Offline“: Sein snapclient ist nicht mit dem Server verbunden (Rechner aus, falsche Serveradresse auf dem Client).
  • „Dieser Stream lässt sich nicht steuern“: Der Stream hat kein Steuerskript. Nutze eine Quelle, die ihren Player meldet (librespot, MPD mit meta_mpd.py…), oder steuere den Player selbst.
  • Ein Stream zeigt „Inaktiv“, obwohl sein Player spielt: Bei snapserver kommt kein Ton an; Snapcast meldet, was es empfängt.
  • Mehr Details: Setze den LOG_LEVEL der Integration auf debug.

Einschränkungen​

  • Ein Snapcast-Server pro Integration.
  • Keine Authentifizierung: Der Steuerport von snapserver hat standardmäßig keine. Ein Server, der eine verlangt (Option neuerer Versionen), wird nicht unterstützt.
  • Kein Gerät pro Gruppe (siehe Streams); die Latenz eines Clients und die Namen stellst du in Snapweb ein.
  • Ein Raum-Gerät erhält Zufallswiedergabe und Wiederholen, sobald ein Stream des Servers sie meldet (siehe Musik-Player): Gladys bietet dann Aktualisieren an.
  • Der Aufbau eines Stream-Geräts hängt von seinem Steuerskript ab: Wird ein Stream später steuerbar, bietet Gladys im Tab Erkennung Aktualisieren an.
  • Getestet mit snapserver und snapclient 0.31 in Docker, mit einem Pipe-Stream und einem geskripteten Player, ohne Lautsprecher. Rückmeldungen im Forum sind willkommen.

Konfigurationseinstellungen​

Diese Einstellungen fragt Snapcast in seinem Konfigurationsbildschirm in Gladys ab.

EinstellungTypPflichtfeldBeschreibung
Verbinde deinen Snapcast-ServersectionNeinGib die Adresse des Rechners ein, auf dem snapserver läuft. Die Integration nutzt seinen JSON-RPC-Steuerport (TCP 1705, standardmäßig aktiv) und folgt jeder Änderung live. Jeder snapclient wird ein Gerät (ein Raum), jeder Stream auch.
ServeradressestringJaIP-Adresse oder Hostname von snapserver. Ergänze :Port, wenn sein Steuerport nicht 1705 ist.
SteuerportnumberNeinTCP-Port der JSON-RPC-Steuerung (Abschnitt tcp von snapserver.conf). Nicht der HTTP-Port 1780.
OptionensectionNeinSprache der Namen und Texte, die die Integration erzeugt (Funktionsnamen werden beim Hinzufügen des Geräts festgelegt).
SpracheselectNein

So installierst du Snapcast in Gladys​

  1. Öffne in Gladys Integrationen: Snapcast erscheint im Katalog neben den nativen Integrationen, mit einem Community-Badge.
  2. Klicke auf Installieren. Gladys lädt das Docker-Image (ghcr.io/guim31/gladys-snapcast:1.1.0) herunter, startet es in einer vom Kern isolierten Sandbox und erzeugt die Oberfläche der Integration (Geräte, Erkennung und Konfiguration).
  3. Öffne den Bildschirm Konfiguration der Integration, fülle die Einstellungen aus und speichere.
  4. Du kannst sie auch direkt über die URL ihres Repositorys installieren: https://github.com/guim31/gladys-snapcast.

Snapcast benötigt Gladys >=5.3.0. Der Katalog in Gladys wird stündlich aktualisiert, eine neue Version ist also spätestens eine Stunde nach ihrer Veröffentlichung verfügbar.

Du nutzt Gladys noch nicht? Es ist kostenlos und Open Source: folge der Installationsanleitung, um loszulegen.

Über externe Integrationen​

Snapcast ist eine externe Integration: eine Community-Integration, die als Docker-Container verpackt und auf GitHub veröffentlicht wird. Gladys installiert sie mit einem Klick und führt sie in einer vom Kern isolierten Sandbox aus. Sie wird von guim31 veröffentlicht und gepflegt, nicht vom Gladys-Kernteam.

Abonniere den Newsletter von Gladys Assistant

Ein paar E-Mails im Monat zu neuen Releases und Neuigkeiten aus dem Projekt. Verschickt von Pierre-Gilles Leymarie, dem Gründer des Projekts. Jederzeit abbestellbar 🙂