Modul für MPD

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

Vorheriges Thema - Nächstes Thema

Wzut

Zitat von: tagedieb am 12 April 2015, 21:03:59
next, repeat und previous bleiben ohne reaktion  :(
klar wie soll auch der nächste Titel in der Playliste gespielt werden wenn gar keine Liste geladen ist ?
Wie ich bereits hier im Thread geschrieben habe, der MPD basiert auf Playlisten und seiner eigenen Datenbank für die Titel.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wernieman

Deshalb schrieb ich es Ihm doch .. er sollte erstmal den mpd zum laufen kriegen und mit mpc (o.Ä.) es Testen. Wenn das funktioniert, dann .....
- 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: SirUli am 05 April 2015, 16:44:20
Ich habe derzeit noch Intervall=30 und useIdle=1 - sinnvoll?
meine Antwort :
Zitat von: Wzut am 08 April 2015, 14:53:47
Nein, das muss ich unbedingt mal im Modul gegeneinander verriegeln.

sodele dann lassen wir den Worten mal Taten folgen :) Ich habe mich die Tage etwas mit dem Modul befasst und einige Dinge geändert, möchte diese Version aber nicht blind einchecken sondern Euch testen lassen.

Änderung :
1. die wichtigste Änderung liegt im Zusammenspiel der beiden Attribute useIdle und interval.
Folgende Kombinationen sind nun möglich :
a. useIdle = 1 und interval > 0  ( ist jetzt de-fault)
Es wird ein eigener Prozess gestartet der mittels idle wartet bis sich beim MPD irgend etwas verändert. Die Änderungen können vom User ausgelöst werden (start/stop , Volume , etc) oder z.B. vom Radiostream ( Titelwechsel). Das fhem Modul aktualisiert dann die Readings und startet sofort wieder einen neuen idle Prozess und das Spiel beginnt von vorne, das ist der Idealfall. Kommt es zu einem Error ( Bsp Verbindungsabbruch) dann kommt interval ins Spiel und zwar als Warte Timer um die Verbindung neu aufzubauen.

b. useIdle = 1 und interval = 0
Zu Beginn wie unter a. beschrieben , allerdings gibt es keinen Timer um einen neuen Versuch zu starten.
Das muss in diesem Fall vom User selbst gemacht werden mit set <name> idleNow

c. useIdle = 0  und interval > 0
Es wird keine dauerhafte Verbindung zum MPD aufgebaut sondern alle X Sekunden der aktuelle Status abgefragt
(das klassische Polling)

d. useIdle = 0  und interval = 0
Readings werden nie automatisch aktualisiert sondern nur als Reaktion auf User set Befehle

2. Das bisherige Modul aktualisiert Readings nur wenn der neue Wert sich vom alten unterscheidet, eine Funktion die eigentlich nichts im Modul zu suchen hat sondern Aufgabe des Users mit Hilfe von
attr event-on-change-reading .*  ( ist nun auch De-fault)

3. das Logging war zur Fehlersuche nicht sehr hilfreich , attr verbose 4 oder 5 liefern nun bessere Ausgaben.

Alles in allem sieht man dem Modul an das es mein erstes fhem Modul war, einige Details würde ich mit meinem heutigen fhem Wissen anders angehen. Z.Z. habe ich bei mir eine Beta laufen die ganz auf das oben beschrieben Idle und Intervall verzichtet und statt dessen den MPD als normales IO Device anbindet.   
   

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

Wernieman

z.Z. habe ich bei mir eine Beta laufen die ganz auf das oben beschrieben Idle und Intervall verzichtet und statt dessen den MPD als normales IO Device anbindet.

Brauchst Du Tester?

Was machst Du (in dem neuen Modul), wenn MPD mal kurzfristig, z.B. durch Neustart des Deamons, wegfällt?
- 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: Wernieman am 30 April 2015, 09:00:19
Brauchst Du Tester?
Was machst Du (in dem neuen Modul), wenn MPD mal kurzfristig, z.B. durch Neustart des Deamons, wegfällt?
a. zu einem späteren Zeitpunkt : klar
b. das gleiche was passiert wenn du heute einen CUL aus und wieder einsteckst : disconnect , waiting , connect :)   
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wernieman

d.h. also "Selbstheilung" .... wie eben momentan, wenn man "Intervall" definiert hat und wartet... Hört sich gut an!

Kann mal Gucken, ob ich übers verlängerte Wochende Deine momentane Lösung testen kann.
- 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

nesges

