[Neues Modul] StreamRadio

Begonnen von gemx, 08 Januar 2014, 19:31:54

Vorheriges Thema - Nächstes Thema

gemx

Hallo zusammen,

jetzt ist endlich mein erstes "richtiges" Modul fertig.
Es basiert auf Infos und Ideen aus den beiden anderen Threads, die sich mit ähnlichem beschäftigen, daher schon mal vielen Dank an alle die dort mit gewirkt haben
http://forum.fhem.de/index.php/topic,15346.0/topicseen.html
http://forum.fhem.de/index.php/topic,13650

Es handelt sich um ein Device, welches das Abspielen von WebStreams auf dem Raspberry ermöglicht.
Zusätzlich wird eigentlich nur der mplayer benötigt.

Was kann es?
Beliebige WebStreams per MPlayer abspielen und auch deren Metadaten, z.B. aktuell laufender Titel anzeigen.
Das ganze wird direkt in der Raumübersicht angezeigt, ohne weblink o.ä.
Siehe Screenshots :-)

Installation
* MPlayer, falls nicht schon vorhanden. sudo apt-get install mplayer
* Das angehängte Script "74_StreamRadio" ins Modul Verzeichnis kopieren, also wahrscheinlich nach /opt/fhem/FHEM
* irgendwo eine Datei mit den WebStreams anlegen. Diese Datei sollte pro Zeile immer den Namen des Streams gefolgt von "|" und dann die URL enthalten.
   also z.B. testradio|http://bla.com/34.m3u. Eine Sample Datei ist ebenfalls dabei

Define
define streamradio StreamRadio /opt/fhem/log/WebStreams.txt
unter der Vorraussetzung, dass ihr die WebStreams.txt dort abgelegt habt.

Attribute
volume_command <= das shell kommando, um die Lautstärke einzustellen. Es kann die Platzhalter von sprintf verwendet werden. Für den raspi z.B. "amixer cset numid=1 -- %s%%". Dies ist der Default, nach einem neuen define
telnetport <= Der lokale telnetport für FHEM. Achtung: Es darf keine Authentifizierung eingerichtet sein
aodevice <= -ao Parameter für mplayer, um das output device anzugeben

Commands
set <name> PLAY <StreamURL/Stationname aus Playlist>
set <name> STOP
set <name> VOLUME <Lautstärke in %>


Aktuelle Version
(Update erfolgt immer hier im ersten Posting)

V0.5
* Reading für "state" funktioniert wieder
* Die Playlist wird nach Namen sortiert angezeigt
*  set PLAY kann jetzt auch der Stationname anstelle der URL angegeben werden
* Die Lautstärke veränderung in % sollte jetzt proportional erfolgen

- V.04 Neues Attribut "aodev", um das aodevice für mplayer festzulegen
- V0.3 Neuer Befehl "VOLUME", Mehr Metadaten, Das MPlayer log wird nicht mehr geparsed sondern direkt STDOUT. Das dürfte deutlich performanter sein
- V0.2 Umbau auf Benutzung von BlockingCall
- V0.1 (initiale Version

Das war es auch schon. Als Attribut kann man noch das Logfile für den MPlayer festlegen, welches für die Ermittlung der Metadaten verwendet wird.

Noch offene Punkte
- Da der MPlayer seinerseits auch noch weitere MPlayer Prozesse forked, hat ein Kill direkt auf die PID nicht funktioniert. Derzeit klappt es nur sauber mit killall
- Telnetport der von Blocking.pm erstellt wird ermitteln. Das hat bisher leider noch nicht geklappt.

WICHTIG:
Bitte die Datei 74_StreamRadio.pm aus dem fhemwiki Artikel
http://www.fhemwiki.de/wiki/Modul_StreamRadio_Einrichtungshilfe
entnehmen, und nicht hier aus dem Anhang.
(Dieser Abschnitt wurde vom Admin nach Hinweis von Anwendern hinzugefuegt, da der Autor nicht mehr aktiv ist).

justme1968

kurz zwei anmerkungen ohne es schon probiert zu haben:

- wenn die mplayer prozesse alle unter dem ersten hängen müsste 'pkill -P' funktionieren

- BlockingCall sollte eigentlich keine performance probleme haben. wenn du es selber mit fork machst und nicht so aufräumst wie es BlockingCall macht wird fhem z.b. bei einem 'shutdown restart' hängen bleiben oder das abziehen und wieder anstecken eines cul geht nicht.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

gemx

Also "pkill -P" hatte ich neben vielen anderen Varianten ebenfalls ausprobiert und es hat mir nur einen MPLAYER gekilled, aber nicht den, den MPLAYER selbst geforked hat.
Wegen dem BlockingCall schaue ich gerne nochmal.

Ist ja mein erstes Modul bzw. die ersten Gehversuche in Perl und FHEM

kvo1

#3
Hallo gemx,

zunächst nur gelesen,nicht getestet (kommt heute noch) .. Hut ab!

Aber was hat es mit den Definitionen
# set <name> <key> <value>
#
# where <key> is one of mute, volume, remoteControl or off
# examples:
# set <name> PLAY <StreamURL>           <Start playback the selected stream>
# set <name> STOP          <Stops playback>

auf sich, kann ich mir hier einen Play und Stop - Button definieren wie beim Haus-Radio ??



RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

gemx

Ja genau. Man kann auch einen Play und Stop Button bauen.
Ich fand das zwar wie ich das gemacht schöner, wollte aber dennoch die Möglichkeit offen lassen ;-)

