|
 |
|

15.11.2012, 14:29
|
|
Erfahrener Benutzer
|
|
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 992
|
|
Merci! Für die Blumen und die Verbesserungen.
Ich habe übrigens nichts dagegen, wenn du die Änderungen ins SVN committest - sofern sie nicht irgendeine Funktionalität zerstören, bspw das Radio.
LG, Fry
|

17.11.2012, 10:48
|
|
Benutzer
|
|
Registriert seit: 25.01.2008
Ort: Graz
Beiträge: 79
|
|
danke erstmal, irgendwie sehe ich den wald vor lauter bäumen nicht mehr.
könntest du mir bitte deine ansagen.pl und die conf zukommen lassen? ich würde diese dann entsprechend meiner gruppenadressen modifizieren ... und vielleicht habe ich dann erfolg.
danke für deine hilfe!!!!
viele grüße
andi
|

20.11.2012, 06:04
|
|
Erfahrener Benutzer
|
|
Registriert seit: 05.07.2010
Beiträge: 1.182
|
|
Code:
use POSIX qw(floor);
use feature "switch"; # aktiviert given...when-Struktur von Perl 5.10
# Defaultkonfiguration
my $speechdir='/var/lib/Ansagen/Sprache';
my $mpddir='/var/lib/Ansagen/Sprache';
my %channels=('default'=>'pakueche');
my $beepchannel='';
my $beep = "Beep/03d.mp3";
my @additional_subscriptions=();
my %mpdhost=('default'=>'127.0.0.1/6602');
my $mode='mpd';
my $radioga=undef;
my %stations=(); # Internet-Radiostationen
# Konfigurationsfile einlesen
my $conf=$plugname; $conf.='.conf' unless $conf=~s/\.pl$/.conf/;
open FILE, "</etc/wiregate/plugin/generic/conf.d/$conf" || return "no config found";
my @lines = <FILE>;
close FILE;
eval("@lines");
# speechdir muss im mpddir liegen!
$speechdir=~s!/$!!;
$mpddir=~s!/$!!;
return "config error: $@" if $@ || ($mode eq 'mpd' && $speechdir !~ /^$mpddir/);
# Aufrufgrund ermitteln
my $event=undef;
if (!$plugin_initflag)
{ $event='restart'; } # Restart des daemons / Reboot
elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'})
{ $event='modified'; } # Plugin modifiziert
elsif (%msg) { $event='bus'; } # Bustraffic
elsif ($fh) { $event='socket'; } # Netzwerktraffic
else { $event='cycle'; } # Zyklus
chdir $speechdir;
if($event=~/restart|modified/)
{
my %gas=();
# Erstaufruf - an GAs anmelden, auf die die Muster in %channels zutreffen
for my $k (grep /^$plugname\_/, keys %plugin_info)
{
delete $plugin_info{$k};
}
# Rueckwaertskompatible Behandlung von eibgaconf
for my $ga (grep /^[0-9\/]+$/, keys %eibgaconf)
{
my $name=$eibgaconf{$ga}{name};
next unless defined $name;
my $channel_found=undef;
for my $pat (keys %channels)
{
next if $pat eq 'default' || $name!~/$pat/;
$channel_found=$channels{$pat};
last;
}
next unless $channel_found;
$gas{$channel_found}++;
$plugin_subscribe{$ga}{$plugname}=1;
if($name=~/$radioga/)
{
speak($channel_found,$name,'AUS');
$plugin_info{$plugname.'_radio_'.$channel_found}='AUS';
plugin_log($plugname, 'Internetradio auf Kanal '.$channel_found.', GA='.$ga);
}
}
my $channel_found=$channels{'default'};
if($channel_found)
{
for my $ga (@additional_subscriptions)
{
my $name=$eibgaconf{$ga}{name};
$gas{$channel_found}++;
$plugin_subscribe{$ga}{$plugname}=1;
if($name=~/$radioga/)
{
speak($channel_found,$name,'AUS');
$plugin_info{$plugname.'_radio_'.$channel_found}='AUS';
plugin_log($plugname, 'Internetradio auf Kanal '.$channel_found.', GA='.$ga);
}
}
}
$plugin_info{$plugname.'_cycle'}=0;
return join ' ', map $_.'->'.$gas{$_}, keys %gas;
}
elsif($event=~/bus/)
{
return if $msg{apci} eq "A_GroupValue_Response";
my $ga=$msg{dst};
my $val=$msg{value};
my $dpt=$eibgaconf{$ga}{DPTSubId};
$dpt=1.017 unless defined $dpt; # = Trigger, bedeutet Textansage ohne Daten
my $name=$eibgaconf{$ga}{name};
my $channel=$channels{default};
my $pattern=$name;
for my $pat (keys %channels)
{
if($pattern=~s/$pat//)
{
$channel=$channels{$pat};
last;
}
}
# Radiosender bei dpt 16 (Text=Sendername)
if($mode eq 'mpd' && $name=~/$radioga/ && $dpt=~/^16/)
{
if($msg{apci} eq 'A_GroupValue_Read')
{
# Host und Port ermitteln
$mpdhost{$channel}=~m!^\s*(.*)\s*/\s*(.*)\s*$!;
my $host=$1; my $port=$2;
# aus irgendeinem Grund funktioniert %ENV im wiregate-Plugin nicht
# also so:
my $mpc=checkexec('mpc');
$mpc="export MPD_HOST=$host; export MPD_PORT=$port; $mpc";
# Laeuft gerade das Radio oder eine Ansage?
my $lfd_radio = $plugin_info{$plugname.'_radio_'.$channel} ne 'AUS';
my $lfd_ansage = `$mpc`=~/playing/s;
# && !$lfd_radio;
return unless $lfd_radio && !$lfd_ansage;
my $mpcout=`$mpc`;
$mpcout=~s/\n.*//s; # erste Zeile rausschneiden
knx_write($ga, $mpcout, undef, 0x40); # response, DPT aus eibga.conf
}
else
{
$val=~s/\000*$//; # streiche Nullen am Ende
return speak($channel, $name, $val);
}
}
return unless $msg{apci} eq 'A_GroupValue_Write';
# Hole alle verfuegbaren Durchsagedateien
my $find=checkexec('find');
my @speech=split /\n/, `$find . -name '*.mp3'`;
map s!^\./!!, @speech; # Pfade relativ zum speechdir
return 'no speech files found' unless @speech;
my @statement=();
# Praefix bei Gefahrenwarnung (dpt 5.005)
push(@statement, words(\@speech, 'Achtung')) if $dpt eq '5.005'; # Gefahrenwarnung
# Textteil (Gruppenadresse ausgesprochen)
push(@statement, words(\@speech, $pattern)) if defined $pattern;
# Informationsteil (Inhalt des Telegramms)
given($dpt)
{
when (1.001) # An/Aus
{
push(@statement, 'Zahlen/'.($val?'an':'aus').'.mp3');
}
when (1.008) # Hoch/Runter
{
push(@statement, 'Zahlen/'.($val?'hoch':'runter').'.mp3');
}
when(1.009) # Auf/Zu
{
push(@statement, 'Zahlen/'.($val?'auf':'zu').'.mp3');
}
when(2.007) # Auf/Ab/Stop
{
push(@statement, 'Zahlen/'.($val==1?'auf':($val==-1?'ab':'stop')).'.mp3');
}
when(5.005) # Gefahrenwarnung
{
my %warnstufe=(0=>'keine_Meldung', 1=>'Hinweis', 2=>'Vorwarnung', 3=>'Warnung', 4=>'Gefahr', 5=>'Gefahr_hoch');
push(@statement, 'Warnung/'.$warnstufe{$val}.'.mp3');
}
when([5.010,7.001,12.001]) # Ordinalzahl
{
push(@statement, number(\@speech, $val, -1));
}
when([3.007,6.010,8.001,13.001]) # Kardinalzahl
{
push(@statement, number(\@speech, $val));
}
when([5.001,6.001]) # Prozent
{
push(@statement, number(\@speech, $val));
push(@statement, 'Zahlen/Prozent.mp3');
}
when(9.001) # Temperatur
{
push(@statement, number(\@speech, $val, 1));
push(@statement, 'Zahlen/Grad.mp3');
}
when(11.001) # Datum
{
if($val=~/^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])/)
{
my @monat=qw(Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember);
push(@statement, number(\@speech, $3, -1));
push(@statement, 'Monate/'.$monat[$2-1].'.mp3') if defined $2 && $2>0 && $2<13;
}
else
{
return "Unbekanntes Datumsformat '$val'";
}
}
when(7.005) # Zeitdauer
{
$val=-$val if $val<0;
my $h=floor($val/3600);
$val-=3600*$h;
my $m=floor($val/60);
$val-=60*$m;
if($h)
{
push(@statement, number(\@speech, $h));
push(@statement, 'Zeiten/Stunden.mp3');
}
if($h || $m)
{
push(@statement, number(\@speech, $m));
push(@statement, 'Zeiten/Minuten.mp3');
}
push(@statement, number(\@speech, $val));
push(@statement, 'Zeiten/Sekunden.mp3');
}
when(10.001) # Uhrzeit
{
if($val=~/^(Mo|Di|Mi|Do|Fr|Sa|So)\s+([0-9][0-9])\:([0-9][0-9])/)
{
push(@statement, "Wochentage/$1.mp3");
push(@statement, number(\@speech, $2));
push(@statement, "Zeiten/Uhr.mp3");
push(@statement, number(\@speech, $3)) if int($3)>0;
}
elsif($val=~/^([0-9][0-9])\:([0-9][0-9])/)
{
push(@statement, number(\@speech, $1));
push(@statement, "Zeiten/Uhr.mp3");
push(@statement, number(\@speech, $2)) if int($2)>0;
}
else
{
return "Unbekanntes Uhrzeitformat '$val'";
}
}
when(/^16/) # Freitext
{
$val=~s/\000*$//; # streiche Nullen am Ende
push(@statement, words(\@speech, $val));
}
when(1.017) # Trigger, kein Datenzusatz
{}
default # kein Datenzusatz, aber mit Logeintrag
{
return "Datentyp $dpt nicht implementiert";
}
}
# Das komplette Statement in die Ausgabe geben
return speak($channel, $name, @statement);
}
return;
sub checkexec
{
my @path = split /:/, $ENV{PATH};
map s|(.)/$|$1|, @path;
for (@path)
{
my $full="$_/$_[0]";
if(-x $full)
{
return "$_/$_[0]";
}
}
die "$_[0] must be in your PATH and executable.\n";
}
sub words
{
my $speech=shift;
my $pattern=shift;
# Konstruiere die abzuspielenden File(s) aus dem GA-Kuerzel
# erster Versuch: eine Datei passt komplett auf das Muster im Kuerzel
my $pat1=$pattern;
$pat1=~s/[_\s]+/.*?/g; # allgemeine Fassung
# $pat1=~s/\s+.*$//; # meine spezielle GA-Struktur
# $pat1=~s/_+/.*?/g; # meine spezielle GA-Struktur
$pat1='.*'.$pat1.'.*\.mp3$';
my @hits=();
my $hit=bestmatch($speech,$pat1);
push(@hits, $hit) if $hit; # gefunden
unless(@hits)
{
$pattern='_'.$pattern;
$pattern=~s/\s+/_/g; # allgemeine Fassung
# $pattern=~s/\s+.*$//; # meine spezielle GA-Struktur
# zweiter Versuch: aus Kuerzeln die Bausteine zusammenbauen
while($pattern=~s/^_([^_]+)//)
{
my $pat2=$1.'\.mp3$';
$hit=bestmatch($speech,$pat2);
push(@hits, $hit) if $hit; # gefunden
}
if($pattern)
{
$pattern=~s/_/.*/g; # Restnachricht
$pattern.='.*\.mp3$';
$pattern='.*'.$pattern;
$hit=bestmatch($speech,$pattern);
push(@hits, $hit) if $hit; # gefunden
}
}
return @hits;
}
sub number
{
my $speech=shift;
my $x=shift; $x=~s/,/./;
my $digits=0;
$digits=shift if @_; # max. Anzahl Nachkommastellen, -1 fuer Ordinalzahlen
my @hits=();
if($x<0)
{
push(@hits, 'Zahlen/minus.mp3');
$x=-$x;
$digits=0 if $digits<0; # keine negativen Ordinalzahlen
}
my $t=$digits<0?'o':'c';
my $n=floor($x);
my $m=$x-$n;
# Manche Zahlen existieren direkt als mp3
# von 0-12, sowie die runden 10er und 100 sowie 1000
# MUESSEN existieren, und zwar als Kardinalzahlen (c4.mp3),
# Ordinalzahlen (o6.mp3), die Zehner ausserdem mit vorangestelltem 'und'
# (u30.mp3, uo30.mp3)
if(-f 'Zahlen/'.$t.$n.'.mp3')
{
push(@hits, 'Zahlen/'.$t.$n.'.mp3');
}
else
{
return if($n>=1000000); # Zahlen ueber eine Million nicht implementiert
if($n>=1000)
{
$digits=0 if $digits>0; # waere Pseudo-genauigkeit und zu langer Text
if($n==1000)
{
push(@hits, 'Zahlen/'.$t.'1000.mp3');
$n = 0;
}
else
{
my $m=floor($n/1000);
@hits=number($speech,$m,0) if $m>1;
$n %= 1000;
if($n)
{
push(@hits, 'Zahlen/c1000.mp3');
}
else
{
push(@hits, 'Zahlen/'.$t.'1000.mp3');
}
}
if($n>=100 && $n<200)
{
push(@hits, 'Zahlen/u1.mp3');
}
}
if(-f 'Zahlen/'.$t.$n.'.mp3')
{
push(@hits, 'Zahlen/'.$t.$n.'.mp3');
}
elsif($n>100)
{
$digits=0 if $digits>0; # waere Pseudo-genauigkeit und zu langer Text
my $h = int($n/100);
$n %= 100;
push(@hits, 'Zahlen/u'.$h.'.mp3') if $h>1;
if($n)
{
push(@hits, 'Zahlen/c100.mp3');
}
else
{
push(@hits, 'Zahlen/'.$t.'100.mp3');
}
}
my $d = $n % 10;
if(-f 'Zahlen/'.$t.$n.'.mp3')
{
push(@hits, 'Zahlen/'.$t.$n.'.mp3');
}
else
{
my $z = $n-$d;
push(@hits, 'Zahlen/u'.$d.'.mp3');
push(@hits, 'Zahlen/u'.$t.$z.'.mp3');
}
}
if($digits>0)
{
$m = sprintf "%.$digits"."f", $m;
if($m>0)
{
push(@hits, 'Zahlen/Komma.mp3');
for (1..$digits)
{
$m*=10.; my $d=floor($m); $m-=$d;
push(@hits, "Zahlen/c$d.mp3");
}
}
}
return @hits;
}
sub bestmatch
{
my $speech=shift;
my $pattern=shift;
my @hits=sort { length($a) <=> length($b) } grep /$pattern/i, @{$speech};
return @hits ? (shift @hits) : undef;
}
sub speak
{
my $channel=shift; # ALSA-Channel
my $name=shift; # Name der Ansage (aus eibga.conf) - fuers Log
my $retval='';
my $date=checkexec('date');
my $datetime=`$date +"%F %X"`;
$datetime=~s/\s*$//s;
# Fuer Russound-Ausgabe: Star Trek 'Beep' vorweg weckt Russound (und User) fuer Ansage auf
if($channel=~/$beepchannel/ && $name!~/$radioga/)
{
my $lastbeep=$plugin_info{$plugname.'_lastbeep_'.$channel};
# max ein Beep pro Minute
if(!defined $lastbeep || time()>$lastbeep+60)
{
unshift(@_, $beep);
$plugin_info{$plugname.'_lastbeep_'.$channel}=time();
}
}
if(@_)
{
if($mode eq 'aplay')
{
my $aplay=checkexec('aplay');
system $aplay, '-c2', "-D$channel", @_;
map s!^.*/(.*?)\.mp3!$1!, @_;
$retval.=$channel.':'.(join ' ', @_);
}
elsif($mode eq 'mpd')
{
# Host und Port ermitteln
$mpdhost{$channel}=~m!^\s*(.*)\s*/\s*(.*)\s*$!;
my $host=$1; my $port=$2;
# aus irgendeinem Grund funktioniert %ENV im wiregate-Plugin nicht
# also so:
my $mpc=checkexec('mpc');
$mpc="export MPD_HOST=$host; export MPD_PORT=$port; $mpc";
# Laeuft gerade das Radio oder eine Ansage?
my $lfd_radio = $plugin_info{$plugname.'_radio_'.$channel} ne 'AUS';
my $lfd_ansage = `$mpc`=~/playing/s;
# && !$lfd_radio;
# Sonderfall Internetradio statt Sprachausgabe
if($name=~/$radioga/)
{
my $val=$_[0];
if($val=~s/V([+-]?[0-9X])$//)
{
my $vol=$1;
$vol = ($vol eq 'X' ? 100: 10*$vol);
system "$mpc volume $vol"; # ermoeglicht gleichzeitig Sender u Lautstaerke festzulegen
}
if($val eq 'AUS')
{
system "$mpc clear";
$plugin_info{$plugname.'_radio_'.$channel}='AUS';
}
elsif($val =~ /^VOLUME\s*([+-]?[0-9]+)/)
{
system "$mpc volume $1";
}
elsif(grep /$val/i, keys %stations)
{
my $station=undef;
unless(defined $stations{$val})
{
my @hits=grep /$val/i, sort { length($a) <=> length($b) } keys %stations;
$val=shift @hits;
}
$station=$stations{$val};
my $wget=checkexec('wget');
# MusicPal-Links "uebersetzen"
if($station=~/freecom\.vtuner\.com/)
{
$station=~s!freecom\.vtuner\.com!vtuner.com!;
$station=~s!setupapp/fc/asp!setupapp/guide/asp!;
$station=~s!dynam.*?\.asp!dynampls.asp!;
$station=~s!\?ex45v=.*\&id=!\?id=!;
}
# vtuner-Links "uebersetzen"
$station = `$wget 2>/dev/null -O - $station` if $station=~/vtuner/;
system "$mpc clear" unless $lfd_ansage; # nur leeren falls abgespielt
system "$mpc add \"$station\"";
# plugin_log($plugname, "$mpc add \"$station\"");
system "$mpc play" unless `$mpc`=~/playing/s; # starten falls noch nicht aktiv
$plugin_info{$plugname.'_radio_'.$channel}=$station;
$retval.="$channel:Radiosender '$val'='$station'";
}
else
{
$retval.="Unbekannter Radiosender '$val'";
}
}
else # Regelfall: Sprachausgabe
{
system "$mpc update"; # Aktualisierung verfuegbarer Soundclips
push @_, "silence.mp3"; # kurze Pause zwischen Ansagen
map s!^/*!$speechdir/!, @_; # alle Eintraege relativ zum speechdir
map s!^$mpddir/!!, @_; # mpd braucht einen Pfadnamen relativ zum music-Dir
map s!/+!/!, @_; # zur Sicherheit
push @_, $plugin_info{$plugname.'_radio_'.$channel} if $lfd_radio; # nach der Ansage wieder zurueck aufs Radio
# wird momentan noch was gespielt?
# dann Playlist leeren, ggf Radio stoppen falls abgespielt
system "$mpc crossfade 0"; # nur leeren falls abgespielt
system "$mpc clear" unless $lfd_ansage;
# ein Fall noch zu klaeren: wenn Radio laeuft und zwei Ansagen kurz hintereinander kommen,
# wird die zweite die erste unterbrechen, weil $lfd_ansage hier (inkorrekt) 0 sein wird.
system "$mpc add \"".(join "\" \"", @_)."\"";
#plugin_log($plugname, "$mpc add \"".(join "\" \"", @_)."\"");
system "$mpc play" unless `$mpc`=~/playing/s; # starten falls noch nicht aktiv
map s!^.*/(.*?)\.mp3!$1!, @_;
$retval.=$channel.':'.(join ' ', @_);
}
}
else
{
$retval.="$name - no output (mpd or aplay) defined";
}
}
else
{
$retval.="$name - no audio output possible (file not found)";
}
return $retval;
}
Und hier die conf
Code:
#!/usr/bin/perl
#
# Ansagen.pl - Konfiguration
# Voraussetzungen:
# 1. Im Verzeichnis $speechdir/Zahlen muessen folgende Dateien vorhanden sein:
# 1.1. Kardinalzahlen ("Null", "Eins"):
# c0.wav...c19.wav, c20.wav...c90.wav, c100.wav, c1000.wav
# 1.2. Ordinalzahlen ("Erster", "Zweiter"):
# o0.wav...o19.wav, o20.wav...o90.wav, o100.wav, o1000.wav
# 1.3. Zahlteile mit "und" wie "...undzwanzig", "...unddreissigster":
# uc20.wav...uc90.wav, uo20.wav...uo90.wav
# 1.4. Ziffern zur Zahlbildung ("ein"):
# u1.wav...u9.wav (u1.wav="ein" als Bestandteil von "einunzwanzig",
# u2.wav...u9.wav koennen identisch mit c2.wav...c9.wav sein)
# 1.7. Spezielle Woerter:
# minus.wav, Komma.wav, Grad.wav, Prozent.wav
# auf.wav, zu.wav, hoch.wav, runter.wav, an.wav, aus.wav
# 2. Im Verzeichnis $speechdir/Monate muessen die Namen der Monate liegen:
# Januar.wav ... Dezember.wav
# 3. Im Verzeichnis $speechdir/Wochentage muessen die Wochentagsnamen liegen:
# Mo.wav ... So.wav
# 4. Ein Piepton $speechdir/beep.wav mit Pieptoenen, die vor der Sprachausgabe
# gesendet werden (weckt bei mir den Russound-Paging-Kanal auf, der sonst die
# ersten Silben verschluckt). Bei mir ist das wiederum ein ganzes Verzeichnis
# Beep mit Dateien 01.wav ... 32.wav in aufsteigender Dauer sortiert
# 5. Im Verzeichnis $speechdir ausserdem:
# Alle Woerter bzw. ganze Saetze, die vorgelesen werden sollen,
# wobei zB ein Satz "Willkommen Fry" in der Datei $speechdir/Willkommen/Fry.wav
# liegen darf
# alle diese Audiodateien kann man sich online generieren, zB bei SVOX.
# Plugin-Konfiguration ################################################
# Ausgabekanal:
# Die ALSA-Kanalunterscheidung wird durch die Namensgebung der GA
# in eibga.conf getroffen. Das Muster ffuer dieKanalunterscheidung
# steht in %channels.
# Textteil: Der Rest des GA-Namens wird als Text "vorgelesen".
# Das Plugin sucht dabei zunaechst nach einem "exact match" einer Datei
# im Sprachverzeichnis. Wenn dieser Match nicht existieren sollte, werden
# die Woerter getrennt und jedes einzeln gesucht.
# Datenteil:
# Am Ende des Textteils wird der Telegramminhalt aufgesagt,
# wobei folgende Datentypen erlaubt sind:
# 1.017: (keine Daten, nur den GA-Namen vorlesen)
# 1.001: "An/Aus"
# 1.008: "Hoch/Runter"
# 1.009: "Auf/Zu"
# 5.010 / 7.001: Ordinalzahl ("Einundzwanzigster")
# 6.010 / 8.001: Kardinalzahl ("Einundzwanzig")
# 6.001 / 5.001: Prozentwert ("dreiundfuenfzig Prozent")
# 9.001: Temperatur ("minus drei komma fuenf Grad")
# 11.001: # Datum ("elfter April")
# 10.001: # Wochentag+Uhrzeit ("Montag elf Uhr fuenfzehn")
# Hier meine Konfiguration als Beispiel:
# ANsagen gehen auf ALSA-Kanal 'welcome' und kommen ueber einen eigenen
# kleinen Verstaerker im Eingangsflur raus
# DURCHsagen gehen auf ALSA-Kanal 'paging' und gehen ueber die Russound an
# alle Lautsprecher im Haus. Dort muss ein Beep vorweggesendet werden
# Directories, Kanaele, Gruppenadressen
$speechdir='/var/lib/Ansagen/Sprache';
%channels=(
'^WA_'=>'pakueche',
# zB "WW_Die Aussentemperatur betraegt"
'^WP_'=>'paging',
# zB "WP_Folgende Fenster sind geoeffnet"
'^WM_'=>'music',
# zB "WM_Folgende Fenster sind geoeffnet"
'default'=>'pakueche' # die GAs in additional_subscriptions
);
$beepchannel='paging|music';
$beep = sprintf "Beep/%02d.mp3", 3; # int(rand(32))+1 fuer Zufallsbeep
#@additional_subscriptions=qw(0/7/245 0/7/246 6/2/186);
@additional_subscriptions=();
# Ausgabeoptionen
$mode='mpd'; # mpd or aplay
# die folgenden Eintraege werden nur fuer mpd benoetigt
$mpddir='/var/lib/Ansagen/Sprache/';
%mpdhost=(
'pakueche'=>'127.0.0.1/6602',
# 'music'=>'127.0.0.1/6601',
# 'pabad'=>'127.0.0.1/6602',
);
# Integriertes Internetradio, funktioniert NUR mit $mode='mpd',
# GA-Kuerzel nach diesem Muster rufen das Radio auf
# $radioga='^...MusicPlayer';
# solche GAs muessen Datentyp DPT 16 haben und uebertragen im Datenteil den Sendernamen
# sowie Kommandos wie 'AUS' oder 'VOLUME 30' oder 'VOLUME +10',
# es ist auch moeglich, in einem einzigen Aufruf Sender und Lautstaerke festzulegen:
# zB knx_write($ga, 'Bayern1 V3', 16); setzt Lautstaerke auf 30%, 'bayern1 VX' auf 100%
# Tabelle von Sendernamen, nicht alle sind <=14 Zeichen und damit aufrufbar...
# die meisten Links sind UNGETESTET!
%stations = (
'Bayern1' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w10a',
'Bayern2' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w11a',
'Bayern3' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w12a',
'BRKlassik' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w13a',
'B5aktuell' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w14a',
'B5plus' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w15a',
'FFH' => 'http://streams.ffh.de/radioffh/mp3/hqlivestream.mp3',
'FFHTop40' => 'http://streams.ffh.de/ffhchannels/mp3/hqtop40.mp3',
'FFH80er' => 'http://streams.ffh.de/ffhchannels/mp3/hq80er.mp3',
'FFHRock' => 'http://streams.ffh.de/ffhchannels/mp3/hqrock.mp3',
'FFHElektro' => 'http://streams.ffh.de/ffhchannels/mp3/hqelectrobeatz.mp3',
'FFHEurodance' => 'http://streams.ffh.de/ffhchannels/mp3/hqeurodance.mp3',
'FFHDeutsch' => 'http://streams.ffh.de/ffhchannels/mp3/hqdeutsch.mp3',
'FFHSoundtrck' => 'http://streams.ffh.de/ffhchannels/mp3/hqsoundtrack.mp3',
'FFHHits4Kids' => 'http://streams.ffh.de/ffhchannels/mp3/hqhits4kids.mp3',
'FFHJazz' => 'http://streams.ffh.de/ffhchannels/mp3/hqjazz.mp3',
'FFH90er' => 'http://streams.ffh.de/ffhchannels/mp3/hqspezial.mp3',
'FFHLounge' => 'http://streams.ffh.de/ffhchannels/mp3/hqlounge.mp3',
'FFHLovesongs' => 'http://streams.ffh.de/ffhchannels/mp3/hqspezial1.mp3',
'FFHAlternatv' => 'http://streams.ffh.de/ffhchannels/mp3/hqalternative.mp3',
'1Live Diggi' => 'http://gffstream.ic.llnwd.net/stream/gffstream_einslive_b',
'1Live Kunst' => 'http://gffstream.ic.llnwd.net/stream/gffstream_einslive_a',
'1Live' => 'http://gffstream.ic.llnwd.net/stream/gffstream_stream_wdr_einslive_a',
'2Radio' => 'http://88.198.50.10:8020',
'80s' => 'http://64.236.34.67:80/stream/1040',
'89.0 RTL' => 'http://62.75.176.45/rtl-high',
'Alpen-Radio' => 'http://cdn1.ice.muc.streamin.de/alpenradio',
'BHJMS-Radio1' => 'http://bhjms-streamserver.mscs.net:8000/',
'BIG FM' => 'http://www.bigfm.de/webradio/bigfm-high.m3u',
'BS Allgenres' => 'http://www.besonic.fm/allgenres',
'BS HipHop' => 'http://besonic.fm:8000/hiphopsoulurban',
'BS JazzBlues' => 'http://besonic.fm:8000/jazzblues',
'BS MixedUP' => 'http://besonic.fm:8000/mixedup',
'BS Pop' => 'http://besonic.fm:8000/Pop',
'BSAlternativ' => 'http://besonic.fm:8000/rockalternative',
'BavOpenRadio' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w9b',
'BlackBeats' => 'http://blackbeats.fm:13000/',
'Blackmusic' => 'http://listen.bmradio.de',
'Blitz-Radio' => 'http://blitz-stream.de:8000/',
'Blu.FM' => 'http://sc1.netstreamer.net:9800/',
'Br4 Zeiglers' => 'http://80.252.104.101:8000/zeiglerswwdp',
'CFNYFM' => 'http://208.80.52.106/CFNYFM',
'CHROMANOV' => 'http://212.112.241.88:8000/',
'Chat-Radio' => 'http://chatradio.myftp.org:8202',
'Citybull' => 'http://citybull.net:11000/',
'ClubNatur.FM' => 'http://server2.digital-webstream.de:7800',
'CrossChannel' => 'http://62.146.11.24/3095crosschannel_dsl.mp3',
'DEFJAY.DE' => 'http://sc1.netstreamer.net:8040/',
'DLF' => 'http://www.dradio.de/streaming/dlf_hq_ogg.m3u',
'DLR Kultur' => 'http://www.dradio.de/streaming/dkultur_hq_ogg.m3u',
'Dancefox' => 'http://s5.pop-stream.de:9000/',
'DeluxeJazz' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/13000deluxe/live/3258radiodeluxe/de_96.mp3',
'DeluxeLounge' => 'http://d852143781.i.sto.core008.cdn.streamfarm.net/13000deluxe/live/3304lounge/de_128.mp3',
'DieNeue107.7' => 'http://cdn1.ice.muc.streamin.de:80/dieneue1077',
'Disco-Beatz' => 'http://85.214.43.232:1598/',
'Discodance' => 'http://discodancefoxradio.eu:25819',
'Discoradio' => 'http://discoradio.fabbricadigitale.it/asx/discoradio.asx',
'Dt Welle' => 'http://metafiles.gl-systemhaus.de/dw/radio_de_64.m3u',
'ELDORADIO' => 'http://sender.eldoradio.de:8000/128',
'ERF Radio' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/3212erf_96_live.mp3',
'Enc Ismaning' => 'http://mp3.webradio.antenne.de:80',
'Enjoy' => 'http://91.121.29.176:9000/',
'EnrgieBerlin' => 'mms://213.200.97.107/energyberlin$livestream.wma',
'EnrgieBremen' => 'mms://213.200.97.107/energybremen$livestream.wma',
'EnrgieHH' => 'mms://213.200.97.107/energyhamburg$livestream.wma',
'EnrgieM' => 'mms://213.200.97.107/energymuenchen$livestream.wma',
'EnrgieN' => 'mms://213.200.97.107/energynuernberg$livestream.wma',
'EnrgieS' => 'mms://213.200.97.107/energystuttgart$livestream.wma',
'EnrgieSachsn' => 'mms://62.26.161.89/energysachsen$livestream.wma',
'FFN' => 'http://rs20.stream24.org:8000/stream',
'Fernsehen' => 'mms://80.190.139.69/11008bmt/live/3338s10rfo/300.wmv?cid=60921&dummy=.wmv',
'Filmradio' => 'http://212.123.103.171:8000/',
'GameSports' => 'http://195.13.63.169:8200/',
'Gamer-FM' => 'http://82.149.224.55:8500/',
'Gong FM' => 'http://213.186.33.86:8321/gongfm.mp3',
'Gong Live' => 'http://radiator.nci.de:8000/live',
'GothicFan' => 'http://85.214.43.100:8000',
'HR Info' => 'http://d851957213.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hrinfo/de_96.mp3',
'HR1' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hr1/de_96.mp3',
'HR2' => 'http://hr.streamfarm.net/cms/_vm100/radio/live/hr2_cms.asx',
'HR3' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hr3/de_96.mp3',
'HR4' => 'http://hr.streamfarm.net/cms/_vm100/radio/live/hr4_cms.asx',
'Hit-R.Ant' => 'MMS://213.200.64.231/ANTENNE1$LIVESTREAM2.WMA',
'Hitradio 77' => 'http://80.154.38.77:8000/',
'HotBeats FM' => 'http://break.hotbeats.fm:9999/',
'House-Musik' => 'http://85.214.92.77:8000',
'Impact Punk' => 'http://85.214.37.96:8000/',
'JUMP' => 'mms://wm-ipx-11.stream.tv1.de/22004mdrjump/live/3087mdr_jump_live/de_44.wma',
'Jack FM' => 'http://sc1.streamfox.com:8050',
'KlassikRadio' => 'http://str0.creacast.com:80/klassik1',
'Krautrock' => 'http://krautrock.pop-stream.de:7592/',
'Kronehit' => 'http://kronehit.sil.at:8016',
'LeFunkBoat' => 'http://lefunkboat.com:8000/',
'M94.5' => 'http://stream.lrz-muenchen.de:31337/m945-hq.mp3',
'MAIN.FM' => 'http://87.106.14.18:8000/',
'MDR Figaro' => 'MMS://D621466636.W.IPX.CORE001.CDN.STREAMFARM.NET/22007MDRFIGARO/LIVE/3087MDR_FIGARO_LIVE/DE_44.WMA',
'MDR Info' => 'MMS://D621466636.W.IPX.CORE001.CDN.STREAMFARM.NET/22006MDRINFO/LIVE/3087MDR_INFO_LIVE/DE_44.WMA',
'MDR Klassik' => 'http://62.146.11.19:80/22008mdrklassik/live/3087mdrklassik/klassik_128.mp3',
'MDR1 Thuerin' => 'mms://wm-ipx-11.stream.tv1.de/22003mdr1thueringen/live/3087mdr_thue/de_44.wma',
'METAL-ONLY ' => 'http://80.190.246.22:6666',
'Memoryradio' => 'http://www.memoryradio.de:4000/',
'Metal Refine' => 'http://www.metal-refinement.de:8088',
'MotorFM' => 'http://85.25.145.179:80/motorfm.mp3',
'Muni.Hardest' => 'http://84.19.188.7:8010',
'N-JOY' => 'mms://213.254.239.66/ndr$live$n-joy.wma',
'NDR Info' => 'http://213.200.97.110:8000/ndr/ndrinfo_spezial.mp3',
'NDR Kultur' => 'mms://213.254.239.60/ndr$live$ndrkultur.wma',
'NDR1 90.3' => 'mms://213.254.239.66/ndr$live$ndr903.wma',
'NDR1 NiederS' => 'mms://213.254.239.60/ndr$live$ndr1niedersachsen.wma',
'NDR1 Welle' => 'mms://213.254.239.66/ndr$live$ndr1wellenord.wma',
'NDR2' => 'mms://213.254.239.60/ndr$live$ndr2.wma',
'NE-WS 89.4' => 'mms://213.200.75.248/news894$livestream.wma',
'Neue Welle' => 'http://www.meine-neue-welle.de/dieneuewelle.m3u',
'NightFly' => 'http://pia-server.com:8080/',
'Nightline' => 'http://radio1.nightline-radio.de:8000',
'Nordwest' => 'mms://a346.l2377539860.c23775.g.lm.akamaistream.net/D/346/23775/v0001/reflector:39860',
'OldieStar' => 'http://www.digitalradiostream.de:8000',
'OnkelzRadio' => 'http://80.67.26.220:8000/',
'PELLENZRADIO' => 'http://pellenzradio.info:8020/',
'POP-Radio 1' => 'http://tobit.pop-radio.de:8000',
'POP-Radio 2' => 'http://tobit.pop-radio.de:8030',
'POP-Radio 3' => 'http://tobit.pop-radio.de:8060',
'PRIDE1' => 'http://p1standby.serveftp.org:8100',
'Powerhitz' => 'http://scfire-chi0l-2.stream.aol.com:80/stream/1044',
'Punkrockers' => 'http://punkrockers.kicks-ass.net:8003/',
'R.AktivFM' => 'http://stream.radioaktiv.fm:8000',
'R.Arabella ' => 'http://83.246.121.39:8010/arabella.mp3',
'R.Bielefeld ' => 'http://stream.radiobielefeld.de:8000/live',
'R.Bonn' => 'http://ga-stream01.ga-bonn.de:80/live128',
'R.Brocken' => 'http://62.75.176.44/brocken-high',
'R.Chemnitz' => 'mms://stream.green.ch/RadioChemnitz',
'R.Chiemgau' => 'http://chiemgau.blm.netlantic.net:80/live.mp3',
'R.Cottbus' => 'mms://d85195723.w.tis.core005.cdn.streamfarm.net/21001radio_cottbus/live/3142radio_cottbus/de_48.wma',
'R.Crazy Oper' => 'http://stream2139.init7.net:80',
'R.Dresden' => 'mms://stream.green.ch/RadioDresden',
'R.Electracks' => 'http://peace.str3am.com:6390/',
'R.Erding' => 'mms://stream.hitwelle.de/hitwelle',
'R.Fantasy' => 'http://stream.fantasy.de:8000/radiofantasy.mp3',
'R.Harmony' => 'mms://213.200.64.231/harmony$livestream.wma',
'R.Hellwig' => 'http://s2.global-streaming.net:8100/',
'R.Jumpstyle' => 'http://88.198.13.153:16055',
'R.Kiepenkerl' => 'http://rs1.radiostreamer.com:8810',
'R.Lausitz' => 'mms://stream.green.ch/RadioLausitz',
'R.Leipzig' => 'mms://stream.green.ch/RadioLeipzig',
'R.Melodie' => 'http://62.146.11.24/3107melodie_live.mp3',
'R.Multikulti' => 'mms://stream2.rbb-online.de/wmtencoder/multikulti-live.wma',
'R.Nachteule' => 'ttp://radio-nachteule.de:8010/',
'R.Norderney' => 'http://radiosws.s2.onlinestream.de/listen1.m3u',
'R.Primavera' => 'http://hellfireserver.de:8000/primavera.mp3',
'R.Regenbogen' => 'mms://195.52.221.166/regenbogenweb$livestream.wma',
'R1Live' => 'http://www.r1live.de:8000',
'R2 Offbeat' => 'http://webchannels.sr-online.de:8000/sr2offbeat',
'RBB 1' => 'mms://stream2.rbb-online.de/wmtencoder/radioeins-live.wma',
'RBB Info' => 'mms://webstream1.rbb-online.de/wmtencoder/inforadio-live.wma',
'RMN Power' => 'http://server.powerstream.de:30846',
'RMN Relaxed' => 'http://server.rmnrelax.de:80/',
'RMN Schlager' => 'http://server1.schlagerhoelle.de:30842/',
'RMNradio' => 'http://streamserver1.radiomelodienet.de:8022/',
'RPR1 Groove' => 'mms://217.151.151.46/RPR1-GROOVE-LOUNGE',
'RPR1 Live' => 'mms://217.151.151.46/RPR1',
'RPR1 Rock' => 'mms://217.151.151.46/RPR1-ROCK',
'RPR1NewSongs' => 'mms://217.151.151.46/RPR1-NEW-SONGS',
'RPR1RnB,Soul' => 'mms://217.151.151.46/RPR1-RnB',
'RPR2' => 'mms://217.151.151.46/RPR2',
'RSA Radio' => 'http://212.227.99.26:7000/rsa',
'R.7' => 'http://213.251.129.69:8010/',
'R.700' => 'http://s1.global-streaming.net:11600/',
'R.AENA' => 'http://85.214.85.83:8055/dslTest',
'R.FreeFM' => 'http://freefm.lauschangriff.org:8100',
'R.Fritz' => 'mms://stream2.rbb-online.de/wmtencoder/fritz-live.wma',
'R.Lippe' => 'http://stream.radiolippe.de:8000/live',
'R.Mundus' => 'http://www.radiomundus.de:7000/',
'R.SAW' => 'mms://195.52.221.166/radiosaw$livestream.wma',
'R.TEDDY' => 'http://sc1.streamfox.com:9000',
'R.21' => 'http://cdn1.ice.muc.streamin.de:80/radio21',
'R.Sinnlos' => 'http://85.25.150.183:8300',
'RockAnt' => 'http://mp3.webradio.rockantenne.de:80',
'RockUnity' => 'http://relay.rockunity.com',
'Rockland' => 'http://cdn1.ice.muc.streamin.de:80/rockland',
'Rockradio' => 'http://rockradio.de:8090',
'SPUTNIK Club' => 'http://62.146.66.19:80/22005mdr/live/3087mdr_sputnik_ch_club.mp3',
'SPUTNIK Live' => 'http://d85195727.i.tis.core005.cdn.streamfarm.net:80/22005mdrsputnik/live/3087mdr_sputnik_live/de_96.mp3',
'SPUTNIK Rock' => 'http://62.146.11.19:80/22005mdr/live/3087mdr_sputnik_ch_rock.mp3',
'SPUTNIKBlack' => 'http://62.146.66.19:80/22005mdr/live/3087mdr_sputnik_ch_black.mp3',
'SPUTNIKIntro' => 'http://62.146.11.19:80/22005mdr/live/3087mdr_sputnik_ch_cd1.mp3',
'SR2 Offbeat ' => 'http://webchannels.sr-online.de:8000/sr2offbeat',
'SR3-Schlager' => 'http://webchannels.sr-online.de:8000/sr3schlagerwelt',
'SR3Oldiewelt' => 'http://webchannels.sr-online.de:8000/sr3oldiewelt',
'SWR Contra' => 'mms://195.52.221.166/swrcontra$live.wma',
'SWR1' => 'mms://213.200.75.252/swr$swr1$live_bw_44.wma',
'SWR2' => 'mms://213.254.239.66/swr$swr2$live.wma',
'SWR3' => 'mms://213.200.75.248/swr3$livestream.wma',
'SWR3' => 'mms://213.254.239.66/swr3$livestream.wma',
'SWR4' => 'mms://213.254.239.66/swr$swr4$live_rp.wma',
'SachsAnhalt' => 'mms://wm-ipx-10.stream.tv1.de/22002mdr1sachsenanhalt/live/3087mdr_mdr1sa_live/de_44.wma',
'Sachsen' => 'mms://wm-ipx-11.stream.tv1.de/22001mdr1sachsen/live/3087mdr_sachsen/de_44.wma',
'ShFM Altern' => 'http://alternative.mthn.net:8700',
'ShFM Black' => 'http://black.mthn.net:8300',
'ShFM Break' => 'http://break.mthn.net:8800',
'ShFM Club' => 'http://club.mthn.net:8200',
'ShFM Elektro' => 'http://electro.mthn.net:8400',
'ShFM House' => 'http://house.mthn.net:8500',
'ShFM Main' => 'http://main.mthn.net:8000',
'Solo Piano' => 'http://208.122.59.30:7794',
'Sonnensender' => 'http://mystreamradio.com:3150/',
'SoundBlack' => 'http://89.149.245.215:80/',
'SoundExtrem' => 'http://89.149.245.201:80',
'SoundHouse' => 'http://housestream.sound-generation.fm:80',
'SoundPop' => 'http://88.198.125.141:80',
'SoundTechno' => 'http://Clubstream.Sound-Generation.FM:11111',
'Spreeradio' => 'MMS://D852143742.W.STO.CORE008.CDN.STREAMFARM.NET/23002SPREERADIO/LIVE/2925SPREERADIO_LIVE/DE_40.WMV',
'Starlight' => 'http://87.118.64.200:8100/',
'Suedstars' => 'http://stream1.suedstars-radio.de:8000/',
'Sun.fm' => 'http://85.214.45.122:10224/',
'Sunshine' => 'http://s2.global-streaming.net:9500',
'TechnoBaseFM' => 'http://dsl.tb-stream.net:80',
'Tiger-Radio' => 'http://85.25.150.17:8000',
'Tillate.com' => 'http://s1.radio.tilllate.com:8080/tilllate_channel1',
'Tillate.com' => 'http://s1.radio.tilllate.com:8080/tilllate_channel21',
'Tillate11' => 'http://s1.radio.tilllate.com:8080/tilllate_channel11',
'Top FM' => 'mms://www.top-fm-webstream.de/top_fm',
'Troisdorf' => 'http://80.237.152.110:9000',
'TruckRadio' => 'http://stream.truckradio.de:8000/',
'TuneBase.FM' => 'http://listen.dsl.tunebase.fm',
'UDing Black' => 'http://webchannels.sr-online.de:8000/unserding-schwarz',
'UDingZukunft' => 'http://webchannels.sr-online.de:8000/unserding-zukunft',
'VirgClassic' => 'http://ogg.smgradio.com/vc160.ogg',
'VirgExtrem' => 'http://ogg.smgradio.com/vx160.ogg',
'VirgGroove' => 'http://ogg.smgradio.com/gr160.ogg',
'VirgRadio' => 'http://ogg.smgradio.com/vr160.ogg',
'WDR Kiraka' => 'http://mp3.stream-a-lot.com/kiraka',
'WDR2' => 'mms://a1367.l672223084.c6722.g.lm.akamaistream.net/D/1367/6722/v0001/reflector:23084',
'WDR3' => 'mms://a1918.l1383638601.c13836.e.lm.akamaistream.net/D/1918/13836/v0001/reflector:38601',
'WDR4' => 'mms://a473.l1383738602.c13837.e.lm.akamaistream.net/D/473/13837/v0001/reflector:38602',
'WDR5' => 'mms://a28.l751837440.c7518.g.lm.akamaistream.net/D/28/7518/v0001/reflector:37440',
'WGUC 90.9' => 'MMS://198.234.121.100/WGUCLIVE',
'Webblaster' => 'http://streaming.wbr1.de:8000',
'Webblaster2' => 'http://87.118.98.89:8010',
'Wilantis' => 'http://217.18.179.34:8000/stream.ogg',
'WoED.fm' => 'http://stream1-1.woed.de:80',
'Wunschradio' => 'http://cdn1.ice.muc.streamin.de:80/wunschradio',
'YOUFM' => 'mms://d85195725.w.tis.core005.cdn.streamfarm.net/17000hr/live/3219youfm/de_48.wma',
'eaR1' => 'http://85.214.25.102:8010',
'eaR2' => 'http://www.earadio.de:8010',
'eaR3' => 'http://www.earadio.de:8020',
'eaR4' => 'http://www.earadio.de:8040',
'enSonic.FM' => 'http://stream.ensonic.fm:8500/',
'jenny.fm' => 'http://stream2.jenny.fm:9000/',
'GrooveSalad' => 'http://scfire-ntc-aa07.stream.aol.com:80/stream/1018',
'SKYDream' => 'http://u12.sky.fm:80/sky_dreamscapes',
'SKYCountry' => 'http://scfire-dtc-aa01.stream.aol.com:80/stream/1019',
'181.FM Hits' => 'http://sc-rly.181.fm:80/stream/1094',
'KDFC' => 'http://6073.live.streamtheworld.com:80/KDFCFM_SC',
'Classic FM' => 'http://media-ice.musicradio.com:80/ClassicFMMP3',
'WCPE' => 'http://audio-mp3.ibiblio.org:8000/wcpe.mp3',
'SKYPianoTrio' => 'http://72.26.204.28:6874/',
'SKYDanceHits' => 'http://72.26.204.18:6844/',
'Smooth Jazz' => 'http://scfire-mtc-aa04.stream.aol.com:80/stream/1005',
'SKYSmoothJzz' => 'http://91.121.3.80:8000/',
'SKYVocal' => 'http://u12.sky.fm:80/sky_vocalsmoothjazz',
'SKYJazz' => 'http://205.188.215.227:8008/',
'OndaTropical' => 'http://174.133.147.90:8000',
'Latino Radio' => 'http://online.radiodifusion.net:8020/',
'SalsaStream' => 'http://205.188.215.231:8010/',
'SKYNew Age' => 'http://scfire-ntc-aa02.stream.aol.com:80/stream/1002',
'AM 1710' => 'http://lin2.ash.fast-serv.com:9022/',
'WNAR' => 'http://live.wnar-am.com:8500/',
'SKY70s' => 'http://scfire-dtc-aa06.stream.aol.com:80/stream/1076',
'SKY80s' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1013',
'SKYOldies' => 'http://91.121.3.80:8010/',
'R.Paradise' => 'http://scfire-ntc-aa02.stream.aol.com:80/stream/1049',
'.977 Hitz' => 'http://scfire-mtc-aa04.stream.aol.com:80/stream/1074',
'80s SKY' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1013',
'SKYLoveMusic' => 'http://91.185.206.240:8000/',
'SKYAlterRock' => 'http://80.94.69.106:6754/',
'SKYClassRock' => 'http://80.94.69.106:6734/',
'SKYSoloPiano' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1004',
'SKYChristian' => 'http://80.94.69.106:6784/',
'SKYSoundtrks' => 'http://80.94.69.106:6774/',
);
############### Ende der Konfiguration #########################
Gruß
Edit: oH man die Zeilen Umbrüche. Einfach copy und paste der WG Editor macht das vielleicht richtig. Kann das jetzt am Handy nicht richten.
Edit2: Zeilenumbrüche gerichtet
Geändert von vlamers (20.11.2012 um 14:58 Uhr)
|

20.11.2012, 14:33
|
|
Benutzer
|
|
Registriert seit: 25.01.2008
Ort: Graz
Beiträge: 79
|
|
...danke dir!!!!
der Editor macht die Zeilenumbrüche leider nicht.
hat aber keine eile, wenn du mal zeit hast würd ich dich nochmals um die beiden scripts bitten.
LG
|

20.11.2012, 14:58
|
|
Erfahrener Benutzer
|
|
Registriert seit: 05.07.2010
Beiträge: 1.182
|
|
So hab die Zeilenumbrüche gerichtet.
Gruß
|

20.11.2012, 15:51
|
|
Benutzer
|
|
Registriert seit: 25.01.2008
Ort: Graz
Beiträge: 79
|
|
danke für deine hilfe, du bist echt super!!!!
auch mit deiner ansagen.pl und config funktioniert es bei mir nicht. jetzt geht gar nix mehr
in der conf hast du die zeile "$radioga="WebRadio$" auskommentiert. ist die wirklich unnötig?
hab die pfade auf /var/lib/mpd/music/Ansagen geändert und in der logdatei nun
2012-11-20 15:38:15.282,Ansagen.pl,WW_WebRadio - no audio output possible (file not found),0s,
keine ahnung, was das wieder ist ... ich mag nimmer
grüße andi
PS nochwas ist mir aufgefallen
im mpd verzeichnis werden die "state und state1" dateien seit kurzem nicht mehr aktualisiert.
vielleicht liegt da der hund begraben??
Geändert von sandy65 (20.11.2012 um 16:07 Uhr)
|

21.11.2012, 11:29
|
|
Erfahrener Benutzer
|
|
Registriert seit: 05.07.2010
Beiträge: 1.182
|
|
Hi,
also da bräuchte ich noch ein paar mehr infos.
Wie sieht deine config aus?
Wie sieht dein Script aus?
Hast du die GA´s imm WG Editor angelegt (WW_... WA_... usw)?
Sind die Ansagen Files wirklich in dem Angegebenen Verzeichniss und hast du zugriff darauf?
Die Zeile ist bei mir auskommentiert, da ich den Radio nicht nutze, nur die Ansagen. Radio ist bei mir ein anderer mpd.
Gruß
|

22.11.2012, 09:55
|
|
Benutzer
|
|
Registriert seit: 25.01.2008
Ort: Graz
Beiträge: 79
|
|
hi,
auf's verzeichnis habe ich zugriff, ich kann die enthaltenen dateien über den relaxx player abspielen. wenn ich eine meldung bei laufendem radio auslöse (zB. aussentemperatur) wird diese meldung angesagt, aber nach beendigung das radio nicht mehr weitergeführt.
im relaxx player sehe ich zuerst den radio stream, dieser wird bei der ansage gelöscht, die ansage steht dann in der aktuellen playlist .. und funkstille.
hier die ansagen.pl (ich glaub das war die letzte funktionierende version)
PHP-Code:
###########
# Ansagen #
###########
# Wiregate-Plugin
# (c) 2012 Fry under the GNU Public License version 2 or later
# $plugin_info{$plugname.'_cycle'}=0; return 'deaktiviert';
use POSIX qw(floor);
use feature "switch"; # aktiviert given...when-Struktur von Perl 5.10
# Defaultkonfiguration
my $speechdir='/var/lib/mpd/music/Ansagen';
my $mpddir='/var/lib/mpd/music';
my %channels=('default'=>'welcome');
my $beepchannel='paging';
my $beep = "Beep/03d.wav";
my @additional_subscriptions=();
my %mpdhost=('default'=>'127.0.0.1/6600');
my $mode='mpd';
my $radioga=undef;
my %stations=(); # Internet-Radiostationen
my $verstaerker = '2/0/4';
# Konfigurationsfile einlesen
my $conf=$plugname; $conf.='.conf' unless $conf=~s/\.pl$/.conf/;
open FILE, "</etc/wiregate/plugin/generic/conf.d/$conf" || return "no config found";
my @lines = <FILE>;
close FILE;
eval("@lines");
# speechdir muss im mpddir liegen!
$speechdir=~s!/$!!;
$mpddir=~s!/$!!;
return "config error: $@" if $@ || ($mode eq 'mpd' && $speechdir !~ /^$mpddir/);
# Aufrufgrund ermitteln
my $event=undef;
if (!$plugin_initflag)
{ $event='restart'; } # Restart des daemons / Reboot
elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'})
{ $event='modified'; } # Plugin modifiziert
elsif (%msg) { $event='bus'; } # Bustraffic
elsif ($fh) { $event='socket'; } # Netzwerktraffic
else { $event='cycle'; } # Zyklus
chdir $speechdir;
if($event=~/restart|modified/)
{
my %gas=();
# Erstaufruf - an GAs anmelden, auf die die Muster in %channels zutreffen
for my $k (grep /^$plugname\_/, keys %plugin_info)
{
delete $plugin_info{$k};
}
# Rueckwaertskompatible Behandlung von eibgaconf
for my $ga (grep /^[0-9\/]+$/, keys %eibgaconf)
{
my $name=$eibgaconf{$ga}{name};
next unless defined $name;
my $channel_found=undef;
for my $pat (keys %channels)
{
next if $pat eq 'default' || $name!~/$pat/;
$channel_found=$channels{$pat};
last;
}
next unless $channel_found;
$gas{$channel_found}++;
$plugin_subscribe{$ga}{$plugname}=1;
if($name=~/$radioga/)
{
speak($channel_found,$name,'AUS');
$plugin_info{$plugname.'_radio_'.$channel_found}='AUS';
plugin_log($plugname, 'Internetradio auf Kanal '.$channel_found.', GA='.$ga);
}
}
my $channel_found=$channels{'default'};
if($channel_found)
{
for my $ga (@additional_subscriptions)
{
my $name=$eibgaconf{$ga}{name};
$gas{$channel_found}++;
$plugin_subscribe{$ga}{$plugname}=1;
if($name=~/$radioga/)
{
speak($channel_found,$name,'AUS');
$plugin_info{$plugname.'_radio_'.$channel_found}='AUS';
plugin_log($plugname, 'Internetradio auf Kanal '.$channel_found.', GA='.$ga);
}
}
}
$plugin_info{$plugname.'_cycle'}=0;
return join ' ', map $_.'->'.$gas{$_}, keys %gas;
}
elsif($event=~/bus/)
{
return if $msg{apci} eq "A_GroupValue_Response";
my $ga=$msg{dst};
my $val=$msg{value};
my $dpt=$eibgaconf{$ga}{DPTSubId};
$dpt=1.017 unless defined $dpt; # = Trigger, bedeutet Textansage ohne Daten
my $name=$eibgaconf{$ga}{name};
my $channel=$channels{default};
my $pattern=$name;
for my $pat (keys %channels)
{
if($pattern=~s/$pat//)
{
$channel=$channels{$pat};
last;
}
}
# Radiosender bei dpt 16 (Text=Sendername)
if($mode eq 'mpd' && $name=~/$radioga/ && $dpt=~/^16/)
{
if($msg{apci} eq 'A_GroupValue_Read')
{
# Host und Port ermitteln
$mpdhost{$channel}=~m!^\s*(.*)\s*/\s*(.*)\s*$!;
my $host=$1; my $port=$2;
# aus irgendeinem Grund funktioniert %ENV im wiregate-Plugin nicht
# also so:
my $mpc=checkexec('mpc');
$mpc="export MPD_HOST=$host; export MPD_PORT=$port; $mpc";
# Laeuft gerade das Radio oder eine Ansage?
my $lfd_radio = $plugin_info{$plugname.'_radio_'.$channel} ne 'AUS';
my $lfd_ansage = `$mpc`=~/playing/s && !$lfd_radio;
# knx_write($verstaerker ,1,1);
return unless $lfd_radio && !$lfd_ansage;
my $mpcout=`$mpc`;
$mpcout=~s/\n.*//s; # erste Zeile rausschneiden
knx_write($ga, $mpcout, undef, 0x40); # response, DPT aus eibga.conf
}
else
{
$val=~s/\000*$//; # streiche Nullen am Ende
return speak($channel, $name, $val);
}
}
return unless $msg{apci} eq 'A_GroupValue_Write';
# Hole alle verfuegbaren Durchsagedateien
my $find=checkexec('find');
my @speech=split /\n/, `$find . -name '*.mp3'`;
map s!^\./!!, @speech; # Pfade relativ zum speechdir
return 'no speech files found' unless @speech;
my @statement=();
# Praefix bei Gefahrenwarnung (dpt 5.005)
push(@statement, words(\@speech, 'Achtung')) if $dpt eq '5.005'; # Gefahrenwarnung
# Textteil (Gruppenadresse ausgesprochen)
push(@statement, words(\@speech, $pattern)) if defined $pattern;
# Informationsteil (Inhalt des Telegramms)
given($dpt)
{
when (1.001) # An/Aus
{
push(@statement, 'Zahlen/'.($val?'an':'aus').'.mp3');
}
when (1.008) # Hoch/Runter
{
push(@statement, 'Zahlen/'.($val?'hoch':'runter').'.mp3');
}
when(1.009) # Auf/Zu
{
push(@statement, 'Zahlen/'.($val?'auf':'zu').'.mp3');
}
when(2.007) # Auf/Ab/Stop
{
push(@statement, 'Zahlen/'.($val==1?'auf':($val==-1?'ab':'stop')).'.mp3');
}
when(5.005) # Gefahrenwarnung
{
my %warnstufe=(0=>'keine_Meldung', 1=>'Hinweis', 2=>'Vorwarnung', 3=>'Warnung', 4=>'Gefahr', 5=>'Gefahr_hoch');
push(@statement, 'Warnung/'.$warnstufe{$val}.'.mp3');
}
when([5.010,7.001,12.001]) # Ordinalzahl
{
push(@statement, number(\@speech, $val, -1));
}
when([3.007,6.010,8.001,13.001]) # Kardinalzahl
{
push(@statement, number(\@speech, $val));
}
when([5.001,6.001]) # Prozent
{
push(@statement, number(\@speech, $val));
push(@statement, 'Zahlen/Prozent.mp3');
}
when(9.001) # Temperatur
{
push(@statement, number(\@speech, $val, 1));
push(@statement, 'Zahlen/Grad.mp3');
}
when(11.001) # Datum
{
if($val=~/^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])/)
{
my @monat=qw(Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember);
push(@statement, number(\@speech, $3, -1));
push(@statement, 'Monate/'.$monat[$2-1].'.mp3') if defined $2 && $2>0 && $2<13;
}
else
{
return "Unbekanntes Datumsformat '$val'";
}
}
when(7.005) # Zeitdauer
{
$val=-$val if $val<0;
my $h=floor($val/3600);
$val-=3600*$h;
my $m=floor($val/60);
$val-=60*$m;
if($h)
{
push(@statement, number(\@speech, $h));
push(@statement, 'Zeiten/Stunden.mp3');
}
if($h || $m)
{
push(@statement, number(\@speech, $m));
push(@statement, 'Zeiten/Minuten.mp3');
}
push(@statement, number(\@speech, $val));
push(@statement, 'Zeiten/Sekunden.mp3');
}
when(10.001) # Uhrzeit
{
if($val=~/^(Mo|Di|Mi|Do|Fr|Sa|So)\s+([0-9][0-9])\:([0-9][0-9])/)
{
push(@statement, "Wochentage/$1.mp3");
push(@statement, number(\@speech, $2));
push(@statement, "Zeiten/Uhr.mp3");
push(@statement, number(\@speech, $3)) if int($3)>0;
}
elsif($val=~/^([0-9][0-9])\:([0-9][0-9])/)
{
push(@statement, number(\@speech, $1));
push(@statement, "Zeiten/Uhr.mp3");
push(@statement, number(\@speech, $2)) if int($2)>0;
}
else
{
return "Unbekanntes Uhrzeitformat '$val'";
}
}
when(/^16/) # Freitext
{
$val=~s/\000*$//; # streiche Nullen am Ende
push(@statement, words(\@speech, $val));
}
when(1.017) # Trigger, kein Datenzusatz
{}
default # kein Datenzusatz, aber mit Logeintrag
{
return "Datentyp $dpt nicht implementiert";
}
}
# Das komplette Statement in die Ausgabe geben
return speak($channel, $name, @statement);
}
return;
sub checkexec
{
my @path = split /:/, $ENV{PATH};
map s|(.)/$|$1|, @path;
for (@path)
{
my $full="$_/$_[0]";
if(-x $full)
{
return "$_/$_[0]";
}
}
die "$_[0] must be in your PATH and executable.\n";
}
sub words
{
my $speech=shift;
my $pattern=shift;
# Konstruiere die abzuspielenden File(s) aus dem GA-Kuerzel
# erster Versuch: eine Datei passt komplett auf das Muster im Kuerzel
my $pat1=$pattern;
$pat1=~s/[_\s]+/.*?/g; # allgemeine Fassung
# $pat1=~s/\s+.*$//; # meine spezielle GA-Struktur
# $pat1=~s/_+/.*?/g; # meine spezielle GA-Struktur
$pat1='.*'.$pat1.'.*\.mp3$';
my @hits=();
my $hit=bestmatch($speech,$pat1);
push(@hits, $hit) if $hit; # gefunden
unless(@hits)
{
$pattern='_'.$pattern;
$pattern=~s/\s+/_/g; # allgemeine Fassung
# $pattern=~s/\s+.*$//; # meine spezielle GA-Struktur
# zweiter Versuch: aus Kuerzeln die Bausteine zusammenbauen
while($pattern=~s/^_([^_]+)//)
{
my $pat2=$1.'\.mp3$';
$hit=bestmatch($speech,$pat2);
push(@hits, $hit) if $hit; # gefunden
}
if($pattern)
{
$pattern=~s/_/.*/g; # Restnachricht
$pattern.='.*\.mp3$';
$pattern='.*'.$pattern;
$hit=bestmatch($speech,$pattern);
push(@hits, $hit) if $hit; # gefunden
}
}
return @hits;
}
sub number
{
my $speech=shift;
my $x=shift; $x=~s/,/./;
my $digits=0;
$digits=shift if @_; # max. Anzahl Nachkommastellen, -1 fuer Ordinalzahlen
my @hits=();
if($x<0)
{
push(@hits, 'Zahlen/minus.mp3');
$x=-$x;
$digits=0 if $digits<0; # keine negativen Ordinalzahlen
}
my $t=$digits<0?'o':'c';
my $n=floor($x);
my $m=$x-$n;
# Manche Zahlen existieren direkt als WAV
# von 0-12, sowie die runden 10er und 100 sowie 1000
# MUESSEN existieren, und zwar als Kardinalzahlen (c4.mp3),
# Ordinalzahlen (o6.mp3), die Zehner ausserdem mit vorangestelltem 'und'
# (u30.mp3, uo30.mp3)
if(-f 'Zahlen/'.$t.$n.'.mp3')
{
push(@hits, 'Zahlen/'.$t.$n.'.mp3');
}
else
{
return if($n>=1000000); # Zahlen ueber eine Million nicht implementiert
if($n>=1000)
{
$digits=0 if $digits>0; # waere Pseudo-genauigkeit und zu langer Text
if($n==1000)
{
push(@hits, 'Zahlen/'.$t.'1000.mp3');
$n = 0;
}
else
{
my $m=floor($n/1000);
@hits=number($speech,$m,0) if $m>1;
$n %= 1000;
if($n)
{
push(@hits, 'Zahlen/c1000.mp3');
}
else
{
push(@hits, 'Zahlen/'.$t.'1000.mp3');
}
}
if($n>=100 && $n<200)
{
push(@hits, 'Zahlen/u1.mp3');
}
}
if(-f 'Zahlen/'.$t.$n.'.mp3')
{
push(@hits, 'Zahlen/'.$t.$n.'.mp3');
}
elsif($n>100)
{
$digits=0 if $digits>0; # waere Pseudo-genauigkeit und zu langer Text
my $h = int($n/100);
$n %= 100;
push(@hits, 'Zahlen/u'.$h.'.mp3') if $h>1;
if($n)
{
push(@hits, 'Zahlen/c100.mp3');
}
else
{
push(@hits, 'Zahlen/'.$t.'100.mp3');
}
}
my $d = $n % 10;
if(-f 'Zahlen/'.$t.$n.'.mp3')
{
push(@hits, 'Zahlen/'.$t.$n.'.mp3');
}
else
{
my $z = $n-$d;
push(@hits, 'Zahlen/u'.$d.'.mp3');
push(@hits, 'Zahlen/u'.$t.$z.'.mp3');
}
}
if($digits>0)
{
$m = sprintf "%.$digits"."f", $m;
if($m>0)
{
push(@hits, 'Zahlen/Komma.mp3');
for (1..$digits)
{
$m*=10.; my $d=floor($m); $m-=$d;
push(@hits, "Zahlen/c$d.mp3");
}
}
}
return @hits;
}
sub bestmatch
{
my $speech=shift;
my $pattern=shift;
my @hits=sort { length($a) <=> length($b) } grep /$pattern/i, @{$speech};
return @hits ? (shift @hits) : undef;
}
sub speak
{
my $channel=shift; # ALSA-Channel
my $name=shift; # Name der Ansage (aus eibga.conf) - fuers Log
my $retval='';
my $date=checkexec('date');
my $datetime=`$date +"%F %X"`;
$datetime=~s/\s*$//s;
# Fuer Russound-Ausgabe: Star Trek 'Beep' vorweg weckt Russound (und User) fuer Ansage auf
if($channel=~/$beepchannel/ && $name!~/$radioga/)
{
my $lastbeep=$plugin_info{$plugname.'_lastbeep_'.$channel};
# max ein Beep pro Minute
if(!defined $lastbeep || time()>$lastbeep+60)
{
unshift(@_, $beep);
$plugin_info{$plugname.'_lastbeep_'.$channel}=time();
}
}
if(@_)
{
if($mode eq 'aplay')
{
my $aplay=checkexec('aplay');
system $aplay, '-c2', "-D$channel", @_;
map s!^.*/(.*?)\.mp3!$1!, @_;
$retval.=$channel.':'.(join ' ', @_);
}
elsif($mode eq 'mpd')
{
# Host und Port ermitteln
$mpdhost{$channel}=~m!^\s*(.*)\s*/\s*(.*)\s*$!;
my $host=$1; my $port=$2;
# aus irgendeinem Grund funktioniert %ENV im wiregate-Plugin nicht
# also so:
my $mpc=checkexec('mpc');
$mpc="export MPD_HOST=$host; export MPD_PORT=$port; $mpc";
# Laeuft gerade das Radio oder eine Ansage?
my $lfd_radio = $plugin_info{$plugname.'_radio_'.$channel} ne 'AUS';
my $lfd_ansage = `$mpc`=~/playing/s && !$lfd_radio;
# Sonderfall Internetradio statt Sprachausgabe
if($name=~/$radioga/)
{
my $val=$_[0];
if($val=~s/V([+-]?[0-9X])$//)
{
my $vol=$1;
$vol = ($vol eq 'X' ? 100: 10*$vol);
system "$mpc volume $vol"; # ermoeglicht gleichzeitig Sender u Lautstaerke festzulegen
}
if($val eq 'AUS')
{
system "$mpc clear";
$plugin_info{$plugname.'_radio_'.$channel}='AUS';
knx_write($verstaerker ,0,1);
}
elsif($val =~ /^VOLUME\s*([+-]?[0-9]+)/)
{
system "$mpc volume $1";
}
elsif(grep /$val/i, keys %stations)
{
my $station=undef;
unless(defined $stations{$val})
{
my @hits=grep /$val/i, sort { length($a) <=> length($b) } keys %stations;
$val=shift @hits;
}
$station=$stations{$val};
my $wget=checkexec('wget');
# MusicPal-Links "uebersetzen"
if($station=~/freecom\.vtuner\.com/)
{
$station=~s!freecom\.vtuner\.com!vtuner.com!;
$station=~s!setupapp/fc/asp!setupapp/guide/asp!;
$station=~s!dynam.*?\.asp!dynampls.asp!;
$station=~s!\?ex45v=.*\&id=!\?id=!;
}
# vtuner-Links "uebersetzen"
$station = `$wget 2>/dev/null -O - $station` if $station=~/vtuner/;
system "$mpc clear" unless $lfd_ansage; # nur leeren falls abgespielt
system "$mpc add \"$station\"";
plugin_log($plugname, "$mpc add \"$station\"");
system "$mpc play" unless `$mpc`=~/playing/s; # starten falls noch nicht aktiv
$plugin_info{$plugname.'_radio_'.$channel}=$station;
knx_write($verstaerker ,1,1);
$retval.="$channel:Radiosender '$val'='$station'";
}
else
{
$retval.="Unbekannter Radiosender '$val'";
}
}
else # Regelfall: Sprachausgabe
{
system "$mpc update"; # Aktualisierung verfuegbarer Soundclips
push @_, "silence.mp3"; # kurze Pause zwischen Ansagen
map s!^/*!$speechdir/!, @_; # alle Eintraege relativ zum speechdir
map s!^$mpddir/!!, @_; # mpd braucht einen Pfadnamen relativ zum music-Dir
map s!/+!/!, @_; # zur Sicherheit
push @_, $plugin_info{$plugname.'_radio_'.$channel} if $lfd_radio; # nach der Ansage wieder zurueck aufs Radio
# wird momentan noch was gespielt?
# dann Playlist leeren, ggf Radio stoppen falls abgespielt
system "$mpc crossfade 0"; # nur leeren falls abgespielt
system "$mpc clear" unless $lfd_ansage;
# ein Fall noch zu klaeren: wenn Radio laeuft und zwei Ansagen kurz hintereinander kommen,
# wird die zweite die erste unterbrechen, weil $lfd_ansage hier (inkorrekt) 0 sein wird.
system "$mpc add \"".(join "\" \"", @_)."\"";
# plugin_log($plugname, "$mpc add \"".(join "\" \"", @_)."\"");
system "$mpc play" unless `$mpc`=~/playing/s; # starten falls noch nicht aktiv
knx_write($verstaerker ,1,1);
map s!^.*/(.*?)\.mp3!$1!, @_;
$retval.=$channel.':'.(join ' ', @_);
}
}
else
{
$retval.="$name - no output (mpd or aplay) defined";
}
}
else
{
$retval.="$name - no audio output possible (file not found)";
}
return $retval;
}
und die conf datei:
PHP-Code:
#!/usr/bin/perl
$speechdir='/var/lib/mpd/music/Ansagen/';
%channels=(
'^WW_'=>'pakueche',
# zB "WW_Die Aussentemperatur betraegt"
'^WP_'=>'pawohn',
# zB "WP_Folgende Fenster sind geoeffnet"
'^WM_'=>'music',
# zB "WM_Folgende Fenster sind geoeffnet"
'default'=>'pakueche' # die GAs in additional_subscriptions
);
$beepchannel='pakueche|pawohn';
$beep = sprintf "Beep/%02d.wav", 3; # int(rand(32))+1 fuer Zufallsbeep
#@additional_subscriptions=qw(0/7/245 0/7/246 6/2/186);
@additional_subscriptions=();
# Ausgabeoptionen
$mode='mpd'; # mpd or aplay
# die folgenden Eintraege werden nur fuer mpd benoetigt
$mpddir='/var/lib/mpd/music';
%mpdhost=(
'pakueche'=>'127.0.0.1/6600',
'pawohn'=>'127.0.0.1/6601',
'music'=>'127.0.0.1/6602',
);
# Integriertes Internetradio, funktioniert NUR mit $mode='mpd',
# GA-Kuerzel nach diesem Muster rufen das Radio auf
#$radioga='^...MusicPlayer';
$radioga='WebRadio$';
# solche GAs muessen Datentyp DPT 16 haben und uebertragen im Datenteil den Sendernamen
# sowie Kommandos wie 'AUS' oder 'VOLUME 30' oder 'VOLUME +10',
# es ist auch moeglich, in einem einzigen Aufruf Sender und Lautstaerke festzulegen:
# zB knx_write($ga, 'Bayern1 V3', 16); setzt Lautstaerke auf 30%, 'bayern1 VX' auf 100%
# Tabelle von Sendernamen, nicht alle sind <=14 Zeichen und damit aufrufbar...
# die meisten Links sind UNGETESTET!
%stations = (
'Antenne' => 'http://livestream.antenne.at',
'Arabella' => 'http://stream01.arabella.vss.kapper.net:8000/',
'Eins' => 'http://stream01.energy.at:8000/enn',
'Bayern1' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w10a',
'Bayern2' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w11a',
'Bayern3' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w12a',
'BRKlassik' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w13a',
'B5aktuell' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w14a',
'B5plus' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w15a',
'FFH' => 'http://streams.ffh.de/radioffh/mp3/hqlivestream.mp3',
'FFHTop40' => 'http://streams.ffh.de/ffhchannels/mp3/hqtop40.mp3',
'FFH80er' => 'http://streams.ffh.de/ffhchannels/mp3/hq80er.mp3',
'FFHRock' => 'http://streams.ffh.de/ffhchannels/mp3/hqrock.mp3',
'FFHElektro' => 'http://streams.ffh.de/ffhchannels/mp3/hqelectrobeatz.mp3',
'FFHEurodance' => 'http://streams.ffh.de/ffhchannels/mp3/hqeurodance.mp3',
'FFHDeutsch' => 'http://streams.ffh.de/ffhchannels/mp3/hqdeutsch.mp3',
'FFHSoundtrck' => 'http://streams.ffh.de/ffhchannels/mp3/hqsoundtrack.mp3',
'FFHHits4Kids' => 'http://streams.ffh.de/ffhchannels/mp3/hqhits4kids.mp3',
'FFHJazz' => 'http://streams.ffh.de/ffhchannels/mp3/hqjazz.mp3',
'FFH90er' => 'http://streams.ffh.de/ffhchannels/mp3/hqspezial.mp3',
'FFHLounge' => 'http://streams.ffh.de/ffhchannels/mp3/hqlounge.mp3',
'FFHLovesongs' => 'http://streams.ffh.de/ffhchannels/mp3/hqspezial1.mp3',
'FFHAlternatv' => 'http://streams.ffh.de/ffhchannels/mp3/hqalternative.mp3',
'1Live Diggi' => 'http://gffstream.ic.llnwd.net/stream/gffstream_einslive_b',
'1Live Kunst' => 'http://gffstream.ic.llnwd.net/stream/gffstream_einslive_a',
'1Live' => 'http://gffstream.ic.llnwd.net/stream/gffstream_stream_wdr_einslive_a',
'2Radio' => 'http://88.198.50.10:8020',
'80s' => 'http://64.236.34.67:80/stream/1040',
'89.0 RTL' => 'http://62.75.176.45/rtl-high',
'Alpen-Radio' => 'http://cdn1.ice.muc.streamin.de/alpenradio',
'BHJMS-Radio1' => 'http://bhjms-streamserver.mscs.net:8000/',
'BIG FM' => 'http://www.bigfm.de/webradio/bigfm-high.m3u',
'BS Allgenres' => 'http://www.besonic.fm/allgenres',
'BS HipHop' => 'http://besonic.fm:8000/hiphopsoulurban',
'BS JazzBlues' => 'http://besonic.fm:8000/jazzblues',
'BS MixedUP' => 'http://besonic.fm:8000/mixedup',
'BS Pop' => 'http://besonic.fm:8000/Pop',
'BSAlternativ' => 'http://besonic.fm:8000/rockalternative',
'BavOpenRadio' => 'http://gffstream.ic.llnwd.net/stream/gffstream_w9b',
'BlackBeats' => 'http://blackbeats.fm:13000/',
'Blackmusic' => 'http://listen.bmradio.de',
'Blitz-Radio' => 'http://blitz-stream.de:8000/',
'Blu.FM' => 'http://sc1.netstreamer.net:9800/',
'Br4 Zeiglers' => 'http://80.252.104.101:8000/zeiglerswwdp',
'CFNYFM' => 'http://208.80.52.106/CFNYFM',
'CHROMANOV' => 'http://212.112.241.88:8000/',
'Chat-Radio' => 'http://chatradio.myftp.org:8202',
'Citybull' => 'http://citybull.net:11000/',
'ClubNatur.FM' => 'http://server2.digital-webstream.de:7800',
'CrossChannel' => 'http://62.146.11.24/3095crosschannel_dsl.mp3',
'DEFJAY.DE' => 'http://sc1.netstreamer.net:8040/',
'DLF' => 'http://www.dradio.de/streaming/dlf_hq_ogg.m3u',
'DLR Kultur' => 'http://www.dradio.de/streaming/dkultur_hq_ogg.m3u',
'Dancefox' => 'http://s5.pop-stream.de:9000/',
'DeluxeJazz' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/13000deluxe/live/3258radiodeluxe/de_96.mp3',
'DeluxeLounge' => 'http://d852143781.i.sto.core008.cdn.streamfarm.net/13000deluxe/live/3304lounge/de_128.mp3',
'DieNeue107.7' => 'http://cdn1.ice.muc.streamin.de:80/dieneue1077',
'Disco-Beatz' => 'http://85.214.43.232:1598/',
'Discodance' => 'http://discodancefoxradio.eu:25819',
'Discoradio' => 'http://discoradio.fabbricadigitale.it/asx/discoradio.asx',
'Dt Welle' => 'http://metafiles.gl-systemhaus.de/dw/radio_de_64.m3u',
'ELDORADIO' => 'http://sender.eldoradio.de:8000/128',
'ERF Radio' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/3212erf_96_live.mp3',
'Enc Ismaning' => 'http://mp3.webradio.antenne.de:80',
'Enjoy' => 'http://91.121.29.176:9000/',
'EnrgieBerlin' => 'mms://213.200.97.107/energyberlin$livestream.wma',
'EnrgieBremen' => 'mms://213.200.97.107/energybremen$livestream.wma',
'EnrgieHH' => 'mms://213.200.97.107/energyhamburg$livestream.wma',
'EnrgieM' => 'mms://213.200.97.107/energymuenchen$livestream.wma',
'EnrgieN' => 'mms://213.200.97.107/energynuernberg$livestream.wma',
'EnrgieS' => 'mms://213.200.97.107/energystuttgart$livestream.wma',
'EnrgieSachsn' => 'mms://62.26.161.89/energysachsen$livestream.wma',
'FFN' => 'http://rs20.stream24.org:8000/stream',
'Fernsehen' => 'mms://80.190.139.69/11008bmt/live/3338s10rfo/300.wmv?cid=60921&dummy=.wmv',
'Filmradio' => 'http://212.123.103.171:8000/',
'GameSports' => 'http://195.13.63.169:8200/',
'Gamer-FM' => 'http://82.149.224.55:8500/',
'Gong FM' => 'http://213.186.33.86:8321/gongfm.mp3',
'Gong Live' => 'http://radiator.nci.de:8000/live',
'GothicFan' => 'http://85.214.43.100:8000',
'HR Info' => 'http://d851957213.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hrinfo/de_96.mp3',
'HR1' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hr1/de_96.mp3',
'HR2' => 'http://hr.streamfarm.net/cms/_vm100/radio/live/hr2_cms.asx',
'HR3' => 'http://d85195728.i.tis.core005.cdn.streamfarm.net:80/17000hr/live/3435hr3/de_96.mp3',
'HR4' => 'http://hr.streamfarm.net/cms/_vm100/radio/live/hr4_cms.asx',
'Hit-R.Ant' => 'MMS://213.200.64.231/ANTENNE1$LIVESTREAM2.WMA',
'Hitradio 77' => 'http://80.154.38.77:8000/',
'HotBeats FM' => 'http://break.hotbeats.fm:9999/',
'House-Musik' => 'http://85.214.92.77:8000',
'Impact Punk' => 'http://85.214.37.96:8000/',
'JUMP' => 'mms://wm-ipx-11.stream.tv1.de/22004mdrjump/live/3087mdr_jump_live/de_44.wma',
'Jack FM' => 'http://sc1.streamfox.com:8050',
'KlassikRadio' => 'http://str0.creacast.com:80/klassik1',
'Krautrock' => 'http://krautrock.pop-stream.de:7592/',
'Kronehit' => 'http://kronehit.sil.at:8016',
'LeFunkBoat' => 'http://lefunkboat.com:8000/',
'M94.5' => 'http://stream.lrz-muenchen.de:31337/m945-hq.mp3',
'MAIN.FM' => 'http://87.106.14.18:8000/',
'MDR Figaro' => 'MMS://D621466636.W.IPX.CORE001.CDN.STREAMFARM.NET/22007MDRFIGARO/LIVE/3087MDR_FIGARO_LIVE/DE_44.WMA',
'MDR Info' => 'MMS://D621466636.W.IPX.CORE001.CDN.STREAMFARM.NET/22006MDRINFO/LIVE/3087MDR_INFO_LIVE/DE_44.WMA',
'MDR Klassik' => 'http://62.146.11.19:80/22008mdrklassik/live/3087mdrklassik/klassik_128.mp3',
'MDR1 Thuerin' => 'mms://wm-ipx-11.stream.tv1.de/22003mdr1thueringen/live/3087mdr_thue/de_44.wma',
'METAL-ONLY ' => 'http://80.190.246.22:6666',
'Memoryradio' => 'http://www.memoryradio.de:4000/',
'Metal Refine' => 'http://www.metal-refinement.de:8088',
'MotorFM' => 'http://85.25.145.179:80/motorfm.mp3',
'Muni.Hardest' => 'http://84.19.188.7:8010',
'N-JOY' => 'mms://213.254.239.66/ndr$live$n-joy.wma',
'NDR Info' => 'http://213.200.97.110:8000/ndr/ndrinfo_spezial.mp3',
'NDR Kultur' => 'mms://213.254.239.60/ndr$live$ndrkultur.wma',
'NDR1 90.3' => 'mms://213.254.239.66/ndr$live$ndr903.wma',
'NDR1 NiederS' => 'mms://213.254.239.60/ndr$live$ndr1niedersachsen.wma',
'NDR1 Welle' => 'mms://213.254.239.66/ndr$live$ndr1wellenord.wma',
'NDR2' => 'mms://213.254.239.60/ndr$live$ndr2.wma',
'NE-WS 89.4' => 'mms://213.200.75.248/news894$livestream.wma',
'Neue Welle' => 'http://www.meine-neue-welle.de/dieneuewelle.m3u',
'NightFly' => 'http://pia-server.com:8080/',
'Nightline' => 'http://radio1.nightline-radio.de:8000',
'Nordwest' => 'mms://a346.l2377539860.c23775.g.lm.akamaistream.net/D/346/23775/v0001/reflector:39860',
'OldieStar' => 'http://www.digitalradiostream.de:8000',
'OnkelzRadio' => 'http://80.67.26.220:8000/',
'PELLENZRADIO' => 'http://pellenzradio.info:8020/',
'POP-Radio 1' => 'http://tobit.pop-radio.de:8000',
'POP-Radio 2' => 'http://tobit.pop-radio.de:8030',
'POP-Radio 3' => 'http://tobit.pop-radio.de:8060',
'PRIDE1' => 'http://p1standby.serveftp.org:8100',
'Powerhitz' => 'http://scfire-chi0l-2.stream.aol.com:80/stream/1044',
'Punkrockers' => 'http://punkrockers.kicks-ass.net:8003/',
'R.AktivFM' => 'http://stream.radioaktiv.fm:8000',
'R.Arabella ' => 'http://83.246.121.39:8010/arabella.mp3',
'R.Bielefeld ' => 'http://stream.radiobielefeld.de:8000/live',
'R.Bonn' => 'http://ga-stream01.ga-bonn.de:80/live128',
'R.Brocken' => 'http://62.75.176.44/brocken-high',
'R.Chemnitz' => 'mms://stream.green.ch/RadioChemnitz',
'R.Chiemgau' => 'http://chiemgau.blm.netlantic.net:80/live.mp3',
'R.Cottbus' => 'mms://d85195723.w.tis.core005.cdn.streamfarm.net/21001radio_cottbus/live/3142radio_cottbus/de_48.wma',
'R.Crazy Oper' => 'http://stream2139.init7.net:80',
'R.Dresden' => 'mms://stream.green.ch/RadioDresden',
'R.Electracks' => 'http://peace.str3am.com:6390/',
'R.Erding' => 'mms://stream.hitwelle.de/hitwelle',
'R.Fantasy' => 'http://stream.fantasy.de:8000/radiofantasy.mp3',
'R.Harmony' => 'mms://213.200.64.231/harmony$livestream.wma',
'R.Hellwig' => 'http://s2.global-streaming.net:8100/',
'R.Jumpstyle' => 'http://88.198.13.153:16055',
'R.Kiepenkerl' => 'http://rs1.radiostreamer.com:8810',
'R.Lausitz' => 'mms://stream.green.ch/RadioLausitz',
'R.Leipzig' => 'mms://stream.green.ch/RadioLeipzig',
'R.Melodie' => 'http://62.146.11.24/3107melodie_live.mp3',
'R.Multikulti' => 'mms://stream2.rbb-online.de/wmtencoder/multikulti-live.wma',
'R.Nachteule' => 'ttp://radio-nachteule.de:8010/',
'R.Norderney' => 'http://radiosws.s2.onlinestream.de/listen1.m3u',
'R.Primavera' => 'http://hellfireserver.de:8000/primavera.mp3',
'R.Regenbogen' => 'mms://195.52.221.166/regenbogenweb$livestream.wma',
'R1Live' => 'http://www.r1live.de:8000',
'R2 Offbeat' => 'http://webchannels.sr-online.de:8000/sr2offbeat',
'RBB 1' => 'mms://stream2.rbb-online.de/wmtencoder/radioeins-live.wma',
'RBB Info' => 'mms://webstream1.rbb-online.de/wmtencoder/inforadio-live.wma',
'RMN Power' => 'http://server.powerstream.de:30846',
'RMN Relaxed' => 'http://server.rmnrelax.de:80/',
'RMN Schlager' => 'http://server1.schlagerhoelle.de:30842/',
'RMNradio' => 'http://streamserver1.radiomelodienet.de:8022/',
'RPR1 Groove' => 'mms://217.151.151.46/RPR1-GROOVE-LOUNGE',
'RPR1 Live' => 'mms://217.151.151.46/RPR1',
'RPR1 Rock' => 'mms://217.151.151.46/RPR1-ROCK',
'RPR1NewSongs' => 'mms://217.151.151.46/RPR1-NEW-SONGS',
'RPR1RnB,Soul' => 'mms://217.151.151.46/RPR1-RnB',
'RPR2' => 'mms://217.151.151.46/RPR2',
'RSA Radio' => 'http://212.227.99.26:7000/rsa',
'R.7' => 'http://213.251.129.69:8010/',
'R.700' => 'http://s1.global-streaming.net:11600/',
'R.AENA' => 'http://85.214.85.83:8055/dslTest',
'R.FreeFM' => 'http://freefm.lauschangriff.org:8100',
'R.Fritz' => 'mms://stream2.rbb-online.de/wmtencoder/fritz-live.wma',
'R.Lippe' => 'http://stream.radiolippe.de:8000/live',
'R.Mundus' => 'http://www.radiomundus.de:7000/',
'R.SAW' => 'mms://195.52.221.166/radiosaw$livestream.wma',
'R.TEDDY' => 'http://sc1.streamfox.com:9000',
'R.21' => 'http://cdn1.ice.muc.streamin.de:80/radio21',
'R.Sinnlos' => 'http://85.25.150.183:8300',
'RockAnt' => 'http://mp3.webradio.rockantenne.de:80',
'RockUnity' => 'http://relay.rockunity.com',
'Rockland' => 'http://cdn1.ice.muc.streamin.de:80/rockland',
'Rockradio' => 'http://rockradio.de:8090',
'SPUTNIK Club' => 'http://62.146.66.19:80/22005mdr/live/3087mdr_sputnik_ch_club.mp3',
'SPUTNIK Live' => 'http://d85195727.i.tis.core005.cdn.streamfarm.net:80/22005mdrsputnik/live/3087mdr_sputnik_live/de_96.mp3',
'SPUTNIK Rock' => 'http://62.146.11.19:80/22005mdr/live/3087mdr_sputnik_ch_rock.mp3',
'SPUTNIKBlack' => 'http://62.146.66.19:80/22005mdr/live/3087mdr_sputnik_ch_black.mp3',
'SPUTNIKIntro' => 'http://62.146.11.19:80/22005mdr/live/3087mdr_sputnik_ch_cd1.mp3',
'SR2 Offbeat ' => 'http://webchannels.sr-online.de:8000/sr2offbeat',
'SR3-Schlager' => 'http://webchannels.sr-online.de:8000/sr3schlagerwelt',
'SR3Oldiewelt' => 'http://webchannels.sr-online.de:8000/sr3oldiewelt',
'SWR Contra' => 'mms://195.52.221.166/swrcontra$live.wma',
'SWR1' => 'mms://213.200.75.252/swr$swr1$live_bw_44.wma',
'SWR2' => 'mms://213.254.239.66/swr$swr2$live.wma',
'SWR3' => 'mms://213.200.75.248/swr3$livestream.wma',
'SWR3' => 'mms://213.254.239.66/swr3$livestream.wma',
'SWR4' => 'mms://213.254.239.66/swr$swr4$live_rp.wma',
'SachsAnhalt' => 'mms://wm-ipx-10.stream.tv1.de/22002mdr1sachsenanhalt/live/3087mdr_mdr1sa_live/de_44.wma',
'Sachsen' => 'mms://wm-ipx-11.stream.tv1.de/22001mdr1sachsen/live/3087mdr_sachsen/de_44.wma',
'ShFM Altern' => 'http://alternative.mthn.net:8700',
'ShFM Black' => 'http://black.mthn.net:8300',
'ShFM Break' => 'http://break.mthn.net:8800',
'ShFM Club' => 'http://club.mthn.net:8200',
'ShFM Elektro' => 'http://electro.mthn.net:8400',
'ShFM House' => 'http://house.mthn.net:8500',
'ShFM Main' => 'http://main.mthn.net:8000',
'Solo Piano' => 'http://208.122.59.30:7794',
'Sonnensender' => 'http://mystreamradio.com:3150/',
'SoundBlack' => 'http://89.149.245.215:80/',
'SoundExtrem' => 'http://89.149.245.201:80',
'SoundHouse' => 'http://housestream.sound-generation.fm:80',
'SoundPop' => 'http://88.198.125.141:80',
'SoundTechno' => 'http://Clubstream.Sound-Generation.FM:11111',
'Spreeradio' => 'MMS://D852143742.W.STO.CORE008.CDN.STREAMFARM.NET/23002SPREERADIO/LIVE/2925SPREERADIO_LIVE/DE_40.WMV',
'Starlight' => 'http://87.118.64.200:8100/',
'Suedstars' => 'http://stream1.suedstars-radio.de:8000/',
'Sun.fm' => 'http://85.214.45.122:10224/',
'Sunshine' => 'http://s2.global-streaming.net:9500',
'TechnoBaseFM' => 'http://dsl.tb-stream.net:80',
'Tiger-Radio' => 'http://85.25.150.17:8000',
'Tillate.com' => 'http://s1.radio.tilllate.com:8080/tilllate_channel1',
'Tillate.com' => 'http://s1.radio.tilllate.com:8080/tilllate_channel21',
'Tillate11' => 'http://s1.radio.tilllate.com:8080/tilllate_channel11',
'Top FM' => 'mms://www.top-fm-webstream.de/top_fm',
'Troisdorf' => 'http://80.237.152.110:9000',
'TruckRadio' => 'http://stream.truckradio.de:8000/',
'TuneBase.FM' => 'http://listen.dsl.tunebase.fm',
'UDing Black' => 'http://webchannels.sr-online.de:8000/unserding-schwarz',
'UDingZukunft' => 'http://webchannels.sr-online.de:8000/unserding-zukunft',
'VirgClassic' => 'http://ogg.smgradio.com/vc160.ogg',
'VirgExtrem' => 'http://ogg.smgradio.com/vx160.ogg',
'VirgGroove' => 'http://ogg.smgradio.com/gr160.ogg',
'VirgRadio' => 'http://ogg.smgradio.com/vr160.ogg',
'WDR Kiraka' => 'http://mp3.stream-a-lot.com/kiraka',
'WDR2' => 'mms://a1367.l672223084.c6722.g.lm.akamaistream.net/D/1367/6722/v0001/reflector:23084',
'WDR3' => 'mms://a1918.l1383638601.c13836.e.lm.akamaistream.net/D/1918/13836/v0001/reflector:38601',
'WDR4' => 'mms://a473.l1383738602.c13837.e.lm.akamaistream.net/D/473/13837/v0001/reflector:38602',
'WDR5' => 'mms://a28.l751837440.c7518.g.lm.akamaistream.net/D/28/7518/v0001/reflector:37440',
'WGUC 90.9' => 'MMS://198.234.121.100/WGUCLIVE',
'Webblaster' => 'http://streaming.wbr1.de:8000',
'Webblaster2' => 'http://87.118.98.89:8010',
'Wilantis' => 'http://217.18.179.34:8000/stream.ogg',
'WoED.fm' => 'http://stream1-1.woed.de:80',
'Wunschradio' => 'http://cdn1.ice.muc.streamin.de:80/wunschradio',
'YOUFM' => 'mms://d85195725.w.tis.core005.cdn.streamfarm.net/17000hr/live/3219youfm/de_48.wma',
'eaR1' => 'http://85.214.25.102:8010',
'eaR2' => 'http://www.earadio.de:8010',
'eaR3' => 'http://www.earadio.de:8020',
'eaR4' => 'http://www.earadio.de:8040',
'enSonic.FM' => 'http://stream.ensonic.fm:8500/',
'jenny.fm' => 'http://stream2.jenny.fm:9000/',
'GrooveSalad' => 'http://scfire-ntc-aa07.stream.aol.com:80/stream/1018',
'SKYDream' => 'http://u12.sky.fm:80/sky_dreamscapes',
'SKYCountry' => 'http://scfire-dtc-aa01.stream.aol.com:80/stream/1019',
'181.FM Hits' => 'http://sc-rly.181.fm:80/stream/1094',
'KDFC' => 'http://6073.live.streamtheworld.com:80/KDFCFM_SC',
'Classic FM' => 'http://media-ice.musicradio.com:80/ClassicFMMP3',
'WCPE' => 'http://audio-mp3.ibiblio.org:8000/wcpe.mp3',
'SKYPianoTrio' => 'http://72.26.204.28:6874/',
'SKYDanceHits' => 'http://72.26.204.18:6844/',
'Smooth Jazz' => 'http://scfire-mtc-aa04.stream.aol.com:80/stream/1005',
'SKYSmoothJzz' => 'http://91.121.3.80:8000/',
'SKYVocal' => 'http://u12.sky.fm:80/sky_vocalsmoothjazz',
'SKYJazz' => 'http://205.188.215.227:8008/',
'OndaTropical' => 'http://174.133.147.90:8000',
'Latino Radio' => 'http://online.radiodifusion.net:8020/',
'SalsaStream' => 'http://205.188.215.231:8010/',
'SKYNew Age' => 'http://scfire-ntc-aa02.stream.aol.com:80/stream/1002',
'AM 1710' => 'http://lin2.ash.fast-serv.com:9022/',
'WNAR' => 'http://live.wnar-am.com:8500/',
'SKY70s' => 'http://scfire-dtc-aa06.stream.aol.com:80/stream/1076',
'SKY80s' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1013',
'SKYOldies' => 'http://91.121.3.80:8010/',
'R.Paradise' => 'http://scfire-ntc-aa02.stream.aol.com:80/stream/1049',
'.977 Hitz' => 'http://scfire-mtc-aa04.stream.aol.com:80/stream/1074',
'80s SKY' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1013',
'SKYLoveMusic' => 'http://91.185.206.240:8000/',
'SKYAlterRock' => 'http://80.94.69.106:6754/',
'SKYClassRock' => 'http://80.94.69.106:6734/',
'SKYSoloPiano' => 'http://scfire-ntc-aa04.stream.aol.com:80/stream/1004',
'SKYChristian' => 'http://80.94.69.106:6784/',
'SKYSoundtrks' => 'http://80.94.69.106:6774/',
);
############### Ende der Konfiguration #########################
und noch ein auszug der logdatei:
PHP-Code:
2012-11-22 09:36:42.580,Ansagen.pl,pawohn->9,0.9s,
2012-11-22 09:39:11.008,Ansagen.pl,pawohn:Ansagen/Beep/03.wav Die aktuelle Aussentemperatur betraegt c2 Komma c1 Grad silence,0.9s,
2012-11-22 09:39:12.049,Ansagen.pl,pawohn:Die aktuelle Aussentemperatur betraegt c2 Komma c1 Grad silence,0.9s,
2012-11-22 09:41:03.430,Ansagen.pl,export MPD_HOST=127.0.0.1; export MPD_PORT=6601; /usr/bin/mpc add "http://livestream.antenne.at"
2012-11-22 09:41:03.656,Ansagen.pl,pawohn:Radiosender 'Antenne'='http://livestream.antenne.at',1.2s,
2012-11-22 09:41:05.256,Ansagen.pl,Unbekannter Radiosender '',1.2s,
vielleicht findest du was, aber bitte mache dir keinen stress!!!
danke und liebe grüße
andi
|

22.11.2012, 10:41
|
|
Erfahrener Benutzer
|
|
Registriert seit: 05.07.2010
Beiträge: 1.182
|
|
Hi,
Ich sehe es mir mal an. Aber wie gesagt bei mir macht das ein separater mpd nicht der selbe,
Bin mir jetzt nicht ganz sicher ob das von tru so gedacht war das das ein mpd macht?
Gesendet von meinem LG-P880 mit Tapatalk 2
|

22.11.2012, 11:27
|
|
Erfahrener Benutzer
|
|
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 992
|
|
Fry nicht Tru, das ist ein anderer :-)
Bei mir macht das ein mpd. Grund: es laufen noch zwei weitere mpds für andere Zwecke, und drei sind eher schon zuviel für das arme Wiregate.
Fry
PS. Also wenn es einmal ein Wiregate mit mehr "Wumms" gäbe, idealerweise immer noch lüfterlos und im gleichen Formfaktor, dann würde ich das bestimmt kaufen... falls nicht, muss ich mittelfristig überlegen, ob ich das Thema "mpd" nicht auf einen anderen Rechner übertrage, beispielsweise ein Raspberry Pi. Wäre allerdings der 6. (7.?) Linuxrechner, den ich dann administrieren muss. Wehe dem, der mal mein Haus kauft oder erbt...
|
| Themen-Optionen |
|
|
| Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 19:52 Uhr.
|