Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

Begonnen von Otto123, 31 Mai 2020, 18:30:55

Vorheriges Thema - Nächstes Thema

kjmEjfu

Ich wollte nur fragen :-)

Ihr habt die Hauptarbeit gemacht und jetzt kommt die Fleißarbeit. Das kann in die eine oder andere Richtung gehen. Wir sollten uns halt nur einigen, damit die nicht eventuell doppelt gemacht werden muss.
Migriere derzeit zu Home Assistant

Otto123

Moin,

mir fiel am WE ein: ich hatte noch eine andere Intension, die eben genau ein "generisches" Device bevorzugt. Als wir mit sonos2mqtt begannen, war der Modulautor von SONOS gerade irgendwie "nicht verfügbar" und es gab ein paar Probleme zu lösen. Also war der Ansatz: möglichst nur existierenden "Basics" von FHEM nehmen und daraus eine funktionierende Anbindung zu bauen. Da kann in der Not jeder auch immer wieder helfen und eingreifen. Mit den großen speziellen Modulen die es in FHEM gibt wird das immer schwierig.
BTW - sehe ich die Entwicklung von immer mehr "eigene kompletten Automatisierungslösungen"  in FHEM, die quasi "alles" in einem Modul können, immer kritischer.

Insofern wollte ich erstmal die Automatisierung von Sonos mit mqtt realisieren und weniger die Optik der Darstellung duplizieren. Ich weiß, dazu gibt es viele unterschiedliche Ansichten.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Zitat von: kjmEjfu am 24 Oktober 2020, 11:13:26
du meinst in dem Fall https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV ? Macht Sinn.
Würde aber z.B. bedeuten, dass wir das beliebte "speak" durch ein "sayText" ersetzen oder [...]
Genau diese Guidlines waren gemeint, und ja, das würde bedeuten, dass das Sonos-Modul _im normalen Modus_ ggf. zu ändern wäre.

Zitat
Jetzt verwirrst du mich.
Das war nicht so zu verstehen, dass das MQTT-Device über das Sonos-Modul zu steuern sein sollte, sondern eben so, dass das "normale" Sonos-Ding eben auch (ggf. "featureleve-"abhängig) künftig die "üblichen" Konventionen einhält, so dass dann für "neue User" der Umstieg - zwischen welchem AV-"Modul"/Gerät zu einem anderen auch immer - einfacher wäre.
In dieser Denke ist das Sonos-Modul mit den heutigen Readings lediglich ein "legacy"-Typ. (Hoffe, das ist jetzt irgendwie klarer, und nein, das ist nicht als Vorwurf an den Maintainer gemeint).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

FunkOdyssey

Weiß jemand wie man erkennen kann, ob eine gültige Spotify-Sitzung im Sonosplayer vorhanden ist?
Ich möchte es automatisieren, dass ansonsten ein Radio-Stream gestartet wird, wenn keine Playliste/kein Titel geladen ist.

Otto123

Ich bin nicht sicher was Du mit Sitzung meinst? Ich mache z.B. sowas:
defmod n_AZ1 notify PIR3:motion:.* {\
     if (ReadingsVal("Sonos_Wohnzimmer","infoSummarize1","") =~ /Deutschlandfunk.Kultur/ \
        and ReadingsVal("Sonos_Wohnzimmer","state","") eq "PLAYING"\
    and ReadingsVal("Sonos_Arbeitszimmer","transportState","") ne "PLAYING"\
    )\
{fhem("set Sonos Groups [Sonos_Wohnzimmer,Sonos_Arbeitszimmer]")}\
}
Wenn Bewegung im Arbeitszimmer und im Wohnzimmer läuft DFK dann füge das Arbeitszimmer dazu.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

kjmEjfu

Zitat von: FunkOdyssey am 26 Oktober 2020, 18:01:40
Weiß jemand wie man erkennen kann, ob eine gültige Spotify-Sitzung im Sonosplayer vorhanden ist?
Ich möchte es automatisieren, dass ansonsten ein Radio-Stream gestartet wird, wenn keine Playliste/kein Titel geladen ist.

Schau mal im Player in das Reading currentTrack_TrackUri. Im Falle von Spotify müsste es anfangen mit: x-sonos-spotify
Migriere derzeit zu Home Assistant

FunkOdyssey

Zitat von: Otto123 am 26 Oktober 2020, 21:57:13
Ich bin nicht sicher was Du mit Sitzung meinst? Ich mache z.B. sowas:
defmod n_AZ1 notify PIR3:motion:.* {\
     if (ReadingsVal("Sonos_Wohnzimmer","infoSummarize1","") =~ /Deutschlandfunk.Kultur/ \
        and ReadingsVal("Sonos_Wohnzimmer","state","") eq "PLAYING"\
    and ReadingsVal("Sonos_Arbeitszimmer","transportState","") ne "PLAYING"\
    )\
{fhem("set Sonos Groups [Sonos_Wohnzimmer,Sonos_Arbeitszimmer]")}\
}
Wenn Bewegung im Arbeitszimmer und im Wohnzimmer läuft DFK dann füge das Arbeitszimmer dazu.

