Internetradio über die Synology Diskstation - Senderwahl über FHEM

Begonnen von jhohn, 13 Oktober 2013, 20:31:26

Vorheriges Thema - Nächstes Thema

jhohn

Ich habe eben mal ein bisschen rumgebastelt und evtl. kann es ja jemand brauchen

In der 99_myUtils.pm einfügen:

######## senderwahl ####################################################
# What  : Radiosender an Synology Diskstation einstellen
# Call  : { senderwahl($sender) }
#
# mehr Stream URLS unter http://wiki.ubuntuusers.de/Internetradio/Stationen
sub senderwahl($) {
my $wahl = Value("Radio");
my @allesender = ("SWR1","SWR3","HR1","HR3","BR2","FFH","DasDing","RadioBob","YouFM_Rock");
my @alleurls = ("http://mp3-live.swr.de/swr1rp_m.m3u","http://mp3-live.swr3.de/swr3_m.m3u","http://metafiles.gl-systemhaus.de/hr/hr1_2.m3u","http://metafiles.gl-systemhaus.de/hr/hr3_2.m3u","http://streams.br-online.de/bayern2_2.m3u","http://streams.ffh.de/radioffh/mp3/hqlivestream.m3u","http://mp3-live.dasding.de/dasding_m.m3u","http://streams.radiobob.de/bob-live/mp3-128/mediaplayerbob","http://metafiles.gl-systemhaus.de/hr/youfm_rock.m3u");
system("killall mplayer");
if ($wahl ne "ausgeschaltet") {
for (my $i = 0; $i<@allesender; $i++) {
if ($allesender[$i] eq $wahl) {
system("/var/packages/AudioStation/target/bin/mplayer -gapless-audio -ao oss -unique USB -daemon $alleurls[$i] -volume 10");
}
}
}
}


dann ein Dummy mit Namen Radio und ein paar Sendern in einer Auswahlliste erstellen:

define Radio dummy
attr Radio room Wohnzimmer
attr Radio group Musik
attr Radio setList state:ausgeschaltet,SWR1,SWR3,HR1,HR3,BR2,FFH,DasDing,RadioBob,YouFM_Rock
attr Radio webCmd state


und dann noch ein notify um die Senderwahl zu triggern:

define n_radio notify radio.* {senderwahl($EVENT)}


um weitere Sender hinzuzufügen müssen diese in der setList des dummies und in der myUtils ergänzt werden.
FHEM auf Synology Diskstation DS413j (DSM4.3), HM LAN Adapter
Steuerung für Nachtspeicheröfen:
Ladung:   HM-WDS10-TH-O, HM-LC-Sw4-DR, Weather-Modul
Gebläse: HM-CC-TC, HM-LC-SW1-FM, HM-Sec-RHS
FHEM auf FritzBox 7390 für Telefon Funktionen

rtv

Vielen Dank - sehr praktisch!
Mein FHEM läuft nicht auf dem NAS, deshalb hab' ich für SSH Zertifikate hinterlegt und nutze es remote.
Wenn mehrere Personen die Audiostation (ggf. über die App) nutzen, ist es vielleicht nicht so praktisch deren Player ebenfalls zu töten, aber das kann man ja noch eingrenzen.
Werden bei dir mit einem Aufruf auch 2 mplayer Prozesse erzeugt?

jhohn

Ja, werden auch. Es laufen aber auch 2 mplayer Prozesse wenn ich über die Synology Remote starte.
mplayer wird, soweit mir bekannt, nur für die Ausgabe über (USB-)Soundkarte genutzt. Zu anderen Clients wird per /usr/syno/synoman/webman/3rdparty/AudioStation/webUI/audio_proxy.cgi gestreamt.
Jedenfalls hat ein "killall mplayer" weder den über die Weboberfläche gestarteten Stream zum Laptop, noch die Wiedergabe über die App gestoppt.

Ich habe das Ganze ein wenig umgebaut und eine Lautstärkeregelung mit eingebaut:

