MPD Player Steuerung im FTUI

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

Vorheriges Thema - Nächstes Thema

Luigi

@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

Tobias

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>
Maintainer: Text2Speech, TrashCal, MediaList

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

Photon68

@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


Markus Hermann

#18
@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 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
CUL/CUL-RFR/HM-LAN an Cubietruck

FS20/FHT/TFK/UTS/KS300/HM-SEC-SC/HMS100/HM-OU-CFM-PL/HM-RC-SEC3/

FLOORPLAN auf Android-Tablet und VDR

Tobias

@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

Maintainer: Text2Speech, TrashCal, MediaList

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

Photon68

@Tobias

Dann würde es mich freuen, wenn du deine Routinen aus den myUtils posten würdest.
Bin gespannt. :)

Gruß Photon68

Tobias

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;
Maintainer: Text2Speech, TrashCal, MediaList

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

Photon68

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

Tobias

#23
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
Maintainer: Text2Speech, TrashCal, MediaList

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

Photon68

Danke Tobias!
Dann probier ich mal, ob ich die Playliste aus den bookmarks bekomme.

Gruß Photon68

mafe68

#25
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;

fretti

#26
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
promox, debian, rpi, homematic, mqtt, dect, z2m

grossmaggul

#27
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.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Bootscreen

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 ^^
Gruß
Oliver

FHEM 5.7 Hardware:
Raspberry PI B+ | HomeMatic USB 2 | 433Mhz Sender (pilight) | nanoCUL (433Mhz)

grossmaggul

#29
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?
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1