Danke. Das kenne ich vom klassischen Sonos-Modul auch. Das Reading infoSummarize1 deutet auch stark darauf hin, dass du hier noch nicht die Sonos2Mqtt-Lösung nutzt, oder?

Bei der Mqtt-Variante ist das schwieriger zu erkennen.

Zitat von: kjmEjfu am 27 Oktober 2020, 07:47:27
Schau mal im Player in das Reading currentTrack_TrackUri. Im Falle von Spotify müsste es anfangen mit: x-sonos-spotify

Danke, ich habe die Readings auch beobachtet. Aber teilweise hat der Sonosplayer keine gültige Spotify-Sitzung und das obwohl scheinbar ein Track geladen ist.
Würde ich dann ein "set xyz play" ausführen, dann findet keine Wiedergabe statt.

Ich suche mal weiter und melde mich, wenn ich etwas in Erfahrung bringen konnte.

kjmEjfu

spielst du aus der Spotify-App auf Sonos ab oder Spotify aus der Sonos-App?
Könnte eventuell einen Unterschied machen, weil Sonos ja quasi "kontoneutral" auf Spotify abgreift, damit sie mit einem Konto auf jeder Box unterschiedlich abspielen können.

Wenn ich aus der Sonos-App abspiele, ist auch

currentTrack_ProtocolInfo sonos.com-spotify:*:audio/x-spotify:*

entsprechend gesetzt
Migriere derzeit zu Home Assistant

Otto123

@FunkOdyssey Mein Beispiel war eher um nachzufragen was Du wirklich meinst :) Aber ja, meine Automatismen laufen teils noch auf dem Sonos Modul.

Du meinst sowas wie den currentTrackProvider - den gibt es unter mqtt nicht, oder "wir" haben ihn nicht aktiviert?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

kjmEjfu

Zitat von: Otto123 am 27 Oktober 2020, 11:27:18
Du meinst sowas wie den currentTrackProvider - den gibt es unter mqtt nicht, oder "wir" haben ihn nicht aktiviert?

der sollte sich aber aus currentTrack_ProtocolInfo ableiten lassen.

Wir hätten da:
sonos.com-spotify:*:audio/x-spotify:* -> Spotify
sonos.com-http:*:*:* -> Stream

Wobei, wenn ich mir gerade meinen Radiostream anschaue, dann ist currentTrack_TrackUri doch aussagekräftiger.
x-sonosapi-stream:tunein:5191?sid=303&flags=8224&sn=11 -> TuneIn
Bei Spotify steht dort sowas x-sonos-spotify:spotify:track:..... -> Spotify

Könnte man also nehmen und dann, weil https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV nix vorgibt, nach currentMediaSource speichern.

ins Userreading:
currentMediaSource { if (lc((ReadingsVal($name,"currentTrack_TrackUri","")) =~ m/tunein/)) {return "TuneIn"} elsif (lc((ReadingsVal($name,"currentTrack_TrackUri","")) =~ m/spotify/)) {return "Spotify"}else {return "unknown"} ;}

geht bestimmt schöner ;-)
Migriere derzeit zu Home Assistant

Beta-User

Zitat von: kjmEjfu am 27 Oktober 2020, 12:24:53
Könnte man also nehmen und dann, weil https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV nix vorgibt, nach currentMediaSource speichern.
fyi: Das "einfach mal machen" ist nicht verboten, aber evtl. würde es Sinn machen, dazu mal einen gesonderten Thread aufzumachen:
Zitat von: Beta-User am 17 April 2020, 12:30:28
Vielleicht hier etwas OT, aber thematisch paßt es aus Usersicht evtl. ganz gut rein:

Wir hatten grade das Thema "sinnvolle Namensgebung" bei Readings usw. rund um eine bestimmte Ladestation für E-Autos (go-echarger, diese Threads: MQTT-Weg  und spezielles Modul).

