Modul für MPD

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

Vorheriges Thema - Nächstes Thema

borney

Ja genau. Haupt-Fhem 24/7 schaltet MPD-Raspi (mit weiterem FHEM) ein und MPD wird mit systemd gestartet. Leider funktioniert das play direkt nicht. Den Sender wähle ich dann per MPD-Modul in FHEM des MPD-Raspi.

Wernieman

ZitatDen Sender wähle ich dann per MPD-Modul in FHEM des MPD-Raspi.
Dann könntest DU auch per FHEM den PLAY senden ;o)

Ansonsten per Cron, ein Script beim @reboot ausführen
(Oder eben in der systemd)
- 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

borney

Per FHEM wäre mir auch am liebsten, aber wie direkt nach dem Einschalten des MPD-FHEM's?

borney

ich habe eine Lösung gefunden:

Auf dem MPD-raspi läuft auch das SYSMON RPI (zur Kontrolle des RasPi) daher haben ich ein Notify erzeugt mit:

RPI:uptime:.* set Radio play

Damit schaltet sich MPD (Radio) ein, sobald RPI ein neues Event nach Start erzeugt.

frank

DAS offizielle start event kommt vom device global.
"global:INITIALIZED", siehe commandref zu notify.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Wernieman

Zitat von: borney am 20 April 2022, 13:52:55
ich habe eine Lösung gefunden:

Auf dem MPD-raspi läuft auch das SYSMON RPI (zur Kontrolle des RasPi) daher haben ich ein Notify erzeugt mit:

RPI:uptime:.* set Radio play

Damit schaltet sich MPD (Radio) ein, sobald RPI ein neues Event nach Start erzeugt.

Was "fast" meinem Punkt ein enstpricht:
Zitatper FHEM: Notify auf Presents und 30sec später mpd anschalten ..
Also nicht Presents sondern Sysmon und ohne Zeitverzögerung sondern sofort (funktioniert das Wirklich?) .. aber ansonsten ....
Ich hoffe Dir trotzdem geholfen zu haben  8)
- 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

borney

#666
Hallo Wernieman, frank,

ja, Danke, die Denkanstösse habe auf jeden Fall geholfen! Leider hat bei mir das global:INITIALIZED nicht funktioniert, dies hätte ich auch gerne vewendet. Bei mir bleibt der global status auf no definition stehen, warum auch immer.

Nochmals vielen Dank.

frank

ZitatBei mir bleibt der global status auf no definition stehen, warum auch immer.
gut so, bei mir auch.
trotzdem kommt das event.

eventuell ist mpd da noch nicht bereit?
eine aktion könnte man zb mit fhem-sleep verzögern.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

CBSnake

#668
Moin,

ich häng mich mal hier ran, hab bis jetzt nichts passendes dazu gefunden.
Ich hatte es nun schon mehrfach, dass das MPD Modul den FHEM Start verhindert:
PERL WARNING: Use of uninitialized value in int at ./FHEM/73_MPD.pm line 459.
ist dann der letzte Eintrag im Log.
Ein Umbenenne des 73_MPD.pm in z.b.  73_MPD.pm.tmp hilft und FHEM startet wieder durch, wirft dann aber natürlich Fehler weil das Modul zu den definierten MPD Devices fehlt.
Ich hab nach dem heutigen Fall ein Update ausgeführt, um die aktuelle 73_MPD.pm zu haben, selbes Problem :-(

Ich bin jetzt mehr User als Programmierer ;-)
Woran könnte das liegen?

Viele Grüße
Achim

Nachtrag: ein MPD Device war durch den Neustart der kompletten Technik offline, könnte das damit zu tun haben? Nach zwei FHEM Startversuchen läuft jetzt alles wieder *puhh*
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

Beta-User

Moin Wzut,

nachdem ich mit Rhasspy/RHASSPY grade etwas rumexperimentiere:
Besteht Interesse, das Modul so zu erweitern, dass man einen/zwei Befehle hat, mit denen man die Playlist ersetzen/erweitern kann um "addfilter"-Vorgaben?

