Sonos: Neue Version vom 14.5.

Begonnen von Reinerlein, 14 Mai 2017, 16:43:29

Vorheriges Thema - Nächstes Thema

Reinerlein

Hallo zusammen,

endlich mal wieder ein Update :) Es hat sich doch einiges angesammelt, aber da es auch stabil laufen soll, lief es auch einige Zeit auf meinem Teststand...

Im Wesentlichen ist die Abfrage der von Sonos per Webservice bereitgestellten Informationen zu den Musikanbietern hinzugekomnen. Dabei werden Name, Icon und Infotexte geladen.
Dadurch werden jetzt kleine rechteckige und runde Icons zur Verfügung gestellt, die auch in der Weboberfläche verwendet und angezeigt werden.
Für die nicht automatisch gelieferten Provider (wie Bibliothek und LineIn-Eingänge oder auch TuneIn) habe ich Icons gebaut, die dann ausgeliefert werden.

Außerdem habe ich die Prüfkommunikation zum SubProzess etwas umgebaut. Bislang konnte es passieren, dass eine Prüfabfrage durchgeführt wurde, obwohl gerade Daten übertragen wurden. Dabei konnte es zu blöden Zuständen kommen.
Nun wird nur noch abgefragt, wenn in dem letzten Zeitraum keinerlei Daten übertragen wurden. Damit sollten diese Überschneidungen Geschichte sein.

Des Weiteren gibt es jetzt ein Reading "currentSource", welches die Quelle für den aktuellen Titel angibt. Das kann der Name einer Sonos-Playliste sein, aber auch einer Spotify-Playliste oder ein Albumname.

Zusätzlich gibt es jetzt die Möglichkeit einen internen Mechanismus für die Simulation der currentTrackPosition zu aktivieren. Das Intervall dieser Simulation kann eingestellt werden, falls man nicht sekündlich ein Event in Fhem haben möchte :)

Eine große Änderung ist auch die jetzige Möglichkeit, die Cover- und Titelanzeige intern vom Modul durchführen zu lassen. Das bedeutet, dass die zusätzlichen Devices für die Titelanzeige (eine ReadingsGroup) und die Steuerung (ein RemoteControl, ein Weblink und ein Notify dazu) nicht mehr notwendig sind. Wer sie dennoch weiterhin verwenden möchte, kann die Darstellung in der Raumansicht wieder auf die DeviceZeile beschränken. In der Detailansicht bleibt die neue Anzeige aber immer bestehen.

Und ich habe natürlich mein Tablet-UI-Beispiel im Wiki angepasst. Dort werden vor Allem die neuen Features bzgl. der currentTrackPositionSimulation und die neuen ProviderIcons verwendet. Außerdem wird die aktuelle Quelle über dem Cover angezeigt...

