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

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

Vorheriges Thema - Nächstes Thema

herrmannj

ist eine Welt für sich ...

werden die Zeichen als *ein* falsches zeicher oder als *zwei* falsche dargestellt ?

vg
joerg

raman

Wenn man das ganze als String an SV schickt, dann geht es.

Wenn ich aber die Einträge aus dem Sonos-Reading in json encodieren will, dann bekomme ich in FHEM z.B.  folgende Meldung:
ipc fronthem:127.0.0.1:48533 (ws): ws ipc decoding error malformed UTF-8 character in JSON string, at character offset 810 (before "\x{fffd}fentliches R...")

Mit einer Encodierung in UTF8 von $event  funktioniert das Encodieren in json jetzt.



herrmannj

wenns läuft - nicht mehr anfassen.

Hab in dieser Ecke (UTF8) Nächte verbracht ... . :)

raman

Aktueller Stand ist folgender:

Der geänderte Code für "send" im Converter mit Sortierung:


if ($param->{cmd} eq 'send')
{
  use Encode qw(encode);
  use JSON;
  $event = encode("utf8", $event);
  my %evt = %{eval( $event )};
  my $msg = "";
  my $i = 1;
  foreach my $key ( sort {lc $evt{$a}{"Title"} cmp lc $evt{$b}{"Title"}} keys %evt )
  {
    $msg .= '{"title":"' . $evt{$key}{"Title"} . '","cover":"' . $evt{$key}{"Cover"} . '"}' . ($i == keys(%evt) ? "" : ",");
    $i++;
  }
  $param->{gadval} = decode_json('[' . $msg . ']');
  main::Log3 undef, 4, $cName . "device: $device, reading: $reading, gadval: $param->{gadval}";
  $param->{gad} = $gad;
  $param->{gads} = [];
  return undef;
}



Und die Änderungen auf der SV-Seite in "update":


'update': function (event, response) {
  if ($(this).val() == undefined) {
    $(this).find('option').remove().end();
    var newOption = "<option value='" + $(this).attr('data-label') + "'>" + $(this).attr('data-label') + "</option>";
    $(this).append(newOption).selectmenu('refresh');

    if (response[0] instanceof Array) {
      for (var i = 0; i < response[0].length; i++) {
        var newOption = "<option value='" + response[0][i].title + "'>" + response[0][i].title + "</option>";
        $(this).append(newOption).selectmenu('refresh');
      }
    }
  }
},


Die Cover-Infos werden mitgeschickt, aber noch nicht genutzt. Da bin ich noch auf der Suche nach einer geeigneten Lösung!
Das Laden der Listen in SV scheint so etwas schneller zu gehen. Kann mich aber auch täuschen.


Damit das alles funktioniert, braucht es eine kleine Änderung im aktuellen io_fhem Treiber (Version 1.12) aus dem
Martin-Gleiss Repository in Zeile 261:


- 261:  io.callUpdateHandler(this, value.list instanceof Array ? values : [values]);

+ 261:  io.callUpdateHandler(this, typeof value === "string" ? [values] : values);


Die Änderung hat keine Auswirkung auf das UZSU-Widget. Da SV für die an dieser Stelle gesendeten Daten ein Array
bzw. Json-Objekt erwartet und keinen String, kann das so nicht nur für "value.list" (UZSU-Daten) geprüft werden.

dev0

#19
Zwei Sachen gefallen mir daran nicht:

1. Die $event Konvertierung:
Du baust manuell einen flachen JSON String zusammen, den Du dann wieder dekodierst um letztendlich dieses Format zu bekommen:

[
  {
    'cover' => 'http://192.168.30.94:1400/getaa....',
    'title' => 'The School of Rock'
  },
  {
    'cover' => 'http://192.168.30.94:1400/getaa....',
    'title' => 'WDR2 Rheinland 88.4 (Pop)'
  }
]

