Modul für MPD

Begonnen von roedert, 08 Januar 2014, 12:17:21

Vorheriges Thema - Nächstes Thema

mrbreil

Gerne ;)

MPD liegt auf dem gleichen PC.

define myMPD MPD
attr myMPD devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
attr myMPD icon it_radio
attr myMPD loadMusic 0
attr myMPD loadPlaylists 0
attr myMPD room Audio
attr myMPD useIdle 1


Wenn ich MPD direkt bediene geht alles sofort, mit einem Click.

Öffne ich die Raumseite mit MPD in FHEM und spulle zb. mit dem Handy einen Titel weiter verliert die Weboberfläche kurz die Verbindung.



Wernieman

Sieh fast so aus wie meins:
Zitat
define myMPD MPD
attr myMPD devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
attr myMPD icon it_radio
attr myMPD interval 300
attr myMPD room Musik
attr myMPD useIdle 1
attr myMPD volumeStep 5

Allerdings habe ich, noch von einer älteren Modul-Version herkommend, das "interval 300" mit drin. Wenn ich mich noch richtig erinnere, wird damit auch eine Zusammengebochene Verbindung zu mpd wieder repariert

volumeStep 5 bedeutet nur, das er in 5er Steps das Volumen anpasst.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Wzut

Zitat von: mrbreil am 15 Januar 2015, 12:29:27
Ich habe unentwegt folgenden Fehler
error     socketclose: Ungültiger Dateideskriptor     2015-01-15 12:22:28
kannst du bitte im Modul ( ca. bei Zeile 647) nach folgendem Abschnitt suchen :
print SOCK "close\n";
close(SOCK) || return  "socketclose: $!";

und diesen ändern in :
print SOCK "close\n";
close(SOCK);


danach mit "reload 73_MPD" das Modul neu laden und nach einigen Tests hier bitte wieder eine Rückmeldung posten.

Was ich allerdings nicht verstanden habe ist der Satz
ZitatWenn ich MPD direkt bediene geht alles sofort, mit einem Click.
wie bzw. mit was bedienst du den MPD direkt ? 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Phill

#123
Hallo, ich habe da mal zwei Fragen.
Gibt es eigentlich die Möglichkeit dem Modul zu sagen, das die nächste/vorherige Playlist abgespielt werden soll? So in der art wie
set mpd nextplaylist
"set mpd next" spielt ja den Nächsten titel innerhalb der Playlist wenn ich das richtig verstanden habe...

Ich habe gerade versucht das über ein Script zu machen bin da aber auf einige Schwierigkeiten gestoßen.
Wie kann ich den aktuell abgespielte Playlistnamen / Dateinamen auslesen?
Das Reading "Playlist" hat immer irgendeine andere Nummer.
Ich muss dazu sagen das meine Playlisten nur Internetstreams enthalten.
Und "File" zeigt ja den aktuellen Stream an aber nicht die Playlistdatei.

Danke und Gruß

[EDIT]
So lese ich momentan die aktuelle Playlist aus...  :o
sub getactualplaylist {
my $dir = "/var/lib/mpd/playlists/";
opendir(my $dh, $dir) || die "can't opendir $dir: $!";
my @pl = grep { -f "$dir/$_" &! /^\./ } readdir($dh);
closedir $dh;
my $actualpl = ReadingsVal("mpd","file",0);
for (@pl) {
open FILE, "<$dir$_";
my $pll = join("", <FILE>);
close FILE;
return $_ if $pll =~ /$actualpl/;
}
return;
}
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Wzut

du kannst dem MPD Server jedes Kommando schicken das er "kennt" , siehe command.ref :
Zitatset <name> mpdCMD (cmd) => sende cmd direkt zum MPD Server
aktuelle Playliste anzeigen :
Zitatget <name> playlistsinfo => zeigt Informationen der aktuellen Playliste
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

VB90

Hallo.

Als erstes: Vielen Dank für dieses Modul. Funktioniert bei mir grundsätzlich einwandfrei.

Allerdings habe ich ein kleines Problem.

Ausgangslage:
Ich checke per presence via Bluetooth die Anwesenheit zweier Smartphones.
Ist eines von beiden oder beide vorhanden, setze ich einen Dummy auf on.
Eine darauf folgendes Abwesenheit erkenne ich mit einer Verzögerung von 5min.
Dieser Dummy wiederum startet den Stream eines Webradios via MPD.
Analog dazu, wird der Stream bei Abwesenheit beider Smartphones gestoppt.