Alle Änderungen im Detail:

  • FHEMWEB-Anzeige der Player auf die neu möglichen, nicht quadratischen, Radiocover angepasst.
  • In der Datei ControlPoint.pm wurde beim Öffnen des SSDP-Ports das Attribut ReusePort hinzugefügt (sofern das Betriebssystem das unterstützt).
  • Es gibt ein neues Reading "currentEnqueuedTransportHandle", welches zur Weitergabe der aktuellen Quelle des aktuellen Titels verwendet werden kann.
  • Es gibt zwei neue Readings "currentTrackHandle" und "nextTrackHandle", welche zur Weitergabe der aktuellen bzw. nächsten Wiedergabe geeignet sind.
  • Es gibt ein neues Reading "currentSource", welches (wenn beliefert) den Namen der Quelle des Titels angibt. Bei Spotify z.B. die gewählte Playliste oder das Album, oder die gewählte Sonos-Playliste.
  • Die Trackprovider werden jetzt über die verfügbaren, von Sonos bereitgestellten, MusicServices ermittelt.
  • (Fehlende) Radiocover werden nun über den offiziellen Webservice von Sonos ermittelt, und werden wieder geladen.
  • Etwaige, immer noch, fehlende Radiocover werden als Fallback wie bisher geladen. Das sollte aber nicht mehr vorkommen.
  • Spotify-Playlisten-Cover werden wieder geladen.
  • Teilweise wurden Bibliothekscover nicht geladen, das sollte wieder gehen.
  • Die Verbindungsprüfung zwischen Fhem-Modul und SubProzess erfolgt nur noch, wenn nicht sowieso schon Daten übertragen werden, und sollte dementsprechend nicht mehr dazwischenfunken.
  • Die Verbindungsprüfung und der grundsätzliche Verbindungsaufbau zum SubProzess wurden umgestellt.
  • Fehlermeldungen bei Fhem-Player-Such-Prozeduren verbessert.
  • Es gibt zwei (bzw. vier) neue Readings "TrackProviderIconRoundURL" und "TrackProviderIconQuadraticURL" (jeweils für "current" und für "next"). Mit diesen lassen sich die entsprechenden Provider-Icons anzeigen.
  • Die Titelanzeige in FhemWeb enthält nun auch die neuen Provider-Icons.
  • Detaildarstellung der SonosPlayer-Devices enthält jetzt auch die Coverdarstellung.
  • Bug in "SONOS_GetTimeFromString" behoben.
  • Es gibt zwei neue Attribute "simulateCurrentTrackPosition" und "simulateCurrentTrackPositionPercentFormat". Mit diesen kann man eine Simulation des Fortschritts von currentTrackPosition im gewählten Intervall aktivieren. Dabei werden die Readings "currentTrackPositionSimulated", "currentTrackPositionSimulatedSec" und "currentTrackPositionSimulatedPercent" (nur bei gelieferter "currentTrackDuration") aktualisiert.
  • Es gibt zwei neue Readings "currentTrackDurationSec" und "nextTrackDurationSec", welche die jeweilige Tracklänge in Sekunden angeben.
  • Durch ein mittlerweile verändertes Notify-Event-Handling in Fhem wurden die Bookmarks nicht immer zusammen mit dem globalen Save-Befehl gespeichert.
  • Die Cover-/Titelanzeige wird nun intern vom Modul durchgeführt. Deshalb ist keine zusätzliche ReadingsGroup für die Anzeige und Aktualisierung mehr notwendig. In der Raumansicht kann man das Verhalten für alle Sonosplayer einheitlich mit dem Attribut "deviceRoomView" beeinflussen. Es kann die Zustände "Both" und "DeviceLineOnly" annehmen.
  • Die Steuermöglichkeiten werden nun intern vom Modul dargestellt. Dazu muss die Cover-/Titelanzeige aktiviert sein. Will man die Steuerung ausblenden, kann man das Attribut "suppressControlButtons" für Sonosplayer einzeln setzen setzen.

Wie immer ab sofort im SVN oder ab Morgen per update.
Viel Spaß damit...

Grüße
Reinerlein

l2r

hi Danke für die Aktualisierung!

ich hatte bei mir die Sonos im Bad mal zu Testzwecken gelöscht und vom Sonos-Device wieder anlegen lassen.

Folgende Meldung ist noch im Log erschienen:
2017.05.15 18:16:15 1: SONOS1: Successfully autocreated SonosPlayer 'Bad' (S1) as 'Sonos_Bad' with Software Revision 7.2 and ID 'RINCON_5CAAFD9AC7XXXXXXX_MR'
2017.05.15 18:16:32 1: PERL WARNING: Argument "0:00:00" isn't numeric in addition (+) at ./FHEM/21_SONOSPLAYER.pm line 386.


Gruß Michael
Wissen ist Macht.
Ich weiß nix.
Macht nix.

Tom71

Hallo,
ich erhalte seit kurzem immer wieder diese Meldung:
Loading device description failed with error: 500 Can't connect to 192.168.40.2:49000 (Location: http://192.168.40.2:49000/igddesc.xml) at ./FHEM/00_SONOS.pm line 4311 thread 1.

Version von 00_SONOS.pm ist:
$Id: 00_SONOS.pm 14279 2017-05-14 11:18:12Z Reinerlein $

Ich kann damit leider nichts anfangen. Mein IP-Adress-Bereich ist 192.168.0/25 . Ich finde auch nichts mit der Konfig von 192.168.40.2

Homematic | RaspberryMatic

MikeRoxx

Hallo Rainer,

ich bekomme im Sekundentakt die Meldung ins Logfile, da kommen schnell mal 100MB zusammen:

recv() on unopened socket 1 at FHEM/lib/UPnP/ControlPoint.pm line 447, <$client> line 5.

Das kommt wohl daher:
ZitatIn der Datei ControlPoint.pm wurde beim Öffnen des SSDP-Ports das Attribut ReusePort hinzugefügt (sofern das Betriebssystem das unterstützt).