In 99_myUtils.pm das Zeugs vom ersten Post rauswerfen und stattdessen das hier einfügen:
######## radio ####################################################
# What  : Radiosender an Synology Diskstation einstellen
# Call  : { radio(senderwahl|volume) }
#
# mehr Stream URLS unter http://wiki.ubuntuusers.de/Internetradio/Stationen
sub radio($) {
my $radiosetting = shift(@_);
my $wahl = Value("Radio");
my $radiovolume = Value("Volume");
my @allesender = ("SWR1","SWR3","HR1","HR3","BR2","FFH","DasDing","RadioBob","YouFM_Rock");
my @alleurls = ("http://mp3-live.swr.de/swr1rp_m.m3u","http://mp3-live.swr3.de/swr3_m.m3u","http://metafiles.gl-systemhaus.de/hr/hr1_2.m3u","http://metafiles.gl-systemhaus.de/hr/hr3_2.m3u","http://streams.br-online.de/bayern2_2.m3u","http://streams.ffh.de/radioffh/mp3/hqlivestream.m3u","http://mp3-live.dasding.de/dasding_m.m3u","http://streams.radiobob.de/bob-live/mp3-128/mediaplayerbob","http://metafiles.gl-systemhaus.de/hr/youfm_rock.m3u");
#Log 1, "Radio Setting: $radiosetting, Sender: $wahl, Lautstärke: $radiovolume";
if ($radiosetting eq "volume") {
#Log 1, "neue Radio Lautstärke $radiovolume";
system("/var/packages/AudioStation/target/bin/volume -s $radiovolume");
}
elsif ($radiosetting eq "senderwahl") {
#Log 1, "neuer Sender $wahl";
system("killall mplayer");
if ($wahl ne "ausgeschaltet") {
for (my $i = 0; $i<@allesender; $i++) {
if ($allesender[$i] eq $wahl) {
system("/var/packages/AudioStation/target/bin/mplayer -gapless-audio -ao oss -unique USB -daemon $alleurls[$i] -volume $radiovolume");
}
}
}
}
}


ein neuer Dummy für die Lautstärke, die Werte im Slider eventuell anpassen, bei mir wird es über 25 zu laut, möglich ist 0 - 100:
define Volume dummy
attr Volume group Musik
attr Volume room EG_Wohnzimmer
attr Volume setList state:slider,0,1,25
attr Volume webCmd state


und ein notify dazu:
define n_RadioVolume notify Volume.* {radio("volume")}

das notify für den Sender ändern in:
define n_radio notify Radio.* {radio("senderwahl")}
FHEM auf Synology Diskstation DS413j (DSM4.3), HM LAN Adapter
Steuerung für Nachtspeicheröfen:
Ladung:   HM-WDS10-TH-O, HM-LC-Sw4-DR, Weather-Modul
Gebläse: HM-CC-TC, HM-LC-SW1-FM, HM-Sec-RHS
FHEM auf FritzBox 7390 für Telefon Funktionen

Trebor5

Hallo,

versuche das ganze auf einem Raspberry umzusetzen.

Habe jetzt in 99_myUtils.pm

######## radio ####################################################
# What  : Radiosender an Synology Diskstation einstellen
# Call  : { radio(senderwahl|volume) }
#
# mehr Stream URLS unter http://wiki.ubuntuusers.de/Internetradio/Stationen

