Ankündigung

Einklappen
Keine Ankündigung bisher.

Sprachausgabe "Ansagen.pl"

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] Sprachausgabe "Ansagen.pl"

    Hallo liebe Forenmitglieder,

    ich habe seit einiger Zeit ein Problem mit meiner Sprachausgabe. Und zwar wird der Internetstream nicht mehr weitergeführt, sobald eine Ansage zB. Regen, etc. über eine GA kommt und ich komme nicht dahinter was da schiefläuft.

    Ich habe die Ansagen.pl inkl. der conf von SVN downgeloadet - leider ohne Erfolg.
    Anbei ein Auszug der Logdatei. Den Eintrag "unbekannter Radiosender" kann ich mir auch nicht erklären.

    2012-11-12 13:03:59.119,Ansagen.pl,pawohn:Ansagen/Beep/03.wav Die aktuelle Aussentemperatur betraegt c8 Grad silence,
    2012-11-12 13:04:11.371,Ansagen.pl,export MPD_HOST=127.0.0.1; export MPD_PORT=6601; /usr/bin/mpc add "http://stream01.arabella.vss.kapper.net:8000/"
    2012-11-12 13:04:11.532,Ansagen.pl,pawohn:Radiosender 'Arabella'='http://stream01.arabella.vss.kapper.net:8000/',0.6s,
    2012-11-12 13:04:12.392,Ansagen.pl,Unbekannter Radiosender '',0.3s,
    2012-11-12 13:04:12.820,Ansagen.pl,Unbekannter Radiosender '',0.3s,
    2012-11-12 13:04:49.786,Ansagen.pl,pawohn:Regen_beginnt silence,
    2012-11-12 13:07:40.855,verstaerker.pl,laeuft,0s,
    2012-11-12 13:12:00.947,Ansagen.pl,pawohn:Ansagen/Beep/03.wav Die aktuelle Aussentemperatur betraegt c8 Grad silence,
    2012-11-12 13:12:02.559,Ansagen.pl,pawohn: Die aktuelle Aussentemperatur betraegt c8 Grad silence,


    Hat jemand eine Idee, was ich noch versuchen könnte?

    Vielen Dank im Voraus und beste Grüße
    Andi

    #2
    Hi Andi,
    kannst du zu deinem wiregated-Log mal den passenden Ausschnitt der eib.log zeigen? Und deine conf-Datei?
    VG, Fry

    Kommentar


      #3
      Hallo Fry,

      anbei sende ich dir die beiden dateien (hoffe es sind die gewünschten infos), würd mich freuen, wenn du den fehler finden könntest.

      LG Andi
      Angehängte Dateien

      Kommentar


        #4
        Nach einem kleinen Bugfix ist nun eine neue Version im SVN. Die Fehlermeldung "Unbekannter Radiosender" sollte nun nicht mehr kommen.

        Melde dich, falls es weiterhin Probleme gibt.

        VG, Fry

        Kommentar


          #5
          die sache mit dem "unbekannten radiosender" kommt nun nicht mehr, das dürfte erledigt sein. leider geht's trotzdem nicht

          könnte es am mpd/mpc liegen? der war beim letzten update mit dabei.

          hab da was im forum gefunden:
          https://knx-user-forum.de/forum/supp...wiregate/23705

          LG.
          Andi

          Kommentar


            #6
            Na mit Sicherheit "könnte" das daran liegen. Mein Problem ist, dass ich aktuell keine Lautsprecher angeschlossen habe und in meiner Baustelle die Prioritäten etwas anders liegen. Ich muss dich daher etwas vertrösten. Oder frage mal vlamers, der ist absoluter mpd-Crack.
            Fry

            Kommentar


              #7
              Crack ist eindeutig übertrieben!
              Ich habe fry's plug-in abgeändert, so dass es mit zwei mpd Instanzen arbeitet.
              Ich setzte die Lautstärke des streams runter während der Ansage. Aber in separaten mpds. Da das so wie es fry macht mit zwei streams zuckelt und halt.
              Ich lasse mir so eine playlist zusammen bauen für den zweiten mpd.

              Wenn benötigt poste ich die nötigen Änderungen gerne wenn ich wieder daheim bin.

              Gesendet von meinem LG-P880 mit Tapatalk 2

              Kommentar


                #8
                das wäre super, danke!

                ich glaube du hast ziemlich die selben anforderungen. hattes du nicht auch das script mit "verstärker ein/aus" in diesem zusammenhang gepostet?

                VG Andi

                Kommentar


                  #9
                  Zitat von vlamers Beitrag anzeigen
                  Wenn benötigt poste ich die nötigen Änderungen gerne wenn ich wieder daheim bin.
                  Ja klar, bitte tu das!

                  Kommentar


                    #10
                    So dann poste ich das mal.
                    Da die Zeit knapp ist versuche ich alles zu erwischen, nicht böse sein wenn ne kleinigkeit fehlt. (wird dann heute abend korrigiert)

                    ich poste mit Absicht größere Code Fragmente, so dass man auch leichter findet wo das steht. Der Rest ist aus Fry´s Script. Sind nur minimale Änderungen.
                    also in dem Ansagen.pl Script:
                    die config oben:
                    Code:
                    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
                    Die Ansagen sollten nicht in /var/lib liegen. Das war mein Fehler. Funktioniert, sollte so aber nicht sein...
                    pakueche ist mein Pulseaudio kanal für die Ansagen (siehe conf.d)

                    weiter unten:
                    Code:
                     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 ' ', @_);
                    	    }
                    die #plugin_log hatte ich zum debuggen drin. So schreibt er den Befehl den er ausführt ins log. Sollten auskommentiert bleiben, da sonst das log zugemüllt wird.

                    in conf.d:

                    Code:
                    # 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/6600',
                    );
                    fertig.

                    Ja das Verstärker Plugin hatte ich auch mal gepostet.
                    Mittlerweile parse ich aber die mpc ausgabe um die Verstärker auszuschalten
                    (mpc outputs, gibt für jedes output enable/disable aus. Bei mir hat ja jeder output separate Verstärker, ist aber noch etwas wirr, da mir die Zeit zum Aufräumen der plugins fehlt)
                    Zum steuern der mpd´s via Taster, Zennio o.ä nehme ich das mpd_Player2 Script aus dem WG SVN (auch von mir also keine Wunder erwarten )
                    Radio streams sind auch noch separat getriggert bei mir. Wieder mal die Zeit die fehlt...

                    Der neue mpd funktioniert bei mir auch noch nicht so gut. Muss ich noch forschen woran das liegen könnte. (vermutlich an zuvielen mpd instanzen, pulseaudio und ähnlichen Verenkungen)

                    Hoffe das hilft erstmal weiter!
                    @Fry das ist wirklich ein spitzen Plugin!

                    Gruß

                    Kommentar


                      #11
                      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

                      Kommentar


                        #12
                        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

                        Kommentar


                          #13
                          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

                          Kommentar


                            #14
                            ...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

                            Kommentar


                              #15
                              So hab die Zeilenumbrüche gerichtet.

                              Gruß

                              Kommentar

                              Lädt...
                              X