Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Socat Problem - Squeezebox Telnet

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] - √ - Socat Problem - Squeezebox Telnet

    Hallo Zusammen,

    da ich nichts gefunden habe, habe ich mal angefangen mir ein Plugin für die Steuerung meiner Squeezeboxen zu schreiben.
    Nur habe ich leider keine Idee wie ich den Socat debuggen kann. Bisher funktioniert es leider noch nicht...

    Ich versuch mal den Stand zu beschreiben:

    1. Ich kann vom Wiregate mit socat auf den squeeze-server zugreifen mit:
    Code:
    socat READLINE,history=$HOME/.squeeze_history TCP4:192.168.1.4:9090
    2. meine Socat Konfiguration als screenshot ist angehängt

    3. Mein Plugin:
    Code:
    # Steuern der Squeezeboxen
    # socat notwendig
    # V0.1 2011-12-17
    
    ### Im WG muss eine Socketverbindung mit folgenden Parametern erstellt werden
    # Socket1: tcp-connect, Socket: IP_OF_SqueezeServer:9090
    # Socket2: udp-datagram, Socket: localhost:50105, Optionen: bind=localhost:50106,reuseaddr
    
    ### Definitionen 
    
    my $power_ga = "5/1/5";  # Gruppenadresse
    my $player_id = "00%3A04%3A20%3A18%3A26%3A8c";   # Player ID
    my $cmd = "power";   # Kommando, dass an die Box gesendet werden soll
    
    my $socknum = 121; # Eindeutige Nummer des Sockets +1
    my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $send_port = "50106"; # Sendeport (UDP, siehe in Socket-Einstellungen)
    my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
    my $recv_port = "50105"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
    
    ### Ende Definitionen
    
    # Eigenen Aufruf-Zyklus setzen
    $plugin_info{$plugname.'_cycle'} = 0;
    
    # Plugin an Gruppenadresse "anmelden"
    $plugin_subscribe{$power_ga}{$plugname} = 1;
    
    # Socket erstellen
    if (!$socket[$socknum]) {
            $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                      Proto => "udp",
                                      LocalAddr => $recv_ip,
                                      PeerPort  => $send_port,
                                      PeerAddr  => $send_ip,
                                      ReuseAddr => 1
                                       )
        or plugin_log($plugname, "open of $recv_ip : $recv_port failed: $!");
        $socksel->add($socket[$socknum]); # add socket to select
        $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
        plugin_log($plugname, "opened Socket $socknum");
    } 
    
    # Nur bei einem Wert auf GA reagieren
    if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $power_ga && defined $msg{'value'}) {
        my $command = $player_id . " " . $cmd . " " . $msg{'value'};
        my $return_val = sendCommand($command);
        plugin_log($plugname, $return_val);
    }
    
    # Log
    return 0;
    
    sub sendCommand {
        my $command = $_[0];
        plugin_log($plugname, $command);
        syswrite($socket[$socknum], $command);
    }
    4. Wenn ich jetzt auf die GA eine 1 schicke, bekomme ich im Log:
    Code:
    2011-12-18 12:32:45.544,SqueezeSteuerung,00%3A04%3A20%3A18%3A26%3A8c power 1 
    2011-12-18 12:32:45.545,SqueezeSteuerung,35
    Die erste Zeile ist der Befehl, der an den Squeezeserver geschickt werden soll und passt soweit auch. Nur passiert nichts weiter. Mit dem Return-Value '35' kann ich leider nichts anfangen.
    Möglicherweise liegt es am CRLF im Socat. Laut Squeeze-CLI brauche ich nur ein LF. Aber das habe ich im socat nicht gefunden.

    Kann mir jemand helfen, wie ich das weiter debugge? Vielleicht übersehe ich ja auch irgendwas.

    Danke und Gruß,
    Moritz
    Angehängte Dateien

    #2
    Mehr ins blaue geraten, da meine Squeezeboxen noch original verpackt im Keller stehen:
    Probier mal "crnl" bzw. "cr" als Option für den socat. "crlf" habe ich nicht finden können.

    cr Converts the default line termination character NL ('\n', 0x0a) to/from CR ('\r', 0x0d) when writing/reading on this channel. crnl Converts the default line termination character NL ('\n', 0x0a) to/from CRNL ("\r\n", 0x0d0a) when writing/reading on this channel (example). Note: socat simply strips all CR characters.
    Vielleicht bringt das ja schon was...

    Gruß
    Christian

    Kommentar


      #3
      Zitat von ChristianRD Beitrag anzeigen
      Probier mal "crnl" bzw. "cr" als Option für den socat.
      Leider ändert sich mit cr oder crnl nichts. Schade!
      Es sei denn ich muss den socat doch noch irgendwie speziel neu starten...

      Danke trotzdem Christian!

      Gruß

      Kommentar


        #4
        Am ende des Stings der übertragen werden soll, sollte ein \r angehängt werden.

        Also z.B.

        Code:
        my $command = $_[0]."\r";
        Was mir noch auffällt... Wiso sind im Log mehreere Abstände zwischen den Befehlen? Ist das so auch in der Protokollbeschreibung?
        Gruss Patrik alias swiss

        Kommentar


          #5
          Hi Swiss,

          ist eine gute Idee - hat den Rückgabewert auf '36' anstatt '35' geändert. Nur was soll mir das sagen...?

          Im Befehl und im Log sind jeweils ein "Space" zwischen den Befehlsteilen.

          Danke und Gruß,
          Moritz

          Kommentar


            #6
            Und nochmal ich:

            mit einem angehängten linefeed '\n' hat es funktioniert :-)

            Danke für den Tip swiss - war die richtige Richtung!

            Gruß

            Kommentar


              #7
              Super

              Dann bekommen wir ja vieleicht bald das fertige Ergebniss für in's SVN
              Gruss Patrik alias swiss

              Kommentar


                #8
                Klar, jetzt muss ich über Weihnachten aber erstmal die restliche Logik reinbasteln. Wenn das Ganze vorzeigbar ist, lade ich es ins SVN.

                Schönen abend,
                Moritz

                Kommentar


                  #9
                  Hallo Moritz,

                  wie weit bist Du gekommen? Würde gern an Deinen Erfahrungen teilhaben Gibt es was zu veröffentlichen?

                  Danke und Gruß
                  Mirko
                  Umgezogen? Ja! ... Fertig? Nein!
                  Baustelle 2.0 !

                  Kommentar


                    #10
                    Zitat von JuMi2006 Beitrag anzeigen
                    wie weit bist Du gekommen?
                    Hi Mirko,

                    So und so. Das Plugin funktioniert zuverlässig, nur habe ich noch nicht wieder Zeit gefunden mehr als Ein/Aus zu implementieren. Das lässt sich aber einfach machen - ist nur Fleissarbeit.

                    Hier das Plugin wie es seit vielen Monaten rennt:
                    Code:
                    # Steuern der Squeezeboxen
                    # socat notwendig
                    # V0.1 2011-12-17
                    
                    ### Im WG muss eine Socketverbindung mit folgenden Parametern erstellt werden
                    # Socket1: tcp-connect, Socket: IP_OF_SqueezeServer:9090
                    # Socket2: udp-datagram, Socket: localhost:50105, Optionen: bind=localhost:50106,reuseaddr
                    
                    ### Definitionen 
                    
                    my $power_ga = "1/3/0";  # Gruppenadresse
                    my $player_id = "00%3A04%3A20%3A29%3Acc%3A63";   # Player ID
                    my $cmd = "power";   # Kommando, dass an die Box gesendet werden soll
                    
                    my $socknum = 121; # Eindeutige Nummer des Sockets +1
                    my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
                    my $send_port = "50106"; # Sendeport (UDP, siehe in Socket-Einstellungen)
                    my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
                    my $recv_port = "50105"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
                    
                    ### Ende Definitionen
                    
                    # Eigenen Aufruf-Zyklus setzen
                    $plugin_info{$plugname.'_cycle'} = 0;
                    
                    # Plugin an Gruppenadresse "anmelden"
                    $plugin_subscribe{$power_ga}{$plugname} = 1;
                    
                    # Socket erstellen
                    if (!$socket[$socknum]) {
                            $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                                      Proto => "udp",
                                                      LocalAddr => $recv_ip,
                                                      PeerPort  => $send_port,
                                                      PeerAddr  => $send_ip,
                                                      ReuseAddr => 1
                                                       )
                        or plugin_log($plugname, "open of $recv_ip : $recv_port failed: $!");
                        $socksel->add($socket[$socknum]); # add socket to select
                        $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
                        plugin_log($plugname, "opened Socket $socknum");
                    } 
                    
                    # Nur bei einem Wert auf GA reagieren
                    if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $power_ga && defined $msg{'value'}) {
                        my $command = $player_id . " " . $cmd . " " . $msg{'value'};
                        my $return_val = sendCommand($command);
                        plugin_log($plugname, $return_val);
                    }
                    
                    # Log
                    return 0;
                    
                    sub sendCommand {
                        #my $command = $_[0];
                        my $command = $_[0]."\n";
                        plugin_log($plugname, $command);
                        syswrite($socket[$socknum], $command);
                    }

                    Kommentar


                      #11
                      Danke, das reicht erstmal, wenn ich was erweiterewird es hier gepostet bzw. würde ich es ins svn legen falls Du nix dagegen hast.
                      Umgezogen? Ja! ... Fertig? Nein!
                      Baustelle 2.0 !

                      Kommentar


                        #12
                        Kurze Zwischenfrage, der Squeeze Server muss local laufen oder geht das auch mit mysqueezebox.com ?
                        Umgezogen? Ja! ... Fertig? Nein!
                        Baustelle 2.0 !

                        Kommentar


                          #13
                          Zitat von JuMi2006 Beitrag anzeigen
                          ... würde ich es ins svn legen falls Du nix dagegen hast.
                          Definitiv nichts dagegen. Immer rein damit!

                          Gruß

                          Kommentar


                            #14
                            Zitat von JuMi2006 Beitrag anzeigen
                            ... der Squeeze Server muss local laufen oder geht das auch mit mysqueezebox.com ?
                            Bei mir läuft der Squeezeserver auf einem anderen lokalen Rechner - also nicht auf dem Wiregate. Das ginge aber bestimmt auch.
                            Ob es auch mit mysqueezebox.com geht, weiss ich nicht - habe ich nicht ausprobiert.

                            Grüße Moritz

                            Kommentar


                              #15
                              Hier mal der aktuelle Stand:

                              AN/AUS
                              Lauter/Leiser (+-10%)
                              Lautstärke in %
                              Stop
                              Play
                              Pause
                              Mute
                              Favoriten


                              Code:
                              # Steuern der Squeezeboxen
                              # socat notwendig
                              # V0.2 2012-06-28
                              
                              ### Im WG muss eine Socketverbindung mit folgenden Parametern erstellt werden
                              # Socket1: tcp-connect, Socket: IP_OF_SqueezeServer:9090
                              # Socket2: udp-datagram, Socket: localhost:50105, Optionen: bind=localhost:50106,reuseaddr
                              
                              ### Definitionen 
                              
                              # 00%3A04%3A20%3A1f%3A92%3Ac4
                              # 00:04:20:1f:92:c4
                              my $player_id = "00%3A04%3A20%3A1f%3A92%3Ac4";   # Player ID = Mac Adresse Trennzeichen "%3A"
                              
                              my $power_ga = "8/1/0";  # "power" # DPT1 1=on 0=off
                              my $play_ga = "8/1/1";  # "play" # Trigger DPT1 Wert egal
                              my $mute_ga = "8/1/2";  # "mixer muting" # DPT1 1=mute 0=unmute
                              my $vol_trigger_ga = "8/1/3";  # "mixer volume" +/- 10% Trigger DPT1 1=vol-up 0=vol-down
                              my $volume_ga = "8/1/5";  # "mixer volume" # absoluter Wert  DPT5
                              my $pause_ga = "8/1/4";  # "button pause" # Trigger DPT1 Wert egal
                              my $stop_ga = "8/1/6"; # "button stop" # Trigger DPT1 Wert egal
                              my $favorites_ga = "8/1/7"; # "favorites playlist play item_id:" # DPT 6.020 Nummer des Favoriten
                              
                              
                              my $socknum = 121; # Eindeutige Nummer des Sockets +1
                              my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
                              my $send_port = "50106"; # Sendeport (UDP, siehe in Socket-Einstellungen)
                              my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
                              my $recv_port = "50105"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
                              
                              ### Ende Definitionen
                              
                              # Eigenen Aufruf-Zyklus setzen
                              $plugin_info{$plugname.'_cycle'} = 0;
                              
                              # Plugin an Gruppenadresse "anmelden"
                              $plugin_subscribe{$power_ga}{$plugname} = 1;
                              $plugin_subscribe{$play_ga}{$plugname} = 1;
                              $plugin_subscribe{$mute_ga}{$plugname} = 1;
                              $plugin_subscribe{$vol_trigger_ga}{$plugname} = 1;
                              $plugin_subscribe{$volume_ga}{$plugname} = 1;
                              $plugin_subscribe{$pause_ga}{$plugname} = 1;
                              $plugin_subscribe{$stop_ga}{$plugname} = 1;
                              $plugin_subscribe{$favorites_ga}{$plugname} = 1;
                              
                              # Socket erstellen
                              if (!$socket[$socknum]) {
                                      $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                                                Proto => "udp",
                                                                LocalAddr => $recv_ip,
                                                                PeerPort  => $send_port,
                                                                PeerAddr  => $send_ip,
                                                                ReuseAddr => 1
                                                                 )
                                  or plugin_log($plugname, "open of $recv_ip : $recv_port failed: $!");
                                  $socksel->add($socket[$socknum]); # add socket to select
                                  $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
                                  plugin_log($plugname, "opened Socket $socknum");
                              } 
                              
                              # Nur bei einem Wert auf GA reagieren
                              
                              # Power Befehl / 0=off 1=on
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $power_ga && defined $msg{'value'}) {
                                  my $command = $player_id . " power " . $msg{'value'};
                                  my $return_val = sendCommand($command);
                               #   plugin_log($plugname, $return_val);
                              }
                              
                              # Play (last) = Power on / Trigger mit beliebigem Wert
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $play_ga && defined $msg{'value'}) {
                                  my $command = $player_id . " play";
                                  my $return_val = sendCommand($command);
                              #    plugin_log($plugname, $return_val);
                              }
                              
                              # Mute Befehl / Trigger mit beliebigem Wert
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $mute_ga && defined $msg{'value'}) {
                                  my $command = $player_id . " mixer muting " . $msg{'value'};
                                  my $return_val = sendCommand($command);
                              #    plugin_log($plugname, $return_val);
                              }
                              
                              # Volume Down Befehl -10 Prozent / DPT 1 Trigger auf 0
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $vol_trigger_ga && $msg{'value'}==0) {
                                  my $command = $player_id . " mixer volume -10";
                                  my $return_val = sendCommand($command);
                              #    plugin_log($plugname, $return_val);
                              }
                              
                              # Volume Down Befehl +10 Prozent / DPT 1 Trigger auf 1
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $vol_trigger_ga && $msg{'value'}==1) {
                                  my $command = $player_id . " mixer volume +10";
                                  my $return_val = sendCommand($command);
                              #    plugin_log($plugname, $return_val);
                              }
                              
                              # Lautstärke setzen / DPT 5 in %
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $volume_ga && defined $msg{'value'}) {
                                  my $command = $player_id ." mixer volume " .$msg{'value'};
                                  my $return_val = sendCommand($command);
                              #    plugin_log($plugname, $return_val);
                              }
                              
                              # Pause Befehl / Trigger mit beliebigem Wert
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $pause_ga && defined $msg{'value'}) {
                                  my $command = $player_id . " button pause";
                                  my $return_val = sendCommand($command);
                              #    plugin_log($plugname, $return_val);
                              }
                              # Stop Befehl über Button / Trigger mit beliebigem Wert
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $stop_ga && defined $msg{'value'}) {
                                  my $command = $player_id . " button stop";
                                  my $return_val = sendCommand($command);
                              #    plugin_log($plugname, $return_val);
                              }
                              
                              # Favoriten wählen / DPT 6.020 als integer der Favoritennummer
                              if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $favorites_ga && defined $msg{'value'}) {
                                  my $command = $player_id ." favorites playlist play item_id:" .$msg{'value'};
                                  my $return_val = sendCommand($command);
                              #    plugin_log($plugname, $return_val);
                              }
                              
                              # Log
                              return 0;
                              
                              sub sendCommand {
                              
                                  my $command = $_[0]."\n";
                                  plugin_log($plugname, $command);
                                  syswrite($socket[$socknum], $command);
                              }
                              Umgezogen? Ja! ... Fertig? Nein!
                              Baustelle 2.0 !

                              Kommentar

                              Lädt...
                              X