Zurück   KNX-User-Forum > Öffentlicher Bereich > KNX EIB Forum > Code-Schnipsel
knx-user-forum - International KNX Award Winner 2010


Links
Kalender
Spende

Antwort
 
Themen-Optionen Ansicht
  #11  
Alt 15.11.2012, 14:29
Fry Fry ist offline
Erfahrener Benutzer
 
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 992
Fry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle Atmosphäre
Standard

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
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #12  
Alt 17.11.2012, 10:48
Benutzer
 
Registriert seit: 25.01.2008
Ort: Graz
Beiträge: 79
sandy65 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #13  
Alt 20.11.2012, 06:04
Erfahrener Benutzer
 
Registriert seit: 05.07.2010
Beiträge: 1.182
vlamers befindet sich auf einem aufstrebenden Ast
Standard

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)
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #14  
Alt 20.11.2012, 14:33
Benutzer
 
Registriert seit: 25.01.2008
Ort: Graz
Beiträge: 79
sandy65 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

...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
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #15  
Alt 20.11.2012, 14:58
Erfahrener Benutzer
 
Registriert seit: 05.07.2010
Beiträge: 1.182
vlamers befindet sich auf einem aufstrebenden Ast
Standard

So hab die Zeilenumbrüche gerichtet.

Gruß
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #16  
Alt 20.11.2012, 15:51
Benutzer
 
Registriert seit: 25.01.2008
Ort: Graz
Beiträge: 79
sandy65 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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)
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #17  
Alt 21.11.2012, 11:29
Erfahrener Benutzer
 
Registriert seit: 05.07.2010
Beiträge: 1.182
vlamers befindet sich auf einem aufstrebenden Ast
Standard

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ß
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #18  
Alt 22.11.2012, 09:55
Benutzer
 
Registriert seit: 25.01.2008
Ort: Graz
Beiträge: 79
sandy65 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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{apcieq "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{apcieq 'A_GroupValue_Read')
    {
        
# Host und Port ermitteln
        
$mpdhost{$channel}=~m!^\s*(.*)\s*/\s*(.*)\s*$!;
        
my $host=$1my $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_'.$channelne 'AUS';
        
my $lfd_ansage = `$mpc`=~/playing/&& !$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$mpcoutundef0x40); # response, DPT aus eibga.conf 
                       
    
}
    else
    {
        
$val=~s/\000*$//; # streiche Nullen am Ende
        
return speak($channel$name$val);
    }
    }
    
    return 
unless $msg{apcieq '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(@statementwords(\@speech'Achtung')) if $dpt eq '5.005'# Gefahrenwarnung
    
    # Textteil (Gruppenadresse ausgesprochen)
    
push(@statementwords(\@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(@statementnumber(\@speech$val, -1)); 
    }
    
when([3.007,6.010,8.001,13.001]) # Kardinalzahl
    

        
push(@statementnumber(\@speech$val)); 
    }
    
when([5.001,6.001]) # Prozent
    

        
push(@statementnumber(\@speech$val));
        
push(@statement'Zahlen/Prozent.mp3'); 
    }
    
when(9.001# Temperatur
    
{
        
push(@statementnumber(\@speech$val1));
        
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(@statementnumber(\@speech, $3, -1));
        
push(@statement'Monate/'.$monat[$2-1].'.mp3') if defined $&& $2>&& $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(@statementnumber(\@speech$h)); 
        
push(@statement'Zeiten/Stunden.mp3'); 
        }
        if(
$h || $m)
        {
        
push(@statementnumber(\@speech$m)); 
        
push(@statement'Zeiten/Minuten.mp3'); 
        }
        
push(@statementnumber(\@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(@statementnumber(\@speech, $2));
        
push(@statement"Zeiten/Uhr.mp3");
        
push(@statementnumber(\@speech, $3)) if int($3)>0;
        }
        
elsif($val=~/^([0-9][0-9])\:([0-9][0-9])/)
        {
        
push(@statementnumber(\@speech, $1));
        
push(@statement"Zeiten/Uhr.mp3");
        
push(@statementnumber(\@speech, $2)) if int($2)>0;
        }
        else
        {
        return 
"Unbekanntes Uhrzeitformat '$val'";
        }
    }
    
when(/^16/) # Freitext
    
{
        
$val=~s/\000*$//; # streiche Nullen am Ende
        
push(@statementwords(\@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=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(-'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=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(-
'Zahlen/'.$t.$n.'.mp3'
    {
        
push(@hits'Zahlen/'.$t.$n.'.mp3');
    }
    
elsif($n>100)
    {
        
$digits=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(-
'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=$1my $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_'.$channelne 'AUS';
        
my $lfd_ansage = `$mpc`=~/playing/&& !$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' 10010*$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/ikeys %stations)
        {
            
my $station=undef;
            
            
unless(defined $stations{$val})
            {
            
my @hits=grep /$val/isort 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.1export 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
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #19  
Alt 22.11.2012, 10:41
Erfahrener Benutzer
 
Registriert seit: 05.07.2010
Beiträge: 1.182
vlamers befindet sich auf einem aufstrebenden Ast
Standard

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
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
  #20  
Alt 22.11.2012, 11:27
Fry Fry ist offline
Erfahrener Benutzer
 
Registriert seit: 14.12.2011
Ort: Hessen
Beiträge: 992
Fry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle AtmosphäreFry sorgt für eine eindrucksvolle Atmosphäre
Standard

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...
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sprachausgabe per Google? ThorstenGehrig Sonstiges / Verwaltung / Archiv 21 08.10.2012 21:07
[Codebeispiel] Neues Wiregate-Plugin für Sprachausgabe Fry WireGate 15 25.05.2012 09:49
- √ - HS-Infoman Sprachausgabe funktioniert nicht nailstreeter KNX EIB Forum 2 03.11.2007 11:59
HS V2.2 Sprachausgabe unter Vista SmartEIB KNX EIB Forum 5 29.06.2007 23:15


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:52 Uhr.



SEO by vBSEO