Was z.B. Multimedia-Geräte angeht, habe ich gestern erst wahrgenommen, dass es sowas für Multimedia schon gibt (https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV) und eben das hier gefunden: (https://wiki.fhem.de/wiki/DevelopmentGuidelinesReadings).

Das ist alles irgendwie noch nicht so richtig miteinander verknüpft und sehr bruchstückhaft...
Vielleicht mag sich jemand (oder eine Gruppe von Leuten) mal die Mühe machen, einen deutlich umfassenderen Vorschlag dazu zu erarbeiten bzw. das nach und nach erweitern? Das würde jedenfalls aus usersicht (und teils auch aus Ansteuerungssicht untereinander) m.E. einiges an verbessertem "Look and feel" bringen und wir würden nicht nachlaufend dann jeweils Reparaturen machen oder historische Zufälle zum Maß der Dinge machen...

Zitat
ins Userreading:
currentMediaSource { if (lc((ReadingsVal($name,"currentTrack_TrackUri","")) =~ m/tunein/)) {return "TuneIn"} elsif (lc((ReadingsVal($name,"currentTrack_TrackUri","")) =~ m/spotify/)) {return "Spotify"}else {return "unknown"} ;}

geht bestimmt schöner ;-)
Ja. 1. mit trigger (!) und 2. mit "schnellem return". Ungetestet:
currentMediaSource:currentTrack_TrackUri.* { return "TuneIn" if ReadingsVal($name,"currentTrack_TrackUri","") =~ m/tunein/i; return "Spotify" if ReadingsVal($name,"currentTrack_TrackUri","") =~ m/spotify/i; return "unknown";}
Und wenn man noch mehr hat, ist es übersichtlicher, das ganze als Hash-lookup zu schreiben, ähnlich z.B. zum go_eCharger. Die Regex wäre dann halt sowas in der Art hier:
[^:]+:([^:]+):.+
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Zitat von: kjmEjfu am 27 Oktober 2020, 12:24:53
Wobei, wenn ich mir gerade meinen Radiostream anschaue, dann ist currentTrack_TrackUri doch aussagekräftiger.
Ich denke auch dort steht - etwas codiert - das wichtigste drin. Jetzt kann man dort irgendwie was zusammen puzzeln - ich denke der Klartext steht auch irgendwo dort in einem Konfigurations XML http://playerip:1400/xml/device_description.xml

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

kjmEjfu

Zitat von: Beta-User am 27 Oktober 2020, 12:44:55
fyi: Das "einfach mal machen" ist nicht verboten, aber evtl. würde es Sinn machen, dazu mal einen gesonderten Thread aufzumachen:

Bin ich bei dir, aber da gibt es weitaus erfahrenere Entwickler, die so ein Thema voran bringen können. Ich glaube, die festgelegten Readings für Batterie haben sich auch noch nicht überall durchgesetzt ...

Zitat von: Beta-User am 27 Oktober 2020, 12:44:55
Ja. 1. mit trigger (!) und 2. mit "schnellem return". Ungetestet:
currentMediaSource:currentTrack_TrackUri.* { return "TuneIn" if ReadingsVal($name,"currentTrack_TrackUri","") =~ m/tunein/i; return "Spotify" if ReadingsVal($name,"currentTrack_TrackUri","") =~ m/spotify/i; return "unknown";}
Und wenn man noch mehr hat, ist es übersichtlicher, das ganze als Hash-lookup zu schreiben, ähnlich z.B. zum go_eCharger. Die Regex wäre dann halt sowas in der Art hier:
[^:]+:([^:]+):.+

Danke, nach so einem Beispiel habe ich gesucht :-)
Frage: wieso würdest du das per trigger lösen?

Wegen dem Beispiel go_eCharger meinst du diesen Thread? https://forum.fhem.de/index.php/topic,105457.0.html Ich versuche deinen Hinweis auf Hash-Lookup (der wäre ja vermutlich gerade für das Anpassen der Readings auf die Guideline sinnvoll) zu verstehen. Ist für einen Copy&Past'ler nicht so einfach ;-)
Migriere derzeit zu Home Assistant

Beta-User

Zitat von: kjmEjfu am 27 Oktober 2020, 13:21:17
Bin ich bei dir, aber da gibt es weitaus erfahrenere Entwickler, die so ein Thema voran bringen können. Ich glaube, die festgelegten Readings für Batterie haben sich auch noch nicht überall durchgesetzt ...
Danke für die "Vorlage": Das Problem mit battery ist, dass es erst den Wildwuchs gab und dann die Konvention! Daher meine dringliche Anregung, erst zu fragen, was denn eine sinnvolle Konvention ist, bevor man hinterher darüber diskutiert, wer denn jetzt sinnvollerweise was in welche Richtung anpassen soll...!

Und diese Diskussion können (eigentlich auch und gerade) erfahrene User auch gut führen... (Will sagen: sehr schwache Ausrede!)