sub radio($) {
my $radiosetting = shift(@_);
my $wahl = Value("Radio");
my $radiovolume = Value("Volume");
my @allesender = ("SWR1","SWR3","HR1","HR3","BR2","FFH","DasDing","RadioBob","YouFM_Rock");
my @alleurls = ("http://mp3-live.swr.de/swr1rp_m.m3u","http://mp3-live.swr3.de/swr3_m.m3u","http://metafiles.gl-systemhaus.de/hr/hr1_2.m3u","http://metafiles.gl-systemhaus.de/hr/hr3_2.m3u","http://streams.br-online.de/bayern2_2.m3u","http://streams.ffh.de/radioffh/mp3/hqlivestream.m3u","http://mp3-live.dasding.de/dasding_m.m3u","http://streams.radiobob.de/bob-live/mp3-128/mediaplayerbob","http://metafiles.gl-systemhaus.de/hr/youfm_rock.m3u");
#Log 1, "Radio Setting: $radiosetting, Sender: $wahl, Lautstärke: $radiovolume";
if ($radiosetting eq "volume") {
#Log 1, "neue Radio Lautstärke $radiovolume";
system("/etc/mplayer/volume -s $radiovolume");
}
elsif ($radiosetting eq "senderwahl") {
#Log 1, "neuer Sender $wahl";
system("killall mplayer");
if ($wahl ne "ausgeschaltet") {
for (my $i = 0; $i<@allesender; $i++) {
if ($allesender[$i] eq $wahl) {
system("/etc/mplayer -gapless-audio -ao oss -unique USB -daemon $alleurls[$i] -volume $radiovolume");
}
}
}
}
}


in in der Fhem.cfg

define Volume dummy
attr Volume room Radio
attr Volume group Musik
attr Volume setList state:slider,0,1,25
attr Volume webCmd state
define n_RadioVolume notify Volume.* {radio("volume")}

define Radio dummy
attr Radio room Radio
attr Radio group Musik
attr Radio setList state:ausgeschaltet,SWR1,SWR3,HR1,HR3,BR2,FFH,DasDing,RadioBob,YouFM_Rock
attr Radio webCmd state
define n_radio notify Radio.* {radio("senderwahl")}


eingefügt .

Soweit so gut leider bekomme ich keinen Ton auf die Boxen am Rasp.

Mit "mpg321 /media/usbstick/SOUNDS/ALARMANLAGEAUS.mp3" funktiont der Ton vom Usb stick auf die Boxen .

jemand einen Tipp ?



Odroid N2,Hauptsensoren Homematic + 1 Wire + 8Kanal Homematic auf Relay Schaltung. Forum Beiträge sind meine letzte Hoffnung nach Stundenlangen erfolglosen suchen und probieren.

jhohn

Zitat von: Trebor5 am 19 Dezember 2013, 21:05:29

               system("/etc/mplayer -gapless-audio -ao oss -unique USB -daemon $alleurls[$i] -volume $radiovolume");

Ist mplayer installiert? Wenn ja, sicherlich nicht in /etc/.
Wenn mpg123 funktioniert, warum verschst D es dann nicht damit?

Versuch mal

system("mpg123 $alleurls[$i] ");
FHEM auf Synology Diskstation DS413j (DSM4.3), HM LAN Adapter
Steuerung für Nachtspeicheröfen:
Ladung:   HM-WDS10-TH-O, HM-LC-Sw4-DR, Weather-Modul
Gebläse: HM-CC-TC, HM-LC-SW1-FM, HM-Sec-RHS
FHEM auf FritzBox 7390 für Telefon Funktionen

Trebor5

Hallo ,

also auf meinem Rasp gibt es das Verzeichnis etc/mplayer und darin sind 3 Dateien input.con , Menu.conf , mplayer.conf.

Habe alles nur über die Konsole vom rasp. Instaliert.

Habe deine Zeile system("mpg123 $alleurls[$i] ");  nochmal geändert in system("mpg321 $alleurls[$i] ");  da der Player nur mit mpg321 anzusprechen ist.

Leider kommt im log 2013.12.28 19:04:41 3: n_radio return value: Undefined subroutine &main::radio called at (eval 872) line 1. wenn ich einen Sender einstellen will.

Noch ein Tip ?
Odroid N2,Hauptsensoren Homematic + 1 Wire + 8Kanal Homematic auf Relay Schaltung. Forum Beiträge sind meine letzte Hoffnung nach Stundenlangen erfolglosen suchen und probieren.

danhauck

Hallo zusammen,

echt coole Idee. Danke euch!!

Hab das ganze mal auf meinem Raspberry mit mpg123 aufgesetzt und eine Erweiterung geschrieben, dass auch die Icecast-Metadaten in fhem angezeigt werden. Leider werden sie noch nicht automatisch aktualisiert (F5 notwendig  ;)). Aber da find ich noch ne Lösung. Oder hat einer schon ne Lösung?

