Sonos-Player über Tastsensor steuern (mit Auswahl Playlist)

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
cyrill.sneer
Beiträge: 17
Registriert: 25. Jan 2022 12:14

Sonos-Player über Tastsensor steuern (mit Auswahl Playlist)

Beitrag von cyrill.sneer »

Hallo zusammen,

auch auf die Gefahr für die Rule vor dem Hintergund von Siri/Alexa und Co und einem Tablet in jedem Raum ausgelacht zu werden, habe ich heute mal die Steuerung der Sonos-Player mittels Tastsenor (Jung RCD 3096) realisiert.
Hintergrund war eine möglichst einfache Steuerung ohne Handy für meinen kleinen Sohn und ein wenig Spieltrieb. Herausforderung dabei war, nur eine Schalterwippe zu verwenden.
Das Ergebnis möchte ich gern mit Euch teilen, auch wenn an vielen Stellen noch Spagetti-Code (insbeosondere Einbindung der Playlisten) ist.
Ich würde mich freuen wenn hier von Euch Anregungen kommen (Playlist via Datenbank oder aus Sonos auslesen). So denn...

Code: Alles auswählen

var String playlist= "Hotzenplotz"			//intitial
var int playlist_entry = 1			
var int playlist_select = 0

rule "Sonos Kinderzimmer Skip/Volume"
 when
    Item OG_KZ_Sonos_Skip_Vol received command										//Tastsensor als Dimmer (wiederholend sendend, Ein/Heller, Aus/Dunkler
 then
    switch receivedCommand {
        case OFF : {
			if (Sonos_KZ_State.state == "STOPPED") {
				playlist_entry = playlist_entry + 1									//Auswahl Playlist: bei Status STOP nächster Listeneintrag
				if (playlist_entry == 1) playlist = "Hotzenplotz"					
				if (playlist_entry == 2) playlist = "Petronella"
				if (playlist_entry == 3) playlist = "Radiosender"
				if (playlist_entry == 3) playlist_entry = 0
				//Auslesen der SONOS Playlisten mit dem binding nicht möglich. Am besten auslesen einer Datenbank oder die Spotify Playlisten auslesen...
				OG_KZ_Display_Seite2_Zeile2.sendCommand(playlist)						//Anzeige Playlist refresh
				}
			else {
				Sonos_KZ_Controller.sendCommand("PAUSE")
				OG_KZ_Display_Seite.sendCommand(1)									//Wechsel auf erste Seite (Standardansicht)
				OG_KZ_Info_Modus.sendCommand(1)										//Infomenüs einschalten
				Sonos_KZ_Clearquene.sendCommand(ON)									//Playlist löschen
				playlist_select = 0
				}
			}
        case ON : {
			switch Sonos_KZ_State.state {
				case "PLAYING" : {													//Pause wenn Play
					OG_KZ_Display_Seite.sendCommand(1)
					OG_KZ_Info_Modus.sendCommand(1)
					Sonos_KZ_Controller.sendCommand("PAUSE")
//				Sonos_KZ_Controller.sendCommand("NEXT")
				}
				case "PAUSED_PLAYBACK" : {											//Play wenn Pause					
					OG_KZ_Display_Seite.sendCommand(3)
					OG_KZ_Info_Modus.sendCommand(0)
					Sonos_KZ_Controller.sendCommand("PLAY")
				}
				case "STOPPED" : {													//Playlist Manü wenn Player gestoppt
					OG_KZ_Display_Seite.sendCommand(2)
					OG_KZ_Info_Modus.sendCommand(0)
					OG_KZ_Display_Seite2_Zeile1.sendCommand("Listenauswahl:")
					OG_KZ_Display_Seite2_Zeile2.sendCommand(playlist)						//Anzeige Playlist
					OG_KZ_Display_Seite2_Zeile3.sendCommand("^=OK v=Weiter")						
					if (playlist_select == 1) sendCommand(Sonos_KZ_Playlist, playlist)			//Playlist erst nach 2. "ON" laden
					playlist_select = playlist_select + 1			
				}
			}			
        }
        case INCREASE : {
            Sonos_KZ_Volume.sendCommand((Sonos_KZ_Volume.state as Number) + 3)
        }
        case DECREASE : {
            Sonos_KZ_Volume.sendCommand((Sonos_KZ_Volume.state as Number) - 3)
        }
    }
end


rule "Sonos Kinderzimmer Titelanzeige"
	when 
		Item Sonos_KZ_CurrentTrack changed
	then
		OG_KZ_Display_Seite.sendCommand(3)
		OG_KZ_Display_Seite3_Zeile1.sendCommand("Es läuft...")