sub _receiveSSDPEvent {
my $self = shift;
my $socket = shift;
my $buf = '';

my $peer = recv($socket, $buf, 2048, 0);  <---------------  Hier ist Zeile 447
return if (!defined($peer));

my @peerdata = unpack_sockaddr_in($peer);
return if (!@peerdata);

return if (scalar(%USEDONLYIP) && (!$USEDONLYIP{inet_ntoa($peerdata[1])}));
return if ($IGNOREIP{inet_ntoa($peerdata[1])});

if ($buf !~ /\015?\012\015?\012/) {
return;
}


Leider kann ich das nicht beheben. Habe die alte ControlPoint.pm wieder verwendet.

Als ignoredIP habe ich einen Samsung TV eingetragen 192.168.178.45, da hattest du mir schon einmal geholfen:
https://forum.fhem.de/index.php/topic,41640.msg339516.html#msg339516

Gruß
Mike
Proxmox mit FHEM und Debmatic auf Deb. Buster
HM / HmIP / FS20

FunkOdyssey

Meine Player-Devices in FHEM aktualisieren nun gar nichts mehr. Keine Readings.
Und es steht überall "Player disappeared".
Läuft bei euch alles nach diesem Update?

MikeRoxx

Hi,

ich hatte bei meinem Player mal das attribut disable auf 0 gesetzt. Dann ging es wieder

Zitat von: FunkOdyssey am 15 Mai 2017, 21:25:11
Und es steht überall "Player disappeared".

Gruß
Mike
Proxmox mit FHEM und Debmatic auf Deb. Buster
HM / HmIP / FS20

FunkOdyssey

Hmm. Stimmt. Da war ja was.
Wobei ich sogar den RasPi schon komplett neu gestartet hatte.
Nun ja. jetzt läuft es.

fhem-challenge

#7
Zitat von: Reinerlein am 14 Mai 2017, 16:43:29
Hallo zusammen,

endlich mal wieder ein Update :) Es hat sich doch einiges angesammelt, aber da es auch stabil laufen soll, lief es auch einige Zeit auf meinem Teststand...

Im Wesentlichen ist die Abfrage der von Sonos per Webservice bereitgestellten Informationen zu den Musikanbietern hinzugekomnen. Dabei werden Name, Icon und Infotexte geladen.
Dadurch werden jetzt kleine rechteckige und runde Icons zur Verfügung gestellt, die auch in der Weboberfläche verwendet und angezeigt werden.
Für die nicht automatisch gelieferten Provider (wie Bibliothek und LineIn-Eingänge oder auch TuneIn) habe ich Icons gebaut, die dann ausgeliefert werden.
... SNIP

Grüße
Reinerlein


Nach dem SONOS Update gibt es bei mir ausschliesslich Chaos. Ich bekomme  x*10E6 Logevents. der folgenden Art. FHEM ist dann de facto nicht mehr bedienbar.
Ich habe auf die Alte "SONOS.pm" umgestellt, damit gehts wieder.


recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.
recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447.



Wenn mann auch noch "RescanNetwork" macht, bricht das Chaos erneut los.

... mal so zum Spass, erstaunlich wie viele "recv() on unopened socket 1 at /opt/fhem/FHEM/lib/UPnP/ControlPoint.pm line 447." Controlpoint.pm ins log schreiben kann. Pro Sekunde sind es > 10.000.

root@fhem:~# cat /opt/fhem/log/fhem-2017-05.log | wc -l
646330
root@fhem:~# cat /opt/fhem/log/fhem-2017-05.log | wc -l
664322
root@fhem:~# cat /opt/fhem/log/fhem-2017-05.log | wc -l
699803
root@fhem:~# cat /opt/fhem/log/fhem-2017-05.log | wc -l
717031
root@fhem:~# cat /opt/fhem/log/fhem-2017-05.log | wc -l
725568



Da wundert's mich nicht, das FHEM aufgibt, was es dann natürlich auch macht.



Viele Grüße!


Andreas

Reinerlein

Hallo zusammen,

@Michael: Da hat sich ein falscher Defaultwert eingeschlichen.. das korrigiere ich gleich.

@Tom71: Der Port 49000 mit dem igddesc.xml scheint etwas von der Fritzbox zu sein. Einfach auch auf die Ignore-Liste setzen.

