Sonos im Tablet UI - Beispielkonfiguration

Begonnen von Sturi2011, 12 Dezember 2016, 23:23:19

Vorheriges Thema - Nächstes Thema

Sturi2011

Hallo,

ich wollte euch mal meine Sonos Integration vorstellen. Dazu habe ich die Scripte von Reinerlein und http://www.juergenstechnikwelt.de/ genommen und etwas angepasst. Ziel war, die Buttons im Tablet UI responsive zu machen und auch auf Aktionen mit der Sonos Anwendung zu reagieren.

Die Auswahl einer Playlist spielt diese ab. Der Play Button verwandelt sich in einen Pause Button. Das Select Element zeigt die aktuelle Playliste an.
Ein Klick auf Stop beendet die Wiedergabe. Das Select Element zeigt wieder seinen Titel Favoriten. Der Pause Button verwandelt sich wieder in einen Play Button.
Ein Klick auf Pause pausiert die Wiedergabe. Der Pause Button verwandelt sich in einen Play Button.

Ein Play in der Sonos App werwandelt den Play in einen Pause Button. Ein Pause in der Sonos App verwandelt den Pause in einen Play Button.

Gelöst habe ich das Ganze, indem ich alle Buttons den Status eines Dummys ändern lasse. Man benötigt für jedes Sonos Device einen Dummy mit dem Namen DM_Sonos_Raum

define DM_Sonos_Kueche dummy

Dieser Dummy wird mit Notifys überwacht. Die Notifys müssen ebenfalls für jeden Sonos Player angelegt werden.

define N_Sonos_Kueche_Play notify DM_Sonos_Kueche.PLAY {fhem "set Sonos_Kueche PLAY"}
define N_Sonos_Kueche_Pause notify DM_Sonos_Kueche.PAUSE {fhem "set Sonos_Kueche PAUSE"}
define N_Sonos_Kueche_Stop notify DM_Sonos_Kueche.STOP {fhem "set Sonos_Kueche STOP";;;; fhem "setreading DM_Sonos_Kueche default Favoriten"}


Für die Überwachung des Devices auf Änderungen, die nicht von Fhem kommen ist ein weiteres Notify pro device sowie ein event-on-change-reading am Device nötig.

define N_Sonos_Kueche_Device notify Sonos_Kueche:transportState.* { if (ReadingsVal("Sonos_Kueche","transportState","") eq "PAUSED_PLAYBACK") { fhem("set DM_Sonos_Kueche PAUSE")} elsif (ReadingsVal("Sonos_Kueche","transportState","") eq "STOPPED") { fhem("set DM_Sonos_Kueche STOP") } elsif (ReadingsVal("Sonos_Kueche","transportState","") eq "PLAYING") { fhem("set DM_Sonos_Kueche PLAY") }}

attr Sonos_Kueche event-on-change-reading .*


Für das Abspielen der Playlisten benötigen wir ein weiteres Notify

define N_SonosPlaylistAbspielen notify DM_Sonos_.* {SonosPlaylistStarten($EVENT)}

In der 99_MyUtils.pm müssen nun noch die folgenden Scripte eingebaut werden:

Playlisten erzeugen und in allen Fhem Dummys speichern
MeinePlayList()
{
   #Kueche ist der Master Player, daher Playlist hier ermitteln
   #Das Script muss manuell ausgeführt werden um die Playlisten einzulesen (nach jeder Änderung der Playlists)
   fhem("get Sonos_Kueche Playlists;");
   my $Playlist = ReadingsVal("Sonos_Kueche", "LastActionResult", "Keine");
   my @Playlists = split('GetPlaylists: ', $Playlist);
   my $playlistneu = 'Ostseewelle MV,'.$Playlists[1].',Favoriten';
   #zusätzllich noch unseren einzigen Radiosender dazu packen
   #playlist für TABUI select aufbereiten
   $playlistneu =~ s/,/:/g;
   $playlistneu =~ s/\"//g;

   #fhem("setreading duSonosPlaylists Playlist ".$playlistneu);
   fhem("setreading DM_Sonos_.* Playlist ".$playlistneu);
   fhem("setreading DM_Sonos_.* default Favoriten");
}


Abspielen der Playlisten
sub SonosPlaylistStarten($)
{
   my ($Playlist) = @_;
   my @player = split(' ',$Playlist);
   my @Liste = split($player[0]." ", $Playlist);

   $Liste[1] =~ s/ /%20/g;

   # falls der Radiosender gewählt wurde
   if($Playlist =~ /Ostseewelle/)
   {
      fhem("set $player[0] StartRadio $Liste[1]");
   }
   elsif($Playlist =~ /Favoriten/)
   {
   }
   else
   {
      fhem("set $player[0] StartPlaylist $Liste[1]");
   }
   my $SelPlayList = uri_unescape($Liste[1]);
   fhem("set DM_$player[0] PLAY");
   fhem("setreading DM_$player[0] default $SelPlayList");
}


Zu guter Letzt muss das Ganze noch in der Tablet UI definiert werden. Dies geschieht mit folgendem Code:

<li data-row="1" data-col="2" data-sizex="3" data-sizey="2">
   <header>Sonos Küche</header>
      <div class="container top-space">
         <div data-type="label" data-device="Sonos_Kueche" data-get="infoSummarize1"></div>
    <div data-type="select" data-device="DM_Sonos_Kueche" data-get="default" data-list="Playlist" data-set="Sonos_Kueche" class="wider large"></div>
      </div>
<div class="container inline">
  <div class="left">
   <div data-type="push" data-device="Sonos_Kueche" data-set-on="PREVIOUS" data-icon="fa-step-backward" class="cell"></div>
   <div data-type="switch" data-device="DM_Sonos_Kueche" data-set-on="PLAY" data-set-off="PAUSE" data-states='["PLAY","PAUSE","STOP"]' data-icons='["fa-pause","fa-play","fa-play"]' data-colors='["#555","#555","#555"]' data-background-colors='["#555","#555","#555"]' data-background-icon="fa-circle-thin" data-background-color="#555" class="cell"></div>
   <div data-type="push" data-device="Sonos_Kueche" data-set-on="NEXT" data-icon="fa-step-forward" class="cell"></div>
   <div data-type="push" data-device="DM_Sonos_Kueche" data-set-on="STOP" data-icon="fa-stop" class="cell"></div>
   <div data-type="multistatebutton" data-device="Sonos_Kueche" data-get="Shuffle" data-get-on='["0","1"]' data-set='["Shuffle 1","Shuffle 0"]' data-set-default="Shuffle 0" data-icons='["fa-random","fa-random"]' data-colors='["#2A2A2A","#00FF00"]' data-background-colors='["#555", "#555"]' background-color="#0000ff" off-color="#0000ff" class="cell"></div>
  </div>
</div>
<div class="container inline">
  <div class="left">
   <div data-type="spinner" data-device="Sonos_Kueche" data-get="Volume" data-set="Volume" data-max="50" data-step="4" data-icon-left="fa-volume-down" data-icon-right="fa-volume-up" class="top-space-2x spinner value" style="width: 200px; max-width: 200px; height: 50px; line-height: 45px; color: rgb(204, 204, 204); background-color: rgb(74, 74, 74);"><div class="lefticon fa fa-volume-down fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div><div class="levelArea" style="width: 50%;"><div class="levelRange" style="left: 0px; width: 21.4286px; background: rgb(170, 105, 0) none repeat scroll 0% 0%;"></div></div><div class="righticon fa fa-volume-up fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div></div>
  </div>
</div>
</li>


Sicher lassen sich die Notifys noch weiter zusammenfassen. Der Übersichtlichkeit halber sind sie hier getrennt ausgeführt.

Gruß Andreas

Noxus

Hallo Sturi,

wollte kurz Rückmeldung geben, dass alles relativ Problemlos funktioniert hat - nutze zwar nicht die Playlist, sondern Favoriten - aber vom Grundprinzip bleibt es ähnlich.
Vielen Dank für die Bereitstellung deiner Konfig.

Sturi2011

Hi,

danke für die positive Rückmeldung. Ich bastele gerade daran, das mit dem Gruppieren etwas eleganter zu lösen...

Gruß Andreas

Sturi2011

Hi,

Hier nun die Funktion für das Gruppieren der Sonos Player:

Es stehen 4 Gruppen oder ungruppiert zur Auswahl. An jedem Sonos Player Menu gibt es ein Circlemenu.
Mit diesem kann der Player einer der 4 Gruppen zugewiesen werden. Realisiert habe ich das ganze mit den
oben beschriebenen DM_Sonos_Raum Dummys und einem Zusätzlichen Attribut. Wenn Ihr den obigen Code
im Tablet UI eingesetzt habt benötigt Ihr nur ein zusätliches Notify pro Player und die Funktion GroupSonos
in der 99_MyUtils.pm. Zusätzlich ist eine Anpassung im FTUI HTML nötig.

GroupSonos für 99_MyUtils.pm
sub GroupSonos() {
my $search="DM_Sonos_";
my @GR1;
my @GR2;
my @GR3;
my @GR4;
my @GREmpty;
my ($devGroup,$CMDGR1,$CMDGR2,$CMDGR3,$CMDGR4,$CMDGREmpty);
foreach my $dev (sort keys %defs) {
    if($defs{$dev}{NAME} =~ m/$search/){
      $devGroup = ReadingsVal($defs{$dev}{NAME},"Gruppe","");
  if ($devGroup eq "1"){
  push @GR1, $defs{$dev}{NAME};
  }
  if ($devGroup eq "2"){
  push @GR2, $defs{$dev}{NAME};
  }
  if ($devGroup eq "3"){
  push @GR3, $defs{$dev}{NAME};
  }
  if ($devGroup eq "4"){
  push @GR4, $defs{$dev}{NAME};
  }
  if ($devGroup eq "-"){
  push @GREmpty, $defs{$dev}{NAME};
  }
    }
}
if (scalar @GR1 > 0){
$CMDGR1="set Sonos Groups [";
foreach my $n (@GR1) {
$n =~ s/^(DM_)//gi;
$CMDGR1 .="$n,";
}
chop($CMDGR1);
$CMDGR1 .="]";
Log 3, $CMDGR1;
fhem("$CMDGR1");
}
if (scalar @GR2 > 0){
$CMDGR2="set Sonos Groups [";
foreach my $n (@GR2) {
$n =~ s/^(DM_)//gi;
$CMDGR2 .="$n,";
}
chop($CMDGR2);
$CMDGR2 .="]";
Log 3, $CMDGR2;
fhem("$CMDGR2");
}
if (scalar @GR3 > 0){
$CMDGR3="set Sonos Groups [";
foreach my $n (@GR3) {
$n =~ s/^(DM_)//gi;
$CMDGR3 .="$n,";
}
chop($CMDGR3);
$CMDGR3 .="]";
Log 3, $CMDGR3;
fhem("$CMDGR3");
}
if (scalar @GR4 > 0){
$CMDGR4="set Sonos Groups [";
foreach my $n (@GR4) {
$n =~ s/^(DM_)//gi;
$CMDGR4 .="$n,";
}
chop($CMDGR4);
$CMDGR4 .="]";
Log 3, $CMDGR4;
fhem("$CMDGR4");
}
if (scalar @GREmpty > 0){
$CMDGREmpty="set Sonos Groups";
foreach my $n (@GREmpty) {
$n =~ s/^(DM_)//gi;
$CMDGREmpty .=" [$n],";
}
chop($CMDGREmpty);
Log 3, $CMDGREmpty;
fhem("$CMDGREmpty");
}
}



Zusätzliches Notify pro Sonos Player
define N_Sonos_Kueche_Group notify DM_Sonos_Kueche:Gruppe.* {GroupSonos()}

Der HTML Code erseztz den Abschnit ders Sliders und enthält den Slider sowie ein Circlemenu für die Tablet UI:
   <header>Sonos Flur</header>
      <div class="container top-space">
         <div data-type="label" data-device="Sonos_Flur" data-get="infoSummarize1"></div>
    <div data-type="select" data-device="DM_Sonos_Flur" data-get="default" data-list="Playlist" data-set="Sonos_Flur" class="wider large"></div>
      </div>
<div class="container inline">
  <div class="left">
   <div data-type="push" data-device="Sonos_Flur" data-set-on="PREVIOUS" data-icon="fa-step-backward" class="cell"></div>
   <div data-type="switch" data-device="DM_Sonos_Flur" data-set-on="PLAY" data-set-off="PAUSE" data-states='["PLAY","PAUSE","STOP"]' data-icons='["fa-pause","fa-play","fa-play"]' data-colors='["#555","#555","#555"]' data-background-colors='["#555","#555","#555"]' data-background-icon="fa-circle-thin" data-background-color="#555" class="cell"></div>
   <div data-type="push" data-device="Sonos_Flur" data-set-on="NEXT" data-icon="fa-step-forward" class="cell"></div>
   <div data-type="push" data-device="DM_Sonos_Flur" data-set-on="STOP" data-icon="fa-stop" class="cell"></div>
   <div data-type="multistatebutton" data-device="Sonos_Flur" data-get="Shuffle" data-get-on='["0","1"]' data-set='["Shuffle 1","Shuffle 0"]' data-set-default="Shuffle 0" data-icons='["fa-random","fa-random"]' data-colors='["#2A2A2A","#00FF00"]' data-background-colors='["#555", "#555"]' background-color="#0000ff" off-color="#0000ff" class="cell"></div>
  </div>
</div>
<div class="container inline narrow">
   <div data-type="spinner" data-device="Sonos_Flur" data-get="Volume" data-set="Volume" data-max="50" data-step="4" data-icon-left="fa-volume-down" data-icon-right="fa-volume-up" class="top-space-2x spinner value" style="width: 200px; max-width: 200px; height: 50px; line-height: 45px; color: rgb(204, 204, 204); background-color: rgb(74, 74, 74);"><div class="lefticon fa fa-volume-down fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div><div class="levelArea" style="width: 50%;"><div class="levelRange" style="left: 0px; width: 21.4286px; background: rgb(170, 105, 0) none repeat scroll 0% 0%;"></div></div><div class="righticon fa fa-volume-up fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div></div>
</div>
   <div data-type="circlemenu" class="cell circlemenu narrow">
    <ul class="menu">
      <li><div data-type="label" data-device="DM_Sonos_Flur" data-get="Gruppe" data-color="#555" class="circleborder big" style="Width:52px;Height=55px"></div></li>
      <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="1"
               data-icon="">1</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="2"
               data-icon="">2</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="3"
               data-icon="">3</div></li>     
  <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="4"
               data-icon="">4</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="-"
               data-icon="">-</div></li>    
    </ul>
   </div>


Viel Spaß beim Nachbasteln.

Gruß Andreas

Noxus

Eine gute Lösung was das Gruppieren betrifft Struri - danke für das teilen.
Habe zwar momentan nur 2 Sonos, aber es können sicher bald mehr werden  ;)

Nutzt Du eigentlich auch bei deinen Sonos die Sprachausgabe mit "speak"?
Mir ist aufgefallen, dass wenn eine Sprachausgabe erfolgt, der Dummy durch das skript "N_Sonos_Kueche_Device" irgendwie durcheinander kommt und ping-pong spielt. Das ging soweit, dass FHEM komplett abgestürzt ist, und die Sonos device nicht mehr funktioniert haben.
Habe erst einmal die skripte deaktiviert - nun tritt das Phänomen nicht mehr auf.
Muss mir das mal die Tage genauer anschauen.

Gruß

Sturi2011

Hallo,

nein Speak nutze ich nicht. Wie ist denn der Status des Sonos Devices bei transportState wenn die Sprachausgabe erfolgt?
Ich könnte mir vorstellen, das indem Reading etwas Steht womit der Notify nichts anfangen kann.
Ich schaue mir das Ganze morgen Abend mal an. Ich hatte sowieso vor Speak einzubinden.

Gruß Andreas

Noxus

gerade mal kurz geschaut -> transportState spring auf PLAYING und wieder auf STOPPED
Habe auch mal Musik abspielen lassen und dann ein längeren Satz per speak als Ausgabe - dabei ist der transportState während des Satzes einmal kurz wieder auf STOPPED und wieder PLAYING innerhalb einer Sekunde. Werde wie gesagt mal die Tage genauer mit loggen was passiert wenn der Fehler auftritt - momentan möchte ich aber kein Absturz verursachen, dann gibts ärger mit der Frau  ;D
Bin mal gespannt ob das Problem bei dir auch auftritt.

Gruß

Sturi2011

Hallo,

ja, der Fehler stellt sich bei mir auch so da. Die Lösung ist vermutlich das Command und das Anzeigeattribut am Dummy zu trennen. Ich setze das morgen mal um.

Gruß Andreas

Sturi2011

Hi,

bitte mal den Play Button umdefinieren:
<div data-type="switch" data-device="DM_Sonos_Flur" data-set-on="PLAY" data-set-off="PAUSE" data-get="tstate" data-states='["PLAY","PAUSE","STOP"]' data-icons='["fa-pause","fa-play","fa-play"]' data-colors='["#555","#555","#555"]' data-background-colors='["#555","#555","#555"]' data-background-icon="fa-circle-thin" data-background-color="#555" class="cell"></div>

und das entsprechende Notify N_Sonos_Name_Device bitt folgendermaßen definieren.
Sonos_Kueche:transportState.* { if (ReadingsVal("Sonos_Kueche","transportState","") eq "PAUSED_PLAYBACK") { fhem ("setreading DM_Sonos_Kueche tstate PAUSE")} elsif (ReadingsVal("Sonos_Kueche","transportState","") eq "STOPPED") { fhem ("setreading DM_Sonos_Kueche tstate STOP") } elsif (ReadingsVal("Sonos_Kueche","transportState","") eq "PLAYING") { fhem ("setreading DM_Sonos_Kueche tstate PLAY") }}

Dann funktioniert auch die Sprachausgabe. Gruppen muss ich heute Abend testen, da ich gerade das Sonos System nur remote im Zugrifff habe.

Bitte teste mal vorab. Das sollte es eigentlich schon gewesen sein.

Gruß Andreas

Noxus

Hallo Sturi,

es funktioniert nun perfekt - gute Idee dies über ein zweites reading am dummy zu lösen  8)
vielen Dank  :)

Sturi2011

Hi,

danke fürs gegentesten. Hier läuft es auch.

Gruß Andreas

Tobias

#11
Hmm, ich habe überhaupt keine Dummies, nur 2 notifies und 2 funktionen. (Cover dynamisch wechseln und die 5sekündliche Positionsanzeige)

Für die Auswahl bzw Erstellung einer Playlist aus meinem riesigen NAS Musikbibliothek habe ich mir ein eigenes Modul gebaut
Die Auswahl erscheint als Popup beim klick auf das Wettersymbol unten
https://forum.fhem.de/index.php/topic,63047.msg542990.html#msg542990
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Sturi2011

Hallo,

dein Modul gefällt mir, ist für mich aber nicht nutzbar, da die Musikbibliotheken in der Cloud liegen.
Den Dummy habe ich eingebaut, um nicht direkt am Sonos Device Readings definieren zu müssen.
Die Notifys lassen sich wie oben geschrieben sicherlich auf 2 zusammenfassen. Wie löst du das Gruppieren?

Btw.: Die Bilder habe ich bewusst weggelassen um Platz für mehr anzuschaffende Sonos Devices zu schaffen.

Gruß Andreas

Tobias

Hi,
Ich habe fest definierte Gruppen pro Raum. Die verändere ich nicht - noch nicht.
Ja es Stimmt, auf einer Seite wird immer ein Raum (aka Sonos Gruppe) angezeigt. Aber wozu gibt es das Swiper Widget :)
Ich habe zwar aktuell nur ein Raum mit Sonos, aber wenn das nächste Kommt, wird nur noch das Swiper Widget dazwischen gelegt und gut ist. Dann kann man "wischen" um zwischen den Räumen zu wechseln. Alternativ kann man auch mehrere PageTabs einbauen. Diese "große" Seite mit Cover hat den WAF bei mir extrem gehoben :)