Hier mein Code: Folgendes in 99_myUtils.pm:
######## radio ####################################################
# What  : Radiosender an Raspberry Pi einstellen
# Call  : { radio(senderwahl|volume) }
#
# mehr Stream URLS unter http://wiki.ubuntuusers.de/Internetradio/Stationen


$LOGFILE = "log/internetradio.log";

sub radio($) {
my $radiosetting = shift(@_);
my $wahl = Value("Radio");
my $radiovolume = Value("Volume");
my @allesender = ("SWR1","SWR3","HR1","HR3","BR2","FFH","DasDing","RadioBob","YouFM_Rock");
my @alleurls = ("http://mp3-live.swr.de/swr1rp_m.m3u","http://mp3-live.swr3.de/swr3_m.m3u","http://metafiles.gl-systemhaus.de/hr/hr1_2.m3u","http://metafiles.gl-systemhaus.de/hr/hr3_2.m3u","http://streams.br-online.de/bayern2_2.m3u","http://streams.ffh.de/radioffh/mp3/hqlivestream.m3u","http://mp3-live.dasding.de/dasding_m.m3u","http://streams.radiobob.de/bob-live/mp3-128/mediaplayerbob","http://metafiles.gl-systemhaus.de/hr/youfm_rock.m3u");
if ($radiosetting eq "volume") {

system("amixer sset PCM $radiovolume%");
}
elsif ($radiosetting eq "senderwahl") {
#Log 1, "neuer Sender $wahl";
system("killall mplayer");
if ($wahl ne "ausgeschaltet") {
for (my $i = 0; $i<@allesender; $i++) {
if ($allesender[$i] eq $wahl) {
system("sudo killall mpg123");
#system("amixer sset PCM $radiovolume%");
system("sudo rm ".$LOGFILE);
system("mpg123 -@ $alleurls[$i] 2>".$LOGFILE." &");
}
}
} else {
# ausgeschaltet
system("sudo killall mpg123");
system("sudo rm ".$LOGFILE);

}
}
}

sub GetStringFromIcyTag(@){
$line   = @_[0];
$IcyTag = @_[1];

$pos = index($line,$IcyTag);
if($pos>-1){
$temp = substr($line,$pos+length($IcyTag));
#$temp =~ s/\r//g;# remove the newline from $line.
#$temp=~ tr/\015//d;
#$temp =~ s/\r?\n$//;

return $temp;
}
return "";
}

sub GetRadioInfosAsHtml(){

open(LOGFILE) or return("Keine Metadaten");
foreach $line (<LOGFILE>) {
# do line-by-line processing.
#$pos = index($line,"ICY-NAME:");

$temp=GetStringFromIcyTag($line,"ICY-NAME:");
if($temp ne "") {$IcyName=$temp};

$temp=GetStringFromIcyTag($line,"ICY-META:");
if($temp ne "") {
$IcyMeta=$temp;
$temp=GetStringFromIcyTag($IcyMeta,"StreamTitle=");
if($temp ne "") {$IcyMeta_StreamInfo=$temp};
}

$temp=GetStringFromIcyTag($line,"ICY-URL:");
if($temp ne "") {$IcyUrl=$temp};

$temp=GetStringFromIcyTag($line,"MPEG 1.0 layer III, ");
if($temp ne "") {$audio="MP3, ".$temp};
}

$html = "<b>Icecast Metadaten:</b><table>";

if($IcyName ne "") {
$html.= "<tr>";
$html.= "  <td>Sendername: </td>";
$html.= "  <td><b>".$IcyName."</b></td>";
$html.= "</tr>";
}
if($IcyMeta ne "") {
$html.= "<tr>";
$html.= "  <td>Infos:</td>";
$html.= "  <td><b>".$IcyMeta_StreamInfo."</b></td>";
$html.= "</tr>";
}
if($IcyUrl ne "") {
$html.= "<tr>";
$html.= "  <td>Web:</td>";
$html.= "  <td>"."<a href='".$IcyUrl."' target=_blank>".$IcyUrl."</a>"."</td>";
$html.= "</tr>";
}
if($audio ne "") {
$html.= "<tr>";
$html.= "  <td>Audio:</td>";
$html.= "  <td>".$audio."</td>";
$html.= "</tr>";
}
$html.= "</table>";

return $html;
}