Schönes Modul! Ich habe MPD erst durch dieses Modul kennen gelernt und habe grade zwei Kodi-Installation damit abgelöst. Danke dafür!

In meiner Installation werden die Readings repeat, random, single und consume nicht upgedatet. Kann das im Zusammenhang mit useIdle stehen? Ich glaube zwar alle Kombinationen durchprobiert zu haben, aber evtl. übersehe ich ja etwas. Aktuell sieht mein MPD folgendermassen aus:

Internals:
   ALBUMARTIST Various Artists
   CFGFN
   CHANGED
   DEF        192.168.178.35 6600
   DISC       1/1
   HOST       192.168.178.35
   INTERVAL   30
   MY ALSA DEVICE on
   NAME       MPD_FLUX
   NR         6979
   PORT       6600
   PRESENT    1
   STATE      play
   TYPE       MPD
   UPDATING_DB 1
   VERSION    MPD 0.16.0
   VOLUME     93
   Ipid:
     abortArg
     abortFn
     finishFn   MPD_IdleDone
     fn         MPD_IdleStart
     pid        29269
   Readings:
     2015-05-09 00:15:28   album           History
     2015-05-09 00:15:28   artist          New Model Army
     2015-05-09 00:15:27   audio           44100:24:2
     2015-05-09 00:15:27   bitrate         192
     2015-05-09 00:15:27   consume         0
     2015-05-08 23:46:26   date            2007
     2015-05-09 00:15:27   elapsed         214.262
     2015-05-08 22:30:04   error           problems decoding "http://www.deutschlandradio.de/streaming/dkultur.m3u"
     2015-05-09 00:15:27   file            music/New Model Army/History/11 Purity.mp3
     2015-05-09 00:15:28   genre           Alternative Rock
     2015-05-09 00:15:28   id              537
     2015-05-09 00:15:27   last-modified   2013-02-06T19:35:52Z
     2015-05-09 00:15:27   mixrampdb       0.000000
     2015-05-09 00:15:27   mixrampdelay    nan
     2015-05-09 00:12:44   mpd_event       changed: options
     2015-05-08 22:31:32   name            Deutschlandradio Kultur
     2015-05-09 00:15:27   nextsong        11
     2015-05-09 00:15:27   nextsongid      538
     2015-05-09 00:15:27   playlist        611
     2015-05-09 00:15:27   playlistlength  14
     2015-05-09 00:15:28   pos             10
     2015-05-09 00:15:27   random          0
     2015-05-09 00:15:27   repeat          0
     2015-05-09 00:15:27   single          0
     2015-05-09 00:15:27   song            10
     2015-05-09 00:15:27   songid          537
     2015-05-08 23:52:11   state           play
     2015-05-08 22:30:31   station         dkultur
     2015-05-09 00:15:27   time            236
     2015-05-09 00:15:28   title           Purity
     2015-05-09 00:15:28   track           11/
     2015-05-09 00:15:27   volume          93
     2015-05-09 00:15:27   xfade           5
   Helper:
     Running_pid:
       abortArg
       abortFn
       finishFn   MPD_IdleDone
       fn         MPD_IdleStart
       pid        29269
Attributes:
   devStateIcon play:rc_PLAY:stop stop:rc_STOP:play pause:rc_PAUSE:pause
   icon       it_radio
   interval   30
   presence   FLUX
   room       Schlafzimmer
   useIdle    1
   userReadings station
   userattr   presence


Wenn ich zB repeat per mpc direkt ändere beobachte ich im Eventmonitor, dass bei "mpc repeat on" kein repeat Event erzeugt wird. Bei "mpc repeat off" wird ein Event "repeat: 0" erzeugt. Von daher ist nachvollziehbar, dass der Wert immer auf 0 bleibt. Hier mal zwei Auszüge aus dem Eventmonitor:

"mpc repeat on":
2015-05-09 00:17:55 MPD MPD_FLUX volume: 93
2015-05-09 00:17:55 MPD MPD_FLUX random: 0
2015-05-09 00:17:55 MPD MPD_FLUX single: 0
2015-05-09 00:17:55 MPD MPD_FLUX consume: 0
2015-05-09 00:17:55 MPD MPD_FLUX playlist: 611
2015-05-09 00:17:55 MPD MPD_FLUX playlistlength: 14
2015-05-09 00:17:55 MPD MPD_FLUX xfade: 5
2015-05-09 00:17:55 MPD MPD_FLUX mixrampdb: 0.000000
2015-05-09 00:17:55 MPD MPD_FLUX mixrampdelay: nan
2015-05-09 00:17:55 MPD MPD_FLUX song: 11
2015-05-09 00:17:55 MPD MPD_FLUX songid: 538
2015-05-09 00:17:55 MPD MPD_FLUX time: 131:221
2015-05-09 00:17:55 MPD MPD_FLUX elapsed: 130.949
2015-05-09 00:17:55 MPD MPD_FLUX bitrate: 192
2015-05-09 00:17:55 MPD MPD_FLUX audio: 44100:24:2
2015-05-09 00:17:55 MPD MPD_FLUX nextsong: 12
2015-05-09 00:17:55 MPD MPD_FLUX nextsongid: 539
2015-05-09 00:17:55 MPD MPD_FLUX file: music/New Model Army/History/12 Space (live).mp3
2015-05-09 00:17:55 MPD MPD_FLUX last-modified: 2013-02-06T19:35:53Z
2015-05-09 00:17:55 MPD MPD_FLUX time: 221
2015-05-09 00:17:55 MPD MPD_FLUX artist: New Model Army
2015-05-09 00:17:55 MPD MPD_FLUX title: Space (live)
2015-05-09 00:17:55 MPD MPD_FLUX album: History
2015-05-09 00:17:55 MPD MPD_FLUX track: 12/
2015-05-09 00:17:55 MPD MPD_FLUX genre: Alternative Rock
2015-05-09 00:17:55 MPD MPD_FLUX pos: 11
2015-05-09 00:17:55 MPD MPD_FLUX id: 538
2015-05-09 00:17:55 MPD MPD_FLUX mpd_event: changed: options


"mpc repeat off":
2015-05-09 00:18:01 MPD MPD_FLUX volume: 93
2015-05-09 00:18:01 MPD MPD_FLUX repeat: 0
2015-05-09 00:18:01 MPD MPD_FLUX random: 0
2015-05-09 00:18:01 MPD MPD_FLUX single: 0
2015-05-09 00:18:01 MPD MPD_FLUX consume: 0
2015-05-09 00:18:01 MPD MPD_FLUX playlist: 611
2015-05-09 00:18:01 MPD MPD_FLUX playlistlength: 14
2015-05-09 00:18:01 MPD MPD_FLUX xfade: 5
2015-05-09 00:18:01 MPD MPD_FLUX mixrampdb: 0.000000
2015-05-09 00:18:01 MPD MPD_FLUX mixrampdelay: nan
2015-05-09 00:18:01 MPD MPD_FLUX song: 11
2015-05-09 00:18:01 MPD MPD_FLUX songid: 538
2015-05-09 00:18:01 MPD MPD_FLUX time: 137:221
2015-05-09 00:18:01 MPD MPD_FLUX elapsed: 137.265
2015-05-09 00:18:01 MPD MPD_FLUX bitrate: 192
2015-05-09 00:18:01 MPD MPD_FLUX audio: 44100:24:2
2015-05-09 00:18:01 MPD MPD_FLUX nextsong: 12
2015-05-09 00:18:01 MPD MPD_FLUX nextsongid: 539
2015-05-09 00:18:01 MPD MPD_FLUX file: music/New Model Army/History/12 Space (live).mp3
2015-05-09 00:18:01 MPD MPD_FLUX last-modified: 2013-02-06T19:35:53Z
2015-05-09 00:18:01 MPD MPD_FLUX time: 221
2015-05-09 00:18:01 MPD MPD_FLUX artist: New Model Army
2015-05-09 00:18:01 MPD MPD_FLUX title: Space (live)
2015-05-09 00:18:01 MPD MPD_FLUX album: History
2015-05-09 00:18:01 MPD MPD_FLUX track: 12/
2015-05-09 00:18:01 MPD MPD_FLUX genre: Alternative Rock
2015-05-09 00:18:01 MPD MPD_FLUX pos: 11
2015-05-09 00:18:01 MPD MPD_FLUX id: 538
2015-05-09 00:18:01 MPD MPD_FLUX mpd_event: changed: options



Ein ähnliches Problem - evtl. gleiche Ursache - gibt es mit "veralteten" Readings. Im list oben sieht man's ganz schön, dort findet man diese beiden Zeilen, die nicht zum aktuell gespielten gehören, sondern Überreste von vor 1,5 Stunden sind:

     2015-05-08 22:30:04   error           problems decoding "http://www.deutschlandradio.de/streaming/dkultur.m3u"
     2015-05-08 22:31:32   name            Deutschlandradio Kultur