Aus MediaList Modul Sicht interessiert  mich, wie du die Playliste zusammenstellst.....
Ich habe gelernt, wenn in der Playliste http://<irgendwas> drin steht, interpretiert das SonosDevice es als Stream. Nur wenn eine UNC Freigabe drinsteht, wird es als echte MP3 Datei gesehen. Was steht bei dir drin?
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Sturi2011

Hi,

die Playlisten sind die im Sonos definierten. Die erzeuge ich in der Sonos Controler APP.
Ausgelesen werden Sie mit reinerleins Script. Man bekommt allerdings (soweit ich weiß)
nur den Playlist Namen - nicht den Content zurück geliefert. Insofern läuft das Ganze
ohne Playlist Modul. Der Swiper würde bei mir den WAF senken, da es ein zusätzlicher
Bedienungsschritt ist.

Die Playlist würde ich super interessant finden, ich habe aber noch keine Idee, wie ich die
einzelnen Titel aus der internen Queue des Sonos bekomme. Sonst könnte man das Playlist
Widget gut als Popup integrieren. Vielleicht muss ich die Playlisten doch noch auf meinen
Server runter ziehen. Ich schaue es mir heute Abend mal an.

Wichtiger war bei mir die Möglichkeit einfach mal schnell zu gruppieren un die Musik mit in den
Keller oder das Badezimmer zu nehmen.

Gruß Andreas

Tobias

ahh, verstehe...
ich habe hier auf meinem NAS eine Musiksammlung > 40.000 Titel, ca 300GB.
Für uns ist es wichtig daraus ein Album mit wenigen Schritten spontan auszuwählen und im Sonos abzuspielen. Die Funktionalität aus mehreren Alben eine PLaylist zu erstellen, ändern, abzuspeichern und zu laden kommt später auch noch in mein Modul.
Bei uns dagegen ist es ein NOGo über andere apps oder außerhalb FHEM umständlich Playlisten erstellen zu müssen damit diese abgespielt werden können ;) bzw überhaupt aus dem Sonos etwas rauszubekommen. Solch statische playlisten hören wir uns irgendwann über ;) Und wenn wir erst wieder playlisten erstellen müssen um etwas neues zu hören, dann ist der Griff zum normalen UKW Radio einfacher und damit wäre FHEM und Sonos im WAF unterirdisch :(
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

SGi

Hallo zusammen,

vielen Dank für Eure zahlreichen Beispiele. Ich versuche auch gerade, mein SONOS in die TabletUI zu integrieren, habe vorher bereits ebenfalls das Beispiel aus Jürgens Technikwelt ausprobiert und nun die hier vorgeschlagenen Änderungen bzgl. der zusätzlichen notifys, Dummys und Dummy-Readings nachgezogen. Dabei stoße ich auf zwei Probleme:

1. Der Eintrag in der TabletUI-HTML ist genau nach Beispiel, der Multistate-Play-Button funktioniert auch, zeigt aber (gar) kein Symbol im Kreis, obwol die notifys jeweils einen korrekten "tstate"-Status setzen. Die Symbole sind aber in anderen TabletUI-Verwendungen da, am Font liegt es also nicht.

2. ich möchte sowohl SONOS-Favoriten (ca. 10 Radiosender) wie auch SONOS-Playlisten nutzen und gemeinsam in der Auswahlliste haben. Meine Versuche, mehr als einen Sender in die Liste hinzuzufügen (durch Ergänzung der Einträge in $playlistneu in der 99_myUtils.pm) scheitern bisher aber kläglich. Gibt es da eine Längenbegrenzung für den String oder ähnliches, oder mag er bestimmte  Sonderzeichen in den SONOS-generierten Radionamen (wie runde Klammern, Trennstriche etc) nicht ?

Oder hat vielleicht schon jemand eine schöne Lösung, die die Generierung der Liste aus Radios und Favoriten elegant kombiniert ? (bin nicht so der PERL-Spezi, ich habe die Abfrage, ob der ausgewählte Listeneintrag ein Radiosender ist oder nicht und dementsprechend Playlist oder Radio PLAYe, noch nicht hinbekommen...)

Schöne Grüße und natürlich allen ein schönes ud friedliches Weihnachtsfest !

Sven
FHEM auf RasPi und FritzBox 7390 mit MAX! und HomeMatic

Sturi2011

Hi,

Hast du den Play Button so undefiniert Wie im Letzten Post der ersten Seite?

Die Radiosender müssen momentan noch manuell über die 99 myutils hinzugefügt werden.
Sie sollten url codiert sein...

Poste mal bitte deine Definition im FTUI

Gruß Andreas

SGi

ZitatHast du den Play Button so umdefiniert Wie im Letzten Post der ersten Seite?

Ja. Und nein :-)  Der Fehler saß natürlich vor der Tastatur. Wenn man "tstate" einmal mit "s" und einmal "S" schreibt, kanns ja auch nicht funktionieren... Fehler behoben.

ZitatDie Radiosender müssen momentan noch manuell über die 99 myutils hinzugefügt werden. Sie sollten url codiert sein...

Ich hab den Sender aus dem Beispiel mit einer Zeichenkette wie dieser ersetzt:

1LIVE - Das junge Radio des WDR. 96.0 (Euro-Hits),1LIVE diggi - Multimedia - 1LIVE,Absolut Radio (Pop),Absolut relax (Unterhaltungsmusik),Radio 91.2 | (Pop),Radio Herne 90.8 (Pop),SWR3 Elchradio 99.6 (Adult Contemporary),WDR Event (Talkshow),WDR Vera (Verkehr),WDR2 Ruhrgebiet 87.8 (Pop),WDR5 - Hören erleben. 90.3,

bekomme dann aber nur eine leere Liste im Select. Außerdem ist dann natürlich die Abfrage "Radio oder Playlist" etwas komplexer.

ABER:
theoretisch kann ich diese Liste doch (aus meinen Favoriten) genauso durch "get Favourites" generieren und müßte diese nur ebenfalls in einer Liste @Favourites ablegen. Dann muss es doch auch klappen, diese beiden Listen per concat-Operator "." zu der Komplettliste $playlistneu für den Selektor zusammenzufügen...

Und mit einer PERL-Bedingung der Form "if Element in @Favourites" -> Start Radio und "if Element in @Playlists" -> Start Playlist die entsprechende Aktion dann auszuwählen. Das habe ich bisher nur noch nicht hingekriegt.

So was hier liefert eine leere Liste (warum ?) der Form '::Favoriten' im Reading Playlist in FHEM

sub GetPlayLists()
{
   # Playlisten zentral ermitteln
   # Das Script muss manuell ausgeführt werden um die Playlisten einzulesen (nach jeder Änderung der Playlists)
   
   fhem("get Sonos_Wohnzimmer Playlists;");
   my $Playlist = ReadingsVal("Sonos_Wohnzimmer", "LastActionResult", "Keine");
   my @Playlists = split('GetPlaylists: ', $Playlist);

   fhem("get Sonos_Wohnzimmer Favourites;");
   my $Favourite = ReadingsVal("Sonos_Wohnzimmer", "LastActionResult", "Keine");
   my @Favourites = split('GetFavourites: ', $Favourite);
   
   # Radios davor packen
   my $playlistneu = $Favourites[1].','.$Playlists[1].',Favoriten';

   
   #playlist für TABUI select aufbereiten
   $playlistneu =~ s/,/:/g;
   $playlistneu =~ s/\"//g;

   fhem("setreading d.Sonos_.* Playlist ".$playlistneu);
   fhem("setreading d.Sonos_.* default Favoriten");
}


Die explizite Variante mit String ebenfalls:

   my $Favourite = '1LIVE - Das junge Radio des WDR. 96.0 (Euro-Hits),1LIVE diggi - Multimedia - 1LIVE,Absolut Radio (Pop),Absolut relax (Unterhaltungsmusik),Radio 91.2 | (Pop),Radio Herne 90.8 (Pop),SWR3 Elchradio 99.6 (Adult Contemporary),WDR Event (Talkshow),WDR Vera (Verkehr),WDR2 Ruhrgebiet 87.8 (Pop),WDR5 - Hören erleben. 90.3';
   
   # Radios davor packen
   my $playlistneu = $Favourite.','.$Playlists[1].',Favoriten';



Und wenn es dann dafür eine funktionierende Weise geben würde

   # falls der Radiosender gewählt wurde
   if($Playlist ~~ $Favourite)
   {
      fhem("set $player[0] StartRadio $Liste[1]");
   }


wäre man doch schon fertig oder ?

Sven
FHEM auf RasPi und FritzBox 7390 mit MAX! und HomeMatic

Sturi2011

#19
Hi Sven,

wie heißt es in original Code so schön "Hier müsste noch ein wait eingefügt werden".
Das Problem ist, dass das LastActionResult erst einige 100 ms nach dem Aufruf gefüllt wird.
Sonos benötigt da einen Augenblick. Die Abfrage kommt zu früh. Wenn du das Original Script
2 mal hintereinander startest läuft es, da dasReading schon gefüllt ist. In deiner Variante ist
es dann aber schon mit dem 2en Wert gefüllt. Das kann man sich schön mit Log 1,... ansehen.

Momentan fällt mir dazu nur die Variante ein,
getfavourites -> Notify mit Filter schreibt Favourites in Dummy.
getplaylists -> ds selbe Notify mit 2em Filter liest Playlist und macht einen String aus
dem Favoriten String und den Playlists, der in den Dummy zurück geschrieben wird.

Gruß Andreas

edit:

eventuell lässt sich das eleganter mit einem userreading am sonos device lösen...ich schaue morgen mal ob ich das so hin bekomme.

SGi

Okay, darüber habe ich auch schon nachgedacht, die Listen vorab fertig als Userreading zu hinterlegen und habe dazu die Lösung von Andreas hier im Forum gefunden:

https://213.252.140.23/index.php?topic=49186.15

Hatte gedacht, dass ich mit

FavTabletUI:LastActionResult.*?GetFavourites:.* {
if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) {
my $returnvalue = $1;
$returnvalue =~ s/","/:/g;
$returnvalue =~ s/\"//g;
return $returnvalue;
}
}, PlayTabletUI:LastActionResult.*?GetPlaylists:.* {
if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) {
my $returnvalue = $1;
$returnvalue =~ s/","/:/g;
$returnvalue =~ s/\"//g;
return $returnvalue;
}
}


zwei Userrreadings generieren könnte, die ich dann über myUtils entweder zusammenpacken oder einfach in zwei separaten Selektoren mit startFavourite und startPlaylist verwenden kann. Das Playlists-Userreading wird aber leider nicht angelegt. Wird der Trigger vom 2. Reading nicht geprüft, wenn man GetFavourites und GetPlaylists direkt in FHEM im Sonos ausführt ?

Sven
FHEM auf RasPi und FritzBox 7390 mit MAX! und HomeMatic

SGi

Hmpf,

habe gerade festgestellt, dass man Playlisten im SONOS ja auch als Favorit ablegen kann (ging das schon immer ?) und somit "ein startFavourite" völlig unabhängig vom Typ des Mediums funktioniert. Damit hat sich die Sache stark vereinfacht. Wie an anderer Stelle hier im Forum schon vorgeschlagen erzeuge ich userReadings in 2 Versionen (für Anzeige und Auswahl):

FavTabletUI:LastActionResult.*?GetFavourites:.* {
if (ReadingsVal("Sonos_Wohnzimmer", "LastActionResult", "") =~ m/.*?: (.*)/) {
my $returnvalue = $1;
$returnvalue =~ s/","/:/g;
$returnvalue =~ s/\"//g;
$returnvalue =~ s/" "/./g;
return $returnvalue }},
FavAliasTabletUI:LastActionResult.*?GetFavourites:.* {
if (ReadingsVal("Sonos_Wohnzimmer", "LastActionResult", "") =~ m/.*?: (.*)/) {
my $returnvalue = uri_escape($1);
$returnvalue =~ s/%22//g;
$returnvalue =~ s/%2C/:/g;
return $returnvalue }}


Im TabletUI geht es dann ganz ohne Dummys etc. mit:


<div data-type="select"
data-device="Sonos_Flur"
data-list="Sonos_Wohnzimmer:FavAliasTabletUI"
data-alias="Sonos_Wohnzimmer:FavTabletUI"
data-get="Sonos_Wohnzimmer:FavTabletUI"
data-set="startFavourite"
class="wider large">


plus der Transportbuttons natürlich.

So muss ich die "Datenpflege" zwar in Sonos machen (ist bei mir kein Problem, da sich da selten was ändert) , löse aber am Haupt-Device danach nur einmal in FHEM ein "get Favourites" aus und die Selektoren in der GUI sind aktuell. Schon läuft alles wie ich es mir vorstelle...

Trotzdem vielen Dank, und natürlich wird das nicht der letzte Tablet-UI-Design-Stand bleiben, aber erstmal funktioniert die Mucke familienkompatibel  :-)

Sven
FHEM auf RasPi und FritzBox 7390 mit MAX! und HomeMatic

l2r

hat jemand die Sonos-Steuerung schon für FTUI 2.5 umgebaut?

Bei hats die Darstellung seit dem Update mehr oder weniger zerschossen. Ich bin allerdings auch noch nicht wirklich dazu gekommen mir das genau anzuschauen...

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

Sturi2011

#23
Hi,

ich habe das Ganze mal auf möglichst wenige Readings am Dummy umgebaut.
Die Version enthält natürlich meinen Sonderwunsch mit der Current Playlist.
Das habe ich aber selbst in das Sonos Mudul eingepatcht.
Du musst das DIV mit dem FA-List Icon entfernen....oer per PN die gepatchte Version bekommen ;)

hier mal die neue Version:
<html>
<title>Musik</title>
<head>
</head>
<body>
<div class="gridster">
<ul>
<li data-row="1" data-col="1" data-sizex="1" data-sizey="4" data-template="menu.html"></li>
<li data-row="1" data-col="2" data-sizex="3" data-sizey="2">
   <header>Sonos Küche</header>
      <div class="container top-space">
         <div data-type="label" data-device="Sonos_Kueche" data-get="infoSummarize1"></div>
<div data-type="select" data-device="Sonos_Kueche" data-list="Sonos_Kueche:FavAliasTabletUI" data-alias="Sonos_Kueche:FavTabletUI" data-get="Sonos_Kueche:FavTabletUI" data-set="startFavourite" class="wider large">
  </div>
<div class="container inline">
   <div data-type="push" data-device="Sonos_Kueche" data-set-on="PREVIOUS" data-icon="fa-step-backward" class="cell inline"></div>
   <div data-type="switch" data-device="Sonos_Kueche" data-set-on="PLAY" data-set-off="PAUSE" data-get="transportState" data-states='["PLAYING","PAUSED_PLAYBACK","STOPPED"]' data-icons='["fa-pause","fa-play","fa-play"]' data-colors='["#555","#555","#555"]' data-background-colors='["#555","#555","#555"]' data-background-icon="fa-circle-thin" data-background-color="#555" class="cell inline"></div>
   <div data-type="push" data-device="Sonos_Kueche" data-set-on="NEXT" data-icon="fa-step-forward" class="cell inline"></div>
   <div data-type="push" data-device="Sonos_Kueche" data-set-on="STOP" data-icon="fa-stop" class="cell inline"></div>
   <div data-type="multistatebutton" data-device="Sonos_Kueche" data-get="Shuffle" data-get-on='["0","1"]' data-set='["Shuffle 1","Shuffle 0"]' data-set-default="Shuffle 0" data-icons='["fa-random","fa-random"]' data-colors='["#2A2A2A","#00FF00"]' data-background-colors='["#555", "#555"]' background-color="#0000ff" off-color="#0000ff" class="cell inline "></div>
</div>
<div class="container inline narrow">
  <div data-type="popup" data-height="600px" data-width="600px">
  <div data-type="push" data-icon="fa-list"></div>
    <div class="dialog">
    <header>Playliste</header>
<div data-type="medialist"
data-device="Sonos_Kueche"
data-get="Sonos_Kueche:currentPlaylistContent"
data-pos="Sonos_Kueche:currentTrack"
data-set="track"
class="autoscroll index1">
</div> 
    </div>
  </div>
</div>
<div class="container inline narrow">
   <div data-type="spinner" data-device="Sonos_Kueche" data-get="Volume" data-set="Volume" data-max="50" data-step="4" data-icon-left="fa-volume-down" data-icon-right="fa-volume-up" class="top-space-2x spinner value" style="width: 200px; max-width: 200px; height: 50px; line-height: 45px; color: rgb(204, 204, 204); background-color: rgb(74, 74, 74);"><div class="lefticon fa fa-volume-down fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div><div class="levelArea" style="width: 50%;"><div class="levelRange" style="left: 0px; width: 21.4286px; background: rgb(170, 105, 0) none repeat scroll 0% 0%;"></div></div><div class="righticon fa fa-volume-up fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div></div>
</div>
<div class="container inline narrow">
  <div data-type="circlemenu" class="cell circlemenu top-space-2x">
    <ul class="menu">
      <li><div data-type="label" data-device="DM_Sonos_Kueche" data-get="Gruppe" data-color="#555" class="circleborder big" style="Width:52px;Height=55px"></div></li>
      <li><div data-type="push" data-device="DM_Sonos_Kueche"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="1"
               data-icon="">1</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Kueche"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="2"
               data-icon="">2</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Kueche"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="3"
               data-icon="">3</div></li>     
  <li><div data-type="push" data-device="DM_Sonos_Kueche"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="4"
               data-icon="">4</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Kueche"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="-"
               data-icon="">-</div></li>    
    </ul>
   </div>
</div>
</li>
<li data-row="1" data-col="5" data-sizex="1" data-sizey="2">
   <header>Gruppe</header>
      <div data-type="push" data-device="Sonos_Kueche" data-cmd="set Sonos Groups [Sonos_Kueche, Sonos_Flur]" data-icon="fa-link" class="cell top-space-2x"></div>
  <div data-type="push" data-device="Sonos_Kueche" data-cmd="set Sonos Groups [Sonos_Kueche], [Sonos_Flur]" data-icon="fa-unlink" class="cell top-space-2x"></div>
</li>
<li data-row="1" data-col="6" data-sizex="3" data-sizey="2">
   <header>Sonos Flur</header>
      <div class="container top-space">
         <div data-type="label" data-device="Sonos_Flur" data-get="infoSummarize1"></div>
<div data-type="select" data-device="Sonos_Flur" data-list="Sonos_Flur:FavAliasTabletUI" data-alias="Sonos_Flur:FavTabletUI" data-get="Sonos_Flur:FavTabletUI" data-set="startFavourite" class="wider large">
      </div>
<div class="container inline">
   <div data-type="push" data-device="Sonos_Flur" data-set-on="PREVIOUS" data-icon="fa-step-backward" class="cell inline"></div>
   <div data-type="switch" data-device="Sonos_Flur" data-set-on="PLAY" data-set-off="PAUSE" data-get="transportState" data-states='["PLAYING","PAUSED_PLAYBACK","STOPPED"]' data-icons='["fa-pause","fa-play","fa-play"]' data-colors='["#555","#555","#555"]' data-background-colors='["#555","#555","#555"]' data-background-icon="fa-circle-thin" data-background-color="#555" class="cell inline"></div>
   <div data-type="push" data-device="Sonos_Flur" data-set-on="NEXT" data-icon="fa-step-forward" class="cell inline"></div>
   <div data-type="push" data-device="Sonos_Flur" data-set-on="STOP" data-icon="fa-stop" class="cell inline"></div>
   <div data-type="multistatebutton" data-device="Sonos_Flur" data-get="Shuffle" data-get-on='["0","1"]' data-set='["Shuffle 1","Shuffle 0"]' data-set-default="Shuffle 0" data-icons='["fa-random","fa-random"]' data-colors='["#2A2A2A","#00FF00"]' data-background-colors='["#555", "#555"]' background-color="#0000ff" off-color="#0000ff" class="cell inline"></div>
