MPD Player Steuerung im FTUI

Begonnen von setstate, 27 Mai 2016, 00:02:46

Vorheriges Thema - Nächstes Thema

setstate

Heute bin ich endlich mit der Optimierung meiner MPD Player Steuerung zu einem vorzeigbaren Ergebnis gelangt.

Die Auswahl der Playlist passiert per Select Widget.
Das Cover wird durch ein normales Image Widget angezeigt.
Die aktuelle Position im Song wird mittels aktualisiertem Level Widget als Balken dargestellt. Dazu habe ich im FHEM MPD das INTERVAL auf 10 gestellt. Also aller 10 Sekunden ein Update der Position. Zusätzlich wird die Song-Gesamtzeit und die gespielte Dauer per Label Widget angezeigt.
Für die Steuerung nehme ich Switch und Push.
Für die Playlist nutze ich das neue 2.2 Widget Medialist .


<div data-type="medialist"
     data-device="MPD1"
     data-get="playlistinfo"
     data-pos="Pos"
     data-set="play"
     class="autoscroll">
</div>


Damit das Ganze fluffig läuft, musste ich das MPD Modul etwas optimieren. Meine Version ist unten mit angehangen. Da ich damit ausschließlich einen Mopidy Server mit Spotify-Plugin steuere und das mit dem originalen MPD Modul nicht 100% optimal klappte, habe ich die definierten Reading angepasst, die currentsong Abfrage bei Songwechsel verbessert und die Liste der Playlists in ein Reading gepackt, damit FTUI auch darauf zugreifen kann.
Das benötigte Reading für die Medialist und das Reading mit der URL für das Cover erzeuge ich in einigen 99_myUtils.pm Funktionen, die per BlockingCall in einen separaten Thread ausgelagert werden, um die weitere Ausführungen von FHEM nicht zu beeinträchtigen.

MPD Definition in der fhem.cfg

define MPD1 MPD xxx.xxx.xxx.xxx 6600
attr MPD1 devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
attr MPD1 event-on-update-reading state,Title,Track,playlistinfo,Album,Artist,playlistcollection,file,cover,playlist,Pos,Time,elapsed
attr MPD1 icon it_radio
attr MPD1 interval 10
attr MPD1 loadPlaylists 1
attr MPD1 room Wohnzimmer
attr MPD1 useIdle 0
attr MPD1 webCmd previous:stop:play:pause:next
# MPD Events
define OnMpdPlay notify MPD1:play {OnMpdPlayPressed()}
define OnMpdPlaylistChanged notify MPD1:playlist:.* {call_mpd1_playlistinfo()}
define OnMpdNewTrack notify MPD1:file:.* {call_mpd1_getcover()}


99_myUtils.pm Funktionen

sub call_mpd1_getcover() {
    Log 1, "call_mpd1_getcover";
    BlockingCall("mpd_getcover","MPD1","done_mpd1_getcover",60);
}

sub done_mpd1_getcover($) {
    my $url = shift;
    Log 1, "done_mpd1_getcover";
    fhem ("setreading MPD1 cover ".$url);
}

sub call_mpd1_playlistinfo() {
    Log 1, "call_mpd1_playlistinfo";
    BlockingCall("mpd_playlistinfo","MPD1","done_mpd1_playlistinfo",120);
}

sub done_mpd1_playlistinfo($) {
    my $playlist = shift;
    Log 1, "done_mpd1_playlistinfo";
    fhem ("setreading MPD1 playlistinfo ".$playlist);
}