und so hab ichs in der fhem.cfg angelegt:


define Volume dummy
attr Volume room Radio
attr Volume group Internetradio
attr Volume setList state:slider,0,1,100
attr Volume webCmd state
define n_RadioVolume notify Volume.* {radio("volume")}

define Radio dummy
attr Radio room Radio
attr Radio group Internetradio
attr Radio setList state:ausgeschaltet,SWR1,SWR3,HR1,HR3,BR2,FFH,DasDing,RadioBob,YouFM_Rock
attr Radio webCmd state
define n_radio notify Radio.* {radio("senderwahl")}

define rInfos weblink htmlCode { GetRadioInfosAsHtml() }
attr rInfos group Internetradio
attr rInfos htmlattr width_"220" height="330" frameborder="0" marginheight="0" marginwidth="0"
attr rInfos room Radio

danhauck

Hallo zusammen,

habs jetzt mal in ein eigenes Modul 00_IRadio.pm verpackt und um ne Klingel-Funktion (bei Klingeltastendruck wird Internetradio unterbrochen, MP3 abgespielt und Internetradio fortgesetzt) erweitert

Bitte um konstruktives Feedback ;-)

Hab leider immer noch keine Lösung, um die Icecast-Daten im Webfrontend zu aktualisieren

Gruß

Daniel

gemx

Zitat von: danhauck am 08 Januar 2014, 07:36:24
Hab leider immer noch keine Lösung, um die Icecast-Daten im Webfrontend zu aktualisieren

In meinem StreamRadio Modul http://forum.fhem.de/index.php/topic,18531.0.html habe ich das so gelöst, dass ich gar kein Logfile benutze, sondern per BlockingCall den mplayer starte und in diesem Aufruf dauerhaft den STDOUT des Prozesses parse.
Wenn ich etwas verwertbares finde aktualisiere ich per telnet Aufruf die readings in fhem.
Ist zwar etwas "von hinten durch die Brust ins Auge" aber funktioniert prima.
Da man ja aus einem BlockingCall heraus nix in FHEM ändern kann, fand ich das ein probates Mittel und ich brauche keinen Timer oder sonstiges Polling.

Die Anzeige selbt habe ich auch nicht über eine HTML funktion gelöst, da diese sich glaube ich auch nicht updated, wenn sich Readings ändern.

Vielmehr habe ich die summaryFn verwendet.
Das geht prima

Eniac

Hallo zusammen,

ich habe an meiner Synology auch mal etwas rumprobiert.

Mein Problem war, dass ich den Stream gerne über Airplay wiedergeben möchte. Das habe ich mit dem mplayer so erstmal nicht hinbekommen. Hat das jemand von euch geschafft?

Wenn ich statt dem mplayer den Befehl "synoairplayd" nutze, dann kann ich problemlos Songs über Airplay abspielen.So kann man das Skript leicht anpassen und es kommt die Musik über Airplay gestreamt. Als Parameter muss man das Airplay-Device und die Lautstärke sowie den Outputfile angeben.

Soweit, sogut, aber leider habe ich es bisher noch nicht geschafft, einen Webstream über synoairplayd zum Abspielen zu bekommen. Vielleicht hat jemand von euch eine Idee. Ich probier auch noch weiter...

Das zweite Problem: Der volume-Befehl funktioniert auch nicht. Man kann über synoairplayd zwar die Lautstärke setzen, aber eben nicht mittendrin verändern.

Ggf. ist es auch eine Option, den myplayer zu nutzen und den Ausgabestream an synoairplayd zu pipen...

Mal sehen...

Viele Grüße
Eniac
--------------------

Using FHEM on a Synology DS212j with Homematic devices

ahnidrum