</div>
<div class="container inline narrow">
  <div data-type="popup" data-height="600px" data-width="600px">
  <div data-type="push" data-icon="fa-list"></div>
    <div class="dialog">
    <header>Playliste</header>
<div data-type="medialist"
data-device="Sonos_Flur"
data-get="Sonos_Flur:currentPlaylistContent"
data-pos="Sonos_Flur:currentTrack"
data-set="track"
class="autoscroll index1">
</div> 
    </div>
  </div>
</div>
<div class="container inline narrow">
   <div data-type="spinner" data-device="Sonos_Flur" data-get="Volume" data-set="Volume" data-max="50" data-step="4" data-icon-left="fa-volume-down" data-icon-right="fa-volume-up" class="top-space-2x spinner value" style="width: 200px; max-width: 200px; height: 50px; line-height: 45px; color: rgb(204, 204, 204); background-color: rgb(74, 74, 74);"><div class="lefticon fa fa-volume-down fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div><div class="levelArea" style="width: 50%;"><div class="levelRange" style="left: 0px; width: 21.4286px; background: rgb(170, 105, 0) none repeat scroll 0% 0%;"></div></div><div class="righticon fa fa-volume-up fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div></div>
</div>
<div class="container inline narrow">
<div data-type="circlemenu" class="cell circlemenu top-space-2x">
    <ul class="menu">
      <li><div data-type="label" data-device="DM_Sonos_Flur" data-get="Gruppe" data-color="#555" class="circleborder big" style="Width:52px;Height=55px"></div></li>
      <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="1"
               data-icon="">1</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="2"
               data-icon="">2</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="3"
               data-icon="">3</div></li>     
  <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="4"
               data-icon="">4</div></li>
      <li><div data-type="push" data-device="DM_Sonos_Flur"
   data-set="Gruppe"
               data-cmd="setreading"
   data-set-on="-"
               data-icon="">-</div></li>    
    </ul>
   </div>
</div> 
</li>
</ul>
</div>
</body>
</html>


Das mit dem Currentplaylist sieht dann so aus:

Gruß Andreas

Sturi2011

Hi,

und dann benötigst du noch das geänderte Userreading:

Favourites:LastActionResult.*?GetFavouritesWithCovers.* { if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, Radios:LastActionResult.*?GetRadiosWithCovers.* { if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, Playlists:LastActionResult.*?GetPlaylistsWithCovers.* { if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } }, currentTrackPosition:LastActionResult.*?GetCurrentTrackPosition.* { if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } },currentPlaylistContent:LastActionResult.*?GetPlaylistContent.* { if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) { return $1; } },FavTabletUI:LastActionResult.*?GetFavourites:.* { if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) { my $returnvalue = $1; $returnvalue =~ s/","/:/g; $returnvalue =~ s/\"//g; $returnvalue =~ s/" "/./g; return $returnvalue }}, FavAliasTabletUI:LastActionResult.*?GetFavourites:.* { if (ReadingsVal("Sonos_Flur", "LastActionResult", "") =~ m/.*?: (.*)/) { my $returnvalue = uri_escape($1); $returnvalue =~ s/%22//g; $returnvalue =~ s/%2C/:/g; return $returnvalue }}


Wenn ich nachher die Kinder im Bett habe stelle ich das ganze mal komplett neu zusammen.

Gruß Andreas

l2r

besten Dank schonmal für die Schnelle Antwort!

Ich habs mir soweit wieder zurecht gebastelt, aber ohne Playlist ;-)

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

Hitcher

Hallo Leute..
Ich verfolge euren Thread hier schon ein paar Tage..

Finde es Prima was ihr hier macht..

Da ich gerade mein Sonos Zeugs aufrüste und mich parallel an Tablet UI versuche..

Gibt es eine kleine Zusammenfassung?
Auch vielleicht was wo hin muss, bzw. was ich anpassen müsste?

Danke Euch!!

thevoyager

Eine Zusammenfassung würde mir auch sehr helfen... bin komplett neu in dem Thema und versuche gerade das ganze aus euren Beschreibungen nachzuvollziehen - aktuell scheitere ich daran die Favoriten in eine Liste zu bekommen :-(

sTaN

Hallo Zusammen,

dem schließe ich mich mal an! ;-) Bin auch gerade dabei mein altes iPad 3 für Tablet UI fit zu machen und habe dies zum Anlass genommen meine Sonos Player nun auch in FHEM zu integrieren. Das hat zunächst geklappt. Über eine Zusammenfassung was ich für die Darstellung in Tablet UI alles benötige, wäre ich auch sehr dankbar!

Gruß
sTaN
Raspberry Pi 3
2 x CUL CC1101-USB-Lite 868MHz
FS20 Komponenten, Philips HUE, Alexa-Fhem, MAX! Geräte, homebridge, harmony, Unifi, FirtzBox, MQTT, Aurora, Denon, Sonos, TabletUI, CALENDAR, EGPM2LAN, Pushover

carzl

Hallo in die Runde,

mir gehts genauso, es ist gefühlt ganz schön tricky... Hat FTUI 2.5 bzw. 2.6 insofern Auswirkungen, dass ich mit Euren Code-Beispielen gar nicht erst anfangen muss, weil es eh nicht funzt? Oder wirkt es sich nur auf die Positionierung etc. aus und ich kann mal starten? Die Komplexität macht mir einigermaßen Respekt...  :-\ 
Fhem 6.0 auf RPi3: CUL, JeeLink, Hue Bridge v2, HarmonyHub, Fritzbox7590+7412, 6x FHT80b, 2x FS20S6A, FS20S4A, S300TH, 4x FritzDECT200/210, 4x TX29DTH, 4x Hue LightStripe, 5x Hue Smart Plug, Sonos mit 5x Play:1, Beam und Sub; 3x Lenovo Tab M10 mit FTUI

l2r

schaut euch mal den WIKI-Eintrag zu Sonos an. Da wurde eine Beispiel-Config ergänzt.

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

eddtima

Hey Sturi2011,

super gemacht ich kann ja kaum verstehen, warum der Thread so wenig Beachtung findet. Ich finde, Du hast das super gelöst und endlich sieht die Sonos mal gelungen in der Tablet UI aus. Nicht zu gross, damit man einige Sonos-Zonen auf eine Seite bekommt und zudem ist auch noch das Problem mit dem Gruppieren gelöst - Chapeau - wirklich gelungen!

An alle, die noch mit den Ausrichtungsproblemen von Version 2.6 kämpfen: Lediglich die class="cell" am Ende der Buttons muss gegen class="inline" ausgetauscht werden. Das sieht das auch unter Tablet UI 2.6 wieder alles gut aus.

Noch eine Frage an Sturi2011: Hast Du irgendwo den Code für die "Group/Ungroup-Buttons" gepostet? Oder habe ich das einfach nur übersehen?

Vielen Dank für Deine Konfiguration!
FHEM auf Odroid N2, FTUI, etwa 110 Homematic Devices verschiedenster Coleur, BMWi3, Gardena, Hue, Sonos, Alexa, Harmony Hub, Samsung TV

Masterfunk

Zitat von: Sturi2011 am 30 Januar 2017, 17:33:01
Hi,

ich habe das Ganze mal auf möglichst wenige Readings am Dummy umgebaut.
Die Version enthält natürlich meinen Sonderwunsch mit der Current Playlist.
Das habe ich aber selbst in das Sonos Mudul eingepatcht.
Du musst das DIV mit dem FA-List Icon entfernen....oer per PN die gepatchte Version bekommen ;)

Gruß Andreas

Was hast Du den gemacht, um die CurrentPlayList zu erzeugen?

Gruß Detlef

Masterfunk

Habe das ganze nochmal überarbeitet (Basierend auf Reinerleins's Config).

Rechts oben wird beim Player noch folgendes angezeigt:
1. Status des Players
2. Status Power-Switch für Player
3. Aktueller "TrackProvider" mit entsprechenden Icons

Hier die Config Dateien:

template_music_sonos.html
<div class="top-space container cell row">
<div Class="col-3-4">

<div data-type="popup" data-width="45%" data-height="80%" class="inline">
<div data-type="image"
data-device="Device"
data-get="currentAlbumArtURL"
data-width="210px"
data-height="210px"
class="nocache">
</div>

<div class="dialog">
<header>Cover für Name</header>

<div data-type="switch"
data-device="Device"
data-get="transportState"
data-states='["PLAYING","PAUSED_PLAYBACK","STOPPED"]'
data-set-states='["Pause","Play","Play"]'
data-background-icon="-"
data-background-colors='["orange","white","white"]'
data-colors='["orange","white","white"]'
data-icons='["fa-play","fa-pause","fa-pause"]'
class="inline"
style="position: absolute; top: 25px; left: 5px;"
onclick="$('.dialog-close').trigger('click');">
</div>

<div data-type="image"
data-device="Device"
data-get="currentAlbumArtURL"
data-width="750px"
data-height="750px"
class="nocache"
onclick="$('.dialog-close').trigger('click');">
</div>

<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="slider"
data-device="Device"
data-get="currentTrackPositionSec"
data-max="currentTrackDurationSec" data-min="0"
data-step="1"
data-handle-diameter="5"
data-width="750px"
class="horizontal top-narrow readonly centered"></div>
</div>

<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="joinedlabel" data-device="Device" data-mask="[$1][ ~ $2][ ~ $3]" data-get='["currentTitle","currentArtist","currentAlbum"]' class="truncate top-space"></div>
</div>
<div data-type="classchanger" data-device="Device" data-get="currentStreamAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="joinedlabel" data-device="Device" data-mask="[$1 ~ ][$2][: $3]" data-get='["currentSenderInfo","currentSender","currentSenderCurrent"]' class="truncate top-space"></div>
</div>
</div>
</div>
</div>

<div Class="col-1-4 top-align">
    <div class="sheet">
        <div class="row">

<div data-type="switch" data-device="Device"
     data-states='["appeared","initialized","disappeared"]'
data-icons='["fa-thumbs-o-up","fa-thumbs-o-down fa-blink","fa-thumbs-o-down"]'
data-background-icons='["-","-","-"]'
     data-colors='["#aa6900","#505050","#505050"]'
     class="readonly inline small top-align left-narrow">
</div>
<div data-type="switch" data-device="Switch"
     data-states='["on","off","set_on"]'
     data-set-states='["off","on","on"]'
data-icons='["fa-power-off","fa-power-off","fa-power-off fa-blink"]'
data-background-icons='["-","-","-"]'
     data-colors='["#aa6900","#505050","#aa6900"]'
     class="inline small top-align left-narrow">
</div>
<div data-type="symbol" data-device="Device" data-get="currentTrackProvider"
     data-states='["Spotify","Bibliothek","Radio","Gruppenwiedergabe:.*",""]'
     data-icons='["fa-spotify","oa-it_nas","oa-it_radio","fa-object-group","fa-question"]'
     data-colors='["green","orange","orange","orange","red"]'
class="inline small top-align left-narrow" ></div>
</div>
</div>



<br>
   <div data-type="label" class="inline" >Titel</div>
<div data-type="label" class="inline" data-device="Device" data-get="currentTrack"></div>
<div data-type="label" class="inline" >von</div>
   <div data-type="label" class="inline" data-device="Device" data-get="numberOfTracks"></div>
<br>
<br>
<div data-type="classchanger" data-device="Device" data-get="nextAlbumArtURL" data-get-on="/fhem/sonos/cover/empty.jpg" data-get-off="!on" data-on-class="hide">
<div data-type="image"
data-device="Device"
data-get="nextAlbumArtURL"
data-width="80px"
data-height="80px"
class="inline nocache">
</div>
<br>
   <div data-type="label" class="inline" >Next</div>
</div>
</div>
<br>
<br>
<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="label" data-device="Device" data-get="currentTrackPosition" class="inline"></div>
<div data-type="slider"
data-device="Device"
data-set="CurrentTrackPosition"
data-get="currentTrackPositionSec"
data-max="currentTrackDurationSec" data-min="0"
data-step="1"
data-handle-diameter="5"
data-width="350"
class="horizontal tap inline">
</div>
<div data-type="label" data-device="Device" data-get="currentTrackDuration" class="inline"></div>


</div>

<div data-type="classchanger" data-device="Device" data-get="currentStreamAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div style="height: 36px;"> </div> <!-- Leerer Ersatz für die bei Streams fehlende Positionsanzeige -->
</div>

<div class="large top-space">
<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="label" data-device="Device" data-get="currentTitle" class="bold truncate" style="height: 21px;"></div>
<div data-type="joinedlabel" data-device="Device" data-mask="[$1][ ~ $2]" data-get='["currentArtist","currentAlbum"]' class="truncate" style="height: 21px;"></div>
</div>
<div data-type="classchanger" data-device="Device" data-get="currentStreamAudio" data-get-on="1" data-get-off="0" data-off-class="hide">
<div data-type="label" data-device="Device" data-get="currentSenderInfo" class="bold truncate" style="height: 21px;"></div>
<div data-type="joinedlabel" data-device="Device" data-mask="[$1][: $2]" data-get='["currentSender","currentSenderCurrent"]' class="truncate" style="height: 21px;"></div>
</div>
</div>

<div class="top-space">

<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide" class="inline top-space">
<div data-type="switch" data-device="Device" data-get="Repeat" data-set="Repeat"
data-icon="fa-repeat" data-background-icon="-"
data-on-color="#aa6900" data-off-color="gray"
data-get-on="1" data-get-off="0"
data-set-on="1" data-set-off="0" class="inline ">
</div>

<div data-type="push" data-device="Device"
data-icon="fa-step-backward" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
data-set-on="Previous" class="inline ">
</div>

<div data-type="push" data-device="Device"
data-set="CurrentTrackPosition"
data-icon="fa-backward" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
data-set-on="-15" class="inline ">
</div>
</div>

<div data-type="switch"
data-device="Device"
data-get="transportState"
data-states='["PLAYING","PAUSED_PLAYBACK","STOPPED"]'
data-set-states='["Pause","Play","Play"]'
data-background-icon="fa-circle-thin"
data-background-colors='["orange","white","white"]'
data-colors='["white","white","white"]'
data-icons='["fa-pause","fa-play","fa-play"]'
class="inline ">
</div>

<div data-type="classchanger" data-device="Device" data-get="currentNormalAudio" data-get-on="1" data-get-off="0" data-off-class="hide" class="inline">
<div data-type="push" data-device="Device"
data-set="CurrentTrackPosition"
data-icon="fa-forward" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
data-set-on="+15" class="inline ">
</div>

<div data-type="push" data-device="Device"
data-icon="fa-step-forward" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
data-set-on="Next" class="inline ">
</div>

<div data-type="switch" data-device="Device" data-get="Shuffle" data-set="Shuffle"
data-icon="fa-random" data-background-icon="-"
data-on-color="#aa6900" data-off-color="gray"
data-get-on="1" data-get-off="0"
data-set-on="1" data-set-off="0" class="inline ">
</div>
</div>

<div data-type="popup" class="inline" data-width="470px" data-height="250px">
<div data-type="push"
data-icon="fa-list-ul" data-background-icon="-"
data-off-color="#fff" data-on-color="#aa6900"
class="">
</div>

<div class="dialog">
<header>Musikauswahl für Name</header>

<div class="top-space-10 left-align left-space">
<br>
<div>
<div class="large middle inline">Favoriten: </div>
<div data-type="select"
data-device="Device"
data-list="FavouritesList"
data-alias="FavouritesListAlias"
data-delimiter="|"
data-quote="/"
data-get="currentFavouriteNameMasked"
data-set="StartFavourite"
class="inline w3x"
onchange="$('.dialog-close').trigger('click');"></div>
</div>
<br>
<div>
<div class="large middle inline">Playlists: </div>
<div data-type="select"
data-device="Device"
data-list="PlaylistsList"
data-alias="PlaylistsListAlias"
data-delimiter="|"
data-quote="/"
data-get="currentPlaylistNameMasked"
data-set="StartPlaylist"
class="inline w3x"
onchange="$('.dialog-close').trigger('click');"></div>
</div>
<br>
<div>
<div class="large middle inline">Radiosta.: </div>
<div data-type="select"
data-device="Device"
data-list="RadiosList"
data-alias="RadiosListAlias"
data-delimiter="|"
data-quote="/"
data-get="currentRadioNameMasked"
data-set="StartRadio"
class="inline w3x"
onchange="$('.dialog-close').trigger('click');"></div>
</div>
</div>
</div>
</div>
</div>

<div data-type="slider" class="inline horizontal value tap" data-device="Device"
data-get="Volume" data-set="Volume" data-min="0" data-max="100" data-width="400px"></div>

<div data-type="switch" data-device="Device" data-get="Mute" data-set="Mute"
data-icon="oa-audio_volume_mute" data-background-icon="-"
data-on-color="#aa6900" data-off-color="gray"
data-get-on="1" data-get-off="0"
data-set-on="1" data-set-off="0" class="inline ">
</div>
</div>


Und die Einbindung auf meiner Media-Seite:
<!-- ========= Sonos Kueche =============== -->
<!-- ====================================== -->
<li class="transparent50" data-row="2" data-col="1" data-sizex="4" data-sizey="4">

<header>SONOS Küche</header>
<div data-template="template_musik_sonos.html" data-parameter='{"Name":"Kueche","Device":"Sonos_Kueche","Switch":"KU_Sonos_SW_Sw"}'></div>

</li>
<!-- ========= Sonos Schlafzimmer============ -->
<!-- ====================================== -->
<li class="transparent50" data-row="6" data-col="1" data-sizex="4" data-sizey="4">

<header>SONOS Schlafzimmer</header>
<div data-template="template_musik_sonos.html" data-parameter='{"Name":"Schlafzimmer","Device":"Sonos_Schlafzimmer","Switch":"SZ_Sonos_SW_Sw"}'></div>

</li>
<!-- ========= Sonos Wohnzimmer =============== -->
<!-- ====================================== -->
<li class="transparent50" data-row="2" data-col="5" data-sizex="4" data-sizey="4">

<header>SONOS Wohnzimmer</header>
<div data-template="template_musik_sonos.html" data-parameter='{"Name":"Wohnzimmer","Device":"Sonos_Wohnzimmer","Switch":"WZ_Sonos_SW"}'></div>

</li>
<!-- ========= Sonos Bad ================== -->
<!-- ====================================== -->
<li class="transparent50" data-row="6" data-col="5" data-sizex="4" data-sizey="4">

<header>SONOS Bad</header>
<div data-template="template_musik_sonos.html" data-parameter='{"Name":"Bad","Device":"Sonos_Bad","Switch":"BZ_Sonos_SW"}'></div>

</li>


Gruß Detlef

ToM_ToM

Hey,

sagt mal wo bekommt ihr denn die Readings RadioList und RadioListAlias her?
Ich habe nur das Reading Radios.

VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

Masterfunk

Zitat von: ToM_ToM am 27 März 2017, 20:12:47
Hey,

sagt mal wo bekommt ihr denn die Readings RadioList und RadioListAlias her?
Ich habe nur das Reading Radios.

VG, Thomas

Guckst Du:

https://forum.fhem.de/index.php/topic,69290.0.html

Gruß Detlef

TottiToad

Zitat von: Masterfunk am 19 März 2017, 13:12:23
Habe das ganze nochmal überarbeitet (Basierend auf Reinerleins's Config).

Rechts oben wird beim Player noch folgendes angezeigt:
1. Status des Players
2. Status Power-Switch für Player
3. Aktueller "TrackProvider" mit entsprechenden Icons
...

Hi,

habe gerade mal deine "Überarbeitung" genutzt.

Vorab, Genial !

Es mussten zwar bei mir ein paar Änderung bzgl. currentTrackPositionSimulatedSec umgestellt werden, doch jetzt läuft !


Hab da jedoch noch ne Frage zu den Symbolen rechts oben

- Bei werden zum einen 4 Symbole anzeigt, nicht 3
- 1 Symbol zeigt aktuellen Track Provider mit Symbol
- 2 Symbol schaltet einfach nur Switch on und off (Was hast Du damit geschaltet ?)
- 3 Symbol ist ohne Funktion
- 4 Symbol ist zum Player zu bzw. wegschabten


Grüße & Danke
Totti

Masterfunk

Zitat von: TottiToad am 26 Oktober 2017, 17:07:06
Hab da jedoch noch ne Frage zu den Symbolen rechts oben

- Bei werden zum einen 4 Symbole anzeigt, nicht 3
- 1 Symbol zeigt aktuellen Track Provider mit Symbol
- 2 Symbol schaltet einfach nur Switch on und off (Was hast Du damit geschaltet ?)
- 3 Symbol ist ohne Funktion
- 4 Symbol ist zum Player zu bzw. wegschabten

1. ja
2. Damit schalte ich die Steckdosen vor den Playern
3. Zeigt a ob der Player "reachable" ist
4. Zum Gruppieren

Gruß Detlef

Tobias

@ masterfunk, sieht ja super aus wie sich mein sonos template weiterentwickelt hat

Gesendet von meinem Leap mit Tapatalk

Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Mumpitz

Mir gefällt deine Integration Wahnsinnig gut. Leider ist sie jedoch für mein Lenovo Tab viel zu gross. Sobald ich anfange die Schriften zu verkleinern zerreisst es das ganze Layout. Kann man die Seite irgendwie einfach verkleinern oder hat jemand einen Tipp an welchen Stellen ich am schräubchen drehen muss?

mameier1234

Bei mir hatte ! alles funktioniert...

Nun kommen aber die Player Steuerungen Stop, Play , Pause usw gar nicht mehr.. werden nicht mehr angezeigt ...

Any Idea ?

chrisko

Also... irgendetwas reffe ich noch nicht.
Ich bekomme es einfach nicht hin, dass mit die Listen (Also Favoritten, Radios, usw.) angezeigt werden.
Weiß jemand Rat, as ich falsch mache, bzw. wwas genau ich beachten muss?
<div>
                  <div data-type="label" class="" >Favoriten:</div>
                  <div class="large middle "></div>
                  <div data-type="select"
                     data-device="Device"
                     data-list="FavouritesList"
                     data-alias="FavouritesListAlias"
                     data-delimiter="|"
                     data-quote="/"
                     data-get="currentFavouriteNameMasked"
                     data-set="StartFavourite"
                     class="large w3x"
                     onchange="$('.dialog-close').trigger('click');"></div>
</div>


Mir ist es nicht klar, wie ich an FavouritesList komme.
In FHEM sieht es so aus:

define Sonos_Kueche SONOSPLAYER RINCON_xxxxxxxxxxxxxxxx_MR
attr Sonos_Kueche alias Küche
attr Sonos_Kueche generateInfoSummarize1 <NormalAudio><Artist prefix="(" suffix=")"/><Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/><Album prefix=" vom Album '" suffix="'"/></NormalAudio> <StreamAudio><Sender suffix=":"/><SenderCurrent prefix=" '" suffix="' -"/><SenderInfo prefix=" "/></StreamAudio>
attr Sonos_Kueche generateInfoSummarize2 <TransportState/><InfoSummarize1 prefix=" => "/>
attr Sonos_Kueche generateInfoSummarize3 <Volume prefix="Lautstärke: "/><Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/> ~ Balance: <Balance ifempty="Mitte" emptyval="0"/><HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" emptyval="0"/>
attr Sonos_Kueche generateVolumeSlider 1
attr Sonos_Kueche getAlarms 1
attr Sonos_Kueche getTitleInfoFromMaster 1
attr Sonos_Kueche group Küche
attr Sonos_Kueche icon icoSONOSPLAYER_icon-S3.png
attr Sonos_Kueche minVolume 0
attr Sonos_Kueche model Sonos_S3
attr Sonos_Kueche room Küche,Sonos
attr Sonos_Kueche simulateCurrentTrackPosition 1
attr Sonos_Kueche sortby 1
attr Sonos_Kueche stateFormat presence ~ currentTrackPositionSimulatedPercent% (currentTrackPositionSimulated / currentTrackDuration)
attr Sonos_Kueche userReadings Favourites:LastActionResult.*?GetFavouritesWithCovers.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1;; } }, Radios:LastActionResult.*?GetRadiosWithCovers.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1;; } }, Playlists:LastActionResult.*?GetPlaylistsWithCovers.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1;; } }, Queue:LastActionResult.*?GetQueueWithCovers.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1;; } }, currentTrackPosition:LastActionResult.*?GetCurrentTrackPosition.* { if (ReadingsVal($name, "LastActionResult", "") =~ m/.*?: (.*)/) { return $1;; } }
attr Sonos_Kueche webCmd Volume
define Sonos_KuecheRG_Favourites readingsGroup Sonos_Kueche:<{SONOS_getListRG($DEVICE,"Favourites",1)}@FavouritesList>
define Sonos_KuecheRG_Radios readingsGroup Sonos_Kueche:<{SONOS_getListRG($DEVICE,"Radios",1)}@RadiosList>
define Sonos_KuecheRG_Playlists readingsGroup Sonos_Kueche:<{SONOS_getListRG($DEVICE,"Playlists")}@PlaylistsList>
define Sonos_KuecheRG_Queue readingsGroup Sonos_Kueche:<{SONOS_getListRG($DEVICE,"Queue")}@QueueList>