Zitat
Danke, nach so einem Beispiel habe ich gesucht :-)
Frage: wieso würdest du das per trigger lösen?
Gerne, und die Frage nach "wieso" verstehe ich nicht. Die Frage ist, wann der Code ausgeführt werden soll. "trigger" schränkt das von "bei jeder Aktualisierung von irgendwas" auf "dann, wenn sinnvoll" ein... Von daher ist meine ganz pauschale Antwort: trigger ist eigentlich keine optionale Angabe, sondern verpflichtend!
Zitat
Wegen dem Beispiel go_eCharger meinst du [...] Ist für einen Copy&Past'ler nicht so einfach ;-)
Jein, eigentlich ist hier der dort entstandene Quelltext gemeint gewesen, zu finden z.B. ab hier: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L3941
Und ja, das ist alles nicht einfach, aber ich habe auch mit c&p angefangen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

kjmEjfu

Zitat von: Beta-User am 27 Oktober 2020, 13:52:09
Danke für die "Vorlage": Das Problem mit battery ist, dass es erst den Wildwuchs gab und dann die Konvention! Daher meine dringliche Anregung, erst zu fragen, was denn eine sinnvolle Konvention ist, bevor man hinterher darüber diskutiert, wer denn jetzt sinnvollerweise was in welche Richtung anpassen soll...!

Und diese Diskussion können (eigentlich auch und gerade) erfahrene User auch gut führen... (Will sagen: sehr schwache Ausrede!)

Treffer. Versenkt! ;-)

Zitat von: Beta-User am 27 Oktober 2020, 13:52:09
Gerne, und die Frage nach "wieso" verstehe ich nicht. Die Frage ist, wann der Code ausgeführt werden soll. "trigger" schränkt das von "bei jeder Aktualisierung von irgendwas" auf "dann, wenn sinnvoll" ein... Von daher ist meine ganz pauschale Antwort: trigger ist eigentlich keine optionale Angabe, sondern verpflichtend!

Ok, das Problem war vor dem Bildschirm. Hab es nicht richtig verstanden gehabt, jetzt ist es klar.

Zitat von: Beta-User am 27 Oktober 2020, 13:52:09
Jein, eigentlich ist hier der dort entstandene Quelltext gemeint gewesen, zu finden z.B. ab hier: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L3941
Und ja, das ist alles nicht einfach, aber ich habe auch mit c&p angefangen...

Ok, gefunden. Baue ich mal nach :-)


Darf ich dich mit noch etwas nerven?
Aktuell bauen wir die ReadingList ja u.a. so auf:

$DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }

dadurch bekommen wir die Readings, die von den Guidelines abweichen.
Wenn ich nun statt dem Reading currentTrack_Title das Reading currentTitle füllen wollen würde, wie müsste man das umbauen? Gibt es da eventuell ein verständliches Beispiel?

In dem entsprechenden Topic sieht es z.B. so aus

{"uuid":"RINCON_B8E93729518A01400","name":"Wohnzimmer","groupName":"Wohnzimmer","coordinatorUuid":"RINCON_B8E93729518A01400","currentTrack":{"Album":"Back In Black","Artist":"AC/DC","AlbumArtUri":"http://192.168.178.30:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:08mG3Y1vljYA6bvDt4Wqkj%3fsid%3d9%26flags%3d8224%26sn%3d3","Title":"Back In Black","UpnpClass":"object.item.audioItem.musicTrack","Duration":"0:04:15","ItemId":"-1","ParentId":"-1","TrackUri":"x-sonos-spotify:spotify:track:08mG3Y1vljYA6bvDt4Wqkj?sid=9&flags=8224&sn=3","ProtocolInfo":"sonos.com-spotify:*:audio/x-spotify:*"},"enqueuedMetadata":{"Artist":"Spotify","AlbumArtUri":"https://i.scdn.co/image/ab67706f00000002519fc8771d90f496501a4da3","Title":"Rock Classics","UpnpClass":"object.container.playlistContainer#playlistItem","ItemId":"0006002cspotify%3aplaylist%3a37i9dQZF1DWXRqgorJj26U","ParentId":"0"},"transportState":"PLAYING","playmode":"NORMAL","ts":1603806343017,"volume":{"Master":5,"LF":100,"RF":100},"mute":{"Master":false,"LF":false,"RF":false},"bass":0,"treble":0,"nextTrack":{"Album":"The Rolling Stones In Mono (Remastered 2016)","Artist":"The Rolling Stones","AlbumArtUri":"http://192.168.178.30:1400/getaa?s=1&u=x-sonos-spotify:spotify:track:1RJeiAIwR9pZBgJA8ndZLL%3fsid%3d9%26flags%3d8224%26sn%3d3","Title":"Paint It, Black - Mono","UpnpClass":"object.item.audioItem.musicTrack","Duration":"0:03:24","ItemId":"-1","ParentId":"-1","TrackUri":"x-sonos-spotify:spotify:track:1RJeiAIwR9pZBgJA8ndZLL?sid=9&flags=8224&sn=3","ProtocolInfo":"sonos.com-spotify:*:audio/x-spotify:*"}}


Migriere derzeit zu Home Assistant