Hallo
Ich befasse mich erst seit kurzem mit dem Thema Synology und fhem. Die Radioausgabe über USB klappt super mit der Senderauswahl. Habe die Datei auch meinen Wünschen nach angepasst. Allerdings suche ich noch nach einer Lösung, damit die Wiedergabe um 06:00 Uhr automatisch startet und sich um 08:00 Uhr automatisch ausschaltet (zwecks morgendliche Dusche im Bad) . Bekomme dies leider nicht hin. Hat vielleicht jemand eine Idee, was und wie man dann die 9_myUtils.pm oder die fhem.cf umändern muß?

Mit diesen Befehlen in der fhem.cf klappt es ganz gut:
define starte_radio at *06:00 { system ("/var/packages/AudioStation/target/bin/mplayer -gapless-audio -ao oss -unique USB -daemon <LIVESTREAM-URL> -volume 20 ") }
define stoppe_radio at *08:00 { system ("killall mplayer") }
Allerings wird meine audio station nach dem killall Befehl gestoppt und ich kann dann tagsüber nicht auf meine Musikliste (per DS Station oder Audio Station) zugreifen. Erst, wenn ich die audio station wieder manuell starte funktioniert wieder alles.
Kann man den mplayer "sanfter" stoppen, indem man vielleicht nur die USB daemon Ausgabe stoppt oder sich der Sender automatisch auf ausschalten setzt?

Wäre dankbar für euer Hilfe

UliM

Hi,
kurzer Hinweis da dies über mplayer funktioniert: Schaut euch mal im Ordner "Multimedia" das Modul StreamRadio an - das verwendet ebenfalls mplayer wenn ich das richtig sehe (benutze es selbst nicht).
Nur mal so als Hinweis :)
Gruß,
Uli

RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Negropo

Zitat von: Eniac am 19 Januar 2014, 14:06:33
Hallo zusammen,

ich habe an meiner Synology auch mal etwas rumprobiert.

Mein Problem war, dass ich den Stream gerne über Airplay wiedergeben möchte. Das habe ich mit dem mplayer so erstmal nicht hinbekommen. Hat das jemand von euch geschafft?

Wenn ich statt dem mplayer den Befehl "synoairplayd" nutze, dann kann ich problemlos Songs über Airplay abspielen.So kann man das Skript leicht anpassen und es kommt die Musik über Airplay gestreamt. Als Parameter muss man das Airplay-Device und die Lautstärke sowie den Outputfile angeben.

Soweit, sogut, aber leider habe ich es bisher noch nicht geschafft, einen Webstream über synoairplayd zum Abspielen zu bekommen. Vielleicht hat jemand von euch eine Idee. Ich probier auch noch weiter...

Das zweite Problem: Der volume-Befehl funktioniert auch nicht. Man kann über synoairplayd zwar die Lautstärke setzen, aber eben nicht mittendrin verändern.

Ggf. ist es auch eine Option, den myplayer zu nutzen und den Ausgabestream an synoairplayd zu pipen...

Mal sehen...

Viele Grüße
Eniac

Hallo Eniac,

ich habe auch probiert mit dem Befehl synoairplayd eine MP3 an meinen Sony SA-NS310 zu senden. Doch leider sagt mir meine DS folgendes:

Feb 14 10:54:00 DiskStation synoairplayd: synoairplayd.cpp:94 Failed to write pid.
Feb 14 10:54:00 DiskStation synoairplayd: synoairplayd.cpp:301 Failed to init daemon.

Kannst du mir da weiterhelfen?

Danke und Gruß

Negropo

Eniac

...spontan würde ich darauf tippen, dass eine Instanz vom Synology Airplay-Deamon bereits läuft.
Hast du das mal geprüft (mittels ps)?
--------------------

Using FHEM on a Synology DS212j with Homematic devices

qwikser

Hi,

wollte mal nach hören ob es hier noch was neues gibt?
Würde auch gerne einen Radio Sender von der Musik Station an einen Airplay Express senden.

Zur Zeit habe ich schon das MAXLAN und das ModbusIP Modul eingebunden, würde dies gerne noch ein wenig erweitern.. :)

MfG.
qwikser