Ankündigung

Einklappen
Keine Ankündigung bisher.

Linuxfrage: Volume auf GA senden????

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

    Linuxfrage: Volume auf GA senden????

    Hallo,

    ich hab eine relativ spezielle Frage:

    Ausgangssituation:

    Sound macht eine 7.1 karte für 4 Räume. Über eine Dimmer Applikation meiner Jung Taster schalte ich den Radio (stream, mp3) ein und aus (mpd in mehreren instanzen).
    kurzer tastenDruck -> Radio ein/aus (mpd über WG Plugin play/stop)
    langer Tastendruck (mit zyklischem Senden der Wertänderung) -> Lautstärke rauf/runter.

    Jetzt wäre es eine feine Sache wenn ich die lautstärke als % - Wert o.ä eine GA senden könnte....
    ich kann mit:

    Code:
    MPD_PORT=6601 MPD_HOST=192.168.178.33 mpc
    die Lautstärke anzeigen lassen.
    Code:
    volume: 25%   repeat: on    random: on
    Aber wir kann ich die angezeigten werte zerlegen, und den Wert den ich Brauche über ein Plugin weiter verarbeiten?? Also ich bräuchte nur die 25 als Zahlenwert(Float?) ohne dem % Zeichen.
    ChrisM hat in einem anderen Thread was über "sed" geschrieben (Schweizertaschenmesser unter linux ) ich denke dass sollte für sowas gut sein. Aber ich bekomme es leider nicht hin....

    Gruß

    #2
    Hi,

    das funktioniert mit sed z. B. so:

    $ echo "volume: 25% repeat: on random: on" | sed 's/^volume: //; s/%.*$//'
    25

    Grüße
    Robert

    Kommentar


      #3
      Hallo,
      Danke für die Antwort
      ich brauche die 25 so weit OK. Aber die 25 sind aber Variabel. d.h. wenn ich 50% Lautstärke hab brauch ich 50.

      Gruß

      Kommentar


        #4
        Der String nach dem echo ist doch nur ein Beispiel um
        mal etwas zu haben was per Pipe an sed uebergeben wird.

        Im echten Betrieb musst Du natuerlich dort den Rueckgabewert
        der Busrueckmeldung per Pipe an sed weiterleiten.

        Kommentar


          #5
          Jetzt steh ich auf dem Schlauch

          also ich möchte per Perl Plugin die Lautstärke automatisch abfragen, und an eine GA senden, um in der Visu eine Rückmeldung über die Lautstärke zu haben.
          Kann ich dass mit deiner Code Zeile realisieren?


          Gruß

          Kommentar


            #6
            Hi,

            also wenn du ein perl-Skript schreibst, dann solltest du auch perl verwenden und nicht auf sed oder awk zurück greifen.

            Gerade bei regulären Ausdrücken und Textverarbeitung ist perl (fast) unschlagbar.

            Anbei ein Bsp. für perl:
            Code:
            lenny@box:~/scripts/perl$ cat get_vol.pl
            #!/usr/bin/perl -w
            
            use strict;
            
            my $FILE="test.txt";
            
            open FH, "<$FILE";
            while(<FH>) {
              if( $_ =~ m/^volume:\s+(\d+)%\s+.*$/) {
                my $match=$1;
                print "$match\n";
              }
            }
            close FH;
            lenny@box:~/scripts/perl$ cat test.txt
            volume: 35%   repeat: on    random: on
            
            lenny@box:~/scripts/perl$ cat get_vol.pl
            #!/usr/bin/perl -w
            
            use strict;
            
            my $FILE="test.txt";
            
            open FH, "<$FILE";
            while(<FH>) {
              # volume: 25%   repeat: on    random: on
              if( $_ =~ m/^volume:\s+(\d+)%\s+.*$/) {
                my $match=$1;
                print "$match\n";
              }
            }
            close FH;
            
            lenny@box:~/scripts/perl$ ./get_vol.pl
            35

            Kommentar


              #7
              Vielen Dank!!

              Das:
              Code:
              if( $_ =~ m/^volume:\s+(\d+)%\s+.*$/)
              ist mir zu hoch!

              hier mein Script das jede minute die lautstärke aktualisiert (wenn sie nicht über die visu geändert wird sondern über BitMPC, Relaxx o.ä)
              Code:
              my $lautstaerke = '13/1/22';
              $plugin_info{$plugname.'_cycle'} = 60;
              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 "ok";
                }
              }
              close FH;
              hier das script das das signal von der visu in den mpd überträgt:
              Code:
              my $lautstaerke = '13/1/22';
              my $laut_GA = '13/1/23';    #the volume will be send here
              my $Port = "6601";
              my $IP = "192.168.178.33";
              $plugin_subscribe{$laut_GA}{$plugname} = 1;
              $plugin_info{$plugname.'_cycle'} = 0;
              
              
              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($lautstaerke,$vol,5);
                  return $vol;
              }
              else {
              return 0;
              }
              kann ich das nach änderungsdatum/uhrzeit der test.txt laufen lassen?

              vielen Dank für eure Hilfe und Geduld!

              Gruß

              Kommentar


                #8
                Code:
                if( $_ =~ m/^volume:\s+(\d+)%\s+.*$/)
                Das m steht für match (könnte auch weggelassen werden).
                Es wird nach einem Suchausdruck zwischen den / ... / gesucht. Das ^ bedeutet, dass das nachfolgende Wort, volume, am Anfang der Zeile stehen muss. \s beschreib Tabulatoren, Leerzeichen, etc. und das + bedeutet, dass dieses Zeichen mindestens einmal und beliebig oft vorkommt. In den () Klammern wird das Matching gespeichert, welches hier eine Zahl sein muss.

                Zitat von vlamers Beitrag anzeigen
                kann ich das nach änderungsdatum/uhrzeit der test.txt laufen lassen?
                Verstehe die Frage nicht ganz?


                Was für einen Server nutzt du, um mit perl Ereignisse auf dem Bus abzufangen und zusenden?

                Kommentar


                  #9
                  Zitat von Lenny Beitrag anzeigen
                  my $FILE="test.txt";

                  open FH, "<$FILE";
                  while(<FH>) {
                  if( $_ =~ m/^volume:\s+(\d+)%\s+.*$/) {
                  my $match=$1;
                  print "$match\n";
                  }
                  }
                  close FH;
                  Hoi Volker, das kann man schon lesen:

                  wenn der übergebene Wert ($_) geparst gleich Abschnitt1 + Abschnitt2 + Abschnitt3 aussieht, dann nimm den Abschnitt2 ($1) (bei 0 beginnen). (ääh hier liege ich evtl. falsch, siehe Lenny)

                  Abschnitt1 ist am Anfang (^) der Text volume: und dann Leerzeichen (\s) auch mehrere (+)

                  Abschnitt2 ist vom Typ Zahl (\d) und mehrere möglich (+) und steht in Klammern damit genau das in Abschnitt2 drin ist was wir haben wollen.

                  Der Rest (Abschnitt3) ist der Text % Leerzeichen (\s) auch mehrere (+) und dann egal was (.*) bis zum Ende ($)

                  Ein Datum z.B. kann man so parsen (\d+).(\d+).(\d+) drei Zahlen mit Punkten dazwischen und mehrstellig möglich. Dann hättest Du in $0 = Tag und in $1 = Monat und in $2 = Jahr (bei deutscher Reihenfolge).

                  Naja so ganz felsenfest bin ich nicht, das /s sind wohl spaces tabs usw. Ich muss selber immer nachschauen
                  Grüsse Bodo
                  Fragen gehören ins Forum, und nicht in mein Postfach;
                  EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                  Kommentar


                    #10
                    Ah ich wusste nicht für was dass d+ usw. steht.
                    Jetzt wirds mir klarer!

                    War doof vormuliert. Ich möchte wenn die lautstärke von einem externen programm geändert wird ein automatisches update der lautstärke GA. Aber wenn ich jetzt genauer darüber nachdenke müsste ich da am mpd rum pfuschen... also hat sichs erledigt.

                    Ich nutze ein Wiregate. Und versuche gerade meine mpd steuerung in die visu einzubauen...

                    Vielen Dank eine Baustelle weniger!!

                    Kommentar

                    Lädt...
                    X