Hilfe für Webradio Modul / myUtils

Begonnen von fk0ff92, 21 Juli 2016, 11:50:21

Vorheriges Thema - Nächstes Thema

fk0ff92

Hallo Community,

ich würde gern eure Hilfe in Anspruch nehmen, vorweg sollte ich kurz erklären was für eine Installation ich habe:


  • FHEM auf Raspberry2B
  • selbst installiertes Multiroom Audio System:
    Jedes Zimmer hat sein eigenes Lautsprecherpaar, angeschlossen an einen großen, alten AV Receiver
    Jedes Zimmer ist einem eigenständigen Alsa-Device zugeordnet, d.h. ich kann jedes Zimmer einzeln ansteuern,
    oder alle synchron über ein Dmixer Alsa Device

Was bisher funktioniert:

  • über Shairport-sync habe ich für jeden Raum einen eigenen Airplay-Server.
    Falls eine Wiedergabe startet, meldet sich shairportsync bei fhem und schaltet einen dummy ein, bzw wieder aus.
    (Hier würde ich gern noch den aktuellen Titel in ein Attribut schreiben)
  • über eine komplexe if Logik werden alle dummies geprüft, deren Status mit der Audioausgabe zutun hat,
    falls einer eine Ausgabe signalisiert, wird ein Relais geschaltet das den Verstärker einschaltet, ein Watchdog verzögert das Ausschalten.
  • ein TTS Modul kann durchsagen in allen Räumen durchführen, hierfür wird der Verstärker eingeschaltet, kurz gewartet und die Durchsage startet. Funktioniert auch mit Nummernansage bei einkommenden Anrufen.

So nun möchte ich euch kurz mein Problem vorstellen: Ich möchte für jeden Raum ein Webradio haben, mit dem StreamRadio Modul bin ich nicht zurecht gekommen. Deshalb habe ich mir selbst was geschrieben, das funktioniert auch. Ich stelle euch kurz meine Version vor (die echt nicht schön geschrieben ist, auf Grund von fehlenden Programmierfähigkeiten):

Bsp Wohnzimmer:

define RadioWohnzimmerlist dummy
attr RadioWohnzimmerlist alias Radio Sender Wohnzimmer
attr RadioWohnzimmerlist genericDeviceType switch
attr RadioWohnzimmerlist group RadioWohnzimmer
attr RadioWohnzimmerlist room Wohnzimmer
attr RadioWohnzimmerlist setList state:80er,Defjay,GayFM,Bayern3,Ostwelle
attr RadioWohnzimmerlist webCmd state
define RadioWohnzimmerliststate dummy
define RadioWohnzimmerlistset1 notify RadioWohnzimmerlist:80er {fhem " set RadioWohnzimmerliststate S1";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmerlistset2 notify RadioWohnzimmerlist:Defjay {fhem " set RadioWohnzimmerliststate S2";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmerlistset3 notify RadioWohnzimmerlist:Bayern3 {fhem " set RadioWohnzimmerliststate S3";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmerlistset4 notify RadioWohnzimmerlist:GayFM {fhem " set RadioWohnzimmerliststate S4";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmerlistset5 notify RadioWohnzimmerlist:Ostwelle {fhem " set RadioWohnzimmerliststate S5";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmer dummy
attr RadioWohnzimmer alias Radio Wohnzimmer
attr RadioWohnzimmer group RadioWohnzimmer
attr RadioWohnzimmer room Homekit,Wohnzimmer
attr RadioWohnzimmer setList on off
attr RadioWohnzimmer webCmd on:off
define RadioWohnzimmeron notify RadioWohnzimmer:on {my $Sender = Value("RadioWohnzimmerliststate");;system("sudo /opt/fhem/bin/radio.sh $Sender wohnzimmer &")}
define RadioWohnzimmeroff notify RadioWohnzimmer:off {system("sudo /opt/fhem/bin/radio.sh stop wohnzimmer &")}
define RadioWohnzimmerVolume dummy
attr RadioWohnzimmerVolume alias Lautstärke Radio Wohnzimmer
attr RadioWohnzimmerVolume group RadioWohnzimmer
attr RadioWohnzimmerVolume room Wohnzimmer
attr RadioWohnzimmerVolume setList state:slider,0,1,100
attr RadioWohnzimmerVolume webCmd state
define Func_Volume_RadioWohnzimmer notify RadioWohnzimmerVolume {my $vol = Value("RadioWohnzimmerVolume");;system("sudo amixer -c 1 set RadioWohnzimmer  $vol% &");;}


dazugehörige radio.sh:
#!/bin/bash
S1='http://www.antenne.de/webradio/channels/80er-kulthits.m3u'
S2='http://www.defjay.de/listen.pls'
S3='http://streams.br.de/bayern3_2.m3u'
S4='http://www.gayfm.de/listen.pls'
S5='http://edge.live.mp3.mdn.newmedia.nacamar.net/ostseewellelive/livestream.mp3.m3u'

ANSAGE=$1
SENDERWAHL=$1
RAUM=$2

case $RAUM in
    wc)
    MPLAYER=mplayerwc
    MIXER=RadioWC
    AO=radiowc
    shift # past argument
    ;;
    bad)
    MPLAYER=mplayerbad
    MIXER=RadioBad
    AO=radiobad
    shift # past argument
    ;;
    buero)
    MPLAYER=mplayerbuero
    MIXER=RadioBuero
    AO=radiobuero
    shift # past argument
    ;;
    wohnzimmer)
    MPLAYER=mplayerwohnzimmer
    MIXER=RadioWohnzimmer
    AO=radiowohnzimmer
    shift # past argument
    ;;
    multiroom)
    MPLAYER=mplayermultiroom
    MIXER=RadioMultiroom
    AO=radiomultiroom
    shift # past argument
    ;;
    *)
        # unknown option
    ;;