Was läuft verkehrt? Was übersehe ich hier?

Euch schonmal vielen Dank für Eure Hilfe!

Viele Grüße,
Chris

mameier1234

Hallo Chris,

ich habe da auch ziemlich lange gekämpft...

Die Beispiele im Wiki   https://wiki.fhem.de/wiki/SONOS  ganz unten machen es dann aber am Schluss doch einfach.. Man muss sich einfach mal richtig durchkämpfen..

Da wird dann auch klar, dass es ohne die Subs in myutils nicht geht.... (deine 4 letzen Zeilen.....getListRG....)

Ist aber tatsächlich alles! im Wiki

trinitywhm

Zitat von: mameier1234 am 25 November 2017, 13:17:48
Bei mir hatte ! alles funktioniert...

Nun kommen aber die Player Steuerungen Stop, Play , Pause usw gar nicht mehr.. werden nicht mehr angezeigt ...

Any Idea ?

Bei mir sah es auch zunächst aus das die Playersteuerung nicht angezeigt wird. Aber dann habe ich rausgefunden dass es mit vier Kacheln so ist das die zweite Zeile die obere Zeile überdeckt. Bei mir ist es zumindest so. Wenn ich nur zwei Kacheln anzeige, dann laufen die Player-Steuerungen auch aus dem div raus. Ich habe es leider noch nicht hinbekommen dass es so toll aussieht wie in dem Anhang von Beitrag #33. Hat noch irgendjemand eine Idee an was das liegen könnte oder was ich ändern muss?

Ich habe die template_sonos_musik.html aus #33 übernommen und die Einbindung soweit angepasst das ich eben nur zwei statt vier Kacheln habe. Wenn der Code hierfür noch interessant sein sollte, zur Problemlösung poste ich den gerne auch noch.

Fixel2012

Hallo zusammen,

ich habe mich ran gemacht und versucht Sonos im FTUI zu konfigurieren. Habe alle maßnahmen laut Wiki getroffen, aber leider wird mir alles nur verzogen angezeigt.

Ich habe keine Ahnung an was es liegen könnte.

Hier meine DEF in FTUI:


<ul>
<!-- ========= Sonos Schlafzimmer============ -->
<!-- ====================================== -->
<li data-row="1" data-col="1" data-sizex="3" data-sizey="5" class="border-down-gray lesstransparent">
<div data-template="template_musik_sonos.html" data-parameter='{"Device":"Sonos_Schlafzimmer"}'></div>
</li>

</ul>


An der Definition sollte doch alles richtig sein?!

Mit den data-size Werten habe ich bereits wild rum gespielt, da ändert sich aber leider nicht viel am Verhalten.

Im Anhang noch ein Bild.

Würde mich freuen, wenn da jemand einen Tipp hätte.

Gruß,

Fixel
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Nobby1805

#45
Wie sieht denn der Rest deiner Datei aus ... wenn ich dein Fragment ohne Änderung in meine Umgebung übernehme dann ist das zwar nicht optimal aber vermutlich doch eher das was du erwartest
Edit: verwendest du das Template aus #33 oder eine anderer Version?
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Fixel2012

Zitat von: Nobby1805 am 07 Januar 2018, 16:22:22
Wie sieht denn der Rest deiner Datei aus ... wenn ich dein Fragment ohne Änderung in meine Umgebung übernehme dann ist das zwar nicht optimal aber vermutlich doch eher das was du erwartest
Edit: verwendest du das Template aus #33 oder eine anderer Version?

Danke für das schnelle Antworten!

Ich verwende das Original Template aus dem Wiki von Reinerlein. Viel einstellen bzw. falsch machen kann man bei der Definition des Templates ja nicht?  :o

Ich habe eben zusätzlich nochmal geprüft, ob ich vielleicht einen kopier Fehler habe. Es ist allerdings alles identisch (geprüft mit diff online checker)

In der Template Datei muss ja auch sonst nichts stehen, oder hat eine Template.html eine gewisse Syntax im Dokument? Das wäre mir neu.

Danke und Gruß,

Fixel

Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Nobby1805

Ok, dann habe ich es mal mit dem Template von Reiner probiert ... sieht gut aus

poste bitte mal deinen kompletten index-File wo du das Template aufrufst

PS deine ftui-Module sind alle auf dem neusten Stand?
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Fixel2012

Zitat von: Nobby1805 am 07 Januar 2018, 23:52:21
Ok, dann habe ich es mal mit dem Template von Reiner probiert ... sieht gut aus

Schade, also muss es an meiner config liegen. Habe allerdings keine Ahnung, wo ich da anfangen soll zu suchen, bzw wonach ich überhaupt suchen muss  ::)

Zitatposte bitte mal deinen kompletten index-File wo du das Template aufrufst

Hier:

<!DOCTYPE html>
<html>
<head>
    <!--
     /* FHEM tablet ui */
     /*
     * UI builder framework for FHEM
     *
     * Version: 2.2.*
     * URL: https://github.com/knowthelist/fhem-tablet-ui
     *
     * Copyright (c) 2015-2016 Mario Stephan <mstephan@shared-files.de>
     * Under MIT License (http://www.opensource.org/licenses/mit-license.php)
     *
     * !!!! Evaluation version - run only in a staging enviroment !!!!
     *
     * - create a new folder named 'tablet_eval' in /<fhem-path>/www
     * - copy all files incl. sub folders into /<fhem-path>/www/tablet_eval
     * - add 'define TABLETUIEVAL HTTPSRV ftui_eval ./www/tablet_eval Tablet-EVAL' in fhem.cfg
     * - Tadaaa! A new fhem ui in http://<fhem-url>:8083/fhem/tablet_eval/
     *
     * Create a Demo Device in FHEM
     * define ftuitest dummy
     */

data-row = oben/unten
data-col = Rechts/Links
    -->
<meta name="viewport" content="maximum-scale=3.0, user-scalable=yes">
<meta name="widget_base_width" content="60">
<meta name="widget_base_height" content="52">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="gridster_disable" content="1">
<meta name="widget_margin" content="4">
<meta name="longpoll" content="1"> <!-- 1=longpoll;0=shortpoll every 30sec -->
<meta name="debug" content="0"> <!-- 1=output to console;0=not output -->

<link rel="stylesheet" href="/fhem/tablet/lib/jquery.gridster.min.css" />
<link rel="stylesheet" href="/fhem/tablet/css/fhem-tablet-ui.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/font-awesome.min.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/material-icons.min.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/jquery.toast.min.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/powerange.min.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/openautomation.css" />
<link rel="stylesheet" href="/fhem/tablet/lib/fhemSVG.css" />
<link rel="stylesheet" href="/fhem/tablet/css/fhem-tablet-ui-page-user.css" />
<link rel="stylesheet" href="/fhem/tablet/css/fhem-tablet-ui-weekprofile.css" />



<!-- define your personal style here, it wont be overwritten  -->
<!-- link rel="stylesheet" href="/fhem/tablet/css/fhem-green-ui.css" / -->
<!-- link rel="stylesheet" href="css/fhem-tablet-ui-user.css" / -->
<script type="text/javascript" src="/fhem/tablet/lib/powerange.min.js"></script>
<script type="text/javascript" src="/fhem/pgm2/jquery.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/lib/jquery.toast.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/lib/jquery.gridster.min.js"></script>
<script type="text/javascript" src="/fhem/tablet/js/fhem-tablet-ui.js" defer></script>

<!-- Enable this lines for usage with WebViewControl --><!-- -->
<script type="text/javascript" src="/fhem/pgm2/cordova-2.3.0.js"></script>
<script type="text/javascript" src="/fhem/js/webviewcontrol.js"></script>
<script type="text/javascript">var wvcDevices = {'12345': 'Tablet'}; var wvcUserCssFile="webviewcontrol.css"</script>
<!-- End for WebViewControl -->


<!-- ANFANG Auto Return to Home PageTab -->

<script type="text/javascript">
var t;
window.onload = resetTimer;
// DOM Events
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;
document.onclick = resetTimer;
document.onmousedown = resetTimer;

function returnHome() {
var hash= window.location.hash.replace('#', '').replace('.html', '');
if (hash != "" && hash != "home") {
var homeButton = document.getElementById('home');
$(homeButton).trigger("toggleOn");
window.location = "https://192.168.1.8:8083/fhem/ftui_felix/#content_main.html";
};
}

function resetTimer() {
clearTimeout(t);
t = setTimeout(returnHome, 30000);
// 1000 milisec = 1 sec
}
</script>

<!-- ENDE Auto Return to Home PageTab -->

<!-- Anfang Styles und Javascript für die Scrolltexte in der Sonosplayer-Ansicht -->
<style>
.flowanimation {
position: relative;
white-space: nowrap;
display: inline-block;
animation: floatText 8s infinite alternate ease-in-out;
}

@keyframes floatText {
from {
left: 0px;
}

to {
left: calc(355px - 100%);
}
}

.mycenteredtext {
position: relative;
white-space: nowrap;
display: inline-block;
left: calc(355px / 2 - 50%);
}
</style>

<script type="text/javascript">
function checkFlowAnimation(elemName) {
if ($(elemName).innerWidth() >= 355) {
$(elemName).addClass('flowanimation');
} else {
$(elemName).addClass('mycenteredtext');
}
}
</script>
<!-- Ende Styles und Javascript für die Scrolltexte in der Sonosplayer-Ansicht -->




    <title>FHEM UI Felix</title>
</head>
<body>
<div class="gridster">
<ul>


<!-- ============= Uhrzeit ================ -->
<!-- ====================================== -->
<li class="semitransparent3d" data-row="1" data-col="2" data-sizex="4" data-sizey="2">
<header class="semitransparentheader">Uhrzeit</header>
<div class="cell">
<div data-type="clock" class="cell top-space-1x big yellow semitransparenttext"></div>
<div data-type="clock" data-format="l d.m.Y" class="large semitransparenttext"></div></div>
</li>

<!-- ========= Aussentemperatur  =========== -->
<!-- ======================================= -->
<li class="semitransparent3d" data-row="1" data-col="6" data-sizex="4" data-sizey="2">
<header class="semitransparentheader">Aussentemperatur</header>
<div class="sheet">
<div class="vbox top-space items-space-around">
<div class="row">
<div class="cell-1-3">
<div class="row">
<div class="hbox">
<div class="compressed  normal shadow inline" data-type="symbol" data-icon="wi wi-thermometer" data-off-color="#999"></div>
<div class="large inline semitransparenttext" data-type="label" data-device="Aussen_Thermometer" data-get="temperature" data-limits='[-73,0,30]' data-colors='["#6699FF","#FAA460","#FF0000"]' data-unit="%B0C%0A" ></div>
</div>
<div data-type="label" class="inline shadow darker">Temperatur</div>
<div class="hbox">
<div data-type="klimatrend" data-device="Aussen_Thermometer" data-get="statTemperatureTendency" data-refperiod="1" class="inline large"></div>
<div data-type="klimatrend" data-device="Aussen_Thermometer" data-get="statTemperatureTendency" data-refperiod="2" class="inline large"></div>
<div data-type="klimatrend" data-device="Aussen_Thermometer" data-get="statTemperatureTendency" data-refperiod="3" class="inline large"></div>
</div>
</div>
</div>
<div class="cell-1-3">
<div class="row">
<div class="hbox">
<div class="compressed  normal shadow inline" data-type="symbol" data-icon="wi wi-humidity" data-off-color="#999"></div>
<div class="large inline semitransparenttext" data-type="label" data-device="Aussen_Thermometer" data-limits='[-73,0,100]' data-colors='["#6699FF","#FAA460","#FF0000"]' data-get="humidity" data-unit="%"></div>
</div>
<div data-type="label" class="inline shadow darker">Luftfeuchte</div>
<div class="hbox">
<div data-type="klimatrend" data-device="Aussen_Thermometer" data-get="statHumidityTendency" data-refperiod="1" class="inline large"></div>
<div data-type="klimatrend" data-device="Aussen_Thermometer" data-get="statHumidityTendency" data-refperiod="2" class="inline large"></div>
<div data-type="klimatrend" data-device="Aussen_Thermometer" data-get="statHumidityTendency" data-refperiod="3" class="inline large"></div>
</div>
</div>
</div>
<div class="cell-1-3">
<div class="row">
<div class="hbox">
<div class="compressed  normal shadow inline " data-type="symbol" data-icon="wi wi-thermometer-exterior" data-off-color="#999"></div>
<div class="compressed  normal shadow inline left-narrow" data-type="symbol" data-icon="wi wi-raindrops" data-off-color="#999"></div>
<div class="large inline semitransparenttext" data-type="label" data-device="Aussen_Thermometer" data-get="dewpoint" data-limits='[-73,0,100]' data-colors='["#6699FF","#FAA460","#FF0000"]' data-unit="%B0C%0A"></div>
</div>
<div data-type="label" class="inline  shadow darker">Taupunkt</div>
<div class="hbox">

<br>
</div>

</div>
</div>
</div>
</div>
</div>
</li>


<!-- ======= Oberes-Hauptmenü Regen ====== -->
<!-- ====================================== -->
<li class="semitransparent3d" data-row="1" data-col="10" data-sizex="2" data-sizey="2">
<header   class="semitransparentheader">Regen</header>

<div class="bigger"
data-type="symbol"
data-device="Regensensor_Rain"
data-get-on='["rain","dry"]'
data-icons='["oa-weather_rain_light","oa-weather_cloudy_heavy"]'
data-on-colors='["#518cf0","#999"]'></div>
</li>



<!-- ================ Sonne =============== -->
<!-- ====================================== -->
<li class="semitransparent3d" data-row="1" data-col="9" data-sizex="3" data-sizey="2">
<header class="semitransparentheader" >Sonne</header>
<div class="vbox">
<div class="hbox">
<div class="compressed  normal shadow" data-type="symbol" data-icon="wi wi-sunrise" data-off-color="#999"></div>
<div class="w1x  normal semitransparenttext" data-type="label" data-device="Sonnenaufgangdummy" data-color="#FAA460"></div>
</div>
<div class="hbox">
<div class="compressed  normal top-narrow shadow" data-type="symbol" data-icon="wi wi-sunset" data-off-color="#999"></div>
<div class="w1x  normal top-narrow semitransparenttext" data-type="label" data-device="Sonnenuntergangdummy" data-color="#FAA460"></div>
</div>
</div>
</li>