Eine Rohfassung fäuft hier schon, mit der man sowas übergeben kann:
set myMPD addSelection ((artist == 'Gary Moore') AND (album == 'Run for Cover'))
Ziel wäre es, dann eher was parseParams-taugliches zusammenzubasteln, also in der Art
set myMPD addSelection artist='Gary Moore' album='Run for Cover'

Da gibt es zwar einige noch zu lösende Fallstricke (https://mpd.readthedocs.io/en/latest/protocol.html#escaping-string-values), aber na ja, irgendwo müßte man halt anfangen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

#670
@Wzut

bei einem fehlerhaften MPD (z.B. bei mir  ::)) bleibt 73_MPD.pm stehen und FHEM hängt.
Das Verhalten tritt auf, wenn die Socket-Verbindung zwar aufgebaut werden kann aber keine Daten vom MPD gesendet werden. Ich konnte das auf zwei Stellen mit diesem Inhalt eingrenzen:
while (<$sock>)
{ last if $_ ; }

Interessant wäre ein Fork der ganzen Routine. Als Notlösung (max. 1 Sec Stillstand) habe ich den beiden while-Schleifen Folgendes vorangestellt: my $read = new IO::Select() || return 'Fehler beim Aufruf von IO::Select!\n';
$read->add($sock);
my @count = $read->can_read(1);
return "Fehler - keine Daten vom MPD!\n" if @count < 1;

Jetzt geht's an die Reparatur des MPD, der wegen bluealsa rumzickt...

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

JensS

@CBSnake

in der Zeile 459 von 73_MPD.pm wird die Lautstärke abgefragt, welche anfangs mit -1 belegt wurde.
Vielleicht reicht es, einen Standardwert von 50 bereitzstellen. my $vol_now = int($hash->{".volume"}) // 50;
Nachher reload 73_MPD.pm nicht vergessen.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

CBSnake

Zitat von: JensS am 18 Juni 2022, 14:36:06
@CBSnake

in der Zeile 459 von 73_MPD.pm wird die Lautstärke abgefragt, welche anfangs mit -1 belegt wurde.
Vielleicht reicht es, einen Standardwert von 50 bereitzstellen. my $vol_now = int($hash->{".volume"}) // 50;
Nachher reload 73_MPD.pm nicht vergessen.

Gruß Jens

Moin Jens,

werde ich testen, danke dir

Grüße
Achim
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

Beta-User

#673
Anbei komplettes Modul und diff. Da sind drin:
- der Vorschlag von JensS* betr. der Prüfung auf "bist du da"
- eine etwas abgeänderter "uninitialized"-Fix für das volume-Thema
- deutlich verkürzter timeout (0.7 Sekunden) als default, auch für * verwendet
- Es wird v.a. beim FHEM-Start nicht mehrfach die Verbindung aufgebaut, wenn der MPD nicht da ist
- da das "komplette Sammlung abholen" auf der MPD-Seite als unerwünscht gekennzeichnet ist, ist der diesbezügliche default jetzt auch "nicht holen"
- commandref "id"

ad * noch:
Weiß  noch nicht, ob ich das doppelte Öffnen des $sock wirklich gut finde, aber einen besseren Vorschlag habe ich auch nicht, jedenfalls im Moment. Forken finde ich wg. des Speicherverbrauchs nicht die optimale Lösung.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

#674
Hab das Ganze mal mit eval probiert:sub mpExecute($$) {
  my ( $hash, $cmd ) = @_;
  my $host = $hash->{adresse};
  my $port = $hash->{port};
  my $antwort = '';

eval {
$SIG{'ALRM'} = sub {die "timeout";};
alarm(1);
  my $client = IO::Socket->new(
    Domain => AF_INET,
    Type => SOCK_STREAM,
    proto => 'tcp',
    PeerPort => $port,
    PeerHost => $host,
    Timeout => 1,
  ) || die "timeout";
  $client->send("$cmd\n");
  $client->shutdown(SHUT_WR);
  while (<$client>) {$antwort .= $_;};
  $client->close();   
};
alarm(0);
if ($@){return $@};
return $antwort;
}

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.