sub mpd_playlistinfo($) {
  my $device = shift;
  my ($all) = fhem("get $device mpdCMD playlistinfo");
  $all =~ s/"/\\"/g; 
  my @artist = ($all=~/\nArtist:\s(.*)\n/g);
  my @title = ($all=~/\nTitle:\s(.*)\n/g);
  my @album = ($all=~/\nAlbum:\s(.*)\n/g);
  my @time = ($all=~/\nTime:\s(.*)\n/g);
  my @file = ($all=~/\nfile:\s(.*)\n/g);
  my @track = ($all=~/\nTrack:\s(.*)\n/g);
  my @albumUri = ($all=~/\nX-AlbumUri:\s(.*)\n/g);

  my $ret = '[';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
  my $lastUri = '';
  my $url;

  for my $i (0 .. $#artist)
  {
     if ( $lastUri ne $albumUri[$i]) {
       my $response = $ua->get("https://embed.spotify.com/oembed/?url=".$albumUri[$i]);
       my $data = '';
       if ( $response->is_success ) {
         $data = $response->decoded_content;
         $url = decode_json( $data );
         $lastUri = $albumUri[$i];
       }
     }

      $ret=$ret.'{"Artist":"'.$artist[$i].'",';
      $ret=$ret.'"Title":"'.$title[$i].'",';
      $ret=$ret.'"Album":"'.$album[$i].'",';
      $ret=$ret.'"Time":"'.$time[$i].'",';
      $ret=$ret.'"File":"'.$file[$i].'",';
      $ret=$ret.'"Track":"'.$track[$i].'",';
      $ret=$ret.'"Cover":"'.$url->{'thumbnail_url'}.'"}';

      if ($i<$#artist) {$ret=$ret.',';}
  }
  $ret =~ s/;//g;
  $ret =~ s/\\n//g;
  return $ret.']';
}

sub mpd_getcover($) {
  my $device = shift;
  my $file = ReadingsVal($device, 'file', '');
  my $url = 'na';
  my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
  my $response = $ua->get("https://embed.spotify.com/oembed/?url=".$file);
  my $data = '';
  if ( $response->is_success ) {
     $data = $response->decoded_content;
     $url = decode_json( $data )->{'thumbnail_url'};
  }
  return $url;
}

sub
OnMpdPlayPressed()
{
my $val=ReadingsVal('AvReceiver', 'input', 'Webradio');
if(($val ne 'SAT') && ($val ne 'BD/DVD') && ($val ne 'Game')) {
  fhem "set AvReceiver input Airplay";
}
fhem "get MPD1 playlists";
}


MPD Player mit Playlist im FTUI

<html>
<title>FHEM</title>
<head>
    <!--
     /* FHEM tablet ui */
     /*
     * second page
     *
     load this page via widget pagebutton

     <div data-type="pagebutton"   data-url="#index_music.html"
          data-load="#content2"    data-off-background-color="transparent"
          data-off-color="#606060" data-on-background-color="#606060"
          data-on-color="#222222"  data-active-pattern=".*#index_music.html"
          data-icon="fa-music"     class="prefetch top-space"></div>
    -->
</head>
<body>
  <div class="page" id="content2">
    <div class="gridster">
      <ul>
        <li data-row="1" data-col="2" data-sizex="5" data-sizey="6">
             <header>PLAYER</header>
                 <div data-type="image"
                          data-device="MPD1"
                          data-get="cover"
                          data-size='250'
                          class="row top-space">
                 </div>
                 <div class="row">
                     <div data-type="label" data-device="MPD1" data-get="elapsed" data-substitution="toMinFromSec()" class="inline middle"></div>
                     <div data-type="level" data-device="MPD1" data-get="elapsed" data-max="Time" data-width="280"   class="horizontal inline middle"></div>
                     <div data-type="label" data-device="MPD1" data-get="Time" data-substitution="toMinFromSec()" class="inline middle"></div>
                 </div>
                 <div class="row large thin top-space">
                     <div data-type="label" data-device="MPD1" data-get="Title" data-substitution="s/Or//g" class="bold"></div>
                     <div data-type="label" data-device="MPD1" data-get="Artist" class=""></div>
                 </div>
                 <div class="row top-space">
                     <div data-type="switch" data-device="MPD1" data-get="repeat" data-set="repeat"
                          data-icon="fa-repeat" data-background-icon="-"
                          data-on-color="white" data-off-color="gray"
                          data-get-on="1" data-get-off="0"
                          data-set-on="1" data-set-off="0" class="col-1-5">
                     </div>
                     <div data-type="push" data-device="MPD1"
                           data-icon="fa-step-backward" data-background-icon="-"
                           data-off-color="#fff" data-on-color="#aa6900"
                           data-set-on="previous" class="col-1-5 big">
                     </div>
                     <div data-type="switch"
                             data-device="MPD1"
                             data-states='["play","pause","stop"]'
                             data-set-states='["pause","play","play"]'
                             data-background-icon="fa-circle-thin"
                             data-background-colors='["white","white","white"]'
                             data-colors='["white","white","white"]'
                             data-icons='["fa-pause","fa-play","fa-play"]'
                             class="col-1-5 big">
                     </div>
                     <div data-type="push" data-device="MPD1"
                           data-icon="fa-step-forward" data-background-icon="-"
                           data-off-color="#fff" data-on-color="#aa6900"
                           data-set-on="next" class="col-1-5 big">
                     </div>
                     <div data-type="switch" data-device="MPD1" data-get="random" data-set="random"
                           data-icon="fa-random" data-background-icon="-"
                           data-on-color="white" data-off-color="gray"
                           data-get-on="1" data-get-off="0"
                           data-set-on="1" data-set-off="0" class="col-1-5">
                     </div>
               </div>
        </li>
        <li data-row="1" data-col="2" data-sizex="6" data-sizey="6">
             <header>PLAYLIST</header>
             <div data-type="select" data-device="MPD1" data-list="playlistcollection" data-get="playlistname" data-set="playlist" class="col-1-2" ></div>
             <div data-type="medialist" data-device="MPD1" data-get="playlistinfo" data-pos="Pos" data-set="play" class="top-space left-space autoscroll"></div>
        </li>
        <li data-row="7" data-col="2" data-sizex="11" data-sizey="3">
             <header>VOLUME</header>
             <div class="row">
                <div class="col-1-4">
                   <div data-type="label" class="inline w2x large">Bad</div>
                   <div data-type="switch" data-device="BadRadio" data-icon="fa-music" class="inline"></div>
                   <div data-type="select" data-device="AvReceiverZ2" data-items='["Airplay","Webradio","BD/DVD","PHONO"]' data-get="input" data-set="input" class="newline wider" ></div>
                </div>
                <div class="col-1-4">
                   <div data-type="label" class="inline w2x large">WZ</div>
                   <div data-type="switch" data-device="RadioAtTablet" data-icon="fa-music" class="inline"></div>
                   <div data-type="select" data-device="AvReceiver" data-list="inputs" data-get="input" data-set="input" class="newline wider" ></div>
                </div>
                <div class="col-1-4">
                    <div data-type="circlemenu" class="circlemenu">
                        <ul>
                          <li><div data-type="push" data-icon="fa-wrench"></div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level -6" data-icon="">-6</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level -2" data-icon="">-2</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level 0" data-icon="">0</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level +3" data-icon="">2</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level +9" data-icon="">9</div></li>
                          <li><div data-type="push" data-device="AvReceiver" data-set="remoteControl" data-set-on="subwoofer-temporary-level +C" data-icon="">12</div></li>
                        </ul>
                    </div>
                    <div data-type="label" class="top-space-2x">Subwoofer</div>
                </div>
                <div class="col-1-4">
                  <div data-type="volume" data-device='AvReceiver' data-get='volume' data-set='volume' class="large cell" ></div>
                  <div data-type="label" class="newline top-narrow wider cell">Volume</div>
                </div>
            </div>
        </li>
      </ul>
    </div>
   </div>
</body>
</html>


aeronaut

Das sieht ja wirklich bombastisch aus, Kompliment! Habe mich gleich mal rangesetzt, davon einiges für meinen Squeeze-Player nachzubauen.

Besonders interessant ist die Anzeige der aktuellen Position mit dem level-Widget. Das bekomme ich leider nicht hin.

  • Umrechung: Die Funktion toMinFromSec() habe ich in den MyUtils implementiert, aber die Methode wird nicht angesprungen
  • Max-Wert: Was tut data-max="Time"? Die Berechnung scheint in meinem Fall nicht zu funktionieren. Der Max-Wert sollte ja der Maximallänge eines Songs entsprechen

Sind das 2.2er-spezifische Funktionen? Ich habe noch die "alte" Version.

lg
aeronaut

setstate

ZitatDas sieht ja wirklich bombastisch aus, Kompliment!
Danke, danke - gefällt mir auch immer noch gut  ;)

Zitat
    Umrechung: Die Funktion toMinFromSec() habe ich in den MyUtils implementiert, aber die Methode wird nicht angesprungen

Das ist eine built-in ftui-js-funktion der 2.2. Muss also nicht in die myUtils.

ZitatMax-Wert: Was tut data-max="Time"? Die Berechnung scheint in meinem Fall nicht zu funktionieren. Der Max-Wert sollte ja der Maximallänge eines Songs entsprechen 

Da "Time" nicht numerisch ist, sucht er als nächstes bei den Readings des angegebenen Devices für die Berechnung der End-Position. "elapsed" heißt bei mir das Reading für die aktuelle Position


Internals:
   CHANGED
   DEF        xxx.xxx.xxx.xxx 6600
   DISC       1
   HOST       xxx.xxx.xxx.xxx
   INTERVAL   10
   MUTE       off
   NAME       MPD1
   NR         248
   PORT       6600
   PRESENT    1
   STATE      stop
   TYPE       MPD
   VERSION    MPD 0.19.0
   VOLUME     100
   Readings:
     2016-06-19 13:14:02   Album           HOPELESSNESS
     2016-06-19 13:14:02   AlbumArtist     ANOHNI
     2016-06-19 13:14:01   Artist          ANOHNI
     2016-06-19 13:14:02   Date            2016
     2016-06-19 15:45:58   Id              12565
     2016-06-19 15:45:58   Pos             8
     2016-06-19 15:45:57   Time            282
     2016-06-19 15:45:58   Title           Crisis
     2016-06-19 15:45:58   Track           9
     2016-06-19 13:14:02   X-AlbumUri      spotify:album:1S3OY2V2ZwFh4xU7gQG6IZ
     2016-05-25 14:18:18   artist
     2016-05-25 18:17:20   bitrate         320
     2016-05-25 18:17:19   consume         0
     2016-06-19 15:45:59   cover           https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4
     2016-06-19 15:47:09   elapsed         80.758
     2016-06-19 15:45:57   file            spotify:track:2YKuqElhfUQ8Oy6jD8ost1
     2016-05-25 16:29:53   mpd_event       changed: player
     2015-12-19 13:36:19   name            0
     2016-06-19 13:14:01   playlist        138
     2016-06-19 13:14:01   playlistcollection [Radio Streams]:50hits lounge:Indie classics (by alexv94):ANOHNI – HOPELESSNESS:PJ Harvey:Biffy Clyro – Opposites (Deluxe):Jack Garrat:ms-sampler 2016-spring:PEACE (by spotify):The Perfect Italian Dinner (by spotify):ms-sampler Tame Beatle:ms-sampler Xmas:Hipster House Party (by spotify):Top40-2015-12:Frank und seine Freunde – Die 44 beliebtesten Kinderlieder:AnnenMayKantereit – Wird schon irgendwie gehen:We The Generation (Deluxe Edition):Wanda – Bussi:Kele – Trick:Editors – IN DREAM:Kwabs – Love + War:Wanda – Amore:Foals – What Went Down:Paul Kalkbrenner – 7:The Maccabees – Marks To Prove It:Muse, Editors, The Killers (by jm.hoekstra):Feelgood Indie (by spotify_germany):J.D. McPherson – Let The Good Times Roll:POLIÇA – Shulamith (Expanded Edition):Leon Bridges – Coming Home:Everything Everything – Get To Heaven (Deluxe):Jamie xx – In Colour:Muse – Drones:Desmond Dekker – Super Best:Portugal. The Man – Evil Friends:Little Dragon – Machine Dreams:ms-sampler 2015:Cold War Kids – Hold My Home:Various Artists – 50 Hits Lounge:Various Artists – Made in Germany:The Prodigy – The Day Is My Enemy:Mumford & Sons – Wilder Mind (Deluxe):Bob Marley Top 30 (by finnur):Deichkind – Niveau Weshalb Warum:Bilderbuch – SCHICK SCHOCK:Why Make Sense? - A Hot Chip Discography (by hot_chip_official):Filmmusik (by spotify_germany):Piano Ballads (by spotify):House Relax (by spotify):Chillout Lounge (by spotify_germany):Pay Close Attention XL Recordings:Elektro Bike (by spotify_germany)
     2016-06-19 13:14:04   playlistinfo    [{"Artist":"ANOHNI","Title":"Drone Bomb Me","Album":"HOPELESSNESS","Time":"251","File":"spotify:track:2qIX2RvAbAvZ4VwGPmbhE3","Track":"1","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"4 DEGREES","Album":"HOPELESSNESS","Time":"232","File":"spotify:track:5ji7wOTLlcJ9uOM4hHcIOw","Track":"2","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Watch Me","Album":"HOPELESSNESS","Time":"207","File":"spotify:track:4wPlMbv1ikPypgeDqBCJvC","Track":"3","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Execution","Album":"HOPELESSNESS","Time":"218","File":"spotify:track:1yt1obxICqGpwt4jNiVlAi","Track":"4","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"I Don't Love You Anymore","Album":"HOPELESSNESS","Time":"300","File":"spotify:track:1kYh5B5YW5gU8XA21qzjlk","Track":"5","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Obama","Album":"HOPELESSNESS","Time":"251","File":"spotify:track:5YmqIz3AsKS6h8hIu4eqyA","Track":"6","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Violent Men","Album":"HOPELESSNESS","Time":"130","File":"spotify:track:0DVNd0ACJkymUl1BbuFCzc","Track":"7","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Why Did You Separate Me from the Earth?","Album":"HOPELESSNESS","Time":"216","File":"spotify:track:5SyBAbwn4GM6N3E71kUKfO","Track":"8","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Crisis","Album":"HOPELESSNESS","Time":"282","File":"spotify:track:2YKuqElhfUQ8Oy6jD8ost1","Track":"9","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Hopelessness","Album":"HOPELESSNESS","Time":"235","File":"spotify:track:4ivqCrlgfWX31azXG929ud","Track":"10","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"},{"Artist":"ANOHNI","Title":"Marrow","Album":"HOPELESSNESS","Time":"181","File":"spotify:track:3FJPWS8JYP7KHsY2g6PUkl","Track":"11","Cover":"https://d3rt1990lpmkn.cloudfront.net/cover/8a9e1ef08c8f0f7f3278d7533d6cf3681d4bb6b4"}]
     2016-06-19 13:14:01   playlistlength  11
     2016-06-19 13:14:01   playlistname    ANOHNI – HOPELESSNESS
     2016-06-10 22:37:23   random          0
     2016-05-25 18:17:19   repeat          0
     2016-05-25 18:17:19   single          0
     2016-06-19 15:45:57   song            8
     2016-06-19 15:45:57   songid          12565
     2016-06-19 15:47:22   state           stop
     2016-06-19 15:47:09   time            80:282
     2016-05-25 12:56:26   title
     2016-05-25 12:53:03   track           14
     2016-05-25 18:17:19   volume          100
     2016-05-25 18:17:19   xfade           0
Attributes:
   devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
   event-on-update-reading state,Title,Track,playlistinfo,Album,Artist,playlistcollection,file,cover,playlist,Pos,Time,elapsed
   icon       it_radio
   interval   10
   loadPlaylists 1
   room       Wohnzimmer
   useIdle    0
   webCmd     previous:stop:play:pause:next

aeronaut

Dann werde ich mal warten, bis ich mich traue, auf die neue Version zu migrieren  :)  Läuft gerade alles so gut.

Bis auf den Progress und die Playlist-Ansicht ist auf jeden Fall alles auch super mit Squeeze darstellbar.

lg
aeronaut

setstate

Aber hat dein Player keine Readings für 1.) Spiel-Dauer  und 2.) für die Song-Dauer  in Sekunden?

Für den Progress braucht man keine toMinFromSec() Funktion, da die beiden Werte sollten in Sekunden vorliegen. In Den Wert in Minuten braucht man nur für das Label. Ggf. kann man das auch mit einem Userreading realisieren.


                     <div data-type="label" data-device="PLAYER1" data-get="ur_playDurationInMinutes"  class="inline middle"></div>
                     <div data-type="level" data-device="PLAYER1" data-get="playDuration" data-max="songDuration" data-width="280"   class="horizontal inline middle"></div>
                     <div data-type="label" data-device="PLAYER1" data-get="ur_songDurationInMinutes" class="inline middle"></div>

aeronaut

Ja stimmt, für die Labels reicht ein Userreading. Das wäre abgefrühstückt.

Readings:
2016-06-20 23:16:43   currentTrackPosition 212
2016-06-20 23:13:16   duration        277.053


Das klappt aber nicht:
<div data-type="level" data-device="sqb.wz"
data-get="currentTrackPosition" data-max="duration" data-width="200"
        class="horizontal inline middle"></div>


Vielleicht stört der Kommawert der Gesamtzeit.

fricketo

Moin setstate,

das sieht ja echt mal fett aus...und hätte ich direkt gesehen, dass schon jemand den MPD im FTUI hinzugefügt hat, hätte mein Wochenende wohl anders ausgesehen, da ich es seit Freitag krampfhaft probiere...(woran man wahrscheinlich erkennt, dass ich mich noch nicht allzu lange mit FHEM beschäftige).

Leider stoße ich aber auch beim Versuch deine Lösung zu übernehmen direkt am Anfang an meine Grenzen...du schreibst, du nutzt das Widget Media List...

...wo finde ich das??? :o :P

LG

Torsten

setstate

Zitat von: fricketo am 21 August 2016, 19:39:48
...du schreibst, du nutzt das Widget Media List...

...wo finde ich das??? :o :P

LG

Torsten

Das FTUI Medialist Widget gibt es nur in der 2.2 (eval) Version von FTUI.

fricketo

na dann sollte ich mir die wohl mal anschauen...

Dank dir!!!

eazy_isi

Hallo zusammen,

erst mal ein dickes LOB für die Integration von MPD in FTUI.
Gefällt mir super das ganze.
Selbst als blutiger Anfänger in FHEM und FTUI konnte ich das ganze ziemlich
schnell bei mir integrieren.
Allerdings scheitere ich an der Playlist im FTUI.
In FHEM kann ich meine Playlists auswählen. In Ftui nimmt er allerdings immer die in FHEM ausgewählte Playlist.
Wenn ich versuche eine Playlist auszuwählen, erhalte ich nur eine leeres Fenster.
Meine Playlist beschränkt sich bisher auf 5 Playlist files im mpd playlist Verzeichnis.
Das LOG in FHEM zeigt mir keine Fehler.
Allerdings wird das reading playlistinfo nur so [] angezeigt.

Und an dieser Stelle bin ich mit meinem kleinen Latein am Ende.

Wäre super wenn mir hier jemand auf die Sprünge helfen könnte.

Gruß
Thomas

Tobias

#10
Hi setstate,
ich bin auch dabei den MPD nach deinem Vorbild im FTUI umzusetzen, klappt auch soweit. Probleme gibt es bei der anzeige des Statusbalkens -> Level Widget. Der färbst sich nicht gemäß Fortschritt gelb ein. Die Zeitanzeige vorher (elapsed) und MaxTime klappt. Ich habe dein Beispiel exakt so übernommen.

Kannst du mir einen Hinweis geben??

<div data-type="label" data-device="MPD1" data-get="elapsed" data-substitution="toMinFromSec()" class="inline middle"></div>
                     <div data-type="level"
                       data-device="MPD1"
                       data-get="elapsed"
                       data-max="Time"
                       data-width="280"
                       class="horizontal inline middle">
                     </div>
                     <div data-type="label" data-device="MPD1" data-get="Time" data-substitution="toMinFromSec()" class="inline middle"></div>


Nochetwas ist mir aufgefallen: im MPD Modul, ein "set MPD1 interval 10" setz das intervall auf 10. Eine Änderung des Attributes "intervall" auf 10 hat allerdings keine Auswirkung nach FHEM-Neustart
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

Stivmaster

Hallo,

wie immer tolle Arbeit setstate, hat bei mir gleich auf Anhieb geklappt.

Eine bitte habe ich jedoch. Wenn ich mit dem Musicbox Webclient Radiostreams anlege, dann kann ich die in FHEM auch anwählen [Radio Streams]. Allerdings bekomme ich keine Auflistung, was alles beinhaltet ist. In meinem Fall ist da Antenne Bayern, Absolut Hot  und sunshine live hinterlegt. Das sind Tunein streams. wenn ich jetzt die Liste auswähle, hängt sich irgendetwas aus, wozu ich leider nicht in der Lage bin, herauszufinden was es ist.

Das wären die letzten Zeilen im Log:

2016.09.25 22:13:48 1: call_mpd1_getcover
2016.09.25 22:13:48 3: OnMpdNewTrack return value: HASH(0x750ce18)
2016.09.25 22:13:49 1: PERL WARNING: Use of uninitialized value in hash element at fhem.pl line 2340.
2016.09.25 22:13:49 1: done_mpd1_getcover
2016.09.25 22:14:08 1: PERL WARNING: Use of uninitialized value in string eq at fhem.pl line 4573.
2016.09.25 22:14:11 1: PERL WARNING: Use of uninitialized value in string eq at fhem.pl line 4573.

Ich muss Fhem neustarten , damit es wieder funktioniert.

Ich hab auch schon überlegt, ne eigene Playlist anzulegen, mit meinen Radiostationen, die ich möchte, allerdings habe ich da auch keinen Plan wie das funktioniert.

Stivmaster

So, 2 Playlists angelegt, leider auch ohne erfolg. Gleiches Verhalten. FHEM schmiert ab.
Evtl. liegts an den fehlenden Album, Cover infomationen?

setstate

Keine Ahnung, wie ich dir da helfen könnte.
Man muss jetzt debuggen, an welcher Stelle welcher Wert vorliegt. Am besten mit Log arbeiten ...

Stivmaster

ich habs jetz so hinbekommen, dass es zumindest nicht mehr abstürzt.
Habe für jeden Stream ne eigene locale Playlist erstellt. Das fehlende Cover setzte ich mit einem DOIF, indem ich den Playlistnamen abfrage. Zudem setze ich das Reading für den Artist auf na.

So funktioniert es zumindest jetzt bei mir. Ist zwar wahrscheinlich die "schmutzigste" Lösung, aber es tut zumindest dass was es soll. Mal sehen ob es auch im Tagesbetrieb stabil läuft, aber dass werd ich dann schnell genug erfahren, wenn ich von der Arbeit heimkomm, und das gemecker dann wieder groß ist, wenn was nicht läuft.