Soweit, sogut.
Jedoch unterbricht die Audio-Ausgabe im Takt der presence-Checks.
Das ist für einen ordentlichen Audio-Genuß natürlich nicht förderlich.

Meine erste Vermutung war, das presence die CPU-Last durch die Decke drückt und der Stream mangels CPU-Zeit stockt. Anhand der SYSMON Logs und Plots kann ich das aber ausschliessen.

Hat hier jemand ne Idee, wo die Ursache für die Abbrüche liegt und wie ich dem bei kommen kann?

Anbei mal die betreffenden Auszüge aus der conf.

### Anwesenheit definieren ####
### Dummy definieren
define Anwesend_Terrasse dummy
attr Anwesend_Terrasse event-on-change-reading state
attr Anwesend_Terrasse group RadioTerra
attr Anwesend_Terrasse icon user_available
attr Anwesend_Terrasse room Terrasse

### Anwesenheit per BT checken ###

define Nexus5_Bluetooth PRESENCE local-bluetooth 48:59:29:54:XX:81 60 300
attr Nexus5_Bluetooth alias Nexus
attr Nexus5_Bluetooth icon it_smartphone
attr Nexus5_Bluetooth room Terrasse

define XperiaZ1compact_Bluetooth PRESENCE local-bluetooth 68:76:4F:A6:XX:A3 60 300
attr XperiaZ1compact_Bluetooth alias Z1c
attr XperiaZ1compact_Bluetooth icon it_smartphone
attr XperiaZ1compact_Bluetooth room Terrasse


### Ende Anwesenheit per BT checken ###

### Anwesend_Terrasse auf on setzen
define SetAnwesend_TerrasseOn notify (Nexus5_Bluetooth:present|XperiaZ1compact_Bluetooth:present) set Anwesend_Terrasse on

### Anwesend_Terrasse auf off setzen
define SetAnwesend_TerrasseOff notify (Nexus5_Bluetooth:absent|XperiaZ1compact_Bluetooth:absent) set Anwesend_Terrasse off

### Ende Anwesenheit definieren ####


##### WebRadio #####
define RadioTerrasse MPD
attr RadioTerrasse devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
attr RadioTerrasse group RadioTerra
attr RadioTerrasse icon it_radio
attr RadioTerrasse room Terrasse

define AutoRadioPlay notify Anwesend_Terrasse:on set RadioTerrasse play
define AutoRadioStop notify Anwesend_Terrasse:off set RadioTerrasse stop

##### Ende WebRadio #####



danke,

vb
Man muss das Rad nicht neu erfinden, nur wissen wie es gedreht wird.

Wernieman

Ich glaube, da ist Deine Anwesenheitserkennung nicht ideal, d.h. es wird zu häufig "play" gedrückt .. aber das müsste sich ein andere angucken.

prinzipiell ist mir aber aufgefallen:
Es soll:
Wenn Handy1 _oder_ Handy2 da ist -> Spiele Musik
Wenn Handy1 _und_ Handy2 nicht da -> stoppe Musik

Speziell das 2. sehe ich so nicht in Deiner Definition .. oder habe ich Dich mißverstanden?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

VB90

#127
Hi,

Nein, prinzipiell hast du recht.
Das stoppen realisiere ich in der letzte Zeile.
Wenn der Dummy "off" ausgibt,  stoppt die Wiedergabe.
Habe ich so gelöst,  weil ich auf diese Art den Dummy recht einfach noch für andere Dinge nutzen kann.

Edit:
Wäre es denn ne Option,  die Wiedergabe für eine gewisse Zeit zu setzen und solange entweder die anwesenheitserkennung oder das regelmäßige aber unnütze "play" setzen zu pausieren?

Wenn ja,  wäre ich für nen Denkansatz dankbar.
Auf die schnelle fällt mir Set for Timer ein...

vb
Man muss das Rad nicht neu erfinden, nur wissen wie es gedreht wird.

Wernieman

Ich würde, weiß aber nicht ob es optimal ist, beim "play" gucken, ob er schon spielt, und wenn ja -> nix tun ;o)

Wäre meine "quick and dirty" Lösung
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Phill