esac


case $SENDERWAHL in
    S1)
    SENDER=$S1
    shift # past argument
    ;;
    S2)
    SENDER=$S2
    shift # past argument
    ;;
    S3)
    SENDER=$S3
    shift # past argument
    ;;
    S4)
    SENDER=$S4
    shift # past argument
    ;;
    S5)
    SENDER=$S5
    shift # past argument
    ;;
    stop)
    killall mplayer$RAUM
#    /usr/local/bin/$MPLAYER -quiet -ao alsa:device=$AO -noconsolecontrols /usr/local/bin/linkdeactivated.mp3   
    exit
    ;;
esac

    sleep 2
    /usr/bin/killall $MPLAYER
    /usr/local/bin/$MPLAYER -quiet -ao alsa:device=$AO -noconsolecontrols /usr/local/bin/linkactivated.mp3
    /usr/local/bin/$MPLAYER -quiet -ao alsa:device=$AO -noconsolecontrols /usr/local/bin/$ANSAGE.mp3
    /usr/local/bin/$MPLAYER -quiet -ao alsa:device=$AO -noconsolecontrols -playlist $SENDER 2>&- 1>/dev/null &

exit


Ich erkläre vielleicht kurz mal:
Ich habe die verschiedenen Sender mit Zahlen verknüpft, z.B. 80er Webradio ist S1.
Wenn ich radio.sh mit S1 Wohnzimmer aufrufe, wird zuerst der eventuell laufende mplayer gekillt,
dann wird ein kurzes "linkactivated" Intro gespielt,
danach eine Ansage welcher Sender kommt (ist dann in S1.mp3)
und dann startet der mplayer (hier dann mplayerwohnzimmer --> habe symlinks von mplayer für jeden Raum erstellt, damit ich den richtigen mplayer wieder killen kann, ist nicht schön gelöst, kam aber zu keiner Lösung per PID)

Dann habe ich die Sonderliste in FHEM
attr RadioWohnzimmerlist setList state:80er,Defjay,GayFM,Bayern3,Ostwelle
attr RadioWohnzimmerlist webCmd state


Dann wird die Auswahl in einem Dummy gespeichert, und falls der Radio bereits laufen sollte,
und damit ein Umschalten des Senders erreicht werden soll, schalte ich den Radio Dummy einfach nochmal mit dem neuen State ein,
das bewirkt ja im bash-Skript, dass der vorherige mplayer gekillt wird und der neue Sender startet.
define RadioWohnzimmerlistset1 notify RadioWohnzimmerlist:80er {fhem " set RadioWohnzimmerliststate S1";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmerlistset2 notify RadioWohnzimmerlist:Defjay {fhem " set RadioWohnzimmerliststate S2";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmerlistset3 notify RadioWohnzimmerlist:Bayern3 {fhem " set RadioWohnzimmerliststate S3";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmerlistset4 notify RadioWohnzimmerlist:GayFM {fhem " set RadioWohnzimmerliststate S4";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}
define RadioWohnzimmerlistset5 notify RadioWohnzimmerlist:Ostwelle {fhem " set RadioWohnzimmerliststate S5";; if (Value("RadioWohnzimmer") eq "on"){fhem "set RadioWohnzimmer on"}}


Hier ist schließlich die Radio Ein Aus Funktionalität
define RadioWohnzimmeron notify RadioWohnzimmer:on {my $Sender = Value("RadioWohnzimmerliststate");;system("sudo /opt/fhem/bin/radio.sh $Sender wohnzimmer &")}
define RadioWohnzimmeroff notify RadioWohnzimmer:off {system("sudo /opt/fhem/bin/radio.sh stop wohnzimmer &")}





Ich mach da mal einen Cut darunter, dieses riesige, schlecht  programmierte Ding habe ich nun 5 mal hintereinander für 5 Räume.
Ich bin sehr unzufrieden, weil mir der Stil äußert schlecht vor kommt.

  • denke ich mir dass man das in FHEM selbst etwas schöner machen könnte, ich aber das Regelwerk von FHEM nicht leicht finde
  • hätte ich gerne davon eine Funktion/Methode oder ein Modul, aber von beiden bin ich weit entfernt weil ich mir mit Python schwer tue

Ich studiere Informatik und kann gut objektorientiert programmieren, deshalb fällt es mir echt nicht leicht das irgendwie ohne die vertrauten Java Funktionalitäten hinzubekommen.

Selbst möchte ich folgendes umsetzen was mir bisher noch nicht gelungen ist:

  • Senderliste.txt --> Einfach eine File im cvs Format, mit "Name, URL"
  • Diese File soll die Methode auslesen und dann automatisch die statelist füllen
  • Keine Umwandlung in S1 ect, sondern beim Aktivieren des Radios direkt den mplayer mit der dazugehörigen URL starten

Würde mich über zahlreiche Feedbacks freuen!
PS: es funktioniert bereits so tadellos, fehlerfrei im Alltag.
Nur sollte das mal aufgeräumt werden, damit ich den Code pflegen und erweitern kann, sonst wird nur noch mehr Chaos daraus.

liebe Grüße Christian