<!-- ============= Menü Links  ============= -->
<!-- ======================================= -->


<li data-row="1" data-col="1" data-sizex="1" data-sizey="10" class="semitransparent3d">
<header  class="semitransparentheader">Menü</header>

<div class="vbox">


<div id="home" data-type="pagebutton" data-url="#content_main.html" data-load="#content1" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern="(.*/||.*index.html||.*#content_main.html)" data-icon="fa-home" class="prefetch big shadow"></div>
<div data-type="label" class="small shadow">Home</div>
<div data-type="pagebutton" data-url="#content_Sonos.html" data-load="#content2" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_Sonos.html" data-icon="fa-music" class="prefetch big shadow"></div>
<div data-type="label" class="small shadow">Sonos</div>
<div data-type="pagebutton" data-url="#content_felix-Schlafzimmer.html"    data-load="#content3" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_felix-Schlafzimmer.html" data-icon="fa-bed" class="prefetch big top-space shadow"></div>
<div data-type="label" class="small shadow">Schlaf- Zimmer</div>
<div data-type="pagebutton" data-url="#content_felix-Wohnzimmer.html"     data-load="#content4" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_felix-Wohnzimmer.html" data-icon="oa-scene_livingroom" class="prefetch big top-space shadow"></div>
<div data-type="label" class="small shadow">Wohn- Zimmer</div>
<div data-type="pagebutton" data-url="#content_zentrale.html"     data-load="#content5" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_zentrale.html" data-icon="fa-cogs" class="prefetch big top-space shadow"></div>
<div data-type="label" class="small shadow">Zentrale</div>

</div>
</li>



<!-- ============= Menü Rechts  ============= -->
<!-- ======================================= -->

<li data-row="1" data-col="15" data-sizex="1" data-sizey="10" class="semitransparent3d">
<header  class="semitransparentheader">Menü</header>
<div class="vbox">
<div data-type="pagebutton" data-url="#content_kameras.html"      data-load="#content6" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_kameras.html" data-icon="oa-it_camera" class="prefetch big  shadow"></div>
<div data-type="label" class="small top-narrow shadow">Kamera</div>
<div data-type="pagebutton" data-url="#content_rolllaeden.html"  data-load="#content7" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_rolllaeden.html" data-icon="oa-fts_shutter_60" class="prefetch big shadow"></div>
<div data-type="label" class="small top-narrow shadow">Rollläden</div>
<div data-type="pagebutton" data-url="#content_telefon.html"     data-load="#content8" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_telefon.html" data-icon="fa-phone" class="prefetch big shadow"></div>
<div data-type="label" class="small top-narrow shadow">Anrufe</div>
<div data-type="pagebutton" data-url="#content_tanken.html"       data-load="#content9" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_tanken.html" data-icon="fa-car" class="prefetch big shadow"></div>
<div data-type="label" class="small top-narrow shadow">Spritpreise</div>
<div data-type="pagebutton" data-url="#content_garten.html"    data-load="#content10" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_garten.html" data-icon="oa-scene_garden" class="prefetch big shadow"></div>
<div data-type="label" class="small top-narrow shadow">Garten</div>
<div data-type="pagebutton" data-url="#content_wetter.html" data-load="#content11" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_wetter.html" data-icon="oa-weather_cloudy" class="prefetch big shadow"></div>
<div data-type="label" class="small top-narrow shadow">Wetter</div>
<div data-type="pagebutton" data-url="#content_3D_Drucker.html" data-load="#content12" data-off-background-color="rgba(0,0,0,0)" data-on-background-color="rgba(0,0,0,0)" data-off-color="#0087EA" data-on-color="#273D5C" data-active-pattern=".*#content_3D_Drucker.html" data-icon="fa-print" class="prefetch big shadow"></div>
<div data-type="label" class="small top-narrow shadow">3D-Drucker</div>

</div>
</li>

<li data-row="3" data-col="2" data-sizex="13" data-sizey="8" >
<div class="page" id="content1"></div>
<div class="page" id="content2"></div>
<div class="page" id="content3"></div>
<div class="page" id="content4"></div>
<div class="page" id="content5"></div>
<div class="page" id="content6"></div>
<div class="page" id="content7"></div>
<div class="page" id="content8"></div>
<div class="page" id="content9"></div>
<div class="page" id="content10"></div>
<div class="page" id="content11"></div>
<div class="page" id="content12"></div>
<div class="page" id="content13"></div>
<div class="page" id="content14"></div>
<div class="page" id="content15"></div>
<div class="page" id="content16"></div>
<div class="page" id="content17"></div>
<div class="page" id="content18"></div>
</li>


</ul>
</div>
</body>
</html>


ZitatPS deine ftui-Module sind alle auf dem neusten Stand?

Ja, alles aktuell!

Danke für deine Hilfe.

Gruß,

Fixel
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Nobby1805

#49
Jetzt komme ich dem Aussehen bei dir schon näher ...

und mit data-sizex="6" data-sizey="12" sieht es bei mir aus wie im 2. Screenshot ... das ist doch dann OK
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Fixel2012

Du bist wohl sehr nahe!  ;D

Exakt so verzogen sieht es eben bei mir auch aus  ;D

Weißt du ganz zufällig auch noch an was es liegt?  ::)
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Fixel2012

Zitat von: Nobby1805 am 08 Januar 2018, 10:36:01
und mit data-sizex="6" data-sizey="12" sieht es bei mir aus wie im 2. Screenshot ... das ist doch dann OK

:o Sieht bei mir mit der Veränderung genauso aus. Allerdings ist das nun außerhalb des bereiches der Tablet UI Seite.

Wie kann ich das Proportional ändern? Ich hätte gerne alle (3 Stück) meine Sonos auf der Seite.

Es muss also alles ein wenig kleiner werden.


Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

Nobby1805

Da sehe ich dann nur noch die Chance an diversen Stellen des Templates vorsichtig etwas zu ändern ... dort sind feste (Pixel) Größen eingetragen ... z.B. bei imagecover, slider, ... usw.

Ähnliche Probleme habe ich auch immer wieder wenn ich an einer Stelle in meiner Anzeige eine kleine Änderung mache und dann diverse andere Stellen im Bild wieder verschoben werden bzw. wirken :(
FHEM-Featurelevel: 6.2   (fhem.pl:28227/2023-11-29) auf Windows 10 Pro mit Strawberry Perl 5.32.1.1-32bit
TabletUI: 2.7.15
IO: 2xHMLAN(0.965)|HMUSB2(0.967)

Fixel2012

Mhh, also ein wenig komplizierter und Aufwändiger ;D Schade.

Werde dann wohl einfach mal alle Werte, die Größen Angaben Signalisieren um die hälfte halbieren.

Danke dir aufjedenfall für deine Hilfe!
Fhem 5.8 auf Raspi 3, HMLAN und 868MHz CUL mit einigen Komponenten, Z-Wave Rollladenaktoren, Tablet UI, 433 MHz CUL mit Baumarktsteckdosen und Temp Sensoren, Amazon Echo, Echo Dot, 2x SONOS  play1, 1x SONOS Connect AMP,  presence, HUE, Lightify

hnnmn

Hallo zusammen

Grosse Begeisterung herrscht - toll, was schon alles funktioniert.
Danke!

Für den WAF>95% fehlt mir noch, dass beim Click auf das Menu-Icon im FTUI-Sonos-Modul im folgenden Popup in den Einträgen bspw. bei Playlist tatsächlich die Playlists erscheinen.

Ich habe ein "Sonos_Living_Room:<{SONOS_getListRG($DEVICE,"Playlists")}@Playlists>" erstellt und dort ist die testweise erstellte Playlist enthalten (readingsGroup).

Zudem habe ich aus der Anleitung heraus ein Notify erstellt: "Sonos_[^_]+:PlaylistsVersion.* { fhem("get $NAME PlaylistsWithCovers"); fhem("get $NAME Playlists"); }"

Um ehrlich zu sein: ich bin noch nicht ganz durchgestiegen... ggf. erstellte mir das Notify auch das zuerst genannte readingsGroup ...

Meine Erwartung war jedenfalls, dass wenn sie in der readingsGroup stehen, sie auch dem SONOS-Template für das FTUI resp. dem o.g. Menu-Eintrag 'zur Verfügung' stehen... dem ist bisher wenigstens, auch nach Restarts, nicht so.

Hat jemand eine Idee dazu?

Beste Grüsse

cpramhofer

#55
Beispiel für aktuelle Version von FHEM, FTUI und SONOS.

ich bin ja extrem begeistert von den Beispielen und den Möglichkeiten.
Nachdem ich mich nun eine Woche lang jeden Abend durch alle Beispiele gekämpft habe und immer noch nicht schlauer bin muss ich mich jetzt aber direkt an das Forum wenden.

Ich habe alles aktualisiert und die aktuellsten Versionen installiert.
Cover Anzeige, Buttons, usw. funktioniert alles. Nur leider komme ich mit den Playlists, Favoriten und Radios nicht klar.
Sonos lädt ja inzwischen die Listen in eigene Readings.
Wie schaffe ich es aus diesen Readings vernünftige Drop Down boxen (oder noch besser Listenauswahlen zu erzeugen)? Ich habe alles versucht inkl. Funktionen in myUtils.
Gibt es für die neusten Versionen ein durchgängiges Beispiel?


<li data-row="1" data-col="2" data-sizex="4" data-sizey="3">
   <header>Sonos Büro</header>

   <div class="col-1-3">
        <div data-type="image" data-device="Sonos_Buero" data-get="currentAlbumArtURL" data-size="100%" class="normal top-space"></div>

        <div data-type="spinner" class="bottom centered" data-device="Sonos_Buero" data-get="Volume" data-set="Volume" data-max="50" data-step="1" data-icon-left="fa-volume-down" data-icon-right="fa-volume-up" class="top-space-2x spinner value" style="width: 200px; max-width: 200px; height: 50px; line-height: 45px; color: rgb(204, 204, 204); background-color: rgb(74, 74, 74);">
            <div class="lefticon fa fa-volume-down fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div>
            <div class="levelArea" style="width: 50%;">
              <div class="levelRange" style="left: 0px; width: 21.4286px; background: rgb(170, 105, 0) none repeat scroll 0% 0%;"></div>
            </div>
            <div class="righticon fa fa-volume-up fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div>
        </div>
   </div>
   <div class="col-2-3">
          <div class="row top-space">
             <div data-type="push" data-device="Sonos_Buero" data-set-on="PLAY" data-icon="fa-play" class="cell bigger"></div>
             <div data-type="push" data-device="Sonos_Buero" data-set-on="PAUSE" data-icon="fa-pause" class="cell bigger"></div>
             <div data-type="push" data-device="Sonos_Buero" data-set-on="PREVIOUS" data-icon="fa-step-backward" class="cell bigger"></div>
             <div data-type="push" data-device="Sonos_Buero" data-set-on="NEXT" data-icon="fa-step-forward" class="cell bigger"></div>
             <div data-type="multistatebutton" data-device="Sonos_Buero" data-get="Shuffle" data-get-on='["0","1"]' data-set='["Shuffle 1","Shuffle 0"]' data-set-default="Shuffle 0" data-icons='["fa-random","fa-random"]' class="cell bigger"></div>
         </div>
          <div class="row bottom">
            <div data-type="label" data-device="Sonos_Buero" data-get="currentArtist" class="normal"></div>
            <div data-type="label" data-device="Sonos_Buero" data-get="currentAlbum" class="small"></div>
            <div data-type="label" data-device="Sonos_Buero" data-get="currentTitle"  class="large"></div>
          </div>
          <div data-type="select" data-device="Sonos_Buero" data-list="Playlists" data-set="Sonos_Buero" class="wider"></div>

          <div data-type="select"
            data-device="Sonos_Buero"
            data-list="Playlists"
            data-alias="PlaylistsListAlias"
            data-delimiter="|"
            data-quote="/"
            data-get="currentPlaylistNameMasked"
            data-set="StartPlaylist"
            class="inline w3x"></div>
        </div>

   </div>
</li>


ich finde nur weit und breit kein Reading "PlaylistsListAlias"


define Sonos_Buero SONOSPLAYER RINCON_5CAAFD07505E01400_MR
attr Sonos_Buero getListsDirectlyToReadings 1
attr Sonos_Buero getPlaylistsListAtNewVersion 1
attr Sonos_Buero getQueueListAtNewVersion 1
attr Sonos_Buero getRadiosListAtNewVersion 1
attr Sonos_Buero getListsDirectlyToReadings 1
attr Sonos_Buero alias Büro
attr Sonos_Buero event-on-change-reading .*
attr Sonos_Buero generateInfoSummarize1 <NormalAudio><Artist prefix="(" suffix=")"/><Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/><Album prefix=" vom Album '" suffix="'"/></NormalAudio> <StreamAudio><Sender suffix=":"/><SenderCurrent prefix=" '" suffix="' -"/><SenderInfo prefix=" "/></StreamAudio>
attr Sonos_Buero generateInfoSummarize2 <TransportState/><InfoSummarize1 prefix=" => "/>
attr Sonos_Buero generateInfoSummarize3 <Volume prefix="Lautstärke: "/><Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/> ~ Balance: <Balance ifempty="Mitte" emptyval="0"/><HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" emptyval="0"/>
attr Sonos_Buero generateVolumeSlider 1
attr Sonos_Buero getAlarms 1
attr Sonos_Buero getTitleInfoFromMaster 1
attr Sonos_Buero group Buero
attr Sonos_Buero icon icoSONOSPLAYER_icon-S6.png
attr Sonos_Buero minVolume 0
attr Sonos_Buero model Sonos_S6
attr Sonos_Buero room Sonos
attr Sonos_Buero simulateCurrentTrackPosition 1
attr Sonos_Buero sortby 1
attr Sonos_Buero stateFormat presence ~ currentTrackPositionSimulatedPercent% (currentTrackPositionSimulated / currentTrackDuration)
attr Sonos_Buero webCmd Volume
define Sonos_GetNewFavouritesNotify notify Sonos_[^_]+:FavouritesVersion.* { fhem("get $NAME FavouritesWithCovers");; fhem("get $NAME Favourites");; }
define Sonos_GetNewPlaylistsNotify notify Sonos_[^_]+:PlaylistsVersion.* { fhem("get $NAME PlaylistsWithCovers");; fhem("get $NAME Playlists");; }
define Sonos_GetNewRadiosNotify notify Sonos_[^_]+:RadiosVersion.* { fhem("get $NAME RadiosWithCovers");; fhem("get $NAME Radios");; }
define Sonos_GetNewQueueNotify notify Sonos_[^_]+:QueueVersion.* { fhem("get $NAME QueueWithCovers");; fhem("get $NAME Queue");; }


Liebe Grüsse
Christoph

Otto

Moin,

ZitatCover Anzeige, Buttons, usw. funktioniert alles. Nur leider komme ich mit den Playlists, Favoriten und Radios nicht klar.

Da scheitere ich auch.

Wer hat einem Tipp?
Gruss Otto

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

docker - homematic

PieBa

Hallo,
versucht mal im SONOS device (nicht SONOSPLAYER!) das attribut getListsDirectlyToReadings auf 1 zu setzen.

Als Trigger zur Aktualisierung und zum erstmaligen Anlegen müsst Ihr dann noch für jedes SONOSPLAYER device

  • get Favourites
  • get Playlists
  • get Queue
  • get Radios
ausführen.

Damit diese Listen bei Änderungen automatisch aktualisiert werden, müssten dann noch die 4 Notifies, die im SONOS Wiki ganz unten aufgeführt sind, eingerichtet werden.

cpramhofer

@PieBa vielen Dank!! Der Hinweis mit dem Attribut im SONOS Device und nicht im Player hat mich ein ordentliches Stück weiter gebracht! Die Playlists werden jetzt angezeigt. Die restlichen Dropdowns sind noch leer aber da werde ich mal bei mir auf Fehlersuche gehen.

Liebe Grüsse und einen schönen Sonntag
Christoph

cpramhofer

Alle Playlists gefüllt! Perfekt!

Mit dem Feintuning bin ich noch nicht ganz zufrieden.

Brauche ich die Funktionen in 99_myUtils eigentlich noch? und wenn ja welche Funktion wird verwendet? Ich kann das aus dem Code nicht ableiten!

Die Selects baue ich mit folgendem Code im FTUI auf:
<div>
<div class="large middle inline">Abspielliste: </div>
<div data-type="select"
data-device="Device"
data-list="QueueList"
data-alias="QueueListAlias"
data-delimiter="|"
data-get="currentTrack"
data-set="Track"
class="inline w3x"
onchange="$('.dialog-close').trigger('click');"></div>
</div>


Er scheint aber auch die ":" als Delimeter zu verwenden.
Zusätzlich habe ich das Problem dass er bei den Playlists in der ersten Zeile den kompletten String anzeigt inkl. Delimeter.


cpramhofer

Problem gelöst!!

ich habe in 99_myUtils.pl die Funktionen auskommentiert und ein Update auf SONOS und alle FTUI Widgets gemacht.
Jetzt ist zwar das Layout zerschossen aber dafür funktionieren alle Dropdowns und alle anderen Widgets perfekt.

Mit den aktuellen Versionen funktioniert jetzt eigentlich alles "out of the box" ohne komplexe Notifys, Userreadings und Funktionen in Utils.

cpramhofer

Mein letztes Problem vor der Perfektion:

Die Anzeige der Gruppen: Habe aus @reinerleins Config den Header mit der Gruppierung übernommen die auch perfekt funktioniert.
Ich kann gruppieren, die Gruppen wieder zerteilen. Das einzige was nicht funktioniert ist dass im Header der Raumname bzw. die Gruppendetails
angezeigt werden. Wahlweis wird mir nichts oder "undefined" angezeigt.

Theoretisch muss ja ein Userreading "ZoneGroupNameDetails" angelegt werden. Aber roomName ist ja ein Reading des SONOS Players, zumindest das muss ja angezeigt werden?
Kann vielleicht jemand bei dem es funktioniert die FEHM-Config seiner Userreadings posten?

<div data-type="joinedlabel" data-device="Device" data-mask="[$1][ ($2)]" data-get='["roomName","ZoneGroupNameDetails"]' class="truncate inline"></div>

das ist das letzte Schnipsel das mir noch fehlt. Danach würde ich als "Revanche" alle meine Configs und Install/Update-Schritte veröffentlichen damit es neuen Usern leichter fällt die von Null auf eine FTUI SONOS integration verwirklichen wollen.

lg
Christoph

OdfFhem

#62
Hallo,

ZoneGroupNameDetails und roomName sind wohl normale Readings; jedenfalls sind sie bei mir beim Gruppieren automatisch gefüllt und stehen nicht im Attribut userReadings.

Ich verwende den folgenden Code im FTUI:

  <div data-type="joinedlabel" data-device="Device" data-mask="[$1][ ($2)]" data-get='["roomName","ZoneGroupNameDetails"]' class="truncate inline"></div>


Das Resultat beim Gruppieren von Büro (Master) und Küche (Slave) lautet:
FTUI-Anzeige bem Büro-SONOSPLAYER:  Büro ( + Küche)
FTUI-Anzeige beim Küche-SONOSPLAYER:  Küche (Büro)

Viele Grüße

steffus

Hallo @cpramhofer,
könntest du deine Lösungen hier posten? Ich stehe gerade vor dem Anfang und komme irgendwie nicht weiter.

cpramhofer

Hallo,

ich versuche mal meine Lösung hier zu posten:

Das allerwichtigste ist vorab alle Komponenten per "update all" zu aktualisieren!!
-> FHEM (5.8.)
-> FTUI (alle Widgets)
-> SONOS

In der Config habe ich die SONOS Komponenten so angelegt:
-> Wichtig: die Notifys müssen in der SONOS Hauptkomponente sein!

define Sonos SONOS localhost:4711 30
attr Sonos getListsDirectlyToReadings 1
define Sonos_GetNewFavouritesNotify notify Sonos_[^_]+:FavouritesVersion.* { fhem("get $NAME FavouritesWithCovers");; fhem("get $NAME Favourites");; }
define Sonos_GetNewPlaylistsNotify notify Sonos_[^_]+:PlaylistsVersion.* { fhem("get $NAME PlaylistsWithCovers");; fhem("get $NAME Playlists");; }
define Sonos_GetNewRadiosNotify notify Sonos_[^_]+:RadiosVersion.* { fhem("get $NAME RadiosWithCovers");; fhem("get $NAME Radios");; }
define Sonos_GetNewQueueNotify notify Sonos_[^_]+:QueueVersion.* { fhem("get $NAME QueueWithCovers");; fhem("get $NAME Queue");; }

define Sonos_Buero SONOSPLAYER RINCON_xxxxxxxxxxxxxx400_MR
attr Sonos_Buero alias Büro
attr Sonos_Buero event-on-change-reading .*
attr Sonos_Buero generateInfoSummarize1 <NormalAudio><Artist prefix="(" suffix=")"/><Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/><Album prefix=" vom Album '" suffix="'"/></NormalAudio> <StreamAudio><Sender suffix=":"/><SenderCurrent prefix=" '" suffix="' -"/><SenderInfo prefix=" "/></StreamAudio>
attr Sonos_Buero generateInfoSummarize2 <TransportState/><InfoSummarize1 prefix=" => "/>
attr Sonos_Buero generateInfoSummarize3 <Volume prefix="Lautstärke: "/><Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/> ~ Balance: <Balance ifempty="Mitte" emptyval="0"/><HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" emptyval="0"/>
attr Sonos_Buero generateVolumeSlider 1
attr Sonos_Buero getAlarms 1
attr Sonos_Buero getTitleInfoFromMaster 1
attr Sonos_Buero group Buero
attr Sonos_Buero icon icoSONOSPLAYER_icon-S6.png
attr Sonos_Buero minVolume 0
attr Sonos_Buero model Sonos_S6
attr Sonos_Buero room Sonos
attr Sonos_Buero simulateCurrentTrackPosition 1
attr Sonos_Buero sortby 1
attr Sonos_Buero stateFormat presence ~ currentTrackPositionSimulatedPercent% (currentTrackPositionSimulated / currentTrackDuration)
attr Sonos_Buero userReadings 1
attr Sonos_Buero webCmd Volume

define Sonos_Kueche SONOSPLAYER RINCON_xxxxxxxxxx2401400_MR
attr Sonos_Kueche alias Küche
attr Sonos_Kueche generateInfoSummarize1 <NormalAudio><Artist prefix="(" suffix=")"/><Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/><Album prefix=" vom Album '" suffix="'"/></NormalAudio> <StreamAudio><Sender suffix=":"/><SenderCurrent prefix=" '" suffix="' -"/><SenderInfo prefix=" "/></StreamAudio>
attr Sonos_Kueche generateInfoSummarize2 <TransportState/><InfoSummarize1 prefix=" => "/>
attr Sonos_Kueche generateInfoSummarize3 <Volume prefix="Lautstärke: "/><Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/> ~ Balance: <Balance ifempty="Mitte" emptyval="0"/><HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" emptyval="0"/>
attr Sonos_Kueche generateVolumeSlider 1
attr Sonos_Kueche getAlarms 1
attr Sonos_Kueche getTitleInfoFromMaster 1
attr Sonos_Kueche group Kueche
attr Sonos_Kueche icon icoSONOSPLAYER_icon-S3.png
attr Sonos_Kueche minVolume 0
attr Sonos_Kueche model Sonos_S3
attr Sonos_Kueche room Sonos
attr Sonos_Kueche simulateCurrentTrackPosition 1
attr Sonos_Kueche sortby 1
attr Sonos_Kueche stateFormat presence ~ currentTrackPositionSimulatedPercent% (currentTrackPositionSimulated / currentTrackDuration)
attr Sonos_Kueche userReadings 1
attr Sonos_Kueche webCmd Volume


Den HTML Code für das FTUI kann ich erst morgen posten.

hnnmn

Hallo zusammen

Ich bin ein wenig am Verzweifeln... alle Komponenten sind updated und dennoch das Problem: im FTUI kommen die Favoriten nur an, wenn ich ...
get Sonos_Living_Room Favourites
...manuell ausführe. Ansonsten steht immer der altbekannte Stand drin.

Spannend wiederum ist, dass die "Sonos_Living_Room"-> "FavouritesVersion", sowie die "Sonos_Living_Room"-> "Favourites" mit einer Aktualisierung der Favoriten (mache ich testweise aus der Sonos-App heraus) aktualisiert wurden (*1). Die Aktualisierung der "Sonos_Living_Room"-> "FavouritesList" und "Sonos_Living_Room"-> "FavouritesListAlias" jedoch passiert nur wie o.g.: manuell. Diese Listen werden wohl für das Listing im FTUI genutzt... dort bleibt demnach immer der alte Stand, bis ich diese Listen manuell aktualisiere.
(*1): wenigstens bis gestern, aktuell geht das auch nicht mehr - habe ich wohl verschlimmbessert


Evtl. hat mir von euch jemand einen Tip?
Als ersten Ansatz habe ich mal die fhem.cfg nach sonos gegreppt... das ist meine aktuelle Konfiguration.
Anmerkung, weil ich selbst erst schauen musste: die 4x ;;;; in den notifys sind aus der fhem-gui heraus betrachtet nur 2x ;; - so, wie es gemäss Doku auch sein sollte.

@cramphofer: was meinst Du mit "die Notifys müssen in der SONOS Hauptkomponente sein!"?

Ideen?

Beste Grüsse




grep -i sonos fhem.cfg | sort -k 2
define Sonos SONOS
attr Sonos getFavouritesListAtNewVersion 1
attr Sonos getListsDirectlyToReadings 1
attr Sonos getPlaylistsListAtNewVersion 1
attr Sonos getQueueListAtNewVersion 1
attr Sonos getRadiosListAtNewVersion 1
attr Sonos room Sonos
define Sonos_GetNewFavouritesNotify notify Sonos_[^_]+:FavouritesVersion.* { fhem("get $NAME FavouritesWithCovers");;;; fhem("get $NAME Favourites");;;; fhem("log 1, NAME__FAVORITE: $NAME");;;; }
attr Sonos_GetNewFavouritesNotify room Sonos
attr Sonos_GetNewFavouritesNotify verbose 5
define Sonos_GetNewPlaylistsNotify notify Sonos_[^_]+:PlaylistsVersion.* { fhem("get $NAME PlaylistsWithCovers");;;; fhem("get $NAME Playlists");;;; }
attr Sonos_GetNewPlaylistsNotify room Sonos
attr Sonos_GetNewPlaylistsNotify verbose 5
define Sonos_GetNewQueueNotify notify Sonos_[^_]+:QueueVersion.* { fhem("get $NAME QueueWithCovers");;;; fhem("get $NAME Queue");;;; }
attr Sonos_GetNewQueueNotify room Sonos
define Sonos_GetNewRadiosNotify notify Sonos_[^_]+:RadiosVersion.* { fhem("get $NAME RadiosWithCovers");;;; fhem("get $NAME Radios");;;; }
attr Sonos_GetNewRadiosNotify room Sonos
define Sonos_Living_Room SONOSPLAYER RINCON_949F3E6C6AA701400_MR
attr Sonos_Living_Room alias Living Room
attr Sonos_Living_Room event-on-change-reading .*
attr Sonos_Living_Room generateInfoSummarize1 <NormalAudio><Artist prefix="(" suffix=")"/><Title prefix=" '" suffix="'" ifempty="[Keine Musikdatei]"/><Album prefix=" vom Album '" suffix="'"/></NormalAudio> <StreamAudio><Sender suffix=":"/><SenderCurrent prefix=" '" suffix="' -"/><SenderInfo prefix=" "/></StreamAudio>
attr Sonos_Living_Room generateInfoSummarize2 <TransportState/><InfoSummarize1 prefix=" => "/>
attr Sonos_Living_Room generateInfoSummarize3 <Volume prefix="Lautstärke: "/><Mute instead=" ~ Kein Ton" ifempty=" ~ Ton An" emptyval="0"/> ~ Balance: <Balance ifempty="Mitte" emptyval="0"/><HeadphoneConnected instead=" ~ Kopfhörer aktiv" ifempty=" ~ Kein Kopfhörer" emptyval="0"/>
attr Sonos_Living_Room generateVolumeSlider 1
attr Sonos_Living_Room getAlarms 1
attr Sonos_Living_Room getTitleInfoFromMaster 1
attr Sonos_Living_Room group Living_Room
attr Sonos_Living_Room icon icoSONOSPLAYER_icon-S9.png
attr Sonos_Living_Room minVolume 0
attr Sonos_Living_Room model Sonos_S9
attr Sonos_Living_Room room Sonos
attr Sonos_Living_Room simulateCurrentTrackPosition 1
attr Sonos_Living_Room sortby 1
attr Sonos_Living_Room stateFormat presence ~ currentTrackPositionSimulatedPercent% (currentTrackPositionSimulated / currentTrackDuration)
attr Sonos_Living_Room verbose 0
attr Sonos_Living_Room webCmd Volume
define Sonos_Living_RoomRG_Favourites readingsGroup Sonos_Living_Room:<{SONOS_getListRG($DEVICE,"Favourites",1)}@Favourites>
define Sonos_Living_RoomRG_Playlists readingsGroup Sonos_Living_Room:<{SONOS_getListRG($DEVICE,"Playlists")}@Playlists>
attr Sonos_Living_RoomRG_Playlists room Sonos
define Sonos_Living_RoomRG_Queue readingsGroup Sonos_Living_Room:<{SONOS_getListRG($DEVICE,"Queue")}@Queue>
define Sonos_Living_RoomRG_Radios readingsGroup Sonos_Living_Room:<{SONOS_getListRG($DEVICE,"Radios",1)}@Radios>
define ntf_sonos notify Sonos_Living_Room:FavouritesVersion.* {fhem(log 1, "blabla")}

nitzerebb

@cpramhofer

Kannst Du bitte noch deinen HTML Code für FTUI posten ?
Wäre voll super :-)