Zitat von: Wzut am 18 Januar 2015, 17:51:50
du kannst dem MPD Server jedes Kommando schicken das er "kennt" , siehe command.ref :aktuelle Playliste anzeigen :

Hat mir jetzt leider nicht wirklich weiter geholfen. Wie gesagt Playlist ID ist immer eine andere Nummer; in Playlistinfo steht die aktuelle Playlist nicht drin; und ich konnte auch kein Kommando finden um die aktuelle Playlist auszulesen. Hier meine Lösung für die 99_Utils.pm:
sub mpdplaylist {
my $n = $_[0];
my $dir = "/var/lib/mpd/playlists/";
opendir(my $dh, $dir) || die "can't opendir $dir: $!";
my @pl = grep { -f "$dir/$_" &! /^\./ } readdir($dh);
closedir $dh;

#open(FILE "
#my @pl = fhem("get mpd playlists");
my $actualpl = ReadingsVal("mpd","file",0);
my $actualplf; my $i;
for (@pl) {
open FILE, "<$dir$_";
my $pll = join("", <FILE>);
close FILE;
if ($pll =~ /$actualpl/) {
$actualplf = $_;
last;
}
$i++;
}

my $u;
unless ($n) {
$u = $i+1;
} elsif ($n eq -1) {
$u = $i-1;
} else {
$u = $n-1;
}

my @s = sort { $a > $b } (0, $u, $#pl);
my $newplf = $pl[$s[1]];
if ($newplf =~ s/.m3u$//) {
Log 1, $newplf.": ".$i;
fhem("set mpd playlist $newplf");
}
return;
}

mpdplaylist(); # spielt die nächste Playlist;
mpdplaylist(-1); # spielt die vorherige Playlist;
mpdplaylist(>0); # also 1,2,3 usw. Spielt die Playlistnr.
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Wzut

Zitat von: Phill am 20 Januar 2015, 22:40:22
ich konnte auch kein Kommando finden um die aktuelle Playlist auszulesen. Hier meine Lösung für die 99_Utils.pm:
lies dir doch bitte mal die beiden folgenden Seiten durch :
http://www.musicpd.org/doc/protocol/queue.html
http://www.musicpd.org/doc/protocol/playlist_files.html
du wirst sehen das man nicht "hart" auf z.B. /var/lib/mpd/playlists/ zugreifen muß um eine Liste aller Playlisten in der Datenbank zu bekommen sondern das MPD interne Kommando "listplaylists" benutzen kann und auch sollte da MPD und FHEM durchaus auf zwei verschiedenen Systemen laufen können ( z.B. bei mir )
Das FHEM Modul hat daher auch das Kommando: get <name> playlists

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Phill

Hallo, ja die Auflistung habe ich gesehen. Aber da ich sowieso auf das Verzeichnis zugreifen muss um die Dateien zu durchsuchen, ist es eh nur möglich mit zugriff auf das verzeichnis.
Die Auflistung alleine bringt mir nichts, wenn ich nicht weiß in welcher Playliste ich mich befinde.
"get playlistinfo" und "get mpdcmd playlist" liefert mir nur informationen über die Dateien innherhalb der Playlisten.

Oder habe ich noch was übersehen...

Gruß
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Wernieman

Und warum machst Du für jeden Radiostream eine eigene Playlist? Mit dann nur einem Eintrag?

habe bei mir eine "Radio-Playlist" ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Phill

#133
Wäre eine Möglichkeit, nur bringt das auch wieder Probleme mit sich.
Ich aktualisiere die Radiosender automatisch. Die liegen halt in m3u auf den Servern und haben keineswegs nur einen Eintrag. Man könnte das natürlich zusammenfügen, ist aber auch nicht trivial.
Dann wird vermutlich der letzte Sender nicht gespeichert! Oder doch?

Wie händelst du denn die Senderauswahl?
Homebrew 1-Wire / HomeMatic Mix - Cubietruck mit FHEM als Server - Raspberry PI 3 als Informationsanzeige im MagicMirror Stil - Raspberry Pi 1 als Klingelanlage - VDR

Mein Modul: Talk2Fhem - Mein Tipp: https://forum.fhem.de/index.php/topic,82442.0.html

Wernieman

Der letzte Sender wird gespeichert wie der letzte Song .. für mpd ist doch ein Sender "nur" ein Song
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html