Verstehe ich nicht. Was soll dieses Format widerspiegeln?
Hashes in einem Array? Dazu müßten die eckigen Klammern rund sein ;)

Kann man das nicht mit einem Standardformat (JSON, hash, ...) lösen ohne den io_fhem.js Treiber anpassen zu müssen? Das angesprochene UZSU Widget übergibt z.B. JSON, wenn ich das richtig in Erinnerung habe.

Da sind wir auch schon beim 2. Thema, dass ich ansprechen möchte: der io_fhem.js Treiber. Dazu erstelle ich gleich einen neuen Thread... Link

raman

Ich habe mich am Widget "status.log" orientiert und das Format, wie es
dort erwartet wird "nachgebaut". Um leichter Änderungen machen zu können,
um verschiedene Formate zu testen, hab ich das ganze als String zusammengebaut
Das ganze ist ja nur ein Teil der gesamten Nachricht wie sie an SV geschickt wird.

Ein anderes Format ist sicher auch möglich, dann muss halt javascript angepasst werden.

Das sollte so mit dem "ürsrünglichen" Treiber aus dem clean Install kompatibel sein.

raman

Ich habe gerade den anderen Thread gelesen. Nur um Verwechslungen vorzubeugen.
Ich habe außer Ähnlichkeiten im Nickname nix mit dem besagten User zu tun.

Die Änderung war nur ein Vorschlag von mir, um das ganze trotz der Patches
in der neuen Version "lauffähig" zu machen.
Mit dem Original-Treiber funktioniert das Senden von json-Objekten ja.

dev0

Zitat von: raman am 21 Oktober 2016, 19:07:29
Ich habe außer Ähnlichkeiten im Nickname nix mit dem besagten User zu tun.
OK

Zitat von: raman am 21 Oktober 2016, 19:07:29
Die Änderung war nur ein Vorschlag von mir, um das ganze trotz der Patches
in der neuen Version "lauffähig" zu machen.
Mit dem Original-Treiber funktioniert das Senden von json-Objekten ja.
Ich schaue mir das die Tage mal genauer an. Würde aber vorher gerne auf sv 2.8 final umstellen.

oli82

Hallo.

Habe nun endlich mal Zeit gehabt um das Widget auf die aktuelle version zu aktualisieren.
Leider klappt bei mir das Laden der Play- und Radiolisten nicht.

Der Log meldet mir:
error doing $result = fronthem::SonosLists($param); Can't use an undefined value as a HASH reference at /opt/fhem/FHEM/99_fronthemSonosUtils.pm line 946.

Wie kann ich den Fehler beheben?

Habe die aktuelle SV 2.8.

Gruß und Danke,
Oli

dev0

In der Zeile wird das Playlist Reading per eval in einen Hash geschrieben. Vermutung: Das Reading gibt es nicht, vertippt beim Readingnamen, ...

oli82

Danke für die schnelle Rückmeldung. Nachdem ich die passenden Readings gefüllt hatte, lief das Widget wie erwartet.
Gruß Oli

Cybers

ich habe das Widget mal mit der aktuellen Develop-Version von Smartvisu und dem darin enthaltenen neuen jQuery Mobile 1.4.5 getestet. Hier stimmt dann das Layout nicht mehr. D.h. die verschiedenen Buttons und Elemente sind verschoben bzw. in der Zeile verrutscht.
Kannst du das Widget an jQuery Mobile 1.4.5 anpassen oder ist das viel Arbeit?

Gruß, Sascha
FHEM 6.3 auf Raspberry PI 4 / Smartvisu
Eltako Serie 14: FAM14, FGW14-USB, FSB14, FSR14-4x, FSR14-2x, FDG14, FTS14-EM in Kombination mit Jung F50 24V Tastern
1-Wire Temperatursensoren
aus alter Zeit:
Gott sei Dank nur noch 3 Homematic Jalousie- & Schaltaktoren! Wer sich mit Funk auskennt, legt Kabel