Danke

maraka

Zitat von: Sturi2011 am 12 Dezember 2016, 23:23:19
Hallo,

ich wollte euch mal meine Sonos Integration vorstellen. Dazu habe ich die Scripte von Reinerlein und http://www.juergenstechnikwelt.de/ genommen und etwas angepasst. Ziel war, die Buttons im Tablet UI responsive zu machen und auch auf Aktionen mit der Sonos Anwendung zu reagieren.

Die Auswahl einer Playlist spielt diese ab. Der Play Button verwandelt sich in einen Pause Button. Das Select Element zeigt die aktuelle Playliste an.
Ein Klick auf Stop beendet die Wiedergabe. Das Select Element zeigt wieder seinen Titel Favoriten. Der Pause Button verwandelt sich wieder in einen Play Button.
Ein Klick auf Pause pausiert die Wiedergabe. Der Pause Button verwandelt sich in einen Play Button.

Ein Play in der Sonos App werwandelt den Play in einen Pause Button. Ein Pause in der Sonos App verwandelt den Pause in einen Play Button.

Gelöst habe ich das Ganze, indem ich alle Buttons den Status eines Dummys ändern lasse. Man benötigt für jedes Sonos Device einen Dummy mit dem Namen DM_Sonos_Raum

define DM_Sonos_Kueche dummy

Dieser Dummy wird mit Notifys überwacht. Die Notifys müssen ebenfalls für jeden Sonos Player angelegt werden.

define N_Sonos_Kueche_Play notify DM_Sonos_Kueche.PLAY {fhem "set Sonos_Kueche PLAY"}
define N_Sonos_Kueche_Pause notify DM_Sonos_Kueche.PAUSE {fhem "set Sonos_Kueche PAUSE"}
define N_Sonos_Kueche_Stop notify DM_Sonos_Kueche.STOP {fhem "set Sonos_Kueche STOP";;;; fhem "setreading DM_Sonos_Kueche default Favoriten"}


Für die Überwachung des Devices auf Änderungen, die nicht von Fhem kommen ist ein weiteres Notify pro device sowie ein event-on-change-reading am Device nötig.

define N_Sonos_Kueche_Device notify Sonos_Kueche:transportState.* { if (ReadingsVal("Sonos_Kueche","transportState","") eq "PAUSED_PLAYBACK") { fhem("set DM_Sonos_Kueche PAUSE")} elsif (ReadingsVal("Sonos_Kueche","transportState","") eq "STOPPED") { fhem("set DM_Sonos_Kueche STOP") } elsif (ReadingsVal("Sonos_Kueche","transportState","") eq "PLAYING") { fhem("set DM_Sonos_Kueche PLAY") }}

attr Sonos_Kueche event-on-change-reading .*


Für das Abspielen der Playlisten benötigen wir ein weiteres Notify

define N_SonosPlaylistAbspielen notify DM_Sonos_.* {SonosPlaylistStarten($EVENT)}

In der 99_MyUtils.pm müssen nun noch die folgenden Scripte eingebaut werden:

Playlisten erzeugen und in allen Fhem Dummys speichern
MeinePlayList()
{
   #Kueche ist der Master Player, daher Playlist hier ermitteln
   #Das Script muss manuell ausgeführt werden um die Playlisten einzulesen (nach jeder Änderung der Playlists)
   fhem("get Sonos_Kueche Playlists;");
   my $Playlist = ReadingsVal("Sonos_Kueche", "LastActionResult", "Keine");
   my @Playlists = split('GetPlaylists: ', $Playlist);
   my $playlistneu = 'Ostseewelle MV,'.$Playlists[1].',Favoriten';
   #zusätzllich noch unseren einzigen Radiosender dazu packen
   #playlist für TABUI select aufbereiten
   $playlistneu =~ s/,/:/g;
   $playlistneu =~ s/\"//g;

   #fhem("setreading duSonosPlaylists Playlist ".$playlistneu);
   fhem("setreading DM_Sonos_.* Playlist ".$playlistneu);
   fhem("setreading DM_Sonos_.* default Favoriten");
}


Abspielen der Playlisten
sub SonosPlaylistStarten($)
{
   my ($Playlist) = @_;
   my @player = split(' ',$Playlist);
   my @Liste = split($player[0]." ", $Playlist);

   $Liste[1] =~ s/ /%20/g;

   # falls der Radiosender gewählt wurde
   if($Playlist =~ /Ostseewelle/)
   {
      fhem("set $player[0] StartRadio $Liste[1]");
   }
   elsif($Playlist =~ /Favoriten/)
   {
   }
   else
   {
      fhem("set $player[0] StartPlaylist $Liste[1]");
   }
   my $SelPlayList = uri_unescape($Liste[1]);
   fhem("set DM_$player[0] PLAY");
   fhem("setreading DM_$player[0] default $SelPlayList");
}


Zu guter Letzt muss das Ganze noch in der Tablet UI definiert werden. Dies geschieht mit folgendem Code:

<li data-row="1" data-col="2" data-sizex="3" data-sizey="2">
   <header>Sonos Küche</header>
      <div class="container top-space">
         <div data-type="label" data-device="Sonos_Kueche" data-get="infoSummarize1"></div>
    <div data-type="select" data-device="DM_Sonos_Kueche" data-get="default" data-list="Playlist" data-set="Sonos_Kueche" class="wider large"></div>
      </div>
<div class="container inline">
  <div class="left">
   <div data-type="push" data-device="Sonos_Kueche" data-set-on="PREVIOUS" data-icon="fa-step-backward" class="cell"></div>
   <div data-type="switch" data-device="DM_Sonos_Kueche" data-set-on="PLAY" data-set-off="PAUSE" data-states='["PLAY","PAUSE","STOP"]' data-icons='["fa-pause","fa-play","fa-play"]' data-colors='["#555","#555","#555"]' data-background-colors='["#555","#555","#555"]' data-background-icon="fa-circle-thin" data-background-color="#555" class="cell"></div>
   <div data-type="push" data-device="Sonos_Kueche" data-set-on="NEXT" data-icon="fa-step-forward" class="cell"></div>
   <div data-type="push" data-device="DM_Sonos_Kueche" data-set-on="STOP" data-icon="fa-stop" class="cell"></div>
   <div data-type="multistatebutton" data-device="Sonos_Kueche" data-get="Shuffle" data-get-on='["0","1"]' data-set='["Shuffle 1","Shuffle 0"]' data-set-default="Shuffle 0" data-icons='["fa-random","fa-random"]' data-colors='["#2A2A2A","#00FF00"]' data-background-colors='["#555", "#555"]' background-color="#0000ff" off-color="#0000ff" class="cell"></div>
  </div>
</div>
<div class="container inline">
  <div class="left">
   <div data-type="spinner" data-device="Sonos_Kueche" data-get="Volume" data-set="Volume" data-max="50" data-step="4" data-icon-left="fa-volume-down" data-icon-right="fa-volume-up" class="top-space-2x spinner value" style="width: 200px; max-width: 200px; height: 50px; line-height: 45px; color: rgb(204, 204, 204); background-color: rgb(74, 74, 74);"><div class="lefticon fa fa-volume-down fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div><div class="levelArea" style="width: 50%;"><div class="levelRange" style="left: 0px; width: 21.4286px; background: rgb(170, 105, 0) none repeat scroll 0% 0%;"></div></div><div class="righticon fa fa-volume-up fa-lg fa-fw" style="color: rgb(170, 170, 170);"></div></div>
  </div>
</div>
</li>


Sicher lassen sich die Notifys noch weiter zusammenfassen. Der Übersichtlichkeit halber sind sie hier getrennt ausgeführt.

Gruß Andreas

Orandus

Hallo zusammen,

ich versuche auch gerade die Sonos Widgets in meinem Tablet UI zu integrieren und scheitere dabei gnadenlos.

Ich habe eine Sonos Box (Player 3) im Haus und in FHEM eingebunden. Das Abspielen von Musik über das angelegte Device "Sonos_Wohnzimmer" in FHEM funktioniert.

Nun habe ich im Tablet UI ein Pagebutton Menu in der index.html definiert und die eigentlichen Inhalte werden über eigene html-Dateien geladen. So ist auf der Startseite also links das Startmenü aus der index.html zu sehen und rechts der Inhalt inkl. Wetter, Abfallanzeige und weitere Widgets definiert in der content_main.html. 

Die Sonos Anzeige soll in der content_music.html definiert werden, da mir die Hauptseite sonst zu voll wird...

Die template_sonos_music.html habe ich auch wie beschrieben angelegt. Bis hierhin alles gut.

Wenn ich aber nun die content_music.html hochlade zerschießt es mir die Anzeige und wirft Fehler, wo ich einfach nicht dahinterkomme, wie sie entstehen. Hier meine content_music.html:

<!DOCTYPE html>
<html>

<head>
    <title>FHEM-Tablet-UI-Dev</title>
</head>

<body>
    <div class="page" id="content2">
    <div class="gridster">
        <ul>
                <!-- ========= Sonos Wohnzimmer =============== -->
                <li data-row="1" data-col="1" data-sizex="3" data-sizey="5" class="border-down-gray lesstransparent">
                    <div data-template="template_musik_sonos.html" data-parameter='{"Device":"Sonos_Wohnzimmer"}'></div>
                </li>

                <!--************** Ende  ****************-->
        </ul>
    </div>
</body>
</html>


Und das führt zu folgenden Fehlermeldungen (sie beziehen sich alle anscheinend auf die content_main.html, die als content1 standardmäßig als "Startseite" geladen wird, da auch das Weather Widget angemeckert wird.):

widget_symbol.js line 25:
Uncaught TypeError: elem.initClassColor is not a function

widget_switch.js line 25:
Uncaught TypeError: elem.initClassColor is not a function