@Mike: hmm. das ist der Handler, der die Antworten auf das SSDP verarbeiten soll. Dort habe ich keine Änderung gemacht. Die Änderung ist ab Zeile 81...
Da scheint irgendwas mit der Portverbindung nicht gut zu laufen. ReUse Port soll ja das Verbinden mit einem Port ermöglichen, obwohl er vielleicht noch belegt ist. Ich werde das wohl konfigurierbar machen, da es anscheinend bei manchen nicht sauber läuft.
Ich brauchte z.B. beim erstenmal auch nicht einfach einen Fhem Neustart, sondern ein Beenden des SubProzesses (also ein disable auf dem Sonos-Device, mit einer Pause, und wieder löschen des disable).

@Andreas: Da reicht es, die ControlPoint.pm auszutauschen. Wie bei Mike, ich werde das mit dem Reuse konfigurierbar machen. Mal schauen, ob ich das gleich noch schaffe...

Grüße
Reiner

Loredo

Traumhaft, super Arbeit Reinerlein!  :D


Zwei Dinge sind mit aufgefallen:

1. Der Cover-Proxy funktioniert leider noch nicht mit dem FHEMWEB Attribut webname zusammen. Die Lösung dafür ist im Reading nicht eine fixe URI mit /fhem/ beginnend hinzuschreiben, sondern den Webnamen wegzulassen und nur ? hinzuschreiben. Natürlich muss der Infix entsprechend angepasst werden. So funktioniert es bei meinem ONKYO_AVR Modul problemlos mit den Covern.

2. Die Web Darstellung beißt sich leider etwas, wenn man webCmd und cmdIcon verwendet (siehe Screenshot).



VG
Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Reinerlein

Hi zusammen,

so, habe eine neue Version eingecheckt.

@Julian: Für den Webname habe ich ein Attribut "webname" am Sonos-Device hinzugefügt, da das Modul viele Links ohne Zugriff über eine FhemWeb-Instanz zusammenbaut, und ich damit keinerlei Zugriff auf den verwendeten Web-Namen habe.
Bei deinem Detaildarstellungsproblem muss ich noch etwas forschen...

Hier die eingebauten Änderungen:

  • Bei der Ermittlung der Masterplayer werden "unsichtbare" Player (wie Bridge o.ä.) nun unterdrückt.
  • An einer Stelle wurde ein fehlerhafter Default-Wert für 'currentTrackPositionSec' eingesetzt, was zu Folgefehlern führte.
  • Die Wiederverwendung von Ports für die UPnP-Erkennung muss nun mittels des Attribut 'reusePorts' aktiviert werden.
Wie immer ab sofort im SVN oder ab Morgen im Update...

Grüße
Reiner

Loredo

Zitat von: Reinerlein am 16 Mai 2017, 00:19:06
@Julian: Für den Webname habe ich ein Attribut "webname" am Sonos-Device hinzugefügt, da das Modul viele Links ohne Zugriff über eine FhemWeb-Instanz zusammenbaut, und ich damit keinerlei Zugriff auf den verwendeten Web-Namen habe.


Hm, da komme ich gerade nicht ganz mit. Warum müsste das Modul denn überhaupt von der jeweiligen FHEMWEB Instanz wissen? Bei Verwendung des ? ist das unerheblich, denn der Browser kümmert sich darum es an die verwendete URI (und somit auch die vom User angesprochene FHEMWEB Instanz) anzuhängen. Ein Attribut "webname" am Sonos-Device hilft da leider nicht weiter, denn es beschränkt mich nach wie vor auf die Verwendung einer einzelnen FHEMWEB Instanz, die jetzt eben nur anders als /fhem heißen kann. Der Trick ist wirklich die Verwendung des Fragezeichens als Teil des Infix-Namens, damit man unabhängig von der FHEMWEB Instanz bleibt.





Gruß
Julian
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Reinerlein

Hi Julian,

es werden einige Links auf die statischen Coverbildchen oder Proxypfade zusammengebaut, die keine Fragezeichen enthalten (bzw. weiter hinten). Was sollte ich dort denn angeben?

Die URLs lauten dann ja z.B.

/fhem/sonos/cover/empty.jpg
oder
/fhem/sonos/proxy/aa?url=urlEncodedOriginalURL

Wenn ich dort nur

