Sonos Widget für smartVISU [updated to v0.91]

Begonnen von dev0, 04 Juli 2016, 07:21:46

Vorheriges Thema - Nächstes Thema

dev0

Sonos Widget für smartVISU

Funktionen:
- Volume, mute, play, pause, stop, next title, previous titel, shuffle, repeat, loudness
- Auswahl von Playlisten und Radiostationen
- Popup für Bass, Treble, Balance und Lautstärke der Nachbar-Player
- Anzeige und setzen der Trackposition
- Gruppieren der Player
- Alle Mitglieder einer Gruppe können den Master steuern

Update 0.90
- Playlisten und Radiostationen werden automatisch erkannt (Danke an [user=raman]raman[/user] für seinen Beitrag)
- Ein Player-Widget für alle Räume (Auswahl des Raums über Selectmenu in der Titelleiste)
- Presence Symbol
Update 0.91
- Selectmenu/Playlists bugfix

Download:
https://github.com/ddtlabs/smartvisu-widgets

Keule_09

Hallo und Vielen Dank für dieses tolle Widget,

ich hab versucht das Sonos-Widget  mit Selectmenü in meine Seite einzubauen.
Habe alles nach der Anleitung integriert.Das Selectmenü wird angezeigt aber es kommt kein Player im Block.
auch wenn ich das Beispiel von Github direkt in meine Seite kopiere.
Das Widget allein ohne Selectmenü funktioniert ohne Probleme.

Braucht es noch andere Voraussetzungen außer Smartvisu 2.8 ??? 


dev0

Zitat von: Keule_09 am 24 September 2016, 23:15:33
Braucht es noch andere Voraussetzungen außer Smartvisu 2.8 ???
Nein, das damalige sv 2.8 reicht aus.

Spontan fallen mir 3 mögliche Ursachen ein:

  • Du hast irgendetwas nicht korrekt umgesetzt/konfiguriert. Beispielsweise das GAD/Item "mm_Sonos_XYZ.svIsVisible".
  • Das Beispiel auf Github ist unvollständig/fehlerhaft. Unwahrscheinlich, sonst hätte sich schon früher jemand gemeldet.
  • Du benutzt die aktuellste smartVISU 2.8 Version und dort hat sich das Verhalten des Widgets "status.collapse" geändert. Die aktuelle sv 2.8 Version ist z.Z. 116 Commits weiter als die getestete sv 2.8 Version. Um das auszuschießen könntest Du den SV 2.8 Fork aus meinem Repository testen.


raman

Hallo dev0,

ich habe im Repository von MartinGleiss für den Treiber io_fhem.js ein paar kleine Änderungen
als Pull Request eingereicht, die auch übernommen worden sind, da bei mir der Treiber so nicht
funktioniert hat.
Ich habe dein sonos-widget mal getestet. Bei mir funktioniert es mit den Änderungen im Treiber,
auch "status.collapse".

Nur im ddtlabs_sonos.selectmenu muss folgende Zeile geändert werden:


var playlists = response[0].split(';;');

in

var playlists = response[0].toString().explode(';;');


Die Änderung sollte sich auch nicht auf die Nutzung mit einer älteren SV-Version auswirken.

Gruß
raman

dev0

@raman: Danke fürs Testen mit der aktuellen 2.8er smartVISU Version und den Fix. Ältere 2.8 smartVISU Versionen funktionieren mit dem Fix weiterhin, wie Du schon geschrieben hattest. Die Änderungen habe ich eingecheckt.

raman

Bitte. Bin eh gerade dabei alle widgets zu testen, die ich verwende, bevor ich entgültig auf die
neuste SV-Version umsteige.

Ist jetzt nicht die eleganteste und wahrscheinlich auch nicht die performanteste Lösung,
da der String mit den Sendern oder der Playlist mehrfach verarbeitet werden muss.
Weißt du, ob es möglich ist, das ganze aus fhem über fronthem an SV gleich als
Array zu übergeben? Das wäre wahrscheinlich schneller.

dev0

Auf Javascript-Seite werde ich keine große Hilfe sein, aber vielleicht können wir das zusammen optimieren.
z.Z. schicken wir eine Liste mit ";;" als Trenner an sv. Wie sollte deiner Ansicht nach der String bzw. das Array formatiert sein, damit es in js effektiver zu verarbeiten wäre?

raman

Ich dachte, wenn man eine Liste, die in eckige Klammern gesetzt wird, an SV übergibt als Array interpretiert wird.
Ist leider nicht so!
Dafür müsste man wahrscheinlich den Treiber io_fhem.js anpassen (oder ich übersehe einfach die passende Funktion).

Also ist die jetzige Lösung den ich momentan am besten, sie funktioniert und ist mit allen SV-Versionen kompatibel.

