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

    #61
    Also ich mag den socat ja wirklich - als Helfer in der Not - aber wenn ich das richtig lese, gehts direkt per UDP, oder?
    Dann ist das eher der richtige Weg..

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

    Kommentar


      #62
      sischer sischer,

      jedoch, hat der programmierer das mit dem Helfer in der Not gelöst und ich bin auf Ergebnisse angewiesen, da die notwendigen Kenntnisse fehlen.


      Grüße,
      lio

      Kommentar


        #63
        Ok.. Ohne Squeeze-Ambitionen kann ich mich aber nur für Fragen zur Verfügung stellen

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

        Kommentar


          #64
          So ... wer keinen Bock mehr auf das socat Geraffel im Webmin hat kann das auch einfacher lösen. Einfach die Player-ID und IP-Adresse des Squeezeboxservers ändern und die GAs anpassen. Fertig.

          Wenn ich mal mehr Lust hab dann räum ich den Code auch auf und schieb den ins SVN.

          Code:
          # Steuern der Squeezeboxen
          # V0.4 2013-02-03
          use IO::Socket;
          ### 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 $squeezeserver = '192.168.2.221';
          my $squeezeport = '9090';
          
          ### Ende Definitionen
          
          # Eigenen Aufruf-Zyklus setzen
          $plugin_info{$plugname.'_cycle'} = 0;
          
          # Beispiel für Hash-Zuordnung
          # $key = power
          # {$function{power} = "8/1/0"
          
          my %function = ("power"=>"8/1/0",
                          "play"=>"8/1/1",
                          "mute"=>"8/1/2",
                          "vol_trigger"=>"8/1/3",
                          "volume"=>"8/1/5",
                          "pause"=>"8/1/4",
                          "stop"=>"8/1/6",
                          "favorites"=>"8/1/7",
                          "show"=>"1/2/35");
          
          # Plugin an Gruppenadresse "anmelden"
          while (my($key,$ga) = each %function)
          {
            $plugin_subscribe{$function{$key}}{$plugname} = 1;
          }
          
          # Nur bei einem Wert auf GA reagieren
          # Power Befehl / 0=off 1=on
          if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $function{power} && 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 $function{play} && 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 $function{mute} && 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 $function{vol_trigger} && $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 $function{vol_trigger} && $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 $function{volume} && 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 $function{pause} && 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 $function{stop} && 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 $function{favorites} && defined $msg{'value'}) {
              my $command = $player_id ." favorites playlist play item_id:" .$msg{'value'};
              my $return_val = sendCommand($command);
          #    plugin_log($plugname, $return_val);
          }
          
          # Display / Trigger mit beliebigem Wert
          if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $function{show} && defined $msg{'value'}) {
              my $command = $player_id . " show line1:Mirko%20liebt%20nur line2:Juliane duration:10 centered:1";
              my $return_val = sendCommand($command);
          #    plugin_log($plugname, $return_val);
          }
          
          #Special Notifications
          #Aussentemperatur anzeigen
          my $temp_aussen = knx_read("7/0/0",0);
          my $temp_speicher = knx_read("7/0/20",0);
          my $temp_trigger = "1/2/100";
          $plugin_subscribe{$temp_trigger}{$plugname} = 1;
          if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $temp_trigger && defined $msg{'value'}) {
              my $command = $player_id . " show line1:Aussentemperatur%20" . $temp_aussen . "%20°C line2:Speicher%20" . $temp_speicher . "%20°C duration:30 centered:1";
              my $return_val = sendCommand($command);
          }
          
          sub sendCommand {
          my $cmd = $_[0];
          my $sock = new IO::Socket::INET (
          PeerAddr => $squeezeserver,
          PeerPort => $squeezeport,
          Proto => 'tcp',
          );
          die "Error: $!\n" unless $sock;
          print $sock ($cmd."\n") ;
          my $answer=<$sock>;
          plugin_log($plugname, $answer);
          close($sock);
          }
          
          #<playerid> button <buttoncode>
          #
          #The "button" command simulates a button press. Valid button codes correspond to the functions defined in the Default.map file.
          #
          #Example:
          #
          #Request: "04:20:00:12:23:45 button stop<LF>"
          #Response: "04:20:00:12:23:45 button stop<LF>"
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #65
            - √ - Socat Problem - Squeezebox Telnet

            Danke!


            Gesendet von unterwegs

            Kommentar


              #66
              Klasse! Sitzt passt, wackelt und hat Luft. Habs nur auf die schnelle mal eingebunden, aber das sieht nach einer super easy Basis aus, um noch weitere Squeezecommands einfach einzubauen... Irgendwann...
              Cheers,
              Oliver

              Kommentar


                #67
                Jup ... und soweit ich das sehe ein Plugin ohne großartige memleaks.
                Socat-Plugins sind nichts für den wiregated soweit ich das beobachten konnte. alles was mit Sockets arbeitet zieht und zieht und zieht ... bis monit kommt.

                Das alte hat dermaßen den Speicher gefressen ... grauenvoll ... war deshalb bei mir nicht mehr im Einsatz.

                Der Spaghetti-Code ist erstmal nicht so schön aber da damit lassen sich schnell auch Sonderanforderungen machen -> siehe #Special Notifications und # Display / Trigger mit beliebigem Wert.

                Grüße
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #68
                  Cool, danke!
                  Dann macht es jetzt wirklich Sinn, mein altes Plugin zu ersetzen :-)

                  Gruß Moritz

                  Kommentar


                    #69
                    na das check ich dann auch mal bald.
                    Danke!

                    Kommentar


                      #70
                      Dann mal ab ins SVN damit

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

                      Kommentar


                        #71
                        Hi Mirko,

                        Du kannst bitte gerne mein Plugin im SVN überschreiben.

                        Gruß Moritz

                        Kommentar


                          #72
                          Jein ... bei der "notification" gibt es den hässlichen Fehler dass die Rückmeldung erst nach 30 Sekunden kommt.

                          Also folgende Änderung:
                          Code:
                          print $sock ($cmd."\n") ;
                          --    my $answer=<$sock>;
                          --    plugin_log($plugname, $answer);
                          ++    plugin_log($plugname, $cmd);
                          close($sock);
                          }
                          Code:
                          # Steuern der Squeezeboxen
                          # V0.5 2013-02-08
                          use IO::Socket;
                          ### 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 $squeezeserver = '192.168.2.221';
                          my $squeezeport = '9090';
                          
                          ### Ende Definitionen
                          
                          # Eigenen Aufruf-Zyklus setzen
                          $plugin_info{$plugname.'_cycle'} = 0;
                          
                          # Beispiel für Hash-Zuordnung
                          # $key = power
                          # {$function{power} = "8/1/0"
                          
                          my %function = ("power"=>"8/1/0",
                                          "play"=>"8/1/1",
                                          "mute"=>"8/1/2",
                                          "vol_trigger"=>"8/1/3",
                                          "volume"=>"8/1/5",
                                          "pause"=>"8/1/4",
                                          "stop"=>"8/1/6",
                                          "favorites"=>"8/1/7",
                                          "show"=>"1/2/35");
                          
                          # Plugin an Gruppenadresse "anmelden"
                          while (my($key,$ga) = each %function)
                          {
                            $plugin_subscribe{$function{$key}}{$plugname} = 1;
                          }
                          
                          # Nur bei einem Wert auf GA reagieren
                          # Power Befehl / 0=off 1=on
                          if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $function{power} && 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 $function{play} && 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 $function{mute} && 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 $function{vol_trigger} && $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 $function{vol_trigger} && $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 $function{volume} && 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 $function{pause} && 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 $function{stop} && 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 $function{favorites} && defined $msg{'value'}) {
                              my $command = $player_id ." favorites playlist play item_id:" .$msg{'value'};
                              my $return_val = sendCommand($command);
                          #    plugin_log($plugname, $return_val);
                          }
                          
                          # Display / Trigger mit beliebigem Wert
                          if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $function{show} && defined $msg{'value'}) {
                              my $command = $player_id . " show line1:Mirko%20liebt%20nur line2:Juliane duration:10 centered:1";
                              my $return_val = sendCommand($command);
                          #    plugin_log($plugname, $return_val);
                          }
                          
                          #Special Notifications
                          #Aussentemperatur anzeigen
                          my $temp_aussen = knx_read("7/0/0",0);
                          my $temp_speicher = knx_read("7/0/20",0);
                          my $temp_trigger = "1/2/100";
                          $plugin_subscribe{$temp_trigger}{$plugname} = 1;
                          if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $temp_trigger && defined $msg{'value'}) {
                              my $command = $player_id . " show line1:Aussentemperatur%20" . $temp_aussen . "%20°C line2:Speicher%20" . $temp_speicher . "%20°C duration:30 centered:1";
                              my $return_val = sendCommand($command);
                          }
                          
                          sub sendCommand {
                          my $cmd = $_[0];
                          my $sock = new IO::Socket::INET (
                          PeerAddr => $squeezeserver,
                          PeerPort => $squeezeport,
                          Proto => 'tcp',
                          );
                          die "Error: $!\n" unless $sock;
                          print $sock ($cmd."\n") ;
                          plugin_log($plugname, $cmd);
                          close($sock);
                          }
                          
                          #<playerid> button <buttoncode>
                          #
                          #The "button" command simulates a button press. Valid button codes correspond to the functions defined in the Default.map file.
                          #
                          #Example:
                          #
                          #Request: "04:20:00:12:23:45 button stop<LF>"
                          #Response: "04:20:00:12:23:45 button stop<LF>"
                          Umgezogen? Ja! ... Fertig? Nein!
                          Baustelle 2.0 !

                          Kommentar


                            #73
                            Ich kann mir jetzt nicht die ganze Sache ansehen, geschweige denn von testen.. Aber der tiefere Sinn der Sockets im Plugin ist: einmal öffnen und dann ganz entspannt auf den Aufruf beim eintreffen von Daten warten; aufgerufen werden! ($fh und so)

                            close($..) im Plugin ist bestenfalls ineffizient..

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

                            Kommentar


                              #74
                              Zitat von makki Beitrag anzeigen
                              close($..) im Plugin ist bestenfalls ineffizient..

                              Makki
                              Warum? ... Ich meine die Frage ernst ... gibt es da einen Grund.
                              Ich hab heute mal folgendes gemacht ... identisches Plugin, lediglich das Senden wird anders ausgeführt:

                              Squeezebox_close.pl
                              Code:
                              sub sendCommand {
                              my $cmd = $_[0];
                              my $sock = new IO::Socket::INET (
                              PeerAddr => $squeezeserver,
                              PeerPort => $squeezeport,
                              Proto => 'tcp',
                              );
                              die "Error: $!\n" unless $sock;
                              print $sock ($cmd."\n") ;
                              #my $answer=<$sock>;
                              #plugin_log($plugname, $answer);
                              plugin_log($plugname, $cmd);
                              close($sock);
                              }
                              Squeezebox_ever.pl
                              Code:
                              # Socket erstellen
                              if (!$socket[$socknum]) { # socket erstellen
                              
                                      $socket[$socknum] = IO::Socket::INET->new(#LocalPort => $send_port,
                                                                Proto => "tcp",
                                                                PeerPort  => $send_port,
                                                                PeerAddr  => $send_ip,
                                                                ReuseAddr => 1
                                                                 )
                                               or return ("open of $send_ip : $send_port failed: $!");
                                  
                              
                                  $socksel->add($socket[$socknum]); # add socket to select
                              
                                  $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
                                  return "opened Socket $socknum";
                              }
                              .
                              .
                              .
                              .
                              .
                              sub sendCommand {
                              my $cmd = $_[0]."\n";
                              syswrite($socket[$socknum],$cmd);
                              }
                              Der geloggte Speicherverbrauch im WireGate spricht da Bände. 0 MBi vs. 13 MBi


                              Grüße
                              Angehängte Dateien
                              Umgezogen? Ja! ... Fertig? Nein!
                              Baustelle 2.0 !

                              Kommentar


                                #75
                                Zitat von JuMi2006 Beitrag anzeigen
                                Warum? ... Ich meine die Frage ernst ... gibt es da einen Grund.
                                Ich hätte es umgekehrt vermutet aber memleaks in Perl sind so ähnlich wie schwarze Löcher: versteht nur Albert Einstein oder Larry Wall

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

                                Kommentar

                                Lädt...
                                X