Kann man MPD so einstellen, dass die Readings gelehrt werden, wenn MPD leere/keine Werte mehr liefert?

Wernieman

ZitatKann man MPD so einstellen, dass die Readings gelehrt werden, wenn MPD leere/keine Werte mehr liefert?

Sofern ich weiß, geht dieses nicht, d.h. mpd selber, kennt keine so etwas nicht. Es müste dann im Modul Nachprogrammiert werden, z.B. wenn mpd auf "stop" steht ...
- 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

@nesges , welche Version benutzt du ? die per Update geliefert wird oder die Beta vom 29.4 hier aus dem Thread ?
Readings putzen : Ich habe damals lange überlegt und hin und her probiert was ich mit den Readings mache, Fakt ist das der MPD je nach Musikstück ( Datei, Stream , etc) und Ereigniss andere interne Werte zurückgibt. Ich fand es sinnvoll die Werte quasi zu sammeln, wie aktuell das eine oder andere noch ist zeigt dann ja der Zeitstempel. So lässt sich dann auch leicht die Frage beantworten "wann und was war denn eigentlich der letzte Fehler ? " :)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

nesges

#174
Zitat von: Wzut am 11 Mai 2015, 17:38:05
@nesges , welche Version benutzt du ? die per Update geliefert wird oder die Beta vom 29.4 hier aus dem Thread ?

Habe beide probiert und bei beiden das gleiche Ergebnis.

ZitatReadings putzen : Ich habe damals lange überlegt und hin und her probiert was ich mit den Readings mache, Fakt ist das der MPD je nach Musikstück ( Datei, Stream , etc) und Ereigniss andere interne Werte zurückgibt. Ich fand es sinnvoll die Werte quasi zu sammeln, wie aktuell das eine oder andere noch ist zeigt dann ja der Zeitstempel.

Ja, macht die Auswertung nur etwas komplizierter. Aber jetzt, da ich weiss, dass das Absicht ist, bau ich mir einfach eine Zwischenschicht, die nur die aktuellen Werte anzeigt :)

Edit: Falls es jemand braucht:

attr MPD_MCP userReadings now_album {mpd_now('MPD_MCP','album')}, now_artist {mpd_now('MPD_MCP','artist')}, now_date {mpd_now('MPD_MCP','date')}, now_last-modified {mpd_now('MPD_MCP','last-modified')}, now_error {mpd_now('MPD_MCP','error')}, now_file {mpd_now('MPD_MCP','file')}, now_genre {mpd_now('MPD_MCP','genre')}, now_name {mpd_now('MPD_MCP','name')}, now_title {mpd_now('MPD_MCP','title')}, now_track {mpd_now('MPD_MCP','track')}

sub mpd_now($$) {
    my $device=shift;
    my $reading=shift;
   
    my $interval = AttrVal($device, 'interval', 30);
    my $extras = 5; # add a few extra seconds
    my $ts = str2time(ReadingsTimestamp($device, $reading, 0));
   
    if($ts < time() - $interval - $extras) {
        # Reading is too old
        return '';
    }
   
    my $val = ReadingsVal($device, $reading, '');
    return $val;
}

tomster

#175
Ich hatte gerade im Moment das gleiche Problem/ den gleichen Gedanken, also hab ich Deinen Code gleich Mal eingebaut.
Allerdings vermute ich, dass meinem Pi irgendwelche Pakete fehlen, weil er immer mosert:

Error evaluating MPD userReading now_album: Undefined subroutine &main::str2time called at ./FHEM/99_myUtilsMPD.pm line 9.


Ich habe da "str2time" im Verdacht. In welchem Paket steckt denn diese Funktion?

nesges

Zitat von: tomster am 11 Mai 2015, 20:34:25
Ich habe da "str2time" im Verdacht. In welchem Paket steckt denn diese Funktion?

Das müsste Date::Parse sein

tomster

Hmm, Date::Parse sei Up to date, sagt er...
Funzt trotzdem nicht. Gleiche Fehlermeldung...

nesges

Zitat von: tomster am 11 Mai 2015, 20:57:56
Hmm, Date::Parse sei Up to date, sagt er...
Funzt trotzdem nicht. Gleiche Fehlermeldung...

Hast du's per

use Date::Parse

in deiner myUtils geladen?

tomster

Nö. Warum? Ich dachte das wird eh inkludiert, wenn es per CPAN installiert wurde...