Keule_09

    Zitat von: dev0 am 25 September 2016, 07:24:48

    • Du benutzt die aktuellste smartVISU 2.8 Version und dort hat sich das Verhalten des Widgets "status.collapse" geändert. Die aktuelle sv 2.8 Version ist z.Z. 116 Commits weiter als die getestete sv 2.8 Version. Um das auszuschießen könntest Du den SV 2.8 Fork aus meinem Repository testen.
    Danke für deine Hilfe es lag an der Smartvisuversion.
    Hab jetzt alles auf den aktuellsten Stand gebracht und es funktioniert   :) :) :)

    raman

    Hallo dev0,

    Um das Thema nochmal aufzugreifen:
    Nachdem ich mich mal mit UZSU näher beschäftigt habe, ist mir die Idee kekommen,
    dass man die Daten für die Listen der Titel und Radiosender ja auch als json schicken
    könnte. Hätte den Vorteil, dass sich das auf Javascript-Seite relativ einfach ohne
    Umwandlung verarbeiten lässt.

    Gruß
    raman

    dev0

    Können wir machen. Im Konverter ist das schnell erledigt. (Vielleicht müssen wir das ganze json_encode noch in ein eval packen, damit FHEM nicht stirbt, wenn etwas schief läuft, das habe ich auf die Schnelle jetzt nicht getestet.)

      if ($param->{cmd} eq 'send')
      {
        use JSON;
        $param->{gadval} = encode_json \%{eval( $event )};
        $param->{gad} = $gad;
        $param->{gads} = [];
        main::Log 5, $cName . "device: $device, reading: $reading, gadval: $param->{gadval}";
        return undef;
      }


    Dann haben wir einen JSON String, der so aufgebaut ist:

    {
    "SQ:14": {
      "Title":"Mixed",
      "Cover":"http://10.68.30.70:1400/getaa?u=x-file-cifs%3a%2f%2fds01%2fSonos%2fAlbums%2fA%2fACDC%2fHighway%20To%20Hell%2f04-Touch%20Too%20Much.mp3&v=142"
      },
    "SQ:7": {
      "Title":"New-Soul",
      "Cover":"http://10.68.30.70:1400/getaa?u=x-file-cifs%3a%2f%2fds01%2fSonos%2fSingles%2fN%2fNatasha%20Bedingfield%20-%20Soulmate.mp3&v=142"
      }
    }


    Jetzt könnte man zusätzlich noch die Cover vor den Listeneinträgen anzeigen, siehe hier. Haste Lust das mal auszuprobieren?

    raman

    Ich habs mal kurz getestet und geschaut was in SV ankommt.
    Wenn ich den JSON String in der Form, wie du ihn angegeben hast, schicke,
    dann wir er nicht als Objekt, sondern als String "durchgereicht".

    Wenn man was in der Form sendet,

    {"list":[{"title":"Title1","cover":"http://....."},{"title":"Title2","cover":"http://...."}]}

    dann kommt im Sonos-Widget ein Objekt an, das man in einer for-Schleife leicht auswerten kann.

    Erwartet der FHEM-Treiber in SV ein bestimmtes Format?

    Das mit den Covern ist eine gute Idee, aber bei mir werden die auf der Beispielseite in Firefox nicht angezeigt, in Chrome
    aber schon. Mal sehen, ob es eine Möglichkeit gibt, die alle Browser abdeckt.
    Evtl. lässt sich für die Zukunft sowas wie ein Coverflow realisieren.

    dev0

    Ich habe den JSON Output entsprechend angepasst und auf Github in den neuen developer branch gelegt. Mit dem Treiber hat das mMn nichts zu tun, ich vermute, dass deine for Schleife einfach nur ein Array statt mehrerer Objekte erwartet.

    Die UI Demo Seite wird bei mir auch mit FF (Mac,Linux,Win) korrekt angezeigt. Hast Du eventuell das Ausführen von JavaScript von den Domänen jqueryui.com oder code.jquery.com nicht zugelassen?

    raman

    Das mit Firefox lag nicht an den Einstellungen. Nachdem ich den Cache geleert habe,
    wird die Seite richtig dargestellt.

    Ich hab jetzt noch Probleme mit den Umlauten bzw. allgemein mit den Sonderzeichen.
    Die werden in SV nicht richtig dargestellt
    Kann es sein, dass encode_json ein UTF8-Format erwartet und das ausgelesene
    Sonos-Reading ein anderes Format besitzt?

    Mit dem selectmenu und den Covers muss ich bei Zeiten mal näher auseinandersetzen,
    um vlt. eine Lösung ohne Nutzung von jqUI zu finden.

    dev0

    Zitat von: raman am 15 Oktober 2016, 17:34:32
    Ich hab jetzt noch Probleme mit den Umlauten bzw. allgemein mit den Sonderzeichen.
    Die werden in SV nicht richtig dargestellt
    Kann es sein, dass encode_json ein UTF8-Format erwartet und das ausgelesene
    Sonos-Reading ein anderes Format besitzt?
    Vorab gesagt: mit der Thematik kenne ich mich auch nicht aus. Es gab aber schon Threads zu diesem Thema:
    - https://forum.fhem.de/index.php/topic,54196.0.html
    - https://forum.fhem.de/index.php/topic,55421.msg470680.html#msg470680

    Ich glaube, dass die Kodierung vom Sonos Modul schon i.o. ist, es funktioniert ja auch, wenn der String nicht in json gewandelt wird.
    Man könnte versuchen den string $event zu kodieren bevor er in den hash %h geschrieben wird.

    utf8::encode($event) if(utf8::is_utf8($event));
    oder
    utf8::downgrade($event) if(utf8::is_utf8($event));

    Ist aber eher geraten, habe im Moment auch keine Möglichkeit das zu testen.

    Sonst jemand eine Idee dazu?