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>
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
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
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
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>
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.
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
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.
na dann sollte ich mir die wohl mal anschauen...
Dank dir!!!
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
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
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.
So, 2 Playlists angelegt, leider auch ohne erfolg. Gleiches Verhalten. FHEM schmiert ab.
Evtl. liegts an den fehlenden Album, Cover infomationen?
Keine Ahnung, wie ich dir da helfen könnte.
Man muss jetzt debuggen, an welcher Stelle welcher Wert vorliegt. Am besten mit Log arbeiten ...
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.
@Tobias habe das gleiche Problem mit dem Fortschrittsbalken. Hast du eine Lösung gefunden?
Gruß
Luigi
Zitat von: Tobias am 07 September 2016, 10:59:18
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
Zitat von: Luigi am 27 September 2016, 16:02:04
@Tobias habe das gleiche Problem mit dem Fortschrittsbalken. Hast du eine Lösung gefunden?
Gruß
Luigi
Ja funzt jetzt...
<div data-type="level"
data-device="sonos_Wohnzimmer"
data-get="TrackPositionSec"
data-max="TrackDurationSec" data-min="0"
data-width="300"
class="horizontal tap inline middle">
</div>
@Tobias:
Ich versuche die level-Anzeige mit meinem Sonos nachzubauen.
"TrackPositionSec" und "TrackDurationSec" sind zumindest bei mir keine Parameter beim Sonos.
Hast du eine Umrechnung / Userreading dafür benutzt um "CurrentTrackPosition" in "TrackPosSec" umzurechnen?
@all
Hat es einer von Euch geschafft, seine Sonosplayliste (Titel, Cover, Spieldauer) mit dem Widget Medialist wie im Beispiel von setstate anzuzeigen? Wenn ja, wäre ich für einen Gedankenanstoss dankbar (z.B Verwendung von BookmarkTitlePlaylist etc.)
Gruß Photon68
@setstate:
Ich suche schon lange eine Möglichkeit meine MP3's mit einen hohem WAF über FHEM abzuspielen. Mir scheint Deine Einbindung des MPD in FTUI als beste Lösung. Ich möchte aber gerne, dass die Musik über meine MUNET PEAQ Lautsprecher (DLNA-Player) abgespielt wird. Das Abspielen von Radio-Streams klappt ja Dank Dominik's 98_DLNARenderer.pm https://forum.fhem.de/index.php/topic,39706.0.html (https://forum.fhem.de/index.php/topic,39706.0.html) schon hervorragend. Nur wie kann ich dem MPD-Modul beibringen, das der Sound an den DLNARenderer geschickt wird? Ich habe schon versucht den output in der /etc/mdp.conf per Pulseaudio auszugeben, aber irgendwie scheiter ich an pulseaudio und pulseaudio-dlna.
Mein FHEM läuft zusammen mit MPD, miniDLNA und Subsonic auf einem Ubuntu-Server, der im Keller steht. Also ich möchte irgendwie erreichen, dass MPD die Musik per "push" auf einen DLNA-fähigen Player schickt bzw streamt. Mit BubbleUNP klappt es schon sehr gut, nur ist das wieder eine extra App und ich möchte wegen dem WAF, das Ganze lieber in FHEM unterbringen.
Hast Du oder jemand anderes einen Tipp für mich.
Gruß
Markus
@photon68: sorry, die myutils Routine muss ich noch Posten. Die Integration in die medialist funktioniert problemlos. Sieht exakt wie im Eingangspost von setstate aus :)
Gesendet von meinem Leap mit Tapatalk
@Tobias
Dann würde es mich freuen, wenn du deine Routinen aus den myUtils posten würdest.
Bin gespannt. :)
Gruß Photon68
Bitte sehr: 99_Utils_Sonos.pm
##############################################
# $Id:$
package main;
use strict;
use warnings;
use POSIX;
sub
Utils_Sonos_Initialize($$)
{
my ($hash) = @_;
}
####################################
# https://github.com/ddtlabs/smartvisu-widgets/blob/master/sonos/99_fronthemSonosUtils.pm
# wird aufgerufen, wen sich der Status beim Sonos ändert
# PLAYING, STOPPED, PAUSED_PLAYBACK
####################################
sub Utils_Sonos_TransportStateChanged ($$) {
my ($device, $event) = @_;
Utils_Sonos_GetTrackPos($device,$event);
return undef;
}
sub Utils_Sonos_GetTrackPos($$) {
my ($device,$evt) = @_;
my $atName = "at_".$device."_GetTrackPos";
my $room = "hidden";
Log3 undef, 4, "Utils_Sonos_SonosGetTrackPos: device: " . $device . " / currentTrackProvider: " . ReadingsVal($device, 'currentTrackProvider','ERROR') . " / currentStreamAudio: " . ReadingsVal($device, "currentStreamAudio","ERROR");
if (($evt eq "PLAYING") && (ReadingsVal($device, 'currentTrackProvider','') !~ /Gruppenwiedergabe/) && (ReadingsVal($device, 'currentStreamAudio','1') eq 0))
{
Utils_Sonos_defineAtTimer($device);
}
else
{
Utils_Sonos_deleteAtTimer($device);
}
}
sub Utils_Sonos_defineAtTimer($) {
my ($device) = @_;
my $atName = "at_".$device."_GetTrackPos";
my $room = "hidden";
my $atSec = "05";
if (ReadingsVal($atName, "state", "doNotExist") eq "doNotExist")
{
Log3 undef, 4, "Utils_Sonos_defineAtTimer: defmod ".$atName." at +*00:00:" . $atSec . " {Utils_Sonos_SonosTrackPositionUpdate(\"$device\")}";
fhem("sleep 0.01; {Utils_Sonos_SonosTrackPositionUpdate(\"$device\")}");
fhem("defmod -temporary ".$atName." at +*00:00:" . $atSec . " {Utils_Sonos_SonosTrackPositionUpdate(\"$device\")}");
fhem("attr ".$atName." room ".$room);
}
return undef;
}
sub Utils_Sonos_deleteAtTimer($) {
my ($device) = @_;
my $atName = "at_" . $device . "_GetTrackPos";
if (ReadingsVal($atName, "state", "doNotExist") ne "doNotExist")
{
Log3 undef, 4, "Utils_Sonos_deleteAtTimer($device): " . "delete $atName";
fhem("delete $atName");
}
}
# ####################################################################
# sv_calcTrackPosPercent() ($LastActionResult = eg. GetCurrentTrackPosition: 0:00:11)
# ####################################################################
sub Utils_Sonos_SonosTrackPositionUpdate($) {
my ($device) = @_;
fhem("get $device CurrentTrackPosition");
my $trackPosP;
my $trackPosS;
my $trackDurS;
my $trackPosT = ReadingsVal($device, "currentTrackPosition", "0:00:10");
my $trackDurT = ReadingsVal($device, 'currentTrackDuration', '0:01:00');
if (($trackDurT eq "0:00:00") || ($trackDurT eq "NOT_IMPLEMENTED") || ($trackDurT eq "")) # last is a test
{
$trackPosP = 0;
}
else
{
$trackDurS = SONOS_GetTimeSeconds($trackDurT);
$trackPosS = SONOS_GetTimeSeconds($trackPosT);
# update is too late, we are one step beyond...
$trackPosP = int(100 * $trackPosS / (0.1 + $trackDurS));
if ($trackPosP >= 100) {$trackPosP = 100} # $trackDurS = 0
}
readingsBeginUpdate($defs{$device});
readingsBulkUpdate($defs{$device}, "TrackPositionSec", $trackPosS);
readingsBulkUpdate($defs{$device}, "TrackPositionPct", $trackPosP);
readingsBulkUpdate($defs{$device}, "TrackDurationSec", $trackDurS) if($trackDurS != ReadingsVal($device, 'TrackDurationSec', '0'));
readingsEndUpdate($defs{$device}, 1);
#Log3 undef, 4, "Utils_Sonos_SonosTrackPositioUpdate($device): setreading $device Utils_Sonos_TrackPosition $trackPosP";
#my @c = Utils_Sonos_SonosGetSlaves($device); # include slaves
#push(@c, $device); # include device itself
#foreach my $client (@c) {
#Log3 undef, 4, "Utils_Sonos_SonosTrackPositioUpdate($device): setreading $clientTrackPositionSec $trackPosP";
#fhem("sleep 0.01; setreading $client TrackPositionPct $trackPosP ");
#}
return undef;
}
1;
Danke Tobias! ;D
Leider stehe ich trotzdem auf dem Schlauch, was die Playlist wie im Beispiel von setstate und den Fortschrittsbalken betrifft:
1. Ich habe die 99_Sonos-Utilities in FHEM angelegt.
2. Muss ich MDP auf dem Raspberry istallieren, auch wenn ich eigentlich nur die Playlisten vom SONOS darstellen will?
3. Muss ich die 99_fronthemSonosUtils.pm auch in FHEM anlegen?
Gruß und Dank Photon68
2: nein, 3: nein
Aber du musst irgendwo die playliste generieren lassen.
Ich lasse sie automatisch generieren aus dem Filesystem
Gesendet von meinem Leap mit Tapatalk
Danke Tobias!
Dann probier ich mal, ob ich die Playliste aus den bookmarks bekomme.
Gruß Photon68
Hallo!
Mal danke für deine Mühe das du so ein Projekt gemacht hast. Nun zu meinem Problem. Ich möchte mir deinen Player nachbauen und habe auch die fhem.cfg, 99_myUtils.pm und index.html erstellt so wie du sie beschrieben hast. Nur wenn ich dann auf Tablet-UI klicke bekomme ich nur diese Zeilen untereinander angezeigt
PLAYER
PLAYLIST
VOLUME
Bad
WZ
-6
-2
0
2
9
12
Subwoofer
Volume
Und im Log finde ich folgenden Fehler
2016.10.12 17:02:26 1: PERL WARNING: Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 15.
kann aber so nichts auffälligen im skipt finden.
Hast du vielleicht einen Tipp für mich?
Hier auch noch die 99_myUtils.pm
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
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";
}
1;
Ich habe auch mal den Teil für FHEM-WEB nachgebaut. FTUI soll noch folgen.
Ich möchte hauptsächlich MP3 aus einem Verzeichnis abspielen, für jedes Verzeichnis gibt es eine playlist im MPD-Playlist-Verzeichnis, das funktioniert auch soweit, ich kann die Playlist auswählen, abspielen, wechseln usw.
Was mich etwas stört/verwundert, alle 10 Sekunden habe ich folgendes im logfile
2016.12.06 20:04:40 1: call_mpd_playlistinfo
2016.12.06 20:04:40 1: done_mpd_playlistinfo
und die readings von playlist, playlistinfo, file werden aktualisiert.
Und ich weiß nicht warum das passiert, auch wenn sich die aktuelle Playlist nicht ändert?
PS: Habs gefunden, intervall 10
Hallo,
tolle Sache das!
Ich versuche das gerade bei mir einzubauen, es funktioniert einiges, anderes noch nicht, da ich leider eine Perlniete bin stehe ich da teilweise etwas auf dem Schlauch.
Wo kann man angeben, wieviele Items der Playliste in der UI angezeigt werden?(habe ich inzwischen rausbekommen)
Die Select-Box zeigt weder meine Playlisten an, noch kann ich eine PL auswählen.
Außerdem wird das Cover nicht angezeigt, im Reading steht immer nur na.
Vielleicht kann mich jemand in die richtige Richtung schubsen.
Moin @setstate
dank dir für diese wunderbare Umsetzung :D
könntest du dich mit @Wzut mal in Verbindung setzen? Er scheint nämlich derzeit auch ein wenig an seinem Modul zu arbeiten und es wäre schön wenn ihr das irgendwie zusammenfügt. Wäre schade wenn er ein Update raus bringt und dann unser FTUI MPD nicht mehr so will wie es soll ^^
Irgendwie bekomme ich die Coverarts nicht, muß man dafür einen Spotifyaccount haben?
Mir scheint irgendetwas mit der URL nicht zu klappen, das hier erscheint im Log
2016.12.18 16:46:09 1: call_mpd1_playlistinfo
2016.12.18 16:46:09 3: OnMpdPlaylistChanged return value: HASH(0x3dd3470)
2016.12.18 16:46:09 3: get MPD1 mpdCMD playlistinfo : MPD1 playlistinfo:
file: T.Rex/20th Century/Children Of The Revolution.mp3
Last-Modified: 2011-04-28T15:33:15Z
Time: 149
Artist: T.Rex
Title: Children Of The Revolution
Album: 20th Century
Date: 1972
Genre: Glam Rock
Pos: 0
Id: 0
....
2016.12.18 16:38:09 1: PERL WARNING: Use of uninitialized value in string ne at ./FHEM/99_myUtils.pm line 65.
2016.12.18 16:38:09 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/99_myUtils.pm line 81.
2016.12.18 16:38:09 1: call_mpd1_getcover
2016.12.18 16:38:09 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/99_myUtils.pm line 80.
2016.12.18 16:38:09 3: OnMpdNewTrack return value: HASH(0x3dd3950)
2016.12.18 16:38:10 1: done_mpd1_playlistinfo
2016.12.18 16:38:11 1: done_mpd1_getcover
Line 65 enthält:
if ( $lastUri ne $albumUri[$i]) {
Line 80/81 enthalten:
$ret=$ret.'"Track":"'.$track[$i].'",';
$ret=$ret.'"Cover":"'.$url->{'thumbnail_url'}.'"}';
Irgendjemand eine Idee?
Marc-Antón
P.S. Nochwas, lässt sich das Logging auch irgendwo abschalten?
Ich benutzer den Fully Browser mit Medialist. Nach unten scrollen funktioniert, nach oben nicht, weil die Seite dann neu lädt. Kann man da am Widget was optimieren, oder ist das ein Problem vom Browser?
Ist es möglich eine Suche einzubauen, welche nach Titel oder Künstler sucht?
Zitat von: TWART016 am 27 Dezember 2016, 00:47:26
Ich benutzer den Fully Browser mit Medialist. Nach unten scrollen funktioniert, nach oben nicht, weil die Seite dann neu lädt. Kann man da am Widget was optimieren, oder ist das ein Problem vom Browser?
EDIT: eine Scrollleiste an der Seite ist bei Fully nicht vorhanden.
Ist es möglich eine Suche einzubauen, welche nach Titel oder Künstler sucht?
Eine Suchfunktion brauche ich auch noch und werde das auch demnächst angehen. Aber das MPD Protokoll kennt keine generische Suchfunktion. Ich werde dafür die Spotify-Web API nutzen: https://developer.spotify.com/web-api/search-item/
UPDATE
Soweit mein Zwischenstand für die Albumsuche. Suche per Input-Widget und ich zeige das Ergebnis in einer Medialist an. Das Anklicken eines Albums zum Abspielen geht noch nicht. Dazu muss ich noch eine Änderung im Medialist-Widget machen. Vorerst muss man noch "set MPD1 playfile spotify:album:xyz123yxz123" eingeben.
sub call_mpd1_searchSpotify() {
Log 1, "call_mpd1_searchSpotify";
my $query = ReadingsVal("MPD1","searchquery","");
BlockingCall("mpd_searchSpotify",$query,"done_mpd1_searchSpotify",120);
}
sub done_mpd1_searchSpotify($) {
my $result = shift;
Log 1, "done_mpd1_searchSpotify";
fhem ("setreading MPD1 searchresult ".$result);
}
sub mpd_searchSpotify($) {
my $query = shift;
my $url;
my $ret = '[';
my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 1 } );
my $response = $ua->get("https://api.spotify.com/v1/search?q=artist:".$query."&type=album");
my $data = '';
if ( $response->is_success ) {
$data = $response->decoded_content();
my $result = decode_json( $data );
my @items = @{$result->{albums}->{items}};
my $count = 0;
foreach my $album (@items )
{
if ( $album->{album_type} eq "album" ) {
$ret=$ret.'{"Artist":"'.$album->{artists}[0]->{name}.'",';
$ret=$ret.'"Title":"'.$album->{name}.'",';
$ret=$ret.'"Album":"'.$album->{name}.'",';
$ret=$ret.'"Time":"0",';
$ret=$ret.'"File":"'.$album->{uri}.'",';
$ret=$ret.'"Track":"'.$count.'",';
$ret=$ret.'"Cover":"'.$album->{images}[2]->{url}.'"},';
$count++;
}
}
if ( $count > 0 ) {
$ret = substr($ret, 0, -1);
}
}
$ret =~ s/;//g;
$ret =~ s/\\n//g;
$ret =~ s/[\x80-\x{FFFF}]/\x5F/g;
$ret = $ret.']';
return $ret;
}
define OnMpdSearchChanged notify MPD1:searchquery:.* {call_mpd1_searchSpotify()}
FTUI
<div data-type="input" data-device="MPD1" data-get="searchquery" data-set="searchquery" data-cmd="setreading" data-value="" class=""></div>
<div data-type="medialist" data-device="MPD1" data-get="searchresult" class=""></div>
Hallo setstate, das ist wirklich ein cooles Modul. Vielen Dank dafür.
Ich habe nur das Problem, dass in kürzester Zeit mein FHEM-Log vollgeschrieben wird.
Alles paar Sekunden kommen Einträge in der Art:
2016.12.30 00:05:35 0: done_mpd1_getcover
2016.12.30 00:05:42 0: done_mpd1_playlistinfo
2016.12.30 00:05:44 0: call_mpd1_playlistinfo
2016.12.30 00:05:44 3: OnMpdPlaylistChanged return value: HASH(0x3a82fd0)
2016.12.30 00:05:44 3: get MPD1 mpdCMD playlistinfo : MPD1 playlistinfo:
file: spotify:track:69l8nFPu0LWmnoJX7YSVYc
Time: 269
Artist: James Taylor
Album: Mud Slide Slim And The Blue Horizon
Title: You've Got A Friend
Date: 1971
Track: 2
Pos: 0
Id: 69
AlbumArtist: James Taylor
X-AlbumUri: spotify:album:0h8hazllDADHsrSpcQCltk
file: spotify:track:2DnJjbjNTV9Nd5NOa1KGba
Kann ich das Logging für die Playlist-Info irgendwie deaktivieren?
Viele Grüße,
Thorsten
Da Tobias mich heute im MPD Fred auf das Thema hier aufmerksam gemacht hat :
Zitat von: setstate am 27 Mai 2016, 00:02:46
Damit das Ganze fluffig läuft, musste ich das MPD Modul etwas optimieren.
--snip --
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.
Was wird denn genau für FTUI gebraucht ?
Verstanden habe ich bis jetzt nur ein Reading mit dem Namen playlistcollection , d.h. eine Liste der vorhanden Playlisten mit Doppelpunkt getrennt ( ist ab morgen im Update verfügbar, aber war da nicht erst vor kurzem hier eine Diskussion das bestimmte Zeichen u.a. auch der Doppelpunkt nichts mehr in Reading Werten zu suchen haben ? .... muss ich jetzt direkt nochmal auf die Suche gehen)
Welche weiteren Readings werden noch benötigt ?
Was ist bei der current Songabfrage nicht OK ?
Reading cover : was wollt ihr hier haben - eine URL zum Bild des Interpreten ? Wenn ja ist im Reading artist_image_html vorhanden, wenn es unbedingt cover sein muss kann ich es ändern bzw. man biegt es sich mit userreading selbst hin.
So, jetzt nochmal zusammengefasst nachdem ich 2 Tage das aktuelle MPD-Modul versuche in TabletUI zu integrieren
- es muss in einem zu definierenden Intervall kontinuierlich das Reading "elapsed" aktualisiert werden. Angabe in Sekunden
- Reading "songtime" sollte ebenfalls die Anzahl in Sekunden der aktuellen Songlänge beinhalten
- "seekcur" aus dem MPD sollte noch ins Modul, damit man x-sekunden vor- und zurückspulen kann
- Ein Reading "currentTrackProvider" sollte verfügbar sein. Dieser sollte folgende Ausprägungen haben
- Radio: Ein Radiostream wird abgespielt
- Bibliothek: Eine lokale MP3 wird abgespielt
- In ein Reading zb.: "playlist_json" wird von extern eine playlistdefinition, passend zur gleich abgespielten Playlist, eingesteuert. Darin befindet sich auch pro Track das passende Cover. Falls dieses Reading befüllt ist, sollte unter "artist_image" das daraus extrahierte Cover zum aktuell laufenden Track liegen
- der MPD stellt selbst kein "mute" zur Vefügung. Das könnte aber im MPD-fhem-Modul simuliert werden. Bei Mute: Volume merken und setvol=0, beim unmute entsprechend anders herum
Zitat von: Tobias am 04 Januar 2017, 16:54:50
- es muss in einem zu definierenden Intervall kontinuierlich das Reading "elapsed" aktualisiert werden. Angabe in Sekunden
Ist in der aktuellen Version enthalten, wird parametriert über das attr waits und wirkt wenn der Status Play ist.
Zitat von: Tobias am 04 Januar 2017, 16:54:50
- Reading "songtime" sollte ebenfalls die Anzahl in Sekunden der aktuellen Songlänge beinhalten
songtime war eine Notlösung für das doppelte Time/time Reading. Nachdem das MPD Modul die Reading Namen 1:1 vom MPD verwendet gibt es dafür keinen Grund mehr. setstate ist in seinem Beispiel im ersten Post auch diesen Weg gegangen.
Zitat von: Tobias am 04 Januar 2017, 16:54:50
- "seekcur" aus dem MPD sollte noch ins Modul, damit man x-sekunden vor- und zurückspulen kann
Auf der ToDo Liste
Zitat von: Tobias am 04 Januar 2017, 16:54:50
Ein Reading "currentTrackProvider" sollte verfügbar sein. Dieser sollte folgende Ausprägungen haben
- Radio: Ein Radiostream wird abgespielt
- Bibliothek: Eine lokale MP3 wird abgespielt
Die Unterscheidung ist heute schon möglich mit dem Reading "Name", wer das Kind unbedingt "currentTrackProvider" nennen will kann dies IMHO mitttels userReadings tun.
Zitat von: Tobias am 04 Januar 2017, 16:54:50
- In ein Reading zb.: "playlist_json" wird von extern eine playlistdefinition, passend zur gleich abgespielten Playlist, eingesteuert. Darin befindet sich auch pro Track das passende Cover. Falls dieses Reading befüllt ist, sollte unter "artist_image" das daraus extrahierte Cover zum aktuell laufenden Track liegen
Habe ich nun verstanden, die Umsetzung im Modul ist mir z.Z. aber noch unklar.
a. sehe ich da ein Timing Problem im Ablauf, da diese externe Info mit Sicherheit erst eintrifft wenn die Readings nach einem Song Wechsel bereits längst aktualisiert sind.
Ich werde das testen, allerdings muss der User dann auf den bequemen Weg verzichten die Bilder von Last.fm zu holen bzw. zu benutzen.
b. Unklar ist mir wie dein Modul 98_Medialist die exakte Zuordung Bild zu Song hinbekommt. Oder ist das pure Fleiß und Handarbeit ?
c. Sollte man darüber nachdenken das es sowohl Interpreten Bilder gibt = "artist_image" als auch Cover Bilder des Mediums LP/CD = "album_image".
Das MPD Modul kann beides dem User via Last.fm zur Verfügung stellen. Das medialist Widget kennt da heute leider nur ein Bild pro Song.
Zitat von: Tobias am 04 Januar 2017, 16:54:50
- der MPD stellt selbst kein "mute" zur Vefügung. Das könnte aber im MPD-fhem-Modul simuliert werden. Bei Mute: Volume merken und setvol=0, beim unmute entsprechend anders herum
da halte ich mich an :
Zitat von: Markus Bloch am 04 Januar 2017, 16:34:56
Schau mal hier: https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV#Kommandos
Wäre cool, wenn du diese Syntax ebenfalls verwenden könntest für den Mute-Befehl. (on/off/toggle).
Zitat von: Wzut am 04 Januar 2017, 17:47:25
songtime war eine Notlösung für das doppelte Time/time Reading. Nachdem das MPD Modul die Reading Namen 1:1 vom MPD verwendet gibt es dafür keinen Grund mehr. setstate ist in seinem Beispiel im ersten Post auch diesen Weg gegangen.
das aktuelle time enthält bei mir: "<elapsed>:<songtime>
Edit: Gefunden: ist "Time". das "time" enthält beides.
Zitat von: Wzut am 04 Januar 2017, 17:47:25
Die Unterscheidung ist heute schon möglich mit dem Reading "Name", wer das Kind unbedingt "currentTrackProvider" nennen will kann dies IMHO mitttels userReadings tun.
In TabletUI ist es schwer zu prüfen ob ein REading leer oder mit eigendetwas gefüllt ist. ODer ich stell mich zu dumm an. Wenn du es also nicht als wichtig erachtest muss man ein Userreading anlegen ;)
Nachtrag: Problem ist, das das Reading "Name" bei einem Wechsel von Radio zu lokaler mp3 keinen EventTrigger bekommt. Damit wird dann das Userreading nicht angeschubst. Kannst du gut im Eventmonitor prüfen das da nix ankommt... Das Userreading müsste heißen:
currentTrackProvider:Name.* {if(ReadingsVal("$name", "Name", "") eq "") {"Bibliothek"} else {"Radio"}}
Nachtrag2: Man kann das Reading "mpd_event" nutzen, im Falle lvon lokalen Dateien ist die Ausprägung "player", bei Radio ist es "playlist". Damit gehts nun
Zitat von: Wzut am 04 Januar 2017, 17:47:25
Habe ich nun verstanden, die Umsetzung im Modul ist mir z.Z. aber noch unklar.
a. sehe ich da ein Timing Problem im Ablauf, da diese externe Info mit Sicherheit erst eintrifft wenn die Readings nach einem Song Wechsel bereits längst aktualisiert sind.
Ich werde das testen, allerdings muss der User dann auf den bequemen Weg verzichten die Bilder von Last.fm zu holen bzw. zu benutzen.
b. Unklar ist mir wie dein Modul 98_Medialist die exakte Zuordung Bild zu Song hinbekommt. Oder ist das pure Fleiß und Handarbeit ?
c. Sollte man darüber nachdenken das es sowohl Interpreten Bilder gibt = "artist_image" als auch Cover Bilder des Mediums LP/CD = "album_image".
Das MPD Modul kann beides dem User via Last.fm zur Verfügung stellen. Das medialist Widget kennt da heute leider nur ein Bild pro Song.
Zuerst wird die playlist_json übergeben, dann ein "set <MPD> playlist <playlistname>" aufgerufen. Die Reihenfolge in der <playlistname> stimmt exakt mit dem playlist_json überein.
Somit steht der json string schon bereit wenn ein "set playlist" erfolgt
Bzgl der Cover: Es wird artist und album eines jeden songs ermittelt und dann zurZeit in 3 verschiendenen Quellen /Coverdatenbanken nach vorhandenen Covern gesucht. Wenn im selben lokalen Folder wie die MP3s aus der Playlist aber auch ein Cover liegt, wird dieses genutzt. Das will und kann ich aber noch verfeinern. Das hinzufügen von weiteren http Quellen ist ziemlich einfach.
Am besten das Cover liegt neben deinen in einem extra Reading. Dann kann man schön das Rotor Widget nutzen um in TabletUI automatisch zwischen den Covern zu wechseln und beide anzuzeigen.
Update :
currentTrackProvider ist ab morgen verfügbar
playlistinfo hat nun auch bei Radiostreams einen Inhalt
album_image , wenn Album einen Inhalt hat (i.d.R. nicht bei Radiostreams)
ToDo:
playlist_json auswerten
Vielen Dank,
CurrentTrackProvider funktioniert :)
Für dich als INfo oder Anregung fürs ToDo:
ich habe folgendes Userreading drin um die aktuelle Position in der aktuell abzuspielenden Playlist zu haben:
PlaylistPositionSec:elapsed.* {Utils_MPD_PlaylistPosition($NAME)}
# ####################################################################
# berechnet die aktuelle Position in der Playlist
# ####################################################################
sub Utils_MPD_PlaylistPosition($) {
my ($device) = @_;
return if(ReadingsVal($device, "mpd_event", "playlist") eq "playlist"); #Radiostream
my $trackPosS = ReadingsVal($device, "elapsed", "0");
my $plPosS = 0; #PlaylistPositionSeconds
my $Track = ReadingsVal($device, "Pos", "0");
my $playlist = ReadingsVal($device, "playlist_json", undef);
my @data = @{JSON::XS->new->decode($playlist)} if($playlist);
#calculate elapsed time of whole playlist
if($playlist) {
for(my $j=0; $j<=$#data; $j++) {
last if($j>=$Track);
$plPosS += $data[$j]->{Time};
}
}
$plPosS += $trackPosS;
return $plPosS;
}
Somit habe ich nicht nur eine laufende Fortschrittsanzeige in TabletUI über den aktuellen TRack, sondern auch über eine laufende Fortschrittsanzeige über die gesamtSpielzeit
Zitat von: Tobias am 05 Januar 2017, 08:55:49
Nachtrag2: Man kann das Reading "mpd_event" nutzen, im Falle lvon lokalen Dateien ist die Ausprägung "player", bei Radio ist es "playlist".
und
return if(ReadingsVal($device, "mpd_event", "playlist") eq "playlist"); #Radiostream
Ich denke hier liegst du nur zum Teil richtig , der event playlist wird laut MPD Doku erzeugt , wenn :
Zitatplaylist: the current playlist has been modified
Sicher das trift bei Radoistreams immer dann zu wenn sie den Titel Tag ändern, sei es weil ein neues Lied beginnt oder die Station andere Nachrichten verschickt.
Aber auch beim abspielen deiner eigenen Musik gibt es diesen Event, mit Sicherheit z.B. beim wechseln der Playliste.
Ja, hab ich auch schon gemerkt, wen ich zb. volume ändere, ist das mpd_event = mixer.
Zum Glück hast du es ja jetzt korrekt eingebaut :)
Hallo zusammen,
leider gelingt es mir nicht, das Medialist Modul zu laden. Wer kann helfen:
reload: Error:Modul 98_MediaList deactivated:
Can't locate MP3/Tag.pm in @INC (you may need to install the MP3::Tag module) (@INC contains: . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/arm-linux-gnueabihf/perl5/5.20 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl ./FHEM) at ./FHEM/98_MediaList.pm line 35, <$fh> line 69.
BEGIN failed--compilation aborted at ./FHEM/98_MediaList.pm line 35, <$fh> line 69.
gruss Peer
@fremitus,
ich habe das Modul noch nicht freigegeben da die Commandref-Doku noch fehlt. Funktionalität ist aber da, wird bei mir täglich getestet ;)
Ich häng dir mal die aktuelle Version hier an
Wikieintrag gibt schon, auch die benötigten Module: https://wiki.fhem.de/wiki/MediaList
Danke, hat geholfen. Allerdings sieht es auf meinem 3.5 Display doch etwas schräg aus...das muss ich mir noch etwas anderes einfallen lassen.
Und Asche auf mein Haupt, ich habe ca. 4h im Internet recherchiert und bin auch über deine Anleitung gestolpert...nur die Installationsanweisung habe ich irgendwie übersehen....
gruss Peer
Hab den Wikiartikel nochmal stark überarbeitet
Sorry, hab die Installationsanweisung auch erst gestern im Wikiartikel eingetragen :(
Moin,
Ich habe jetzt das Beispiel von setstate übernommen weil ich es optisch ansprechend finde.
Habe jedoch ein Problem mit der MediaList.
Die angezeigten Cover sind riesig und die Liste geht weit über den Bildschirm (nach unten) hinaus (Bild anbei)
Wie kann ich das ändern?
Mit freundlichen Grüßen
Hi,
ich glaube ohne Code der index.html und der Unterseite mit der MediaList wird dir so schnell keiner helfen können ;)
8),
Ja, natürlich. Das kommt davon wenn man mal schnell was zwischen Tür und Angel fragen möchte.
Hier der HTML Teil der MediaList
<li data-row="1" data-col="2" data-sizex="7" data-sizey="6">
<header>PLAYLIST</header>
<div data-type="label" data-device="myMediaList" data-get="CurrentDir" class="" ></div>
<div data-type="select" data-device="myMediaList" data-list="FolderContent" data-get="CurrentDir" data-set="RequestedDirectory" class="wider" ></div>
<div data-type="medialist" data-device="myMediaList" data-get="currentdir_playlist" data-pos="Pos" data-set="play" class="vbox phone-width"></div>
</li>
Und hier meine Index HTML
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="widget_base_width" content="76">
<meta name="widget_base_height" content="83">
<meta name="gridster_cols" content="13">
<meta name="gridster_rows" content="9">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="gridster_disable" content="0">
<meta name="widget_margin" content="1">
<meta name="longpoll" content="1">
<meta name="debug" content="2">
<link rel="stylesheet" href="lib/jquery.gridster.min.css" />
<link rel="stylesheet" href="lib/openautomation.css" />
<link rel="stylesheet" href="lib/fhemSVG.css" />
<link rel="stylesheet" href="css/fhem-tablet-ui.css" />
<link rel="stylesheet" href="lib/font-awesome.min.css" />
<link rel="stylesheet" href="lib/material-icons.min.css" />
<link rel="stylesheet" href="lib/jquery.toast.min.css" />
<!-- define your personal style here, it wont be overwritten -->
<!-- link rel="stylesheet" href="css/fhem-green-ui.css" / -->
<!-- link rel="stylesheet" href="css/fhem-tablet-ui-user.css" / -->
<script src="lib/jquery.toast.min.js"></script>
<script src="lib/jquery.gridster.min.js"></script>
<script src="js/fhem-tablet-ui.js" defer></script>
<title>FHEM-Tablet-UI-eval</title>
</head>
<body>
<div class="gridster">
<ul>
<li data-row="1" data-col="1" data-sizex="1" data-sizey="9">
<header><div data-type="label" class="medium orange">Menu</header>
<div class="cell">
<div data-type="pagebutton" data-url="#content_main.html" data-load="#content1" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern="(.*/||.*index_page_left_demo.html||.*#content_main.html)" data-icon="fa-home" class="default top-space"></div>
<div data-type="pagebutton" data-url="#content_music.html" data-load="#content9" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_music.html" data-icon="fa-music" class="prefetch top-space"></div>
<div data-type="pagebutton" data-url="#content_rollaeden.html" data-load="#content3" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_rollaeden.html" data-icon="oa-fts_shutter_50" class="top-space"></div>
<div data-type="pagebutton" data-url="#content_light.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=".*#content_light.html" data-icon="fa-lightbulb-o" class="top-space"></div>
<div data-type="pagebutton" data-url="#content_phone.html" data-load="#content5" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_phone.html" data-icon="fa-phone" class="top-space"></div>
<div data-type="pagebutton" data-url="#content_cam.html" data-load="#content6" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_cam.html" data-icon="fa-video-camera" class="top-space"></div>
<div data-type="pagebutton" data-url="#content_heating.html" data-load="#content7" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_heating.html" data-icon="oa-sani_heating" class="top-space"></div>
<div data-type="pagebutton" data-url="#content_charts.html" data-load="#content8" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_traffic.html" data-icon="fa-line-chart" class="top-space"></div>
<div data-type="pagebutton" data-url="#content_wetter.html" data-load="#content4" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#content_wetter.html" data-icon="oa-weather_cloudy" class="top-space"></div>
<div data-type="pagebutton" data-url="#content_dlna.html" data-load="#content11" data-off-background-color="transparent" data-off-color="#606060" data-on-background-color="#606060" data-on-color="#222222" data-active-pattern=".*#musik-dg-settings.html" data-icon="oa-edit_settings" class="prefetch"></div>
<div class="absolute bottom bottom-space-2x">
<div data-type="clock" data-format="H:i" class="large"></div>
<div data-type="clock" data-format="d.n.Y" class="small"></div>
</div>
</div>
</li>
<li data-row="1" data-col="2" data-sizex="12" data-sizey="9">
<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="content11"></div>
</li>
</ul>
</div>
</body>
</html>
Mit freundlichen Grüßen
Also sowit hab ich das jetzt nach langem hin und her auch ganz gut zum laufen gebracht.
Im Prinzip hab ich das originale Modul hergenommen, zusätzlich von setstate noch die beiden notifys OnMpdNewTrack und OnMpdPlay, sowie die Funktionen seiner 99_myUtils.pm.
Läuft soweit auch ganz gut, leider werden die Covers in dem Medialist Widget nur teilweise angezeigt, was wohl daran liegt dass ich das letzte notify nicht verwendet habe.
Dazu muss ich sagen, das Modul das setstate verwendet ist schon etwas veraltet und hat einige Funktionen nicht. Das jetzt auseinander zu klamüssern und 2 zu eins zu machen is für mich leider unmöglich. Bisher zumindest... :P
Das wäre mal zumindest ein Punkt den ich zu beanstanden hab ;D
Zum andern geht das hoch scrollen der Medialist nicht im fullyBrowser, schaltet man das reload beim Pull in den Einstellungen aus, dann geht's auch.
Alles in allem trotzdem ne gute Arbeit und ich bedanke mich :)
Edit:
Zu den Covers noch:
Wenn man mit Last.FM verbunden ist, wird vom MPD Modul eine URL zu einem Albumbild ausgegeben.
Könnte man dieses nicht iwi über die Medialist abfragen?
Hi,
versuch mal folgende Zeile:
<header><div data-type="label" class="medium orange">Menu</header>
in Folgendes zu ändern:
<header><div data-type="label" class="medium orange">Menu</div></header>
ggf. kann schon das der Grund sein, warum das Design "zerschossen" wird.... muss aber nicht sein... ansonsten müsste setstate nachschauen, was da evtl. im Widget schief läuft.
Gruß
Mathias
Zitat von: DerBaer am 16 Februar 2017, 20:18:43
Wenn man mit Last.FM verbunden ist, wird vom MPD Modul eine URL zu einem Albumbild ausgegeben.
Könnte man dieses nicht iwi über die Medialist abfragen?
Natürlich, viele der letzten Änderungen am MPD Modul wurde ja vorgenommen um direkt mit TabletUI zusammen arbeiten zu können.
ZitatHi,
versuch mal folgende Zeile:
Code: [Auswählen]
<header><div data-type="label" class="medium orange">Menu</header>
in Folgendes zu ändern:
Code: [Auswählen]
<header><div data-type="label" class="medium orange">Menu</div></header>
ggf. kann schon das der Grund sein, warum das Design "zerschossen" wird.... muss aber nicht sein... ansonsten müsste setstate nachschauen, was da evtl. im Widget schief läuft.
Gruß
Mathias
Danke für den Hinweis.
Leider keine Änderung auf der Seite, auch nicht bei den anderen Seiten meines Tablet-UI.
Da hilft dann nur warten auf setstate
Zitat von: Wzut am 17 Februar 2017, 12:40:02
Natürlich, viele der letzten Änderungen am MPD Modul wurde ja vorgenommen um direkt mit TabletUI zusammen arbeiten zu können.
Das hab ich auch verfolgt. Es fehlt momentan halt noch an der Medialist. Aber wird zur gegebenen Zeit schon noch kommen.
War ja jetzt "nur" meine Rückmeldung zu dem ganzen Thema. ;D
Zitat von: Shadow3561 am 15 Februar 2017, 19:51:34
Moin,
Ich habe jetzt das Beispiel von setstate übernommen weil ich es optisch ansprechend finde.
Habe jedoch ein Problem mit der MediaList.
Die angezeigten Cover sind riesig und die Liste geht weit über den Bildschirm (nach unten) hinaus (Bild anbei)
Wie kann ich das ändern?
Mit freundlichen Grüßen
Moin,
Habe den Fehler jetzt gefunden.
Habe TabletUi 2.5 installiert, da ist wohl das MediaList Modul noch nicht portiert worden.
Bin jetzt wieder zurück auf 2.2 und alles läuft wie es soll.
Danke an alle fürs Kopfzerbrechen.
MfG
Edit: habe noch ein weni optimiert und bin soweit zufrieden.
Bin aber für jede Anregung dankbar, also legt los wenn ihr noch Ideen habt.
Kannst Du mal sagen, was Du audiomäßig angebunden hast? Wie hast Du das in FHEM und Tablet UI definiert?
Zitat von: Gunther am 26 Oktober 2017, 02:34:49
Kannst Du mal sagen, was Du audiomäßig angebunden hast? Wie hast Du das in FHEM und Tablet UI definiert?
Sorry, aber ich stehe bezüglich deiner Frage ein wenig auf dem Schlauch.
Was genau möchtest du wissen?
MfG
Ich glaub er meint wie das mit dem Lautsprecher verkabelt is ^^
Aha,
Also mein BananaPi hängt per HDMI an meinem Onkyo Tx-Nr5008.
Es besteht aber auch die Möglichkeit einen Stream mit MPD zu senden und diesen als Radiostation über einen Netzwerkplayer einzubinden.
MfG
Zitat von: Shadow3561 am 26 Oktober 2017, 16:36:21
Sorry, aber ich stehe bezüglich deiner Frage ein wenig auf dem Schlauch.
Was genau möchtest du wissen?
MfG
Mich interessiert, was Du hinter Server und Radio stecken hast. Sind das Funktionen des MPD Players oder wie hast Du Radio und Server (Streaming?) eingebunden?
moin,
im Bereich Server ist die Playlist auswahl vom Modul MediaList (https://wiki.fhem.de/wiki/MediaList).
Die Radioauswahl ist vom Modul MPD und ist quasi die Playlistauswahl vom MPD-Player.
<div data-type="select" data-device="MPD1" data-list="playlistcollection" data-get="playlistname" data-set="playlist" class="col-1-2" ></div>
Ich hoffe es reicht dir als Antwort.
MfG
Danke! Das sieht spannend aus!
Ich muss mich mal tiefer in MDP einlesen. Mopify zum Abspielen von Spotify klingt interessant.
Mal schauen, ob es da eine Möglichkeit gibt die Spotifyapp zum Suchen und Bestücken von Playlisten nicht mehr öffnen zu müssen.
Stellst Du die Definition (Code) Deines Onkyoreceivers (FHEM/ Tablet UI) zur Verfügung?
Was hat es mit dem Listening Mode auf sich?
Zitat von: Gunther am 27 Oktober 2017, 11:32:30
Stellst Du die Definition (Code) Deines Onkyoreceivers (FHEM/ Tablet UI) zur Verfügung?
Was hat es mit dem Listening Mode auf sich?
<header><div data-type="label" class="medium orange">Onkyo AVR</div></header>
<div data-type="label" class="darker" data-device="AVR"
data-get="presence">
</div>
<div class="cell">
<div data-type="switch" data-device="AVR"
data-get="stateAV"
data-icon="fa-power-off"
data-on-color="green"
data-on-background-color="#555"
data-off-color="red"
data-background-icon="fa-square-o"
class="wider"></div>
<div data-type="label" class="darker top-space-2x">Eingang</div>
<div data-type="select" data-device="AVR" data-items='["usb","music-server","internet-radio","cbl-sat","bd/dvd","video4"]' data-get="input" data-set="input" data-alias='["USB-Front","Music-Server","Internet-Radio","Sky-Receiver","Media-Player","HDMI-Front"]' class="" ></div>
</div>
<div class="cell">
<div data-type="label" class="darker top-space-2x">Listening-Mode</div>
<div data-type="select" data-device="AVR" data-get="listening-mode" data-set="listening-mode"
data-items='["stereo","all-ch-stereo","pure-audio","direct","audyssey-dsx"]'
data-alias='["Stereo","all-Ch-Stereo","Pure-Audio","Direct","Audyssey-DSX"]'
class="" ></div>
</div>
<div class="cell">
<div data-type="label" class="darker top-space-2x">Volume</div>
<div data-type="knob" data-device='AVR' data-get="volume" data-step="1" data-inputcolor="green" data-fgcolor="green" data-set="volume" class="">
</div>
<div class="cell">
<div data-type="label" class="darker top-space-2x">Subwoofer</div>
<div data-type="switch" data-device="Subwoofer"
data-icon="oa-audio_loudness" data-backround-color="#505050" data-on-color="green"
class="invert"></div>
<div data-type="label" class="darker top-space-2x">Woofer-Level</div>
<div data-type="circlemenu" data-direction="vertical-top" class="noshade">
<ul>
<li><div data-type="push" data-icon="fa-wrench"></div></li>
<li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="-12" data-set-on="-12" data-icon="">-12</div></li>
<li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="-6" data-set-on="-6" data-icon="">-6</div></li>
<li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="0" data-set-on="0" data-icon="">0</div></li>
<li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="2",data-set-on="2" data-icon="">2</div></li>
<li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="9" data-set-on="9" data-icon="">9</div></li>
<li><div data-type="push" data-device="AVR" data-set="subwoofer-temporary-level" data-get="subwoofer-temporary-level" data-on-color="green" data-off-color="grey" data-get-on="12" data-set-on="12" data-icon="">12</div></li>
</ul>
</div>
</div>
Listening-Mode ist der Wiedergabe-Modus des Verstärkers. Ich denke der o.A. Code erklärt es von selbst.
MfG
Danke Dir! :)
Hi ich hätte da mal noch eine fragen.
Ich bin zwar noch nicht im FTUI mit meinem Radio angelangt, aber ihr könnt mir doch bestimmt helfen.
Ich habe das Programm Medialist soweit nach Wiki installiert.
defmod meineMusik MediaList /media/music/
attr meineMusik MediaList_CacheFileDir /var/lib/mpd/playlists/
attr meineMusik MediaList_PathReplaceFrom /media/pi/68FA-40DE 68FA-40DE/PUR
attr meineMusik MediaList_PlayerDevice StreamRadio
attr meineMusik MediaList_mkTempCopy symlink
attr meineMusik room Radio
setstate meineMusik 2018-01-02 19:24:12 playlist []
setstate meineMusik 2018-01-02 19:24:12 playlistduration
setstate meineMusik 2018-01-02 19:24:12 playlistname PUR
Habe ich noch irgendwas vergessen oder falsch installiert??
Den leider klappt dieses nicht bei mir.
danke schon mal
1. Die generierte Playlist "meineMusik.m3u" enthält die mp3-dateien ohne Pfadangabe?
2. die MP3 Dateien befinden sich alle im angegebenen cachefiledir?
3. MPD ist wie im Wiki konfigirierte das er allen Symlinks folgt?
4. MPD hat Zugriffsrechte auf die verlinkten "echten" Files?
5. Fehlermeldung des MPD wenn du die Playlist manuell in den MPD lädst?
Hallo zusammen,
ich habe gerade das Module bei mir integriert mit Mopidy....funktioniert soweit.
Leider werden aber die Mustiktitel nicht aktualisiert....erst wenn ich immer wieder ein "get device statusRequest" händisch ausführe.
Was ist dabei das Problem? Ich habe es auch mit einem waits 10 versucht...ohne Erfolg
Update:
Die einzigen Werte die nach einem "set device play 0" aktualisiert werden sind Title, rawTitle, volume.
In Title und rawTitle steht dann der name des Playlisteintrages.
das ist leider ein Problem, ich halte bei mir eine alte Verson des Moduls wo es noch sauber funktioniert.
73_MPD.pm 13247 2017-01-26 20:20:08Z Wzut
Könnt ihr bitte mal die angehängte Version testen ?
Falls das Problem damit erledigt ist checke ich sie ein.
Hallo zusammen,
ich finde das Projekt sehr interessant. Ich komme mit einigen Punkten allerdings noch nicht klar.
Ich habe mopidy mit spotify installiert. Auf der grafischen Übersicht Iris bekomme ich soweit auch alles angezeigt.
In Fhem sehe ich allerdings meine Playlists nicht - siehe Screenshot. Habe ich was bei der Installation übersehen? Oder geht die Funktion gerade nicht mehr?
Für einen Tipp wäre ich euch dankbar.
Grüße,
Alex
Bilder /Screenshots sind immer schlecht, was helfen könnte wäre ein list ( in Code Tags ! ) vom Device
Hallo Wzut,
vielen Dank für die Antwort. Hier mal ein list auf das Device:
Internals:
CFGFN ./FHEM/01_spotify.cfg
CHANGED
FUUID 5da5b4c4-f33f-2077-7caa-fe890cb54dee4b57
HOST localhost
INTERVAL 30
MUTE off
NAME MPD1
NR 596
PORT 6600
PRESENT 1
STATE play
TYPE MPD
VERSION MPD 0.19.0
VOLUME 100
READINGS:
2019-10-15 20:38:42 Album +
2019-10-15 17:35:09 AlbumArtist Ed Sheeran
2019-10-15 17:35:09 Artist Ed Sheeran
2019-10-15 13:57:57 Cover
2019-10-15 20:38:42 Date 2011
2019-10-15 11:47:31 Disc 1
2019-10-15 13:57:57 Genre
2019-10-15 20:38:42 Id 77
2019-10-15 13:57:57 Last-Modified
2019-10-15 13:57:57 Name
2019-10-15 20:38:42 Pos 4
2019-10-15 20:38:42 Time 258
2019-10-15 20:38:42 Title The A Team
2019-10-15 20:38:42 Track 1
2019-10-15 20:38:42 X-AlbumUri spotify:album:0W5GGnapMz0VwemQvJDqa7
2019-10-15 11:47:31 albums 0
2019-10-15 12:04:04 artist
2019-10-15 11:47:31 artists 0
2019-10-15 11:47:31 bitrate 160
2019-10-15 11:47:31 consume 0
2019-10-15 20:38:45 cover https://i.scdn.co/image/ab67616d00001e02f0e911d0e5aadefc431bf34a
2019-10-15 11:47:31 currentTrackProvider Bibliothek
2019-10-15 11:47:31 db_playtime 0
2019-10-15 11:47:31 db_update 0
2019-10-16 07:10:20 elapsed 101.713
2019-10-15 14:00:25 error1 connect: Connection refused
2019-10-15 17:35:07 error2 socketclose: Bad file descriptor
2019-10-15 20:38:42 file spotify:track:1VdZ0vKfR5jneCmWIUAMxK
2019-10-15 13:59:03 last_error IdleStart: Connection refused
2019-10-15 11:29:49 mpd_event player
2019-10-15 09:44:24 mute off
2019-10-15 12:04:04 name 0
2019-10-15 20:38:42 nextsong 5
2019-10-15 20:38:42 nextsongid 78
2019-10-15 11:45:57 outputenabled0 0
2019-10-15 11:45:57 outputname0 Mute
2019-10-15 17:36:20 playlist 22
2019-10-15 11:29:49 playlist_crc 62105
2019-10-15 13:57:57 playlist_json
2019-10-15 13:57:57 playlist_num -1
2019-10-15 17:36:20 playlistcollection
2019-10-15 17:36:55 playlistinfo [{"Artist":"Ed Sheeran","Title":"Happier","Album":"÷ (Deluxe)","Time":"208","File":"spotify:track:2RttW7RAu5nOAfq6YFvApB","Track":"7","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Thinking out Loud","Album":"x (Deluxe Edition)","Time":"282","File":"spotify:track:34gCuhDGsG4bRPIf9bb02f","Track":"11","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"Galway Girl","Album":"÷ (Deluxe)","Time":"171","File":"spotify:track:0afhq8XCExXpqazXczTSve","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Dive","Album":"÷ (Deluxe)","Time":"238","File":"spotify:track:51ChrwmUPDJvedPQnIU8Ls","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"The A Team","Album":"+","Time":"258","File":"spotify:track:1VdZ0vKfR5jneCmWIUAMxK","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02f0e911d0e5aadefc431bf34a"},{"Artist":"Ed Sheeran","Title":"Shape of You","Album":"÷ (Deluxe)","Time":"234","File":"spotify:track:7qiZfU4dY1lWllzX7mPBI3","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Castle on the Hill","Album":"÷ (Deluxe)","Time":"261","File":"spotify:track:6PCUP3dWmTjcTtXY02oFdT","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Perfect","Album":"÷ (Deluxe)","Time":"263","File":"spotify:track:0tgVpDi06FyKpA1z0VMD4v","Track":"5","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"What Do I Know?","Album":"÷ (Deluxe)","Time":"237","File":"spotify:track:2pJZ1v8HezrAoZ0Fhzby92","Track":"10","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Don't","Album":"x (Deluxe Edition)","Time":"220","File":"spotify:track:1huvTbEYtgltjQRXzrNKGi","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"I See Fire - From \"The Hobbit - The Desolation Of Smaug\"","Album":"The Hobbit - The Desolation Of Smaug (Original Motion Picture Soundtrack / Special Edition)","Time":"301","File":"spotify:track:3B7udSGy2PfgoCniMSb523","Track":"28","Cover":"https://i.scdn.co/image/6fcd5648de0faf3a40c9ddbed9e9e9d7e0d278f4"},{"Artist":"Ed Sheeran","Title":"Bloodstream","Album":"x (Deluxe Edition)","Time":"300","File":"spotify:track:5v4sZRuvWDcisoOk1PFv6T","Track":"7","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"Nancy Mulligan","Album":"÷ (Deluxe)","Time":"180","File":"spotify:track:35QZaWQRkmnAVqBF1TLCxQ","Track":"15","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"New Man","Album":"÷ (Deluxe)","Time":"189","File":"spotify:track:5HDPtsnyb3maFmPL8LLUTG","Track":"8","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"I'm a Mess","Album":"x (Deluxe Edition)","Time":"245","File":"spotify:track:0xCA70t1ZA4fa9UOE0lIJm","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"Sing","Album":"x (Deluxe Edition)","Time":"235","File":"spotify:track:6K8qKeWo5MsFED7wCR6Kop","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"You Need Me, I Don't Need You","Album":"+","Time":"220","File":"spotify:track:5KL4iZkCTZyXl7KnHgfVDj","Track":"10","Cover":"https://i.scdn.co/image/ab67616d00001e02ed139c2e0e3681cc2d35e256"},{"Artist":"Ed Sheeran","Title":"Eraser","Album":"÷ (Deluxe)","Time":"227","File":"spotify:track:7oolFzHipTMg2nL7shhdz2","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Supermarket Flowers","Album":"÷ (Deluxe)","Time":"221","File":"spotify:track:4VuS959DSpr82t3qBqCrWG","Track":"12","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Ed Sheeran","Title":"Photograph","Album":"x (Deluxe Edition)","Time":"259","File":"spotify:track:1HNkqx9Ahdgi1Ixy2xkKkL","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e0213b3e37318a0c247b550bccd"},{"Artist":"Ed Sheeran","Title":"Shape of You","Album":"÷ (Deluxe)","Time":"234","File":"spotify:track:7qiZfU4dY1lWllzX7mPBI3","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e02ba5db46f4b838ef6027e6f96"},{"Artist":"Imagine Dragons","Title":"Thunder","Album":"Evolve","Time":"187","File":"spotify:track:1zB4vmk8tFRmM9UULNzbLB","Track":"10","Cover":"https://i.scdn.co/image/b7dd9a6acef8183c090e705e4572f5bdbef3e31c"},{"Artist":"Backstreet Boys","Title":"Everybody (Backstreet's Back) - Extended Version","Album":"The Hits--Chapter One","Time":"286","File":"spotify:track:3tH03v5SIWaglfE3rzXzeB","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02c2f0d820b1113f9a243fb973"},{"Artist":"*NSYNC","Title":"Bye Bye Bye","Album":"No Strings Attached","Time":"201","File":"spotify:track:4r8lRYnoOGdEi6YyI5OC1o","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02fceb9d92981970dbeea23257"},{"Artist":"Louane","Title":"On était beau","Album":"Louane","Time":"206","File":"spotify:track:10ZrEcxWcD9vOSUVhUH33O","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02c0b3a7a9a2bd9ca47471e3c9"},{"Artist":"Sia","Title":"Bird Set Free","Album":"This Is Acting","Time":"252","File":"spotify:track:1LsH71NteRF29VdSkXoF4Y","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02fc36b265066a58e205ecbd5c"},{"Artist":"Welshly Arms","Title":"Legendary","Album":"No Place Is Home","Time":"232","File":"spotify:track:2bDENJyfbxj0neGiXUFvIX","Track":"9","Cover":"https://i.scdn.co/image/ab67616d00001e02605fea88497f83c4881df0da"},{"Artist":"Taylor Swift","Title":"I Knew You Were Trouble.","Album":"Red (Big Machine Radio Release Special)","Time":"220","File":"spotify:track:6FB3v4YcR57y4tXFcdxI1E","Track":"8","Cover":"https://i.scdn.co/image/8e76cca4edfc4780b4bc86062e8808534d067e52"},{"Artist":"Alessia Cara","Title":"Scars To Your Beautiful","Album":"Know-It-All (Deluxe)","Time":"230","File":"spotify:track:42ydLwx4i5V49RXHOozJZq","Track":"10","Cover":"https://i.scdn.co/image/6dea260c2c37abfd9a034e758a047481f68b4c85"},{"Artist":"KALEO","Title":"Way Down We Go","Album":"A/B","Time":"214","File":"spotify:track:0y1QJc3SJVPKJ1OvFmFqe6","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02f793a842c1642b09a768a63b"},{"Artist":"Imagine Dragons","Title":"Whatever It Takes","Album":"Evolve","Time":"201","File":"spotify:track:6Qn5zhYkTa37e91HC1D7lb","Track":"3","Cover":"https://i.scdn.co/image/b7dd9a6acef8183c090e705e4572f5bdbef3e31c"},{"Artist":"Jess GlynneClean Bandit","Title":"Rather Be (feat. Jess Glynne)","Album":"Rather Be (feat. Jess Glynne)","Time":"228","File":"spotify:track:3s4U7OHV7gnj42VV72eSZ6","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e027e519297d9876b6afff2ab7b"},{"Artist":"Peter Fox","Title":"Schwarz zu blau","Album":"Stadtaffe","Time":"216","File":"spotify:track:1Fjz0ME9pzk553wH86m3ZZ","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e029061a4e47413aff8f58a3c9c"},{"Artist":"Seeed","Title":"Augenbling","Album":"SEEED","Time":"217","File":"spotify:track:4eT8TcG3KKlprFcYePA9gw","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e024ee35a7450f3c8476654a256"},{"Artist":"Die Orsons","Title":"Schwung in die Kiste","Album":"What's Goes?","Time":"243","File":"spotify:track:1d0LKskvREPlQfBanvabh8","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e02b995f9f8ee282d935198a072"},{"Artist":"Die Orsons","Title":"Rosa, Blau, Grün","Album":"Das Chaos und Die Ordnung","Time":"246","File":"spotify:track:4qC0H1RHG3EnHw3qIyyxYb","Track":"10","Cover":"https://i.scdn.co/image/ab67616d00001e025865d1de03a7feab31191ca1"},{"Artist":"Gianna Nannini","Title":"Bello e impossibile","Album":"Profumo","Time":"283","File":"spotify:track:3dZHWv3IsAQLzAr7FLJoJA","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e025ee0276a8cb48fff5608bea0"},{"Artist":"Udo Jürgens","Title":"Ich war noch niemals in New York","Album":"Aber bitte mit Sahne - Jubiläumsedition","Time":"283","File":"spotify:track:18q9XvWQgY1iO3PLGMit8l","Track":"13","Cover":"https://i.scdn.co/image/ab67616d00001e0226f3c1f6966e591fe3d64e5b"},{"Artist":"Dieter Thomas Kuhn & Band","Title":"Willst Du Mit Mir Geh'n","Album":"Wer Liebe Sucht","Time":"192","File":"spotify:track:06UxOBMpXvXj5glumCFXSF","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e028a004e257197b627eeaa3ab0"},{"Artist":"P!nk","Title":"Beautiful Trauma","Album":"Beautiful Trauma","Time":"250","File":"spotify:track:2DlIwu1iDTILEMXA7MUotn","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0200164c96548a622d34b39828"},{"Artist":"Ricchi E Poveri","Title":"Mamma Maria","Album":"The Collection","Time":"176","File":"spotify:track:7tVEeTbzEJkHP0EqUu6rmf","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02e46c669e434e80209396680b"},{"Artist":"OneRepublic","Title":"Kids","Album":"Oh My My (Deluxe)","Time":"238","File":"spotify:track:4IG7IRfkbeLBGaQLGWwNPS","Track":"4","Cover":"https://i.scdn.co/image/612fd0cb8724ba18187c4f90c0c556e057db18ad"},{"Artist":"MKTO","Title":"Classic","Album":"Classic","Time":"175","File":"spotify:track:5x9VIW2fS21JMswOt6AORI","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e023468ab7160ba573bf7ff59ed"},{"Artist":"CluesoDie Fantastischen Vier","Title":"Zusammen feat. Clueso","Album":"Captain Fantastic","Time":"225","File":"spotify:track:35Ma4j9sPWhUAJ471naHV3","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e026712dc332b14708db08cddce"},{"Artist":"Netta","Title":"Toy","Album":"Toy","Time":"180","File":"spotify:track:6n2eIfLj0wOOUkUfNmYzlh","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02c78e0ef9967093485f00ea13"},{"Artist":"Mikolas Josef","Title":"Lie to Me","Album":"Lie to Me","Time":"171","File":"spotify:track:6zBdVVksaTQeAzwfszbovz","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0241d33a9ea79736306e902589"},{"Artist":"Rita OraLiam Payne","Title":"For You (Fifty Shades Freed) (& Rita Ora)","Album":"FIFTY SHADES OF GREY - Befreite Lust (Original Motion Picture Soundtrack)","Time":"245","File":"spotify:track:6GKkczxg0QqLUqrhsic1Ut","Track":"2","Cover":"https://i.scdn.co/image/2db339f0f62e0bb118ff4c9a67320cecfdb35031"},{"Artist":"K.A.S.T.A","Title":"Vokrug Shum","Album":"Vokrug Shum","Time":"214","File":"spotify:track:0dSeAQtXHjXROIIyjAGKTf","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0291a08c84ac80ae8ab41a03cb"},{"Artist":"P!nk","Title":"Just Like Fire (From the Original Motion Picture \"Alice Through The Looking Glass\")","Album":"Just Like Fire (From the Original Motion Picture \"Alice Through The Looking Glass\")","Time":"215","File":"spotify:track:7K5dzhGda2vRTaAWYI3hrb","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e022002a63b1572e5cd031ab78f"},{"Artist":"Sara Bareilles","Title":"Love Song","Album":"Little Voice","Time":"259","File":"spotify:track:4E6cwWJWZw2zWf7VFbH7wf","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e021c3e0a58f3ee28af2922e351"},{"Artist":"Ingrid Michaelson","Title":"Afterlife","Album":"Lights Out","Time":"245","File":"spotify:track:13iycH8hoDh5116sUTZXsD","Track":"12","Cover":"https://i.scdn.co/image/ab67616d00001e027939d39424c0cfcc321415ab"},{"Artist":"Alvaro Soler","Title":"La Cintura","Album":"Mar De Colores (Versión Extendida)","Time":"205","File":"spotify:track:6VUJQqyeQhAZHkQbSDqLtI","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e025767e044062c6d03256397e5"},{"Artist":"Bruno Mars","Title":"Young Girls","Album":"Unorthodox Jukebox","Time":"229","File":"spotify:track:3G5iN5QBqMeXx3uZPy8tgB","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02926f43e7cce571e62720fd46"},{"Artist":"Jess Glynne","Title":"I'll Be There","Album":"I'll Be There","Time":"194","File":"spotify:track:083Qf6hn6sFL6xiOHlZUyn","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0277179b6ddeb4b4f4757e7a10"},{"Artist":"DisclosureFlumeEliza Doolittle","Title":"You & Me - Flume Remix","Album":"Settle (Special Edition)","Time":"283","File":"spotify:track:3W2ZcrRsInZbjWylOi6KhZ","Track":"34","Cover":"https://i.scdn.co/image/ab67616d00001e0209f5242f9d639ee5669afa45"},{"Artist":"Wincent Weiss","Title":"Feuerwerk","Album":"Irgendwas gegen die Stille","Time":"209","File":"spotify:track:3GRoxbBauU8Ui1zUJwn9aD","Track":"2","Cover":"https://i.scdn.co/image/b344392c64d9e23baf75d705e21e2b09321b750b"},{"Artist":"Wincent Weiss","Title":"Musik sein","Album":"Irgendwas gegen die Stille","Time":"194","File":"spotify:track:00ZoztotP7jEoezTPNMjvm","Track":"1","Cover":"https://i.scdn.co/image/b344392c64d9e23baf75d705e21e2b09321b750b"},{"Artist":"Beyoncé","Title":"Halo","Album":"I AM...SASHA FIERCE","Time":"262","File":"spotify:track:2MfOcbtgz2yTsiznFmVZUN","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e022fd16e69054586f25be54f49"},{"Artist":"Texas","Title":"Inner Smile","Album":"The Greatest Hits","Time":"231","File":"spotify:track:6X6ljHP0LlsdUILsGwfQ40","Track":"5","Cover":"https://i.scdn.co/image/1f0366a3b54d274ad7af98c2f0546395d7fc309c"},{"Artist":"Panic! At The Disco","Title":"High Hopes","Album":"Pray for the Wicked","Time":"191","File":"spotify:track:1rqqCSm0Qe4I9rUvWncaom","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e02c5148520a59be191eea16989"},{"Artist":"Christina Perri","Title":"sea of lovers","Album":"head or heart","Time":"215","File":"spotify:track:4EisHKHtmZ2Sa5z2e1kYEp","Track":"7","Cover":"https://i.scdn.co/image/ab67616d00001e02891b5348358ee43343077db2"},{"Artist":"Marco Frisina","Title":"Pacem In Terris","Album":"The Best Of Marco Frisina","Time":"264","File":"spotify:track:64gXE26DHs96jsPz7zciMI","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e020c580758f7fdfc8c3b865d03"},{"Artist":"Sasha","Title":"If You Believe","Album":"Greatest Hits","Time":"240","File":"spotify:track:4AstOWewI6yGeMh6ysWFCW","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e028c2724dcf12ce01b4c7d916c"},{"Artist":"Loud LuxuryBrando","Title":"Body","Album":"Body","Time":"163","File":"spotify:track:3jvpPbTJqfyKvEOtOsn83m","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02c85a86599e5e237504221b1f"},{"Artist":"B.o.B","Title":"So Good","Album":"Strange Clouds","Time":"213","File":"spotify:track:28GUjBGqZVcAV4PHSYzkj2","Track":"6","Cover":"https://i.scdn.co/image/ab67616d00001e02a191830c8b300bc71c2faac7"},{"Artist":"Ava Max","Title":"Sweet but Psycho","Album":"Sweet but Psycho","Time":"187","File":"spotify:track:25sgk305KZfyuqVBQIahim","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02c5015d2a9270865a5979f56b"},{"Artist":"Sia","Title":"I'm Still Here","Album":"I'm Still Here","Time":"242","File":"spotify:track:5KGTKwOePys7aH4o6EzXEP","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0288aec414e2ddc035d7f66104"},{"Artist":"Drupi","Title":"Piccola e fragile","Album":"Drupi","Time":"268","File":"spotify:track:5MsOJoGpCAqdTf90mHzISd","Track":"9","Cover":"https://i.scdn.co/image/ab67616d00001e028ca951f14ecf9e78030d191e"},{"Artist":"Udo Jürgens","Title":"Immer wieder geht die Sonne auf","Album":"Was ich Dir sagen will","Time":"185","File":"spotify:track:4NE71zloHC3tV0YZAo1HXr","Track":"5","Cover":"https://i.scdn.co/image/ab67616d00001e024672ce8568d045a0ad409226"},{"Artist":"MEUTE","Title":"You & Me","Album":"You & Me","Time":"306","File":"spotify:track:1MdbDBwEEecnlLiyWChJFh","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e021e4b57f1cfb61e9bfef1e8ca"},{"Artist":"Robin SchulzErika Sirola","Title":"Speechless (feat. Erika Sirola)","Album":"Speechless (feat. Erika Sirola)","Time":"215","File":"spotify:track:1rCcsYnmqbMYdkG7kS9GC5","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02318e24185fcbd27faeeef55c"},{"Artist":"Rita Ora","Title":"Let You Love Me","Album":"Phoenix (Deluxe)","Time":"191","File":"spotify:track:5Fla3zyOCcIRqrDoKLU0DP","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e02f1b136eb0388414a8225a348"},{"Artist":"Ellie GouldingSwae LeeDiplo","Title":"Close To Me (with Diplo) (feat. Swae Lee)","Album":"Close To Me (feat. Swae Lee)","Time":"183","File":"spotify:track:5JEx7HbmvHQQswJCsoo9rA","Track":"1","Cover":"https://i.scdn.co/image/d2fc265553b67cc1e79958a531a0b5f8ae23fbd9"},{"Artist":"Marteria","Title":"Endboss","Album":"Zum Glück in die Zukunft","Time":"224","File":"spotify:track:2JGloz8S7kkUi57c892mnv","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e021873e2932eadced388135837"},{"Artist":"Marteria","Title":"Scotty beam mich hoch","Album":"Roswell","Time":"249","File":"spotify:track:6zuUWT2b1cFs9NMVHuDLdY","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e0263a0d158ea0c02b24749da06"},{"Artist":"Ava Max","Title":"So Am I","Album":"So Am I","Time":"183","File":"spotify:track:0uUNN1nSoUx1A4fkDCWDQ7","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02b8dcf98474721fe404ad780d"},{"Artist":"Matt Simons","Title":"Open Up","Album":"Open Up","Time":"168","File":"spotify:track:3ENfrioOpwovY3HrIAX3UC","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02c4898b5e598158b3725e1bfd"},{"Artist":"Wincent Weiss","Title":"Hier mit dir","Album":"Hier mit dir","Time":"185","File":"spotify:track:3fqmx4fMxm2GPCrYe1TPOB","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0263e2ae77b985df1179f41439"},{"Artist":"Fettes Brot","Title":"Für immer immer","Album":"3 is ne Party","Time":"202","File":"spotify:track:5ofIisXnT7e7klW4K9w7Lh","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e028cc0c3fe4f025b1e7df758d4"},{"Artist":"Michel Sardou","Title":"La maladie d'amour","Album":"La Maladie D'Amour","Time":"210","File":"spotify:track:2flivK5ivlprHRE7YNcRrj","Track":"11","Cover":"https://i.scdn.co/image/dd36e11f71e0a35e49b47d79164fa4cdadfdffec"},{"Artist":"Laith Al-Deen","Title":"Bilder von Dir","Album":"2000 - 2008: Best Of","Time":"296","File":"spotify:track:5JEenaFSoOuZgtat8bhwg1","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e021e2e9d850c26ad31aecb4f0f"},{"Artist":"Sido","Title":"Tausend Tattoos","Album":"Kronjuwelen","Time":"205","File":"spotify:track:2PAYSgrVOBz8RJqp9B7QLu","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e0213160387f081dbf84f98a4d4"},{"Artist":"EAV","Title":"Samurai","Album":"100 Jahre EAV","Time":"237","File":"spotify:track:5hjO4HQ02cX2VJLcINshtr","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e027733f4a485ac9ff7bc0c7f6f"},{"Artist":"Lena","Title":"thank you","Album":"thank you","Time":"195","File":"spotify:track:3uCZ4IqMY54A0jxRkyPGPl","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02d09daaf2a06c91dbc4ffdd04"},{"Artist":"Pietro Lombardi","Title":"Bella Donna","Album":"Bella Donna","Time":"196","File":"spotify:track:3v9OYjvyB1tJ9sMrZIlfcz","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02aaa3177b2b3cc0b01a532028"},{"Artist":"Ellie Goulding","Title":"Anything Could Happen","Album":"Halcyon","Time":"286","File":"spotify:track:6bKetqXF3g4UgaXQlAYdgz","Track":"3","Cover":"https://i.scdn.co/image/c8a558841b91fd182549ca82f8faf6e2a93dd027"},{"Artist":"Clean BanditDemi Lovato","Title":"Solo (feat. Demi Lovato)","Album":"What Is Love? (Deluxe Edition)","Time":"223","File":"spotify:track:3NuK5xMlSlB6K2Qp16zf3h","Track":"3","Cover":"https://i.scdn.co/image/ab67616d00001e0237fb0680110fbb107740de5d"},{"Artist":"Troye SivanLauv","Title":"i'm so tired...","Album":"i'm so tired...","Time":"163","File":"spotify:track:7COXchtUOMd6uIT6HvmRaI","Track":"1","Cover":"https://i.scdn.co/image/ab67616d00001e02923d879fb957411a7504fa57"},{"Artist":"Dieter Thomas Kuhn","Title":"Sag Mir Quando, Sag Mir Wann","Album":"Wer Liebe Sucht","Time":"188","File":"spotify:track:3wx5BXdMwTECAQXoturLvF","Track":"2","Cover":"https://i.scdn.co/image/ab67616d00001e028a004e257197b627eeaa3ab0"},{"Artist":"Dieter Thomas Kuhn","Title":"Eine neue Liebe ist wie ein neues Leben","Album":"Mein Leben Für Die Musik","Time":"193","File":"spotify:track:3Wv3ISOIeSRtZSJHuHu5s1","Track":"8","Cover":"https://i.scdn.co/image/ab67616d00001e02c93eb8d0b620479a6239896c"},{"Artist":"Dieter Thomas Kuhn","Title":"Über den Wolken - Live","Album":"Im Auftrag der Liebe (Live)","Time":"253","File":"spotify:track:03cwW6MW7qEd7czbPj6tdG","Track":"7","Cover":"https://i.scdn.co/image/ab67616d00001e02c9e1741fde8949ebb7547e8c"},{"Artist":"Dieter Thomas Kuhn","Title":"Heute So, Morgen So","Album":"Gold (Party Edition)","Time":"139","File":"spotify:track:4CRYvxMZzb10dxTkCBzVSO","Track":"4","Cover":"https://i.scdn.co/image/ab67616d00001e02ecb9cd779f2e4b1b835e5bfa"}]
2019-10-15 17:36:20 playlistlength 92
2019-10-15 17:36:20 playlistname
2019-10-15 11:47:31 playtime 0
2019-10-15 13:59:03 presence absent
2019-10-15 11:47:31 random 0
2019-10-15 11:47:31 rawTitle Orchestral Suite No. 4 in D Major, BWV 1069: I. Overture
2019-10-15 14:33:39 repeat 0
2019-10-15 14:33:39 single 0
2019-10-15 20:38:42 song 4
2019-10-15 20:38:42 songid 77
2019-10-15 11:47:31 songs 0
2019-10-16 07:09:20 state play
2019-10-16 07:10:20 time 101:258
2019-10-15 12:04:04 title
2019-10-15 11:47:31 updating_db 0
2019-10-15 11:47:31 uptime 0
2019-10-15 14:33:39 volume 100
2019-10-15 11:47:31 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
loadPlaylists 1
room Spotify
useIdle 0
webCmd previous:stop:play:pause:next
Grüße,
Alex
ok, Attribut loadPlaylists ist auf 1
Gibt "mpc lsplaylists" denn die Listen auf der Konsole aus ?
Bzw in der FHEM Webansicht get <name> playlists ?
BTW: du verlierst einiges an Komfort mit useIdle = 0 , da dann der MPD nur im Intervall abgefragt wird und die Readings nicht Event basierend getzt werden.
Edit :
Ich sehe gerade :
Zitat von: xasher am 15 Oktober 2019, 17:42:34
Ich habe mopidy mit spotify installiert.
Setz das Attribut player auch bitte auf mopidy , dann gibt es richtige Fehlermeldungen. U.a. unterstützt der mopidy einige Befehle nicht die der echte mpd kann,
betrifft auch das Laden von Playlisten.
Hi,
Ich habe diesen Code mal bei mir in die 99_myUtils.pm reinkopiert. Soweit würde das auch funktionieren.
Wo ich Hilfe bräuchte wäre, das ich nicht nur die Cover von Spotify bekomme sondern auch die von Tunein.
Ich peil des ganze mit Perl irgendwie nicht. :'(
Viele Grüße
Sebastian
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";
}