kvo1

ups .. da hab ich wohl was falsch verstanden, hilf mir auf die Sprünge...
wenn ich
set streamradio PLAY
set streamradio STOP

eintrage

kommt ...

RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

kvo1

Hi gemx.... läuft auf Anhieb ... coooool

das (sieh Bild) könnt man sich sparen , aber das ist ja noch ein offener Punkt ...Metadaten...

Gruß

Klaus
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

gemx

Zitat von: kvo1 am 08 Januar 2014, 21:16:32
ups .. da hab ich wohl was falsch verstanden, hilf mir auf die Sprünge...
wenn ich
set streamradio PLAY
set streamradio STOP

eintrage

kommt ...

Für "PLAY" muss man als Parameter noch die URL des Streams anhängen, also "set streamradio PLAY http://...."

betateilchen

bei den Werten für "state" solltest Du auf die vielen Punkte verzichten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

kvo1

Für "PLAY" muss man als Parameter noch die URL des Streams anhängen, also "set streamradio PLAY http://...."


bringt leider nix , gleicher Fehler wie zuvor !


define streamradio StreamRadio /opt/fhem/WebStreams.txt
attr streamradio room Radio
set streamradio PLAY http://www.radioeins.de/live.m3u
set streamradio STOP

Hast du ein Beispiel ?
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

koldomon

in der 74_StreamRadio hast du unterschiedliche Schreibweisen für "MplayerLog" (MplayerLog, MPlayerLog). Führt zu einer Fehlermeldung

Habs bei mir normalisiert und es kommt keine FM mehr
OdroidC1 -> fhem
CUNO -> FS20
CUL -> HomeMatic
TCM310 -> enOcean
DUOFERN -> rademacher

koldomon

hi, nochmal ich  8)

Hab das Modul "fast" erfolgreich getestet. Nachdem ich 2 Tage brauchte um ein Bluetooth-Speaker zum laufen zu bekommen, hat dein Modul auf anhieb funktioniert.....ABER.... wenn ich auf meinem Raspi mit mp321 den Stream von http://mp3.webradio.rockantenne.de:80 aufrufe funktioniert alles prima, mit mplayer hört es total verrauscht an????? ich finde auch nciht raus, woran das liegt. Evtl. findest du da was. Was mir noch aufgefallen ist, wenn ich FHEM neu starte, dann zeigt das Pulldown auf der Weboberfläche an, dass ein Stream gewählt ist und "angeblich" läuft. Ist aber alles Stumm, so wie vor dem Reboot. ???

so, nun zu den Anregungen