widget_weather.js line 684:
Uncaught TypeError: elem.initData is not a function

widget_label.js line 71:
Uncaught TypeError: elem.initData is not a function


Sobald ich die content_music.html wieder herauswerfe ist alles gut und die content_main.html wird fehlerlos geladen...

Hat irgendjemand eine Idee? Ich bin am verzweifeln...

Vielen Dank im Voraus,
der Lars

Karsiacar

Hallo und ein Frohes neues Jahr,

muss das Thema nochmal aufwärmen und hoffen, dass mich einer an die Hand nimmt.

Wie bekomme ich meine Radiosender (Favoriten in der Sonosapp bzw. im noson Programm auf linux), die ja mit
set Sonos_Buero FavouritesWithCovers in FHEM eingepflegt werden, in mein FTUI?

Hab dazu n paar Tutorials gelesen/befolgt aber ich scheitere kläglich an der 99_myUtils. Oder bestimmt auch wo anders.

Hier mal meine RAW definition:

defmod Sonos SONOS localhost:4711 30 1 5
attr Sonos getPlaylistsListAtNewVersion 1
attr Sonos icon audio_sound
attr Sonos room Sonos
attr Sonos targetSpeakDir /opt/fhem/SonosSpeak
attr Sonos targetSpeakFileHashCache 1
attr Sonos targetSpeakFileTimestamp 0
attr Sonos targetSpeakMP3FileDir /opt/fhem/SonosSpeak
attr Sonos targetSpeakURL \\192.168.178.21\SonosSpeak

setstate Sonos opened
setstate Sonos 2020-12-18 12:31:44 AllPlayer ['Sonos_Buero','Sonos_Wohnzimmer']
setstate Sonos 2020-12-18 12:31:44 AllPlayerCount 2
setstate Sonos 2020-12-18 12:31:44 AllPlayerNotBonded ['Sonos_Buero','Sonos_Wohnzimmer']
setstate Sonos 2020-12-18 12:31:44 AllPlayerNotBondedCount 2
setstate Sonos 2021-01-03 16:47:25 LastProcessAnswer 1609688845
setstate Sonos 2020-11-28 23:13:58 LineInPlayer []
setstate Sonos 2020-12-21 10:08:17 MasterPlayer ['Sonos_Buero','Sonos_Wohnzimmer']
setstate Sonos 2020-12-21 10:08:17 MasterPlayerCount 2
setstate Sonos 2021-01-03 16:27:48 MasterPlayerNotPlaying ['Sonos_Wohnzimmer']
setstate Sonos 2021-01-03 16:27:48 MasterPlayerNotPlayingCount 1
setstate Sonos 2021-01-03 16:27:48 MasterPlayerPlaying ['Sonos_Buero']
setstate Sonos 2021-01-03 16:27:48 MasterPlayerPlayingCount 1
setstate Sonos 2020-12-31 21:11:25 MusicServicesList {'9' => {'ResolutionSubstitution' => '_light_290.svg','SMAPI' => 'https://spotify-v5.ws.sonos.com/smapi','Name' => 'Spotify','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/2311/2311-400x400.png','ServiceType' => '2311','Capabilities' => '5310995','PromoText' => 'Musik auf radikal andere Weise erleben. Millionen von Titeln auf Abruf in höchster Klangqualität.','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/2311/2311-72x72.png','Resolution' => 290},'192' => {'ResolutionSubstitution' => '-1500.png','SMAPI' => 'https://www.focusatwill.com/sonos/action','Name' => 'focus@will','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/49159/49159-400x400.png','ServiceType' => '49159','Capabilities' => '5632','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/49159/49159-72x72.png','Resolution' => 1500},'256' => {'ResolutionSubstitution' => 'w_1500,h_1500','SMAPI' => 'https://cbcmusic-sonos-beta.azurewebsites.net/SonosService.svc','Name' => 'CBC Radio &amp;; Music','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/65543/65543-400x400.png','ServiceType' => '65543','Capabilities' => '594496','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/65543/65543-72x72.png','Resolution' => 1500},'273' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://klassiksonos.prod.global.7digital.net/sonos.asmx','Name' => 'Klassik Radio Select','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/69895/69895-400x400.png','ServiceType' => '69895','Capabilities' => '561729','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/69895/69895-72x72.png','Resolution' => undef},'193' => {'ResolutionSubstitution' => '_1500.png','SMAPI' => 'https://api.tunify.com/Sonos2/services/Sonos','Name' => 'Tunify for Business','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/49415/49415-400x400.png','ServiceType' => '49415','Capabilities' => '8769','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/49415/49415-72x72.png','Resolution' => 1500},'279' => {'ResolutionSubstitution' => '_1500.jpg','SMAPI' => 'https://sonoslb.radioapi.io/global','Name' => 'Global Player','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/71431/71431-400x400.png','ServiceType' => '71431','Capabilities' => '577','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/71431/71431-72x72.png','Resolution' => 1500},'268' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos.mytuner.mobi/api/v2/sonos/soap','Name' => 'myTuner Radio','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/68615/68615-400x400.png','ServiceType' => '68615','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/68615/68615-72x72.png','Resolution' => undef},'174' => {'ResolutionSubstitution' => '640x640.jpg','SMAPI' => 'https://smapi.tidal.com/sonos','Name' => 'TIDAL','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/44551/44551-400x400.png','ServiceType' => '44551','Capabilities' => '47699','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/44551/44551-72x72.png','Resolution' => 640},'295' => {'ResolutionSubstitution' => '_80.svg','SMAPI' => 'https://sms.soundtrackyourbrand.com/soap','Name' => 'Soundtrack Player','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/75527/75527-400x400.png','ServiceType' => '75527','Capabilities' => '13632001','PromoText' => 'Soundtracks evolve dynamically and give your business an endless stream of music. Pick soundtracks made by our music experts or create your own in seconds.','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/75527/75527-72x72.png','Resolution' => 40},'294' => {'ResolutionSubstitution' => '.jpg','SMAPI' => 'https://rjsonos.app/musicservice','Name' => 'Radio Javan','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/75271/75271-400x400.png','ServiceType' => '75271','Capabilities' => '528897','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/75271/75271-72x72.png','Resolution' => 600},'38' => {'ResolutionSubstitution' => '_800.jpg','SMAPI' => 'https://sonos-service.7digital.com/sonos.asmx','Name' => '7digital','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/9735/9735-400x400.png','ServiceType' => '9735','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/9735/9735-72x72.png','Resolution' => 800},'270' => {'ResolutionSubstitution' => '1000.png','SMAPI' => 'https://sonos.relisten.net/mp3','Name' => 'Relisten','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/69127/69127-400x400.png','ServiceType' => '69127','Capabilities' => '4672','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/69127/69127-72x72.png','Resolution' => 1000},'308' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://api.radioparadise.com/sonos/soap/server.php','Name' => 'Radio Paradise','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/78855/78855-400x400.png','ServiceType' => '78855','Capabilities' => '4198912','PromoText' => 'Radio Paradise is a unique blend of many styles and genres of music, carefully selected and mixed by two real human beings. Discover why people all over the world make Radio Paradise their all-day every day soundtrack. Login or Create an account to start listening.','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/78855/78855-72x72.png','Resolution' => undef},'36' => {'ResolutionSubstitution' => '_290.png','SMAPI' => 'https://sonos.hos.com/SOAP/Server1.2.php','Name' => 'Hearts of Space','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/9223/9223-400x400.png','ServiceType' => '9223','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/9223/9223-72x72.png','Resolution' => 290},'271' => {'ResolutionSubstitution' => '&amp;;w=1500&amp;;h=1500','SMAPI' => 'https://idg-prod-sonos.herokuapp.com/smapi/action','Name' => 'IDAGIO','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/69383/69383-400x400.png','ServiceType' => '69383','Capabilities' => '602688','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/69383/69383-72x72.png','Resolution' => 1500},'13' => {'ResolutionSubstitution' => '_290x290.png','SMAPI' => 'https://stitcher.com/Service/Sonos/Sonos.php','Name' => 'Stitcher','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/3335/3335-400x400.png','ServiceType' => '3335','Capabilities' => '4675','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/3335/3335-72x72.png','Resolution' => 290},'191' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://api.classicalarchives.com/smapi/endpoint','Name' => 'Classical Archives','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/48903/48903-400x400.png','ServiceType' => '48903','Capabilities' => '1030739','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/48903/48903-72x72.png','Resolution' => undef},'277' => {'ResolutionSubstitution' => '_290.svg','SMAPI' => 'https://psapi.nrk.no/sonos/sonos.svc','Name' => 'NRK Radio','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/70919/70919-400x400.png','ServiceType' => '70919','Capabilities' => '37377','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/70919/70919-72x72.png','Resolution' => 290},'171' => {'ResolutionSubstitution' => '_1500.png','SMAPI' => 'https://sonos.mix.moodmedia.com/api','Name' => 'Mood Mix','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/43783/43783-400x400.png','ServiceType' => '43783','Capabilities' => '4609','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/43783/43783-72x72.png','Resolution' => 1500},'218' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://soundsuit.fm/smapi','Name' => 'Soundsuit.fm','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/55815/55815-400x400.png','ServiceType' => '55815','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/55815/55815-72x72.png','Resolution' => undef},'150' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://www.rusc.com/sonos.asmx','Name' => 'RUSC','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/38407/38407-400x400.png','ServiceType' => '38407','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/38407/38407-72x72.png','Resolution' => undef},'275' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos.radioart.com/','Name' => 'ARTRADIO - RadioArt.com','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/70407/70407-400x400.png','ServiceType' => '70407','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/70407/70407-72x72.png','Resolution' => undef},'31' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://www.qobuz.com/api.xml/0.3/sonos','Name' => 'Qobuz','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/7943/7943-400x400.png','ServiceType' => '7943','Capabilities' => '10835','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/7943/7943-72x72.png','Resolution' => undef},'157' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sns.bandcamp.com/api/sonos/2/sonos_api','Name' => 'Bandcamp','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/40199/40199-400x400.png','ServiceType' => '40199','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/40199/40199-72x72.png','Resolution' => undef},'183' => {'ResolutionSubstitution' => '_290.svg','SMAPI' => 'https://narando.com/sonos/service/action','Name' => 'narando','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/46855/46855-400x400.png','ServiceType' => '46855','Capabilities' => '37395','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/46855/46855-72x72.png','Resolution' => 290},'169' => {'ResolutionSubstitution' => '_1500.jpg','SMAPI' => 'https://sonos.tribeofnoise.com/server-v2.1.php','Name' => 'Tribe of Noise','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/43271/43271-400x400.png','ServiceType' => '43271','Capabilities' => '4672','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/43271/43271-72x72.png','Resolution' => 1500},'262' => {'ResolutionSubstitution' => '_290x290.png','SMAPI' => 'https://sonos.mycloud.com/musicservice','Name' => 'My Cloud Home','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/67079/67079-400x400.png','ServiceType' => '67079','Capabilities' => '33281','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/67079/67079-72x72.png','Resolution' => 290},'233' => {'ResolutionSubstitution' => '/960/','SMAPI' => 'https://integrations.pocketcasts.com/service/smapi','Name' => 'Pocket Casts','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/59655/59655-400x400.png','ServiceType' => '59655','Capabilities' => '1028672','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/59655/59655-72x72.png','Resolution' => 960},'222' => {'ResolutionSubstitution' => '_290.svg','SMAPI' => 'https://sonos.nugs.net/soap/nugs','Name' => 'nugs.net','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/56839/56839-400x400.png','ServiceType' => '56839','Capabilities' => '531027','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/56839/56839-72x72.png','Resolution' => 290},'226' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonosapi.storytel.com/sonos/1.0','Name' => 'Storytel','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/57863/57863-400x400.png','ServiceType' => '57863','Capabilities' => '636481','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/57863/57863-72x72.png','Resolution' => undef},'306' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos-smapi.service.kollekt.fm/wsdl','Name' => 'Atmosphere by Kollekt.fm','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/78343/78343-400x400.png','ServiceType' => '78343','Capabilities' => '4260352','PromoText' => 'Kollekt.fm is on a mission to end generic and boring background music.              For client brands, Atmosphere offers a tailor made in-store music experience. Every month a brand-fit             repertoire is handpicked by a personal curator (Artist, DJ or Tastemaker). We believe interesting stories             are not told by algorithms and faceless playlists. Our curators live and breath music and make your brand’s             story come to life.','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/78343/78343-72x72.png','Resolution' => undef},'239' => {'ResolutionSubstitution' => '290x290.svg','SMAPI' => 'https://sonos.audible.com/smapi','Name' => 'Audible','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/61191/61191-400x400.png','ServiceType' => '61191','Capabilities' => '1095249','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/61191/61191-72x72.png','Resolution' => 290},'189' => {'ResolutionSubstitution' => '_1500.png','SMAPI' => 'https://provider.sound-machine.com/sonosapi','Name' => 'SOUNDMACHINE','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/48391/48391-400x400.png','ServiceType' => '48391','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/48391/48391-72x72.png','Resolution' => 1500},'163' => {'ResolutionSubstitution' => '/large/','SMAPI' => 'https://sonos.spreaker.com/sonos/service/v1','Name' => 'Spreaker','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/41735/41735-400x400.png','ServiceType' => '41735','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/41735/41735-72x72.png','Resolution' => 200},'203' => {'ResolutionSubstitution' => '1500x1500.jpg','SMAPI' => 'https://sonosapi-napster.rhapsody.com/smapi','Name' => 'Napster','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/51975/51975-400x400.png','ServiceType' => '51975','Capabilities' => '595','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/51975/51975-72x72.png','Resolution' => 1500},'232' => {'ResolutionSubstitution' => '_1500.jpg','SMAPI' => 'https://sonoslb.radioapi.io/radioplayer','Name' => 'Radioplayer','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/59399/59399-400x400.png','ServiceType' => '59399','Capabilities' => '577','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/59399/59399-72x72.png','Resolution' => 1500},'212' => {'ResolutionSubstitution' => 'width=1500','SMAPI' => 'https://sonos.plex.tv/v2.2/soap','Name' => 'Plex','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/54279/54279-400x400.png','ServiceType' => '54279','Capabilities' => '1937985','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/54279/54279-72x72.png','Resolution' => 1500},'309' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://api.prod.jazzed.club/api/sonosservice','Name' => 'jazzed','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/79111/79111-400x400.png','ServiceType' => '79111','Capabilities' => '26055232','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/79111/79111-72x72.png','Resolution' => undef},'216' => {'ResolutionSubstitution' => '1500x1500.jpg','SMAPI' => 'https://sonosapi-aldimusic.rhapsody.com/smapi','Name' => 'Aldi life Musik','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/55303/55303-400x400.png','ServiceType' => '55303','Capabilities' => '4627','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/55303/55303-72x72.png','Resolution' => 1500},'303' => {'ResolutionSubstitution' => '?w=1500','SMAPI' => 'https://sali.sonos.radio/smapi','Name' => 'Sonos Radio','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/77575/77575-400x400.png','ServiceType' => '77575','Capabilities' => '12599817','PromoText' => 'Greife auf tausende Radiosender aus der ganzen Welt zu, höre von uns zusammengestellte Sender verschiedener Genres, entdecke neue Musik und erlebe eigens kuratierte Inhalte kostenlos mit der Sonos App.','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/77575/77575-72x72.png','Resolution' => 1500},'223' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos-smapi.rautemusik.fm/smapi','Name' => 'RauteMusik.FM','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/57095/57095-400x400.png','ServiceType' => '57095','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/57095/57095-72x72.png','Resolution' => undef},'162' => {'ResolutionSubstitution' => '_290.svg','SMAPI' => 'https://sonos.townsquaremedia.com/index.php','Name' => 'radioPup','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/41479/41479-400x400.png','ServiceType' => '41479','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/41479/41479-72x72.png','Resolution' => 290},'283' => {'ResolutionSubstitution' => '1500x1500','SMAPI' => 'https://sonos.calm.com/server.php','Name' => 'Calm','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/72455/72455-400x400.png','ServiceType' => '72455','Capabilities' => '102976','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/72455/72455-72x72.png','Resolution' => 1500},'269' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos.antennebayern.customers.nuuk.de/wsdl','Name' => 'ANTENNE BAYERN','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/68871/68871-400x400.png','ServiceType' => '68871','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/68871/68871-72x72.png','Resolution' => undef},'312' => {'ResolutionSubstitution' => '_1500.png','SMAPI' => 'https://smapi.radioshop.net/SonosService.svc','Name' => 'Radioshop','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/79879/79879-400x400.png','ServiceType' => '79879','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/79879/79879-72x72.png','Resolution' => 1500},'164' => {'ResolutionSubstitution' => '500x500.jpg','SMAPI' => 'https://www.saavn.com/apps/sonos/SonosAPI.php','Name' => 'Saavn','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/41991/41991-400x400.png','ServiceType' => '41991','Capabilities' => '12865','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/41991/41991-72x72.png','Resolution' => 500},'301' => {'ResolutionSubstitution' => '.svg','SMAPI' => 'https://sonos-api.primephonic.com/server.php','Name' => 'Primephonic','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/77063/77063-400x400.png','ServiceType' => '77063','Capabilities' => '577','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/77063/77063-72x72.png','Resolution' => 40},'221' => {'ResolutionSubstitution' => '_290.svg','SMAPI' => 'https://sonos.nugs.net/soap/livephish','Name' => 'LivePhish+','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/56583/56583-400x400.png','ServiceType' => '56583','Capabilities' => '6675','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/56583/56583-72x72.png','Resolution' => 290},'315' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos.convoynetwork.com/musicservice','Name' => 'Convoy Network','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/80647/80647-400x400.png','ServiceType' => '80647','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/80647/80647-72x72.png','Resolution' => undef},'198' => {'ResolutionSubstitution' => '-290x290.png','SMAPI' => 'https://api.anghami.com/anghmob/SonosAPI.php','Name' => 'Anghami','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/50695/50695-400x400.png','ServiceType' => '50695','Capabilities' => '2627','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/50695/50695-72x72.png','Resolution' => 290},'260' => {'ResolutionSubstitution' => '_1500.jpg','SMAPI' => 'https://sonos.minidisco.nl/server.php','Name' => 'Minidisco','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/66567/66567-400x400.png','ServiceType' => '66567','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/66567/66567-72x72.png','Resolution' => 1500},'201' => {'ResolutionSubstitution' => '290x290.svg','SMAPI' => 'https://sonos.amazonmusic.com/','Name' => 'Amazon Music','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/51463/51463-400x400.png','ServiceType' => '51463','Capabilities' => '2208321','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/51463/51463-72x72.png','Resolution' => 290},'235' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos.playsr.com/ws','Name' => 'Sveriges Radio','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/60167/60167-400x400.png','ServiceType' => '60167','Capabilities' => '70145','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/60167/60167-72x72.png','Resolution' => undef},'234' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos.deliver.media/musicservice','Name' => 'deliver.media','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/59911/59911-400x400.png','ServiceType' => '59911','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/59911/59911-72x72.png','Resolution' => undef},'184' => {'ResolutionSubstitution' => '_290.svg','SMAPI' => 'https://sonos.stingray.com/ws/Sonos','Name' => 'Stingray Music','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/47111/47111-400x400.png','ServiceType' => '47111','Capabilities' => '295427','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/47111/47111-72x72.png','Resolution' => 290},'167' => {'ResolutionSubstitution' => '_480x480_','SMAPI' => 'https://sonosapi.gaana.com/SonosAPI.php','Name' => 'Gaana','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/42759/42759-400x400.png','ServiceType' => '42759','Capabilities' => '577','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/42759/42759-72x72.png','Resolution' => 480},'284' => {'ResolutionSubstitution' => '_dark_290x290.svg','SMAPI' => 'https://music.googleapis.com/v1:sendRequest','Name' => 'YouTube Music','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/72711/72711-400x400.png','ServiceType' => '72711','Capabilities' => '32473609','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/72711/72711-72x72.png','Resolution' => 290},'2' => {'ResolutionSubstitution' => '1000x1000-000000-80-0-0.jpg','SMAPI' => 'https://api.deezer.com/sonos','Name' => 'Deezer','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/519/519-400x400.png','ServiceType' => '519','Capabilities' => '25180755','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/519/519-72x72.png','Resolution' => 1000},'305' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://libbysonos.overdrive.com/soap','Name' => 'Libby by OverDrive','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/78087/78087-400x400.png','ServiceType' => '78087','Capabilities' => '4821568','PromoText' => 'Select "Sign in" below to link with your Libby app.','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/78087/78087-72x72.png','Resolution' => undef},'230' => {'ResolutionSubstitution' => '/1000x1000/','SMAPI' => 'https://www.nts.live/smapi','Name' => 'NTS Radio','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/58887/58887-400x400.png','ServiceType' => '58887','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/58887/58887-72x72.png','Resolution' => 1000},'304' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://sonos.regiocast.customers.nuuk.de/wsdl','Name' => 'BOB! Deutschlands Rockradio','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/77831/77831-400x400.png','ServiceType' => '77831','Capabilities' => '513','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/77831/77831-72x72.png','Resolution' => undef},'181' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://www.mixcloud.com/sonos-app/','Name' => 'Mixcloud','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/46343/46343-400x400.png','ServiceType' => '46343','Capabilities' => '2627','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/46343/46343-72x72.png','Resolution' => undef},'160' => {'ResolutionSubstitution' => 't500x500','SMAPI' => 'https://soundcloud-go.ws.sonos.com/smapi','Name' => 'SoundCloud','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/40967/40967-400x400.png','ServiceType' => '40967','Capabilities' => '4611','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/40967/40967-72x72.png','Resolution' => 500},'217' => {'ResolutionSubstitution' => '_1500.jpg','SMAPI' => 'https://www.fitradio.com/apisonos/ws','Name' => 'FIT Radio Workout Music','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/55559/55559-400x400.png','ServiceType' => '55559','Capabilities' => '4610','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/55559/55559-72x72.png','Resolution' => 1500},'231' => {'ResolutionSubstitution' => '640','SMAPI' => 'https://moapi.wolfgangs.com/ws/wolfgangs.asmx','Name' => 'Wolfgang&apos;;s Music','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/59143/59143-400x400.png','ServiceType' => '59143','Capabilities' => '537153','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/59143/59143-72x72.png','Resolution' => 640},'310' => {'ResolutionSubstitution' => '-1000.jpg','SMAPI' => 'https://sonos.ibroadcast.com/','Name' => 'iBroadcast','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/79367/79367-400x400.png','ServiceType' => '79367','Capabilities' => '4198977','PromoText' => 'Listen to your iBroadcast music library on Sonos speakers.','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/79367/79367-72x72.png','Resolution' => 600},'265' => {'ResolutionSubstitution' => undef,'SMAPI' => 'https://api.powergroup.com.tr/Sonos/','Name' => 'PowerApp','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/67847/67847-400x400.png','ServiceType' => '67847','Capabilities' => '512','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/67847/67847-72x72.png','Resolution' => undef},'237' => {'ResolutionSubstitution' => 'artwork_1500','SMAPI' => 'https://api.storeplay.com.au/sonos/SonosService.asmx','Name' => 'storePlay','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/60679/60679-400x400.png','ServiceType' => '60679','Capabilities' => '328193','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/60679/60679-72x72.png','Resolution' => 1500},'264' => {'ResolutionSubstitution' => '300.png','SMAPI' => 'https://prod.radio-api.net/sonos/v1/ws','Name' => 'radio.net','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/67591/67591-400x400.png','ServiceType' => '67591','Capabilities' => '627201','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/67591/67591-72x72.png','Resolution' => 300},'204' => {'ResolutionSubstitution' => '1200x1200','SMAPI' => 'https://sonos-music.apple.com/ws/SonosSoap','Name' => 'Apple Music','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/52231/52231-400x400.png','ServiceType' => '52231','Capabilities' => '3117633','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/52231/52231-72x72.png','Resolution' => 1200},'211' => {'ResolutionSubstitution' => '.l.jpg','SMAPI' => 'https://themusicmanager.eu/sonos/SonosAPI.php','Name' => 'The Music Manager','IconQuadraticURL' => 'http://sonos-logo.ws.sonos.com/54023/54023-400x400.png','ServiceType' => '54023','Capabilities' => '515','PromoText' => '','IconRoundURL' => 'http://sonos-logo.ws.sonos.com/54023/54023-72x72.png','Resolution' => 119}}
setstate Sonos 2020-12-31 21:11:25 MusicServicesListVersion RINCON_949F3EF8DC7C01400:27
setstate Sonos 2020-11-30 21:37:06 ShareIndexInProgress 0
setstate Sonos 2021-01-03 16:33:16 ZoneGroupState <ZoneGroupState><ZoneGroups><ZoneGroup Coordinator="RINCON_949F3EF8DC4201400" ID="RINCON_949F3EF8DC4201400:591251197"><ZoneGroupMember UUID="RINCON_949F3EF8DC4201400" Location="http://192.168.178.32:1400/xml/device_description.xml" ZoneName="Wohnzimmer" Icon="" Configuration="1" SoftwareVersion="61.1-83220" SWGen="2" MinCompatibleVersion="60.0-00000" LegacyCompatibleVersion="58.0-00000" HTForwardEnabled="0" BootSeq="20" TVConfigurationError="0" HdmiCecAvailable="0" WirelessMode="1" WirelessLeafOnly="0" HasConfiguredSSID="1" ChannelFreq="2462" BehindWifiExtender="0" WifiEnabled="1" Orientation="0" RoomCalibrationState="4" SecureRegState="3" VoiceConfigState="0" MicEnabled="0" AirPlayEnabled="0" IdleState="1" MoreInfo=""/></ZoneGroup><ZoneGroup Coordinator="RINCON_949F3EF8DC7C01400" ID="RINCON_949F3EF8DC7C01400:1084997932"><ZoneGroupMember UUID="RINCON_949F3EF8DC7C01400" Location="http://192.168.178.33:1400/xml/device_description.xml" ZoneName="Büro" Icon="" Configuration="1" SoftwareVersion="61.1-83220" SWGen="2" MinCompatibleVersion="60.0-00000" LegacyCompatibleVersion="58.0-00000" HTForwardEnabled="0" BootSeq="14" TVConfigurationError="0" HdmiCecAvailable="0" WirelessMode="1" WirelessLeafOnly="0" HasConfiguredSSID="1" ChannelFreq="2462" BehindWifiExtender="0" WifiEnabled="1" Orientation="0" RoomCalibrationState="4" SecureRegState="3" VoiceConfigState="0" MicEnabled="0" AirPlayEnabled="0" IdleState="0" MoreInfo=""/></ZoneGroup></ZoneGroups><VanishedDevices></VanishedDevices></ZoneGroupState>
setstate Sonos 2021-01-03 16:25:57 state opened


in der index.html hab ich schon etliche Varitionen bei data-list, date-get und data-set versucht. data-list ist für mich am nächten gedacht die FavouritesWithCover, halt nur ohne Cover :) Ich steig da nicht mehr durch.
<div data-type="select" data-device="Sonos_Buero" data-list="Favourites" data-set="StartFavourite" data-get="FavouritesWithCovers" class="wider"></div>