sonos/cover/empty.jpg
oder
sonos/proxy/aa?url=urlEncodedOriginalURL

erzeugen würde, würde der Browser doch das "fhem" auch weglassen. Ein Fragezeichen als erstes Zeichen würde auch nicht gehen, da damit FhemWeb die Verarbeitung meiner Cover und Proxy machen müsste, und die Anfrage damit nicht in meinem Modul landen würde...

Das liegt an dem unüblichen Aufbau einer Fhem-URL.
Eigentlich sollten die ja eher so lauten:

https://192.168.0.0:1234/fhem/room?name=Wohnzimmer
oder
https://192.168.0.0:1234/fhem/detail?name=Sonos

oder mehr nach REST-Paradigma

https://192.168.0.0:1234/fhem/room/Wohnzimmer
bzw.
https://192.168.0.0:1234/fhem/detail/Sonos

Dann würden auch meine statischen URLs durch weglassen des "/fhem/"-Webname funktionieren (zumindest in der nicht-REST-Variante).
Gleichzeitig müsste das Attribut webname eigentlich nicht an einer Fhemweb-Instanz hängen, sondern an global (damit man innerhalb der Applikation Fhem darauf als "statischen" Wert zugreifen kann), da die FhemWeb-Instanzen sich ja bereits durch die Ports unterscheiden...
Dann könnte man auch wieder die REST-Variante zusammenbauen...

Und ja, ich kenne es nur so, dass eine Applikation nur über einen Webname erreichbar ist... Wozu sollte man auch Port und Webname gleichzeitig unterschiedlich gestalten, wenn man diesselbe Anwendung meint? Der Webname stammt ja aus dem Bereich der Webapplikationsserver, die damit die Unterscheidung treffen, um welche der vielen Installierten Applikationen es sich handeln soll, damit man beim Administrieren und Ausführen des Systems die internen Namensräume sauber getrennt bekommt.
Die Portnummer definiert im Normalfall den "Dienst" oder die "Art-und-Weise" wie zugegriffen wird. Meint als Konvention z.B. 80 für HTTP oder 443 für HTTPS...

Grüße
Reiner

Tom71

#13
Hallo,
in der neuen sowie alten Version wird das MP3-File von speak im Wurzelverzeichnis von fhem abgelegt: /opt/fhem/RINCON_949F3E7407DE01400_MR_Speak.mp3

obwohl gesetzt ist:

attr Sonos targetSpeakDir /opt/fhem/SonosSpeak
attr Sonos targetSpeakURL \\192.168.0.38\SonosSpeak
attr Sonos targetSpeakFileTimestamp
attr Sonos targetSpeakMP3FileDir /opt/fhem/SonosSpeak


Rechte auf dem Verzeichnis sind: drwxrwxrwx  2 fhem dialout   4096 Mai 16 15:12 SonosSpeak

2017.05.16 14:53:48 3: SONOS1: Load Google generated MP3 (1. Element) from "http://translate.google.com/translate_tts?tl=de&client=tw-ob&q=%20Waschmaschine%20ist%20fertig" to "./RINCON_949F3E7407DE01400_MR_Speak.mp31"
2017.05.16 14:53:48 3: SONOS1: Combine loaded chunks into "./RINCON_949F3E7407DE01400_MR_Speak.mp3"
2017.05.16 14:53:48 3: SONOS1: Start temporary playing of "/RINCON_949F3E7407DE01400_MR_Speak.mp3"

==> /opt/fhem/log/Sonos-2017-05.log <==
2017-05-16_14:53:49 Sonos_Wohnen LastActionResult: PlayURITemp: Success!


Danach spielt der Speaker einfach den letzten Song ab, obwohl vor "speak" auf Pause gesetzt war.

@Reinerlein Was meintest du mit "Ignore-Liste"? attr ignoredIPs ?
Homematic | RaspberryMatic

Reinerlein

Hi Tom71,

genau, in das Attribut "ignoredIPs" am Sonos-Device einfach die IP-Adressen eintragen, die komisch stören. Diese werden dann ignoriert.

Zu deinem Speak: Hast du nach dem Setzen des Attributs den Sonos-SubProzess neugestartet?
Einmal das Attribut "disable" am Sonos-Device setzen, ein paar Sekunden warten, und das Attribut einfach wieder löschen...

Grüße
Reinerlein