1. Gedanke: Name des Modul
"StreamRadio" sagt zwar aus, was es tut, aber nicht womit/wie. Mein Vorschlag: "MPlayerStream". Warum? Weil damit auch klar wird, dass der "MPlayer" dazu benutzt wird. weiter dazu in "2. Gedanke". Wenn du nur Streams mit dem Modul ausgibst, dann ist das Suffix "Stream" wohl am passendsten. Solltest du planen, zukünftig auch MP3 als Datei oder aus dem lokalen Netzwerk abzuspielen, sollte das Modul wohl am besten nur "MPlayer" heissen.

2. Gedanke: Grundlage des Modul
Die Basis deines Moduls ist "mplayer". Muss das so bleiben? Nachdem bei mir ja mit "mpg321" alles sauber funktioniert und das Ding sogar über das Terminal bedienbar ist, wäre es eine Alternative zu deiner Wahl. Oder noch besser, du machst den Player auswählbar. Die jeweiligen Parameter können ja als Attribut für den jeweiligen Player übergeben werden.
2a. Gedanke: Warum überhaupt nur "medienwiedergabe"?
Wenn ich den 2. Gedanke zu Ende spinne, kommt ich auf ein Modul, mit dem ich beliebige Programme von Linux starten kann, die im Hintergrund laufen

3. Gedanke: Steuerung des Modul
Das mit dem Pulldown ist ja ganz schick und sicherlich die bessere Wahl, wenn man sehr viele Einträge in der Playlist stehen hat. Ich vermute, dass die meisten 4-5 Einträge haben und die könnten als direkte Liste ausgegeben werden.

4. Gedanke: Pflege der Playlist
Die Einträge der Playlist sollten meines Erachtens als Definition des Moduls gemacht werden, so dass Sie direkt über die Weboberfläche bearbeitet werden können. Das würde auch dem bisherigen Stil von fhem folgen.

So, ich hoffe du fasst meine Anregungen nicht als Kritik an dir oder deiner Arbeit auf - soll ja schon mal vorgekommen sein. Wenn du dir jetzt denkst "Bau dir doch dein eigenes Modul", richtig, bin ich aber leider noch zu blöd für. Ich befass mich grad mal 4 Wochen mit Linux und hab noch keine Ahnung von der Programmierung in Perl. Aber wir könnten es zusammen machen, würd ich wenigstens was lernen (wenn du mir ne Einweisung gibst  ;))

alles Gute

cu markus
OdroidC1 -> fhem
CUNO -> FS20
CUL -> HomeMatic
TCM310 -> enOcean
DUOFERN -> rademacher

gemx

Nee, nee passt schon.
Freue mich ja über Anregungen :-)

1) Name des Moduls:
Könnte man durchaus drüber nachdenken. War mir noch nicht sicher wo die Reise hingeht

2) Warum nur Medienwiedergabe?
Weil ein toller Aspekt die Anzeige der Metadaten ist und das passt nunmal nur zum MPlayer

3) ..ist wohl Geschmackssache

4) Pflege der Playlist
Das ist glaube ich ziemlich umständlich, weil das define statements sehr lang wird. Zudem ist die Pflege der Kanalliste auch arg unpraktisch.
Ich überleg mal, wie man das evtl. in die Oberfläche bringen könnte.

kvo1

« Antwort #10 am: Heute um 12:36:50 »Zitat in der 74_StreamRadio hast du unterschiedliche Schreibweisen für "MplayerLog" (MplayerLog, MPlayerLog). Führt zu einer Fehlermeldung

Habs bei mir normalisiert und es kommt keine FM mehr



sollte das auch die Lösung für mein Problem sein ? Werde ich heute Abend mal testen.
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

DosiRocker

Hallo gemx,
bei mir tut es erstmal alles was es soll.
Laut/leiser wäre natürlich für eine Radio app super, dann könnte man sich auch durch langsam ansteigende Lautstärke wecken lassen

Super Dankeschön
Martin
Cubietruck: CUNO 868;CUL HM
1 Wire: 1 OWAD, 13 OTHERM
10 FS20 ST; 3 HMS100WD; 1 EM1000;  4 S300TH;
4 HM_CC_RT_DN, HM_SEC_SC
AVM 7390 als FHEM2FHEM, Raspberry Pi