Hoffe Ihr könnt mich da mal Schrittchen für Schrittchen durch eirern lassen.

Bis dahin bleibt gesund und munter
Karsiacar

juemuc

Hallo,

bei mir funktioniert:
                   <div data-type="select" data-device="Sonos_Bad" data-get="currentFavouriteNameMasked" data-list="FavouritesList" data-alias="FavouritesListAlias"
                        data-delimiter="|" data-quote="/" data-set="StartFavourite"
                        onchange="$('.dialog-close').trigger('click');">
                   </div>


Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Karsiacar

Hallo Jürgen,

Danke fürs drum Kümmern! Aber leider klappt es immer noch nicht. Bekomme im "select"-pulldown-menu im FTUI das reading von Favourites angezeigt.
Was jetzt anders gegenüber meinen Versuchen ist, ist das was im Favouritesreadig steht wird jetzt nicht mehr untereinander sondern nebeneinander angezeigt. Klickbar aber ohne Funktion.
Hab noch ein bischen die Readings in der index.html verändert, wie ich denke es richtig ist. Z.B. currentFavouritesNameMasked heißt bei mir nur currentFavouritesName.

Das ist das Favourites-Reading:
{'FV:2/38' => {'Ressource' => 'x-sonosapi-stream:s307854?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-profiles.tunein.com/s307854/images/logog.jpg?t=155446','Typ' => 'audioBroadcast','Title' => 'KISS FM – OLD SCHOOL HIP HOP BEATS','Position' => '8'},'FV:2/49' => {'Ressource' => 'x-sonosapi-stream:STATION%3a6757?sid=264&flags=8224&sn=2','Description' => 'radio.net Sender','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3ASTATION%253a6757%3Fsid%3D264%26amp%3Bflags%3D8224%26amp%3Bsn%3D2','Typ' => 'audioBroadcast','Title' => 'SOULFOOD','Position' => '21'},'FV:2/48' => {'Ressource' => 'x-sonosapi-stream:STATION%3a117753?sid=264&flags=8224&sn=2','Description' => 'radio.net Sender','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3ASTATION%253a117753%3Fsid%3D264%26amp%3Bflags%3D8224%26amp%3Bsn%3D2','Typ' => 'audioBroadcast','Title' => 'PARADISO.soul','Position' => '9'},'FV:2/40' => {'Ressource' => 'x-sonosapi-stream:STATION%3a38157?sid=264&flags=8224&sn=2','Description' => 'radio.net Sender','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3ASTATION%253a38157%3Fsid%3D264%26amp%3Bflags%3D8224%26amp%3Bsn%3D2','Typ' => 'audioBroadcast','Title' => 'rickfuture-fm','Position' => '15'},'FV:2/4' => {'Ressource' => 'x-sonosapi-stream:s78375?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-profiles.tunein.com/s78375/images/logog.png?t=153184','Typ' => 'audioBroadcast','Title' => 'Radio Hagen','Position' => '12'},'FV:2/46' => {'Ressource' => 'x-sonosapi-stream:STATION%3a42167?sid=264&flags=8224&sn=2','Description' => 'radio.net Sender','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3ASTATION%253a42167%3Fsid%3D264%26amp%3Bflags%3D8224%26amp%3Bsn%3D2','Typ' => 'audioBroadcast','Title' => 'RT1 FUNK','Position' => '17'},'FV:2/30' => {'Ressource' => 'x-sonosapi-stream:s97067?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-radiotime-logos.tunein.com/s97067g.png','Typ' => 'audioBroadcast','Title' => 'PsyRadio Progressive','Position' => '10'},'FV:2/21' => {'Ressource' => 'x-sonosapi-stream:s129395?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-radiotime-logos.tunein.com/s129395g.png','Typ' => 'audioBroadcast','Title' => 'Radio Hoerspieltalk','Position' => '13'},'FV:2/19' => {'Ressource' => 'x-sonosapi-stream:s309345?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-profiles.tunein.com/s309345/images/logog.png?t=159129','Typ' => 'audioBroadcast','Title' => 'TOGGO Radio','Position' => '23'},'FV:2/41' => {'Ressource' => 'x-sonosapi-stream:s8295?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-radiotime-logos.tunein.com/s8295g.png','Typ' => 'audioBroadcast','Title' => 'WDR4','Position' => '25'},'FV:2/12' => {'Ressource' => 'x-sonosapi-stream:s20301?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-radiotime-logos.tunein.com/s20301g.png','Typ' => 'audioBroadcast','Title' => 'WDR 5','Position' => '24'},'FV:2/47' => {'Ressource' => 'x-sonosapi-stream:STATION%3a12178?sid=264&flags=8224&sn=2','Description' => 'radio.net Sender','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3ASTATION%253a12178%3Fsid%3D264%26amp%3Bflags%3D8224%26amp%3Bsn%3D2','Typ' => 'audioBroadcast','Title' => 'Solar Radio','Position' => '19'},'FV:2/15' => {'Ressource' => 'x-sonosapi-stream:s235451?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-radiotime-logos.tunein.com/s235451g.png','Typ' => 'audioBroadcast','Title' => 'Soundtales Productions Radio','Position' => '22'},'FV:2/34' => {'Ressource' => 'x-sonosapi-stream:s287261?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-profiles.tunein.com/s287261/images/logog.png?t=154176','Typ' => 'audioBroadcast','Title' => 'FunkaGroove Radio','Position' => '2'},'FV:2/43' => {'Ressource' => 'x-sonosapi-stream:STATION%3a116349?sid=264&sn=0','Description' => 'Radio','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3ASTATION%253a116349%3Fsid%3D264%26amp%3Bsn%3D0','Typ' => 'audioItem','Title' => '90s90s Hiphop','Position' => '0'},'FV:2/2' => {'Ressource' => 'x-sonosapi-stream:s244042?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-radiotime-logos.tunein.com/s244042g.png','Typ' => 'audioBroadcast','Title' => 'Solar Walk Radio','Position' => '20'},'FV:2/26' => {'Ressource' => 'x-sonosapi-stream:s233618?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-radiotime-logos.tunein.com/s233615g.png','Typ' => 'audioBroadcast','Title' => 'rupsy.ru - Psytrance mixes','Position' => '18'},'FV:2/44' => {'Ressource' => 'x-sonosapi-stream:STATION%3a102911?sid=264&flags=8224&sn=2','Description' => 'radio.net Sender','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3ASTATION%253a102911%3Fsid%3D264%26amp%3Bflags%3D8224%26amp%3Bsn%3D2','Typ' => 'audioBroadcast','Title' => 'RPR1.Old School Hip-Hop','Position' => '16'},'FV:2/5' => {'Ressource' => 'x-sonosapi-stream:s37375?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-profiles.tunein.com/s37375/images/logog.jpg','Typ' => 'audioBroadcast','Title' => 'COSMO','Position' => '1'},'FV:2/13' => {'Ressource' => 'x-sonosapi-radio:3009?sid=303&flags=0&sn=1','Description' => 'Sonos Radio Sender','Cover' => 'http://192.168.178.33:1400/getaa?u=x-sonosapi-radio%3A3009%3Fsid%3D303%26flags%3D0%26sn%3D1','Typ' => 'audioBroadcast','Title' => 'Rare Grooves','Position' => '14'},'FV:2/0' => {'Ressource' => 'x-sonosapi-stream:tunein%3a30684?sid=303&flags=8224&sn=1','Description' => 'Sonos Radio Sender','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3Atunein%253a30684%3Fsid%3D303%26amp%3Bflags%3D8224%26amp%3Bsn%3D1','Typ' => 'audioBroadcast','Title' => 'Hirschmilch Radio Psytrance','Position' => '6'},'FV:2/32' => {'Ressource' => 'x-sonosapi-stream:s231747?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-profiles.tunein.com/s231747/images/logog.png?t=158766','Typ' => 'audioBroadcast','Title' => 'Funky Corner Radio','Position' => '3'},'FV:2/28' => {'Ressource' => 'x-sonosapi-stream:s2393?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-radiotime-logos.tunein.com/s2393g.png','Typ' => 'audioBroadcast','Title' => 'PsyRadio PsyTrance','Position' => '11'},'FV:2/17' => {'Ressource' => 'x-sonosapi-stream:s306485?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-profiles.tunein.com/s306485/images/logog.jpg','Typ' => 'audioBroadcast','Title' => 'Kinderohrenkino','Position' => '7'},'FV:2/42' => {'Ressource' => 'x-sonosapi-stream:s47876?sid=254&flags=8224&sn=0','Description' => 'TuneIn Sender','Cover' => 'http://cdn-profiles.tunein.com/s47876/images/logog.jpg?t=159139','Typ' => 'audioBroadcast','Title' => 'FUNKY RADIO','Position' => '4'},'FV:2/45' => {'Ressource' => 'x-sonosapi-stream:STATION%3a9547?sid=264&flags=8224&sn=2','Description' => 'radio.net Sender','Cover' => 'http://192.168.178.33:1400/getaa?s=1&u=x-sonosapi-stream%3ASTATION%253a9547%3Fsid%3D264%26amp%3Bflags%3D8224%26amp%3Bsn%3D2','Typ' => 'audioBroadcast','Title' => 'Hirschmilch Chillout Channel','Position' => '5'}}

Beste Grüße
Karsiacar

Karsiacar

Wie wird denn ein Radiosender händisch in der FHEM-Befehlszeile gestarten?

juemuc

steht in der Doku:

set Device StartRadio <Radiostationname>

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

hydrotec

Hallo Karsiacar,

eventuell hilft dir ein kleines Beispiel, wie ich ein Sonos Mini Radio in FTUI eingerichtet habe.
Man kann lediglich das Radio ein und ausschalten, die Lautstärke anpassen und einen Favourit auswählen.


Gruß Karsten

Karsiacar

Hallo,

Es funktioniert. Danke an euch!

Nach Einarbeitung in deinen Code, hab ich's dann nach ein paar kleinen Hürden hinbekommen.
Hab mir noch die Senderinfo eingebaut
<div data-type="label" data-device="Sonos_Buero" data-get="infoSummarize2"></div>
Glücklich!

Beste Grüße
Karsten (In dem Fall spezielle ins Schwobaländle 8))

hydrotec

Hallo Karsiacar,

Danke für die Speziellen.
Namensvetter?  8)

Zitat von: Karsiacar am 13 Januar 2021, 22:33:56
..., hab ich's dann nach ein paar kleinen Hürden hinbekommen.
Nächstes mal gerne nachfragen  ;)
Hauptsache es läuft jetzt wie gewünscht.

Gruß Karsten

Karsiacar

Guten Morgen Karsten,

eine Frage hät ich noch. Wenn ich eine Sonos- Sprchduchsage hatte, kann ich das data-type="label" data-device="Sonos_Buero" data-get="currentSender"  also das data-type="popup" nicht mehr anklicken bzw. öffnen.
Das "Lable" erscheint nach der Durchsage nicht mehr, weil das zuletzt gespielte "Track" ja stehen bleibt.
Hast du hierfür noch ein Tip? Könnte ich das sogar in den Play-Stop-Switch "integrieren"?

Beste Grüße
Karsten

hydrotec

Hallo Karsten,

Danke für den Hinweis.
Hatte das auch schon mal festgestellt, doch vergessen die Abfrage zu korrigieren.
(Kommt davon wenn das Radio fast den ganzen Tag läuft, da hatte es wie gewünscht funktioniert)

Versuch mal anstatt

data-type="label" data-device="Sonos_Buero" data-get="currentSender"

das hier

data-type="label" data-device="Sonos_Buero" data-get="currentSource"

Damit sollte es auf den letzten Sender wechseln.
Sorry für die Umstände.

Zitat von: Karsiacar am 15 Januar 2021, 10:16:15
Könnte ich das sogar in den Play-Stop-Switch "integrieren"?
Das verstehe ich nicht wirklich.
Meinst du das popup in den switch zu integrieren?
Auf die Schnelle könnte man folgendes machen.
auf den switch verzichten, und dann über popup->dialog das Radio ausschalten, bzw. die Sender zu starten/wechseln.


Gruß Karsten

Karsiacar

ZitatSorry für die Umstände

Ach was! Bin ja froh, dass ich fragen kann. Außerdem find ichs ja manchmal gut, wenn was nicht richtig funzt :D
ZitatMeinst du das popup in den switch zu integrieren?
Ne, meinte mit klich auf PLAY auch das popup öffnen. War eh nur so ne Idee.
data-get="currentSource funktioniert wie gewünscht - und eleganter. Danke!

Grüße Kartsen