Ankündigung

Einklappen
Keine Ankündigung bisher.

WG (Linux Debian) als Multiroom-System (Code Sammlung)

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

    [WireGate-Plugin] WG (Linux Debian) als Multiroom-System (Code Sammlung)

    Hallo,

    ich werde das ganze auf mehr Posts aufteilen müssen.
    Für Erweiterungen, Änderungen, Verbesserungen und sonstige Anregungen wäre ich Dankbar.
    Wer Fehler findet bitte Bescheid sagen!

    Ich fang mal ganz vorne bei der Installation an:

    *****************************************
    Hier die neue asound.conf für alsa-only konfiguration
    *****************************************

    Achtung wer den neuen mpd benutzt bitte folgende Änderungen für die mpd.conf verwenden: >Klick mich<
    Basis ist ein Debian Lenny (so wie auf dem WG1)


    Installation benötigter Pakete:
    Code:
    apt-get install alsa alsa-base alsa-utils pulseaudio pulseaudio-utils pulseaudio-module-zeroconf pulseaudio-module-hal mpd mpc
    Alsa konfiguration:
    Wer auf dem WG den nuen mpd hat muss eine andere mpd.conf nehmen. >Klick mich<
    Erstmal müssen wir herausfinden welche Hardware ID unsere Mehrkanal Soundkarte hat:
    Code:
    aplay -l
    **** List of PLAYBACK Hardware Devices ****
    card 0: Audio [CS5535 Audio], device 0: CS5535 Audio [CS5535 Audio]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    card 1: default [USB Sound Device        ], device 0: USB Audio [USB Audio]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    Also bei mir Hardware ID 1 (Angefangen zu zählen wird bei 0 )

    Falls die "neue" Soundkarte Hardware ID 0 haben sollte:
    Bei einem Neustart von Alsa bringt mein WG die HW ID's durcheinander:

    Der Neustart von Alsa: (Bei einem Wiregate) Wird durch den Tipp von Jitter123 ersetzt
    Code:
    alsa force-reload
    muss durch:
    Code:
    alsa force-reload && alsa force-reload
    ersetzt werden, da sonst die "neue" Soundkarte ID 0 bekommt.

    Ein Tipp von Jitter123:

    Die ID´s der Soundkarte mit
    Code:
    lsusb
    herausfinden. Ausgabe sollte ca so aussehen:
    Code:
    root@wiregatexxx:~# lsusb
    Bus 002 Device 003: ID 0d8c:0102 C-Media Electronics, Inc. CM106 Like Sound Device
    Bus 002 Device 002: ID 04fa:2490 Dallas Semiconductor DS1490F 2-in-1 Fob, 1-Wire adapter
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    in dem Fall ist:
    vid=0x0d8c
    pid=0x0102

    Unter "/etc/modprobe.d/" eine Datei namens "snd-usb-audio" anlegen:
    Code:
    cd /etc/modprobe.d/
    nano snd-usb-audio
    und in die Datei folgende Zeilen eintragen:
    Code:
    options snd-usb-audio index=1 vid=0x0d8c pid=0x0102
    die Modulnamen der Soundkarte herausfinden:
    Code:
    cat /proc/asound/modules
    sollte folgende Ausgabe erzeugen:
    Code:
    root@wiregatexxx:~# cat /proc/asound/modules
     0 snd_cs5535audio
     1 snd_usb_audio
    In "/etc/modprobe.d/alsa-base" die Zuordnug der Module mit den eben erhaltenen Namen ergänzen:
    Code:
    nano /etc/modprobe.d/alsa-base
    Code:
    options snd_cs5535audio index=0 #interne Karte
    options snd_usb_audio index=1   #USB-Karte LogiLink 7.1
    Danach noch alsa neu starten
    Code:
    alsa force-reload
    anschließend müssen folgende Inhalte in die Datei /etc/asound.conf (komplette asound.conf weiter unten)

    zuerst die Sound Karte:
    Code:
    pcm_slave.logilink { 
    pcm "hw:1,0"            # or "hw:0,0" for the first card 
        channels 8 
        rate 44100 
    #        format  "S16_LE" 
    }
    Der Name "logilink" ist Variabel
    channels: 8 bei einer 7.1 Soundkarte

    Anschließend die PCM Devices:
    Code:
    pcm.dmixer { 
        type plug 
    slave.pcm { 
    type dshare 
        ipc_key 1024 
    ipc_key_add_uid false 
    ipc_gid audio 
        ipc_perm 0660 
        slave logilink  
        bindings [ 0 1 ] 
    #    rate 44100 
    #    channels 2 
        } 
    }
    - bindings [ 0 1 ] bedeutet: Kanal 1 und 2. (es wird wieder bei 0 angefangen zu zählen)
    - slave logilink verweist auf die oben erstellte Soundkarte
    - type dshare ist für pulseaudio (bei alsa und mehr zuspielern: dmix statt dshare)

    Das sollte für jeden gewünschten kanal erstellt werden. Natürlich mit unterschiedlichen Namen und bindings.
    bindings lassen sich meinse wissens nur durch try&error herausfinden. Ich hatte das mit Kopfhörern gemacht und durch probiert wo der Sound raus kommt.

    ans Ende der /etc/asound.conf
    Code:
    pcm.pulse { 
    type pulse 
    } 
    ctl.pulse { 
    type pulse 
    } 
    pcm.!default { 
    type pulse 
    } 
    ctl.!default { 
    type pulse 
    }
    Nach jeder änderung Alsa neustarten:
    Code:
    alsa force-reload && alsa force-reload




    Pulseaudio konfigurieren:
    (konfigurationsdateien liegen unter /etc/pulse

    daemon.conf
    Folgende Zeilen gehören aktiviert (Simikolon entfernen)
    Code:
     daemonize = yes
    realtime-scheduling = yes
     realtime-priority = 5
    So geht es bei mir ruckel frei.

    Edit: Ich habe in der default.pa die "default_fragments" und die "fragment_size" auskommentiert. Nun laufen alle Kanäle der zerlegten 7.1 USB Karte absolut synchron

    default.pa/system.pa (je nach Version des Pulseaudios muss eine Datei unter /etc/pulse/ vorhanden sein)
    Code:
    load-module module-alsa-sink device=dmixerwohn sink_name=pawohn
    load-module module-alsa-sink device=dmixer sink_name=pakueche
    load-module module-alsa-sink device=dmixerbad sink_name=pabad
    load-module module-null-sink
    ### Load several protocols
    .ifexists module-esound-protocol-unix.so
    load-module module-esound-protocol-unix socket="/tmp/.esd/socket"
    .endif
    load-module module-native-protocol-unix
     
    #load-module module-esound-protocol-tcp
    load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.178.33/24
    load-module module-zeroconf-publish
     
    ### Automatically restore the volume of playback streams
    load-module module-volume-restore
     
    ### Automatically restore the default sink/source when changed by the user during runtime
    load-module module-default-device-restore
     
    ### Automatically move streams to the default sink if the sink they are
    ### connected to dies, similar for sources
    load-module module-rescue-streams
     
    ### Automatically suspend sinks/sources that become idle for too long
    load-module module-suspend-on-idle
     
    ### Make some devices default
    set-default-sink null
    
    Alle anderen Zeilen (die nicht mit einem "." beginnen auskommentieren mit einer Raute)

    Zur Sicherheit Alsa neustarten
    Code:
    alsa force-reload && alsa force-reload
    /etc/default/pulseaudio:
    Code:
    PULSEAUDIO_SYSTEM_START=1
    DISALLOW_MODULE_LOADING=0
    pulseaudio starten

    Code:
    pulseaudio

    Ob das alles funktioniert können wir leicht testen:
    Code:
    mpg123 -a dmixer /home/Irgendeine.mp3
    Code:
    alsamixer -c hardwareID_der_Soundkarte
    
    hier kann man alle Ausgänge getrennt in der Lautstärke regeln.

    Zum Schluss noch den Usern die benötigten Berechtigungen zuteilen:
    Code:
    addgroup root pulse 
    addgroup root pulse-rt 
    addgroup root pulse-access 
    addgroup pulse audio 
    addgroup root audio
    Nun sollte etwas zu hören sein. Wenn nicht muss man auf fehler suche gehen. Meist wird man in der /var/log/messages fündig.



    Wenn dass funktioniert kann man mit dem nächsten Schritt fortfahren

    Edit: mpc in apt-get Liste eingefügt

    Ergänzende Hinweise: (Danke Squawk7700)
    Nachdem alsa-only betrieben wird, muss in der mpd.conf der audio_output über typ="alsa" und device="name_des_pcm_aus_alsa.conf" definiert werden
    Angehängte Dateien

    #2
    MPD konfigurieren

    Nun kommt die mpd konfiguration dran:

    Zuerst nur mal eine Instanz die dann nachher vervielfacht werden kann.

    folgende Zeilen der /etc/mpd.conf müssen nach den eigenen Bedürfnissen angepasst werden.
    Code:
    music_directory        "/var/lib/mpd/auto"
    playlist_directory    "/var/lib/mpd/playlists"
    db_file            "/var/lib/mpd/tag_cache"
    log_file        "/var/log/mpd/mpd.log"
    error_file        "/var/log/mpd/errors.log"
    pid_file        "/var/run/mpd/pid"
    Code:
    state_file        "/var/lib/mpd/state"
    user sollte auf root stehen
    Code:
    user                            "root"
    Die IP muss auf die eigene IP geändert werden:
    Code:
    bind_to_address                 "127.0.0.1"
    bind_to_address            "192.168.178.33"
    port                            "6600"
    Code:
    audio_output {
        type    "pulse"
        name    "Kueche"
        sink    "pakueche"
        server    "127.0.0.1"
    }
    Code:
    mixer_type                      "software"
    Code:
    audio_buffer_size               "3060"
    buffer_before_play              "10%"
    http_buffer_size                "2048"
    http_prebuffer_size             "200"
    Ich hab eine sehr langsame Internet Verbindung, deshalb muss mein http_buffer so hoch sein.






    ansonsten muss an der Config im Normalfall nichts geändert werden.

    MPD starten
    Code:
    /etc/init.d/mpd restart
    Als WebGUI habe ich Relaxx-Player und MPD-Player. Diese müssen einfach ins /var/www Verzeichniss kopiert werden.
    bei mir also: /var/www/relaxx/relaxx

    Aufgerufen über:
    Code:
    192.168.178.33/relaxx/relaxx
    Port und IP auf die der Relaxx Player zugreift werden angepasst indem man den Config Button betätigt (Passwort leer lassen)
    nun kopiert man irgendeine mp3 zum testen in den oben definierten music Ordner. Die MP3 sollte sich nun über die WebGUI abspielen lassen.

    Wenn dass funktioniert können wir die anderen Instanzen erstellen.

    Erstellen einer zweiten MPD Instanz:
    /etc/init.d/mpd
    diese Datei muss kopiert werden:
    Code:
    cp /etc/init.d/mpd /etc/init.d/mpd2
    und folgende Zeilen angepasst werden:
    Code:
    nano /etc/init.d/mpd2
    Code:
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    NAME=mpd
    DESC="Music Player Daemon"
    DAEMON=/usr/bin/mpd
    MPDCONF=/etc/mpd.conf
    START_MPD=true
    in:
    Code:
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    NAME=mpd2
    DESC="Music Player Daemon2"
    DAEMON=/usr/bin/mpd2
    MPDCONF=/etc/mpd2.conf
    START_MPD=true

    /etc/default/mpd
    Code:
    cp /etc/default/mpd /etc/default/mpd2
    es müssen folgende Zeilen Angepasst werden:
    Code:
    nano /etc/default/mpd2
    Code:
    MPDCONF=/etc/mpd2.conf
    /usr/bin/mpd
    Code:
    cp /usr/bin/mpd /usr/bin/mpd2
    nichts anpassen

    /etc/mpd.conf
    Code:
    cp /etc/mpd.conf /etc/mpd2.conf
    folgende Zeilen ändern:
    Code:
    nano /etc/mpd2.conf
    Code:
    music_directory         "/var/lib/mpd/auto"
    playlist_directory      "/var/lib/mpd/playlists"
    db_file                 "/var/lib/mpd/tag_cache2"
    log_file                "/var/log/mpd/mpd2.log"
    error_file              "/var/log/mpd/errors2.log"
    pid_file                "/var/run/mpd/pid2"
     
    state_file              "/var/lib/mpd/state2"
     
    port                            "6601"
    ansonsten keine Änderung in der mpd2.conf

    nun die zweite Instanz starten:
    Code:
    /etc/init.d/mpd2 start
    einen zweiten relaxx Player anlegen in einem neuen Verzeichniss:
    bei mir /var/www/relaxx/relaxx2

    Den Port unter config auf die zweite Instanz anpassen:
    bei mir 6601

    Kommentar


      #3
      Das Plugin zum Ein/auschalten des Radios, empfangen von Helligkeitswerten als Lautstärke, empfangen von Dimmschritten (im Taster auf kontinuierlich senden), und zum Auswählen von Playlisten(werden nach festen Namen der Playlists gewählt)
      Playlist1: Radio
      2: Frau
      3: Meine
      usw..

      für das ändern der alsa Lautstärke:
      Code:
      root@wiregate225:~# amixer -c1 scontrols
      Simple mixer control 'PCM',0
      Simple mixer control 'PCM Capture Source',0
      Simple mixer control 'Line',0
      Simple mixer control 'Mic',0
      Simple mixer control 'IEC958 In',0
      Simple mixer control 'Speaker',0
      sagt uns der Befehl muss Anfangen mit:
      Code:
      amixer -c1 sset Speaker,0
      und
      Code:
      root@wiregate225:~# amixer -c1 sget Speaker,0
      Simple mixer control 'Speaker',0
        Capabilities: pvolume pswitch pswitch-joined
        Playback channels: Front Left - Front Right - Rear Left - Rear Right - Front Center - Woofer - Side Left - Side Right
        Limits: Playback 0 - 197
        Mono:
        Front Left: Playback 197 [100%] [on]
        Front Right: Playback 197 [100%] [on]
        Rear Left: Playback 197 [100%] [on]
        Rear Right: Playback 197 [100%] [on]
        Front Center: Playback 197 [100%] [on]
        Woofer: Playback 197 [100%] [on]
        Side Left: Playback 197 [100%] [on]
        Side Right: Playback 197 [100%] [on]
      sagt uns es geht weiter mit:
      Code:
      amixer -c1 sset Speaker,0 Front
      Code:
      # Plugin um eine mpd Instanz mit mehreren Outputs zu steuern, inkl. verschiedener Playlists
      # und verschiedenen lautstärken der unterschiedlichen Ausgängen von Tastern oder sonstigen EIB Geraeten zu kontrollieren
      # Version 0.3    25.11.2011
      # Copyright: vlamers (https://knx-user-forum.de/members/vlamers.html)
      # License: GPL (v2)
      # Aufbau m�glichst so, dass man unterhalb der Einstellungen nichts ver�ndern muss!
      
      #################################
      ##########Einstellungen##########
      #################################
      # Aktuelle Einstellungen arbeiten mit einer gesplitteten 7.1 USB Soundkarte
      # Sehr viele Einstellungen, die aber nötig sind :-)
      # Alsa Sound
      my $vol_alsa = "100%";    # Volume for amixer (alsa volume)
      my $Kanal = "Front";    # Channel of 7.1 soundcard
      my $Kanal2 = "Rear";    # Channel of the second speaker pair
      my $volkanal2 = "40%";    # The volume of the 2nd Speaker
      my $cardnum = "1";        # Hardware Number of the Sound card
      my $Speaker = "Speaker,0";    # Name of the output ( My soundcard is defined as following: Speaker,1 Front; Speaker,1 Rear
      
      ## mpd 
      my $mpdname = "mpd2";        # the name of the mpd instance
      my $IP = "192.168.178.33";    # The IP where the mpd Instanz is running
      my $Port = "6601";        # Port of the mpd Instanz
      my $volume_anfang = "35";     # This Volume will be set for mpd
      
      # Aus wenn Fernseher an
      my $Fernseher = '3/0/0';    # Fernseher
      
      # Verstaerker
      my $verstaerker = '13/1/2';    # Verstaerker on/off GA
      
      #Radio GA
      my $knx_addr_player2 = '13/1/0';# mpd Player on/off GA
      
      #Volume
      ## Vol Receive
      my $Vol_addr = '13/1/7'; # knx_address for volume up/down (receive)
      my $volumestep = "3";    # The stepsize for volume
      my $vol_up_data = "9";    # Data that ETS Busmonitor shows when you send a telegram from a switch to this GA
      my $vol_down_data = "1";
      
      #Vol send (brightness-value / helligkeitswert)
      my $knx_addr_vol = '13/1/22'; # The Volume will be send here from the plugin
      my $laut_GA = '13/1/23';    #the volume can be send here as brightness-value
      
      # GA for recorded message
      my $info_wz = '3/1/2';        # Info Switch wz
      
      # Partymodus
      my $Partymodus = '13/1/21';    # GA for Partymodus
      my $vol_party = "100%";     # With % Symbol
      
      # Quellen
      my $kueche = '13/1/5';        # küche enable/disable    
      my $kueche_nr = "1";        # mpd output number
      my $wohnz = '13/1/8';        # Wohnzimmer enable/disable
      my $wohnz_nr = "3";    # number of mpd output
      my $Bad = '13/1/15';        # enable/disable bathroom output
      my $Bad_nr = "2";        # mpd output number
      
      # Prev / next
      my $addr_pn= '13/1/14';    # Prev / Next
      
      # Playlist
      my $playlist = '13/1/24';    # the playlist number will be send here (value 1 - 255)
      my $playlist1 = "Antenne";
      my $playlist2 = "Christina";
      my $playlist3 = "Volker";
      my $playlist4 = "Kinderlieder";
      
      
      ##################################################
      ################Ende Einstellungen################
      ##################################################
      
      #######################################################
      # do not change anything below, all config stays above#
      #######################################################
      
      # subscribe plugins and call it only when necessary
      $plugin_subscribe{$knx_addr_player2}{$plugname} = 1;
      $plugin_subscribe{$Fernseher}{$plugname} = 1;
      $plugin_subscribe{$Vol_addr}{$plugname} = 1;
      $plugin_subscribe{$Partymodus}{$plugname} = 1;
      $plugin_subscribe{$addr_pn}{$plugname} = 1;
      $plugin_subscribe{$laut_GA}{$plugname} = 1;
      $plugin_subscribe{$knx_addr_vol}{$plugname} = 1;
      $plugin_subscribe{$wohnz}{$plugname} = 1;
      $plugin_subscribe{$kueche}{$plugname} = 1;
      $plugin_subscribe{$Bad}{$plugname} = 1;
      $plugin_subscribe{$playlist}{$plugname} = 1;
      $plugin_info{$plugname.'_cycle'} = 0;
      
      # Radio on/off
      if ($msg{'dst'} eq ($knx_addr_player2))
      { if ($msg{'apci'} eq 'A_GroupValue_Write') # change volume
      { if ($msg{'value'} == 01) {
          knx_write($verstaerker,1,1);
          knx_write($Bad,0,1);
          knx_write($wohnz,1,1);
          knx_write($kueche,1,1);
          my $debug = `/etc/init.d/$mpdname restart`;
              my $debug = `amixer -c $cardnum set $Speaker $Kanal $vol_alsa && amixer -c $cardnum set $Speaker $Kanal2 $volkanal2`;
              knx_write($playlist,1,1);
              knx_write($laut_GA ,$volume_anfang,5);
              return "Player 2 läuft";
      }
      if ($msg{'value'} == 00) {
          knx_write($verstaerker,0,1);  # Verstaerker aus
          my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc stop`;
          return "Player 2 aus";}}}
      # Aus wenn Fernseher an
      if ($msg{'dst'} eq ($Fernseher) && ($msg{'apci'} eq 'A_GroupValue_Write') && ($msg{'value'} == 1))    {
          knx_write( $knx_addr_player2, 0,1 );
          return "Player 2 aus Fernseher";    }
      #################### Volume step ################################
      if ($msg{'dst'} eq ($Vol_addr))
      { if ($msg{'apci'} eq 'A_GroupValue_Write')  # change volume
      { if ($msg{'data'} == $vol_up_data) {
          my $debug = `MPD_PORT=$Port MPD_HOST=$IP mpc volume +$volumestep`;
          return; }
      
      if ($msg{'data'} == $vol_down_data) {
          my $debug = `MPD_PORT=$Port MPD_HOST=$IP mpc volume -$volumestep`;
          return;}}}
      ###################### Vol receive ####################################
      if ($msg{'dst'} eq ($laut_GA) && ($msg{'apci'} eq 'A_GroupValue_Write'))
      {   my $vol1 = decode_dpt5($msg{'data'});
          my $vol = round($vol1);
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc volume $vol`; 
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc volume > /tmp/test.txt`;
          knx_write($knx_addr_vol,$vol,5);
          return $vol1;}
      ###################### Partymodus ##########################################
      if ($msg{'dst'} eq ($Partymodus) && ($msg{'apci'} eq 'A_GroupValue_Write'))
      { if ($msg{'data'} == 01) {
          knx_write($kueche,00,1);
          knx_write($wohnz,1,1);
           my $debug = `amixer -c $cardnum set $Speaker $Kanal2 $vol_party`;
          return "Party"; }
      
      if ($msg{'value'} == 00) {
         my $debug = `amixer -c $cardnum set $Speaker $Kanal2 $volume_anfang%`;
         knx_write($kueche,01,1);
          return "Party ende"; }
      else{
      return;}}
      ######################### prev / next #####################################################
      if ($msg{'dst'} eq ($addr_pn))
      { if ($msg{'apci'} eq 'A_GroupValue_Write') # change volume
      { if ($msg{'value'} == 1) {
          my $debug = `MPD_PORT=$Port MPD_HOST=$IP mpc next`;
          return "next"; }
      
      if ($msg{'value'} == 0) {
          my $debug = `MPD_PORT=$Port MPD_HOST=$IP mpc prev`;
          return "prev";}}}
      ####################### Quellen ########################################
      # wohnz
           if ($msg{'dst'} eq $wohnz && ($msg{'apci'} eq 'A_GroupValue_Write'))
           {  if (($msg{'value'} == 01)) {
              my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc enable $wohnz_nr`;
              return; }
              
              if (($msg{'value'} == 00)) {
              my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc disable $wohnz_nr`;
              return; }}
        
          # kueche
            if ($msg{'dst'} eq $kueche && ($msg{'apci'} eq 'A_GroupValue_Write'))
           {  if (($msg{'data'} == 01)) {
              my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc enable $kueche_nr`;
              return "OK"; }
              if (($msg{'data'} == 00)) {
              my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc disable $kueche_nr`;
              return "nOK";}else {return 0;}}
         
          # Bad
           if ($msg{'dst'} eq $Bad && ($msg{'apci'} eq 'A_GroupValue_Write'))
           {
              if (($msg{'value'} == 01)) {
              my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc enable $Bad_nr`;
              return; }
                if (($msg{'value'} == 00)) {
              my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc disable $Bad_nr`;
              return; }
                else {return;}}
      ###################### Playlist #########################################
      
      if ($msg{'dst'} eq ($playlist) && ($msg{'apci'} eq 'A_GroupValue_Write'))
      {    if ($msg{'data'} == 01){
          my $playlist = $playlist1;
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc clear`; 
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc load $playlist`;
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc play`; 
          return "1";}
      if ($msg{'data'} == 02){
          my $playlist = $playlist2;
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc clear`; 
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc load $playlist`;
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc play`; 
          return "2";}
      if ($msg{'data'} == 03){
          my $playlist = $playlist3;
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc clear`; 
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc load $playlist`;
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc play`; 
          return "3";}
      if ($msg{'data'} == 04){
          my $playlist = $playlist4;
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc clear`; 
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc load $playlist`;
          my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc play`; 
          return "4";}
      else {
      my $pl = ($msg{'data'});
      return $pl;
      }}
      Ist dass Plugin selbst erklärend? Oder soll ich dass nochmal kurz erklären?

      Der Partymodus wird für viele Überflüssig sein. Bei mir schaltet er mir in meinem Wohn- Ess- Küchenbereich auf nur Wohnzimmerboxen da die die meisten Watt vertragen

      Da ich eine Anzeige der Lautstärke in meinem Zennio Z38 habe, brauch ich eine Aktualisierung der Lautstärke wenn der Wert Ausserhalb des EIB/KNX (z.B über Relaxx) geändert wurde.

      Aktualisierung:
      Code:
      my $lautstaerke = '13/1/22';
      my $volume_GA = '13/1/7';     #Volume that will be set
      my $Port = '6601';
      my $IP = '192.168.178.33';
      $plugin_info{$plugname.'_cycle'} = 60;
      $plugin_subscribe{$volume_GA}{$plugname} = 1;
      
      
      
      if ($msg{'dst'} eq ($volume_GA) && ($msg{'apci'} eq 'A_GroupValue_Write'))
      {
      my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc volume > /tmp/test.txt`;
      use strict;
      my $FILE="/tmp/test.txt";
      open FH, "<$FILE";
      while(<FH>) {
        if( $_ =~ m/^volume:\s+(\d+)%\s+.*$/) {
          my $match=$1;
          print "$match\n";
      ##       my $volume = decode_dpt5($1); 
          knx_write($lautstaerke,$1,5);
          return $1;
        }
      }
      close FH;
      } else {
      my $debug = `MPD_PORT=$Port MPD_IP=$IP mpc volume > /tmp/test.txt`;
      use strict;
      my $FILE="/tmp/test.txt";
      open FH, "<$FILE";
      while(<FH>) {
        if( $_ =~ m/^volume:\s+(\d+)%\s+.*$/) {
          my $match=$1;
          print "$match\n";
      ##       my $volume = decode_dpt5($1); 
          knx_write($lautstaerke,$1,5);
          return $1;
        }
      }
      close FH;}

      Kommentar


        #4
        Ansagen einspielen

        Das Plugin schaut ob die Verstärker ausgeschaltet sind:
        Code:
        # Schalte tagsüber Dachboden das Licht aus
        my $Verstaerker = '13/1/2';
        my $Radio_an = '13/1/0';
         
        # Eigenen Aufruf-Zyklus auf 15*60 Sekunden setzen
        # der Aufrufzyklus ist unabhängig von der Taktzeit und muss kürzer sein!
         
        my $status = knx_read($Radio_an,0,1);
        $plugin_info{$plugname.'_cycle'} = 300;
         
         
        if ($status == 01) {
        return "laeuft";
        }
         
        if ($status == 00){
        knx_write($Verstaerker,0,1);
        return "aus";
        } else {
        return "fehler";
        }
        Die Ansagen werden bis jetzt noch über linknx und ein Shellscript realisiert:

        in der linknx.xml:
        Code:
        <rule id="info-wohnz"> 
                <condition type="object" id="info-wohnz" trigger="true" value="1"/> 
                <actionlist> 
                <action type="set-value" id="Verstaerker" value="1"/> 
                <action type="shell-cmd" cmd="/var/www/sprachansage/linknx/./kuecheansage+morgens.sh"/> 
                </actionlist> 
                </rule>
        die kuechenansage+morgens.sh:

        Code:
        #!/bin/sh
        PORT=6602
        IP=192.168.178.33
        mpdname=mpd3
        volume_anfang=`30%`
        PL=Ansage
        shcmd=`/var/www/sprachansage/./vorhersage.sh && /var/www/sprachansage/./aussentemp.sh && /var/www/sprachansage/./wohntemp.sh && MPD_HOST=$IP MPD_PORT=$PORT mpc clear && MPD_HOST=$IP MPD_PORT=$PORT mpc enable 1 && MPD_PORT=$PORT MPD_HOST=$IP mpc disable 2 && MPD_PORT=$PORT MPD_HOST=$IP mpc disable 3 && MPD_PORT=$PORT MPD_HOST=$IP mpc load $PL && MPD_PORT=$PORT MPD_HOST=$IP mpc volume $volume_anfang && MPD_HOST=$IP MPD_PORT=$PORT mpc play`
        echo $shcmd
        anders ließ es sich nicht über linknx realisieren. Und die Ausführugnsdauer wenn ich es als Plugin formuliere ist ca 13 sek

        Kommentar


          #5
          Troubleshooting:

          Für die Problemsuche hilft oft ein Blick in folgende Log´s:

          alsa schreibt direkt in:
          Code:
          /var/log/messages
          pulseaudio schreibt ebenfalls in:
          Code:
          /var/log/messages
          mpd schreibt in folgende log Dateien:
          Code:
          /var/mpd/mpd.log
          oder
          Code:
          /var/mpd/errors.log
          es ist darauf zu achten, für welche mpd Instanz man die Log Dateien sucht. Die logs sind in der jeweiligen mpd.conf oder mpdx.conf festgelegt.


          Wenn sich pulseaudio nicht starten lässt:
          - alle mpd Instanzen Beenden und nochmals versuchen
          - die daemon.conf überprüfen (system Instanze yes/no, daemonize yes/no); zum testen beides auskommentieren.
          per kommandozeile lässt sich Pulsaudio mit:
          Code:
          pulseaudio -D
          als Daemon starten
          und mit:
          Code:
          pulseaudio -k
          lässt sich der Daemon beenden.

          mit:
          Code:
          pulseaudio --system
          lässt sich pulseaudio als System-Instance starten
          und mit:
          Code:
          killall pulseaudio
          wieder Beenden

          in der default.pa oder system.pa sollte man alle erstellten sinks auskommentieren (# davor) und pulseaudio neu starten mit:
          Code:
          pulseaudio -vv
           
          oder wenn in der daemon.conf kein Daemonize oder System Instance festgelegt ist
           
          pulseaudio -D -vv
          oder
          pulseaudio --system -vv
          wenn es trotzdem nicht läuft kann man hier die Fehlerausgaben Posten.


          So ich hoffe ich hab nichts vergessen. Falls irgendetwas auffällt bitte ich darum zu meckern

          Gruß

          Kommentar


            #6
            Sehr gut, endlich mal ein Anfang (ich hätts auch nur komplizierter beschreiben können!)

            Wenns fragen gibt, fragen! Man nähert sich langsam, ich hab seit jahren (sehr stabil!) so eine ähnliche Nummer (nur ohne linknx) am rennen

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar


              #7
              Hallo.
              Nach soetwas habe ich schon gesucht:-)

              Habe es gerade versucht umzusetzen.
              Da ich aber leider (noch) kein WireGate habe sonder ein Debian Squeeze Server.

              Bei pulseaudio habe ich aber leider ein Problem.
              Es will nicht starten.

              Code:
              root@homeserver:/etc/pulse# pulseaudio --system
              W: main.c: System-Modus aktiv, jeodch --disallow-exit nicht gesetzt!
              W: main.c: System-Modus aktiv, jedoch --disallow-module-loading nicht gesetzt!
              N: main.c: System-Modus aktiv, SHM-Modus gezwungenermaßen deaktiviert!
              N: main.c: System-Modus aktiv, Exit-Idle-Time gezwungenermaßen deaktiviert!
              E: main.c: Start des Daemons fehlgeschlagen.
              dies kommt wen ich es starten will.

              Die default.pl sieht folgendermaßen aus:
              Code:
              #!/usr/bin/pulseaudio -nF
              #
              # This file is part of PulseAudio.
              #
              # PulseAudio is free software; you can redistribute it and/or modify it
              # under the terms of the GNU Lesser General Public License as published by
              # the Free Software Foundation; either version 2 of the License, or
              # (at your option) any later version.
              #
              # PulseAudio is distributed in the hope that it will be useful, but
              # WITHOUT ANY WARRANTY; without even the implied warranty of
              # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
              # General Public License for more details.
              #
              # You should have received a copy of the GNU Lesser General Public License
              # along with PulseAudio; if not, write to the Free Software Foundation,
              # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
              
              # This startup script is used only if PulseAudio is started per-user
              # (i.e. not in system mode)
              
              .nofail
              
              ### Load something into the sample cache
              #load-sample-lazy x11-bell /usr/share/sounds/gtk-events/activate.wav
              #load-sample-lazy pulse-hotplug /usr/share/sounds/startup3.wav
              #load-sample-lazy pulse-coldplug /usr/share/sounds/startup3.wav
              #load-sample-lazy pulse-access /usr/share/sounds/generic.wav
              
              .fail
              
              ### Automatically restore the volume of streams and devices
              #load-module module-device-restore
              #load-module module-stream-restore
              #load-module module-card-restore
              
              ### Automatically augment property information from .desktop files
              ### stored in /usr/share/application
              load-module module-augment-properties
              
              ### Load audio drivers statically (it's probably better to not load
              ### these drivers manually, but instead use module-hal-detect --
              ### see below -- for doing this automatically)
              load-module module-alsa-sink device=dmixer sink_name=pagaewc
              #load-module module-alsa-source device=hw:1,0
              #load-module module-oss device="/dev/dsp" sink_name=output source_name=input
              #load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input
              load-module module-null-sink
              #load-module module-pipe-sink
              
              ### Automatically load driver modules depending on the hardware available
              .ifexists module-udev-detect.so
              #load-module module-udev-detect
              .else
              ### Alternatively use the static hardware detection module (for systems that
              ### lack udev support)
              #load-module module-detect
              .endif
              
              ### Automatically load driver modules for Bluetooth hardware
              .ifexists module-bluetooth-discover.so
              #load-module module-bluetooth-discover
              .endif
              
              ### Load several protocols
              .ifexists module-esound-protocol-unix.so
              load-module module-esound-protocol-unix socket="/tmp/.esd/socket"
              .endif
              load-module module-native-protocol-unix
              
              ### Network access (may be configured with paprefs, so leave this commented
              ### here if you plan to use paprefs)
              #load-module module-esound-protocol-tcp
              load-module module-native-protocol-tcp
              load-module module-zeroconf-publish
              
              ### Load the RTP reciever module (also configured via paprefs, see above)
              #load-module module-rtp-recv
              
              ### Load the RTP sender module (also configured via paprefs, see above)
              #load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 description="RTP Multicast Si$
              #load-module module-rtp-send source=rtp.monitor
              ### Load additional modules from GConf settings. This can be configured with the paprefs tool.
              ### Please keep in mind that the modules configured by paprefs might conflict with manually
              ### loaded modules.
              .ifexists module-gconf.so
              .nofail
              #load-module module-gconf
              .fail
              .endif
              
              ### Automatically restore the default sink/source when changed by the user during runtime
              load-module module-default-device-restore
              
              ### Automatically move streams to the default sink if the sink they are
              ### connected to dies, similar for sources
              load-module module-rescue-streams
              
              ### Make sure we always have a sink around, even if it is a null sink.
              #load-module module-always-sink
              
              ### Honour intended role device property
              #load-module module-intended-roles
              
              ### Automatically suspend sinks/sources that become idle for too long
              load-module module-suspend-on-idle
              
              ### If autoexit on idle is enabled we want to make sure we only quit
              ### when no local session needs us anymore.
              #load-module module-console-kit
              
              ### Enable positioned event sounds
              #load-module module-position-event-sounds
              
              ### Cork music streams when a phone stream is active
              #load-module module-cork-music-on-phone
              
              # X11 modules should not be started from default.pa so that one daemon
              # can be shared by multiple sessions.
              
              ### Load X11 bell module
              #load-module module-x11-bell sample=bell-windowing-system
              
              ### Register ourselves in the X11 session manager
              #load-module module-x11-xsmp
              
              ### Publish connection data in the X11 root window
              #.ifexists module-x11-publish.so
              #.nofail
              #load-module module-x11-publish
              #.fail
              #.endif
              
              ### Make some devices default
              set-default-sink output
              #set-default-source input
              aplay -l sagt folgendes:
              Code:
              root@homeserver:/etc/pulse# aplay -l
              **** Liste der Hardware-Geräte (PLAYBACK) ****
              Karte 0: Intel [HDA Intel], Gerät 0: ALC662 rev1 Analog [ALC662 rev1 Analog]
                Sub-Geräte: 1/1
                Sub-Gerät #0: subdevice #0
              Karte 0: Intel [HDA Intel], Gerät 1: ALC662 rev1 Digital [ALC662 rev1 Digital]
                Sub-Geräte: 1/1
                Sub-Gerät #0: subdevice #0
              und die asound.conf so:
              Code:
              pcm_slave.onboard {
                  pcm "hw:0,0"            # or "hw:0,0" for the first card
                      channels 6
                      rate 44100
              #        format  "S16_LE"
              }
              pcm.dmixer {
                      type plug
                  slave.pcm {
                  type dshare
                      ipc_key 1024
                  ipc_key_add_uid false
                  ipc_gid audio
                      ipc_perm 0660
                      slave onboard
                      bindings [ 0 1 ]
              #    rate 44100
              #    channels 2
                      }
              }
              pcm.pulse {
                  type pulse
              }
              ctl.pulse {
                  type pulse
              }
              pcm.!default {
                  type pulse
              }
              ctl.!default {
                  type pulse
              }
              ich hoffe ihr könnt mir helfen.

              Kommentar


                #8
                Bin jetzt nicht der PA-Profi aber es sagt doch initial schon was falsch ist, PA will eben nicht so gerne mit --system laufen, dann muss man halt überzeugender sein

                Makki
                EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                -> Bitte KEINE PNs!

                Kommentar


                  #9
                  Ich bin da auch kein Profi aber versuchen wir mal unser Glück

                  In der default.pa:
                  Code:
                  load-module module-native-protocol-tcp
                  da muss noch ne IP dahinter etwa in der Form:
                  Code:
                  load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.178.33/24
                  und ganz unten:
                  Code:
                  set-default-sink output
                  durch:
                  Code:
                  set-default-sink null
                  ersetzen.


                  daemon.conf:
                  Code:
                  ; system-instance = yes
                  das sollte auskommentiert sein.

                  Falls der pulseaudio noch irgendwo drin hängen sollte:
                  Code:
                  pulseaudio -k
                  um den Daemon zu beenden

                  und
                  Code:
                  killall pulseaudio
                  um pulseaudio als Systemprozess zu beenden.

                  es darf nichts anderes auf die Soundkarten zugreifen. Die müssen "frei" sein.
                  also alle mpd's vorher beenden (wenn der schon läuft)
                  Code:
                  killall mpd
                  Ich suche in meiner dokumentation mal wie man nachsehen konnte was auf der Soundkarte sitzt.

                  Könntest du in deiner /var/log/messages mal nachsehen was Pulseaudio da als Fehler angibt?

                  Für eine bessere Fehler ausgabe beim start:
                  Code:
                  pulseaudio -v
                  Und zu guter letzt ist daemonize gesetzt in deiner daemon.conf?

                  Gruß Volker

                  Edit:
                  Wichtig!!

                  Ich hab die user vergessen!

                  Den aktuellen User des mpd (bei mir root) muss noch den Gruppen hinzugefügt werden:
                  Code:
                  addgroup root pulse
                  addgroup root pulse-rt
                  addgroup root pulse-access
                  addgroup pulse audio
                  addgroup root audio

                  Kommentar


                    #10
                    Und zu guter letzt ist daemonize gesetzt in deiner daemon.conf?
                    Was meinst du damit?

                    Die Gruppe pulse-rt exestirt bei mir nicht. Hast du diese selber erstellt?

                    Unter welchen benutzer führst du pulseaudio aus?

                    Kommentar


                      #11
                      so sieht meiner daemon.conf aus

                      Code:
                      #!/usr/bin/pulseaudio -nF
                      #
                      # This file is part of PulseAudio.
                      #
                      # PulseAudio is free software; you can redistribute it and/or modify it
                      # under the terms of the GNU Lesser General Public License as published by
                      # the Free Software Foundation; either version 2 of the License, or
                      # (at your option) any later version.
                      #
                      # PulseAudio is distributed in the hope that it will be useful, but
                      # WITHOUT ANY WARRANTY; without even the implied warranty of
                      # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
                      # General Public License for more details.
                      #
                      # You should have received a copy of the GNU Lesser General Public License
                      # along with PulseAudio; if not, write to the Free Software Foundation,
                      # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
                      
                      # This startup script is used only if PulseAudio is started per-user
                      # (i.e. not in system mode)
                      
                      .nofail
                      
                      ### Load something into the sample cache
                      #load-sample-lazy x11-bell /usr/share/sounds/gtk-events/activate.wav
                      #load-sample-lazy pulse-hotplug /usr/share/sounds/startup3.wav
                      #load-sample-lazy pulse-coldplug /usr/share/sounds/startup3.wav
                      #load-sample-lazy pulse-access /usr/share/sounds/generic.wav
                      
                      .fail
                      
                      ### Automatically restore the volume of streams and devices
                      #load-module module-device-restore
                      #load-module module-stream-restore
                      #load-module module-card-restore
                      
                      ### Automatically augment property information from .desktop files
                      ### stored in /usr/share/application
                      load-module module-augment-properties
                      
                      ### Load audio drivers statically (it's probably better to not load
                      ### these drivers manually, but instead use module-hal-detect --
                      ### see below -- for doing this automatically)
                      load-module module-alsa-sink device=dmixer sink_name=pagaewc
                      #load-module module-alsa-source device=hw:1,0
                      #load-module module-oss device="/dev/dsp" sink_name=output source_name=input
                      #load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input
                      load-module module-null-sink
                      #load-module module-pipe-sink
                      
                      ### Automatically load driver modules depending on the hardware available
                      .ifexists module-udev-detect.so
                      #load-module module-udev-detect
                      .else
                      ### Alternatively use the static hardware detection module (for systems that
                      ### lack udev support)
                      #load-module module-detect
                      .endif
                      
                      ### Automatically load driver modules for Bluetooth hardware
                      .ifexists module-bluetooth-discover.so
                      #load-module module-bluetooth-discover
                      .endif
                      
                      ### Load several protocols
                      .ifexists module-esound-protocol-unix.so
                      load-module module-esound-protocol-unix socket="/tmp/.esd/socket"
                      .endif
                      load-module module-native-protocol-unix
                      
                      ### Network access (may be configured with paprefs, so leave this commented
                      ### here if you plan to use paprefs)
                      #load-module module-esound-protocol-tcp
                      load-module module-native-protocol-tcp
                      load-module module-zeroconf-publish
                      
                      ### Load the RTP reciever module (also configured via paprefs, see above)
                      #load-module module-rtp-recv
                      
                      ### Load the RTP sender module (also configured via paprefs, see above)
                      #load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 description="RTP Multicast Sink"
                      #load-module module-rtp-send source=rtp.monitor
                      
                      ### Load additional modules from GConf settings. This can be configured with the paprefs tool.
                      ### Please keep in mind that the modules configured by paprefs might conflict with manually
                      ### loaded modules.
                      .ifexists module-gconf.so
                      .nofail
                      #load-module module-gconf
                      .fail
                      .endif
                      
                      ### Automatically restore the default sink/source when changed by the user during runtime
                      load-module module-default-device-restore
                      
                      ### Automatically move streams to the default sink if the sink they are
                      ### connected to dies, similar for sources
                      load-module module-rescue-streams
                      
                      ### Make sure we always have a sink around, even if it is a null sink.
                      #load-module module-always-sink
                      
                      ### Honour intended role device property
                      #load-module module-intended-roles
                      
                      ### Automatically suspend sinks/sources that become idle for too long
                      load-module module-suspend-on-idle
                      
                      ### If autoexit on idle is enabled we want to make sure we only quit
                      ### when no local session needs us anymore.
                      #load-module module-console-kit
                      
                      ### Enable positioned event sounds
                      #load-module module-position-event-sounds
                      
                      ### Cork music streams when a phone stream is active
                      #load-module module-cork-music-on-phone
                      
                      # X11 modules should not be started from default.pa so that one daemon
                      # can be shared by multiple sessions.
                      
                      ### Load X11 bell module
                      #load-module module-x11-bell sample=bell-windowing-system
                      
                      ### Register ourselves in the X11 session manager
                      #load-module module-x11-xsmp
                      
                      ### Publish connection data in the X11 root window
                      #.ifexists module-x11-publish.so
                      #.nofail
                      #load-module module-x11-publish
                      #.fail
                      #.endif
                      
                      ### Make some devices default
                      set-default-sink nulltcp auth-ip-acl=127.0.0.1;192.168.115.1/24
                      #set-default-source input

                      Kommentar


                        #12
                        Bin gerade am handy. hoffe dass das deine default.pa ist
                        das TCP gehört auch nicht hinter den default sink Null (letzte Zeilen)
                        ausführlich wenn ich an nem ordentlichen Browser sitze

                        Kommentar


                          #13
                          So ich hab mal für den Post alle auskommentierten Zeilen entfernt. Zwecks der Übersicht

                          Code:
                          load-module module-augment-properties
                          
                          load-module module-alsa-sink device=dmixer sink_name=pagaewc
                          load-module module-null-sink
                          .ifexists module-udev-detect.so
                          .else
                          .endif
                          
                          .ifexists module-bluetooth-discover.so
                          .endif
                          
                          .ifexists module-esound-protocol-unix.so
                          load-module module-esound-protocol-unix socket="/tmp/.esd/socket"
                          .endif
                          load-module module-native-protocol-unix
                          load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.115.1/24
                          load-module module-zeroconf-publish
                           
                           
                          
                          .ifexists module-gconf.so
                          .nofail
                          .fail
                          .endif
                          
                          load-module module-default-device-restore
                          load-module module-rescue-streams
                          load-module module-suspend-on-idle
                          
                          set-default-sink null
                          bei der roten Zeile bin ich mir gerade nicht sicher ob ich dass zuhause drin hab. (bin in der Arbeit)

                          Gruß

                          Edit: die Gruppe pulse-rt sollte es eigentlich geben. Aber du brauchst sie vorerst nicht.

                          Kommentar


                            #14
                            Wie startest du denn pulseaudio?.

                            Wen ich pulseaudio -v eingebe kommt immernoch das gleiche wie ich weiter oben schoneinmal gepostet habe.
                            Wen ich es mit /etc/init.d/pulseaudio start startedann läuft ein Prozess. Muss gleich einmal nachsehen ob da was läuft.

                            Kommentar


                              #15
                              Welcher User bist du? Root?
                              Ich gebe einfach in irgendeinem verz. Pulseaudio ein.

                              Wie sieht den deine daemon.conf aus?

                              Kommentar

                              Lädt...
                              X