//		OG_KZ_Display_Seite3_Zeile2.sendCommand(Sonos_KZ_CurrentArtist.state.toString.substring(0,14))
		OG_KZ_Display_Seite3_Zeile2.sendCommand(Sonos_KZ_CurrentTrack.state.toString.substring(0,14))
		OG_KZ_Display_Seite3_Zeile3.sendCommand(Sonos_KZ_CurrentTitle.state.toString.substring(0,14))
end
Die Bedienung ist simpel und funktioniert erstaunlich gut.
  • Lange drücken der Tasten nach oben/unten regelt die Lautstärke.
  • Wenn der Player gestoppt ist, startet ein kurzer Tastendruck nach oben (On) die Abbfrage welche Plalist abgespielt werden soll. Erneuter kurzer Druck startet die ausgewählte Playlist. Taste nach unten (Off) zeigt die nächste Playlist bis die erste wieder kommt.
  • Wenn der Player läuft bewirkt ein kurzer Tastendruck nach oben (On) Pause und Rückkehr auf die normale Menüebene des Testsensors. Erneuter Tastsruck nach oben setzt die Playliste an gleicher Stelle wieder fort.
  • Wenn Player läuft (und wenn Pause) kurzer Tastendruck nach unten (Off) und Player wird gestoppt. Die Playlist wird gelöscht und Rückkehr auf die normale Menüebene des Tastsensors.
  • Im Display des Tastsenors wird selbstverständlich der Titel und der Artist angezeigt. Naürlich nur 14 Zeichen (DPT 16.001)
Ich nutzt die Sonos-interen Playlisten.

Thats it. Anregungen gerne!

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Sonos-Player über Tastsensor steuern (mit Auswahl Playlist)

Beitrag von udo1toni »

Ich hab es mir jetzt nicht genauer angeschaut, aber auf den ersten Blick sieht der Code sehr kompakt aus (vor dem Hintergrund, was er leistet).

Da ich keine Displays habe, habe ich auf Playlisten verzichtet. Stattdessen bewirkt ein kurzer Tastendruck das Springen zum nächsten bzw. vorherigen Titel. Start und Stopp liegt auf einer eigenen Taste, weil die Player in den Badezimmern laufen, sprich es läuft los wenn man Licht an macht.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

cyrill.sneer
Beiträge: 17
Registriert: 25. Jan 2022 12:14

Re: Sonos-Player über Tastsensor steuern (mit Auswahl Playlist)

Beitrag von cyrill.sneer »

Hallo Udo,
ich habe zwischezeitlich ein paar kleine Anpassungen vegenommen, da es kleinere Fehler gab.
Was ich jetzt wirklich gern machen würde ist die Playlisten des jeweiligen Sonos Controllers auszulesen um die Listeneinträge nicht statisch im Code zu haben (Bastellösung).
Sonos hat die Möglichkeit via getplaylists die Playliste auszugeben. Das unterstütz das Sonos Binding derzeit aber leider noch nicht.
https://developer.sonos.com/reference/c ... playlists/
Mein Überlegung ist ein GET über das http-Binding auf den jeweiligen Controller und die Antwort in ein Array zu speichern. Hat jemand Erfahrungen a) mit der Sonos Steuerung über das http-Bindung und b) dem Einlesen der Antwort?

Code: Alles auswählen

{
  "version" : "1",
  "playlists" : [
    {
      "id" : "11",
      "name" : "Thursday Morning Mix",
      "type" : "playlist",
      "trackCount" : 50
    },
    {
      "id" : "17",
      "name" : "My Favorite Tracks",
      "type" : "playlist",
      "trackCount" : 17
    }
  ]
}
Konkret einmal die Anzahl der gepsiecherten Playlisten (als Zahl im Beispiel 2) und die Namen der Playlisten in ein Array?

cyrill.sneer
Beiträge: 17
Registriert: 25. Jan 2022 12:14

Re: Sonos-Player über Tastsensor steuern (mit Auswahl Playlist)

Beitrag von cyrill.sneer »

Hallo zussammen,
nach einem halb Jahr und weiteren kleineren Optimierungen bin ich mit der Rule zur Sonos-Steuerung via Tastsensor sehr zufrieden. Alles funktioniert wie gewünscht und mein Sohnmann hat etliche Plalisten zu Auswahl.

Jetzt würde ich aber sehr gerne das Problem mit den statischen Array für die Playlisten angehen und diese per hhtp-Binding aus dem Sonos-Player auslsen und ins das Array speichern.
Hat jemand eine Idee wie der get-Befehl für das binding aussehen muss?

Antworten