Flow: Squeezebox

Squeezebox

Hier ist meine simple Umsetzung des Squeezebox-Http-Protokolls für Node-Blue. Umsetzung ist schon fast zuviel gesagt.

So sieht das Ding in Benutzung aus:

MAn füllt über die Template-Node folgende JSON-Struktur aus:

{   
    "p0": "",
    "p1": "",
    "p2": "",
    "p3": "",
    "p4": "",
    "server": "", 
    "port": "",
    "player": "" 
}

Die Werte für p0 bis p4 sind der folgenden Tabelle zu entnehmen:

p0 p1 p2 p3 p4 Description
play Start the player playing
pause (0,1,) Pause/unpause player. p1=1 to pause, p1=0 to unpause, omit p1 to toggle
stop Stop the player
sleep (0…n) (Play for p1 seconds and then sleep
playlist play Replace the current playlist with the song, playlist or directory specified by p2
playlist add Append the song, playlist or directory specified by p2 to the end of the current playlist
playlist insert Insert the song, playlist or directory specified by p2 to be played immediately after the current song.
playlist resume Replace the current playlist with the playlist specified by p2, starting at the song that was playing when the file was saved. (Resuming works only with M3U files saved with the playlist save command below.) Shortcut: use a bare playlist name (without leading directories or trailing .m3u suffix to load a playlist in the saved playlists folder.
playlist loadalbum Replace the current playlist with all songs for a given genre, artist, and album. Use a value of “*” for p2, p3, or p4 as a wildcard. Note: the server’s cache must contain the items for this to work.
playlist save Save a playlist file in the saved playlists directory. Accepts a playlist filename (without .m3u suffix) and saves in the top level of the playlists directory.
playlist addalbum Add all songs for a given genre, artist, and album. Use a value of “*” for p2, p3, or p4 as a wildcard. Note: the server’s cache must contain the items for this to work.
playlist clear Clear the current playlist
playlist repeat (0,1,2,) Change the repeat mode. p1=0 no repeat, stop at the end of the playlist, p1=1 repeat the current song, p1=2 repeat the entire playlist. Omit p1 to cycle through values.
playlist shuffle (0,1,2,) Shuffle the playlist. p1=0 no shuffle, p1=1 shuffle songs in the playlist, p1=2 shuffle albums in the playlist. Omit p1 to toggle shuffle mode.
playlist move Move the song in the offset specified by p2 to the offset specified by p3 in the playlist.
playlist delete Delete the song in the playlist at the offset specified by p2
playlist jump Make the song at the offset specified by p2 in the playlist the currently playing song
mixer volume (0 … 100) (-100 … +100)
mixer balance (0 … 100) (-100 … +100)
mixer base (0 … 100) (-100 … +100)
mixer treble (0 … 100) (-100 … +100)
status Return the current status of the player without any change.
display Put text on the player’s display. line 1 is specified by p1, line 2 is specified by p2. The text is displayed for a number of seconds as specified by p3. If p3 is omitted, then a default time is used of approximately 1.5 seconds.
button Simulate a button press from the infrared remote, where is a function name per the Default.map file.
rescan Start a rescan of the music library
pref Set the value of a preference. Use a value of “?” to get the value in the returned p2 header
pref ? Get the value of a preference. The value is returned in the returned p2 header
playerpref Set the value of a player specific preference. Use a value of “?” to get the value in the returned p2 header
playerpref ? Get the value of a player-specific preference. The value is returned in the returned p2 header
debug Set the value of a debugging variable, for example, set “d_ir” to “1” to have infrared debugging output.

Der Subflow ist im Gegensatz dazu ziemlich einfach:

image

squeezebox.txt (619 Bytes)

3 Likes

Im aktuellen Nightly ist die Squeezebox-Node enthalten. (Meine erste Node :smiley: )

image

Die neue Node ist kompatibel zum obigen Subflow. Man kann die ganzen Parameter entweder wie beim Subflow in ein Json verpacken, oder aber in der Node direkt angeben. Es müssen nicht alle Parameter im Json vorhanden sein, alles was nicht im Json ist, wird aus der Konfiguration der Node genommen.

4 Likes

Da unser WLan-Radio im Bad Mucken macht und ich noch eine selbstgebaute Squeezebox von der Terasse übrig habe, hab ich mal @job’s Anbindung ein wenig überarbeitet.

Da ich noch nicht die nightly sondern nur testing einsetze, habe ich den passenden Node noch nicht. Also habe ich den Subflow zum http-Request an den Logitech Media Server übernommen. Angebunden habe ich einen 4fach-EnOcean-Taster, der beim Drücken true sendet und wenn mann loslässt false.

Funktionen sind:

  • play/stop auf einem Taster
  • laut/leiser mit Taster halten in 5%-Schritten
  • durch Playlist springen

Die Serverkonfiguration wird in “set player vars” vorgenommen. Dort habe ich auch noch was eingebaut, damit man einen Array mit Parametern übergeben kann, der dann einfach in p0...p3 gefüllt wird. Wichtig auch, dass die Parameter urlencodet werden, bevor sie an den LMS gesendet werden.
Die Playlist ist ein Array mit Stream URL’s in “cycle playlist” und kann natürlich nach den eigenen Wünschen angepasst werden.

Übergangsweise habe ich dilletantisch Aufkleber auf den Tastern angebracht :stuck_out_tongue_closed_eyes:

Gruß,
p

4btn-lms-control.txt (6,0 KB)

2 Likes

Hab das mal direkt versucht nachzubauen. Bin bislang daran gescheitert, dass mein Merten Multitouch Pro im Bad keinen Status sondern Bool-Werte zurück gibt. Aber schöne Lösung!

Der STATE der enocean-Taster is während des drückens true und beim loslassen false.
Sollte also auch funktionieren. Ansonsten mit Rising-Edge filtern…

Ich bin mir nicht sicher, ob die nodes nicht trotzdem funktionieren. Die sind sowieso nicht im Build, die müssen aktuell selbstständig gebaut werden.

git clone https://github.com/Homegear/homegear-nodes-optional -bdev

Die debs werden dann über ./buildPackages.sh gebaut.

1 Like

So, mal mit aktueller nightly (2835) umgebaut, da es da endlich einen Round-Robin-node gibt. Press-Pattern hat auch endlich eine konfigurierbare Zahl an Ausgängen. Bei Doppelklick auf die Playlist-Taste wird jetzt auf den ersten Eintrag gesprungen. Das hatte ich vorher in PHP schon mal programmiert, geht aber so völlig ohne function-node.
RES des Round-Robin-Nodes setzt nur den Index auf 0. D.h. ohne weiteren Trigger passiert nichts. Deswegen ist der zeifach-Ausgang vom Press-Patern auf beide Eingänge gelegt.
Zusätzlich hatte ich das Problem, dass das Interval für laut/leise schon mal von alleine losgelaufen ist, bei undefiniertem Eingang. Hier jetzt zur Sicherheit beim Start auf false.

Tastereingänge kommen übrigens mittlerweile aus ner Beckhoff, verhalten sich aber analog zu EnOcean. Es wird true/false erwartet.

[{"id":"cba31730.f3eb7","type":"http-request","namespace":"http","z":"709092c6.e1d954","name":"","method":"GET","ret":"txt","url":"","usetls":false,"basicauth":false,"x":715,"y":870,"wires":[[]]},{"id":"7e29856e.3f0bac","type":"link-out","namespace":"link","z":"709092c6.e1d954","name":"","links":["7343b3e5.78cfbc"],"x":865,"y":480,"wires":[]},{"id":"cffb23d2.974cb","type":"function","namespace":"function","z":"709092c6.e1d954","name":"volume +5","func":"$message['payload'] = ['mixer', 'volume', '+5'];\nreturn $message;","inputs":1,"outputs":1,"noerr":0,"x":700,"y":480,"wires":[[{"id":"7e29856e.3f0bac","port":0}]]},{"id":"b2bce024.b13f3","type":"function","namespace":"function","z":"709092c6.e1d954","name":"volume -5","func":"$message['payload'] = ['mixer', 'volume', '-5'];\nreturn $message;","inputs":1,"outputs":1,"noerr":0,"x":700,"y":600,"wires":[[{"id":"7e29856e.3f0bac","port":0}]]},{"id":"8734b934.69f57","type":"change","namespace":"basic-logic","z":"709092c6.e1d954","name":"1Live","rules":[{"t":"set","p":"payload","pt":"message","to":"http://www.wdr.de/wdrlive/media/einslive.m3u","tot":"string"}],"x":730,"y":670,"wires":[[{"id":"7efe5ab1.a5669c","port":0}]]},{"id":"57493be1.b40d0c","type":"change","namespace":"basic-logic","z":"709092c6.e1d954","name":"YouFM","rules":[{"t":"set","p":"payload","pt":"message","to":"http://metafiles.gl-systemhaus.de/hr/youfm_2.m3u","tot":"string"}],"x":730,"y":710,"wires":[[{"id":"7efe5ab1.a5669c","port":0}]]},{"id":"2f13ef60.0ee1f8","type":"change","namespace":"basic-logic","z":"709092c6.e1d954","name":"Delta Radio Kiel","rules":[{"t":"set","p":"payload","pt":"message","to":"http://streams.deltaradio.de/101/mp3-128/streams.deltaradio.de/play.m3u'","tot":"string"}],"x":755,"y":750,"wires":[[{"id":"7efe5ab1.a5669c","port":0}]]},{"id":"9f05f3c7.af2ba","type":"change","namespace":"basic-logic","z":"709092c6.e1d954","name":"YouFM JustMusic","rules":[{"t":"set","p":"payload","pt":"message","to":"http://metafiles.gl-systemhaus.de/hr/youfm_justmusic.m3u","tot":"string"}],"x":760,"y":790,"wires":[[{"id":"7efe5ab1.a5669c","port":0}]]},{"id":"7efe5ab1.a5669c","type":"function","namespace":"function","z":"709092c6.e1d954","name":"set playlist","func":"$message['payload'] = [\n    'playlist', \n    'play', \n    $message['payload']\n];\nreturn $message;","inputs":1,"outputs":1,"noerr":0,"x":910,"y":640,"wires":[[{"id":"7e29856e.3f0bac","port":0}]]}]
1 Like

Warum hast du dann nicht die Squeezebox-Node benutzt? :wink:

Oh, sorry. Soweit dann doch noch nicht umgebaut…

ii  homegear-nodes-core            0.8.0-2835                          armhf        Core nodes for Homegear's Node-BLUE
ii  homegear-nodes-extra           0.8.0-2835                          armhf        Extra nodes for Homegear's Node-BLUE

Wobei ich keinen Squeezebox node habe. Die musste ich über gihtub installieren, ne?

Nein, über node-Blue.

1 Like

Wie zeige ich da “alle” an?

Und irgendwas funktioniert nicht :wink:

gar nicht :frowning:

Aber du musst nur eine Buchstaben tippen… wenn du also ein “e” kaufst, findest du viele. :wink:

1 Like

Stell mal node-blue auf Englisch, da fehlt die Übersetzung.

Hab ich, keine Änderung…

(inkl. cache-reload des Browsers)

OK…

Auch ab-/anmelden hat nicht geholfen.
Egal, zu spät heute. Morgen wieder :+1:

was sagt denn:

ls /var/lib/homegear/node-blue/nodes/multimedia/squeezebox.hni

oder

find /var/ -name *.hni | sort

root@homegear:/home/pi# ls /var/lib/homegear/node-blue/nodes/multimedia/squeezebox.hni
/var/lib/homegear/node-blue/nodes/multimedia/squeezebox.hni

Ist da. node-blue wird bei mir aber auch nach der Einstellung auf Englisch immer noch in Deutsch angezeigt. Liegt also wahrscheinlich da dran.