Ankündigung

Einklappen
Keine Ankündigung bisher.

Denon-Plugin

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

    [wiregate] Denon-Plugin

    Sehr schlampig, sehr alpha aber mir reichts
    an/aus,Quelle,Status..

    Der Rest dürfte nur Tipparbeit sein -> wenn man sagt, was man noch will/braucht

    Wichtig: siehe Anhang: wieder mit socat (ist halt einfacher, was bei Änderung von localhost durch eine andere IP auch dem lieben HS per UDP genügen sollte)
    Optional geht es aber auch direkt über den /dev/usbserial-X oder Telnet

    Code:
    # Plugin Denon-AVR
    # Kommunikation via UDP - socat separat einzurichten
    # Version: 0.1 2011-01-31
    
    ##################
    ### DEFINITION ###
    ##################
    
    my $socknum = 118;                # Eindeutige Nummer des Sockets +1
    
    # Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
    $plugin_info{$plugname.'_cycle'} = 600;
    
    my $send_ip = "localhost"; # Sendeport (UDP, sie in Socket-Einstellungen)
    my $send_port = "50106"; # Sendeport (UDP, sie in Socket-Einstellungen)
    my $recv_ip = "localhost"; # Empfangsport (UDP, sie in Socket-Einstellungen)
    my $recv_port = "50105"; # Empfangsport (UDP, sie in Socket-Einstellungen)
    
    my $denon_ip;
    #$denon_ip = "172.17.2.89:23";  # uncomment to use direct telnet without socat
    
    my $basega = "10/0/0";
    my $numgas = 20;
    # Startadresse
    # 0=PW 1=PWStatus
    
    #######################
    ### ENDE DEFINITION ###
    #######################
    
    # Hauptverarbeitung
    if (!$socket[$socknum]) { # socket erstellen
        if ($denon_ip) {
            $socket[$socknum] = IO::Socket::INET->new(PeerAddr => $denon_ip, Timeout => 120, Blocking => 0)
                 or return ("open of $denon_ip  failed: $!");
        } else {
            $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                      Proto => "udp",
                                      LocalAddr => $recv_ip,
                                      PeerPort  => $send_port,
                                      PeerAddr  => $send_ip,
                                      ReuseAddr => 1
                                       )
                     or return ("open of $recv_ip : $recv_port failed: $!");
        }
    
        $socksel->add($socket[$socknum]); # add socket to select
    
        $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
        return "opened Socket $socknum";
    } 
    
    if (%msg) { # telegramm vom KNX
      if ($msg{'apci'} eq "A_GroupValue_Write") {
          my $idx = str2addr($msg{'dst'}) - str2addr($basega);
          if ($idx==0) {
              my @vals = qw/PWSTANDBY PWON/; #1bit on/off
              syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
          #1=PW?
          } elsif ($idx==2) { 
              my @vals = qw /MVDOWN MVUP/; #1bit master-vol
              syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
          } elsif ($idx==3) { # 1byte 0-99
              syswrite($socket[$socknum], sprintf("MV%02d\r",$msg{'data'}));
          #4=MV?
          } elsif ($idx==5) {
              my @vals = qw /MUOFF MUON/; #1bit mute
              syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
          #6=MU?
          } elsif ($idx==7) { #1byte source 5=TV 11=ipod 19=usb
              my @vals = qw /PHONO CD TUNER DVD BD TV SAT\/CBL DVR GAME V.AUX DOCK IPOD NET\/USB NAPSTER LASTFM FLICKR FAVORITES IRADIO SERVER USB\/IPOD/;
              syswrite($socket[$socknum], "SI".$vals[$msg{'data'}]."\r");
          #8=SI?
          } elsif ($idx==9) { #1byte sourround mode 2=ST 6=MCHST 10=Matrix
              my @vals = ("DIRECT","PURE DIRECT","STEREO","STANDARD","DOLBY DIGITAL","DTS SUROUND","MCH STEREO","ROCK ARENA","JAZZ CLUB","MONO MOVIE","MATRIX","VIDEO GAME","VIRTUAL");
              syswrite($socket[$socknum], "MS".$vals[$msg{'data'}]."\r");
          #10=MS?
          } else {
              return "dunno? recv KNX $msg{'dst'} $msg{'data'}";
          }
      }
      return;
    } elsif ($fh) { # incoming dgram
        my $buf = <$fh>;
        my $bufhex = unpack("H*",$buf);
        chomp $buf;
        my $fn = substr($buf,0,2);
        # this is still very dumb
        if ($fn eq "PW") {
            my @vals = qw/PWSTANDBY PWON/; #1bit on/off
            my( $val )= grep { $vals[$_] eq $buf } 0..$#vals;
            knx_write(addr2str(str2addr($basega)+1) ,$val,1);
            return "$val - @vals - $buf";
        } elsif ($fn eq "MV" and $buf !~ /^MVMAX/) { # MVMAX is undocumented?
            # broken, just sends every 2, .5 isn't considered
            knx_write(addr2str(str2addr($basega)+4),substr($buf,2,2),5.010);
            return "recv $buf ($bufhex)";
        } else {
            return "dunno recv $buf ($bufhex)";
        }
        return;
    }
    
    for (my $i=0; $i<$numgas;$i++) {
        $plugin_subscribe{$basega}{$plugname} = 1;
        $basega = addr2str(str2addr($basega)+1,1);
    }
    
    # insert all commands to be sent cyclic
    syswrite($socket[$socknum],"PW?\r");
    
    return "cycle";
    Makki
    Angehängte Dateien
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    #2
    Hallo!

    Ich habe das obige Plugin seit ca. einem Jahr am laufen und es hat bisher auch wunderbar funktioniert.

    Seit einiger Zeit bekomme ich allerdings keine Rückantworten des Denon mehr mit.

    Der Zeitpunkt müsste grob mit dem ersten großen Update für das WG zusammen liegen.

    Dieses hat übrigens auch bei mir die Stabilität in Verbindung mit dem NanoDMX USB Interface erheblich verbessert. Läuft seit dem völlig stabil Danke!

    Meine in einem anderen Thread gelesen zu haben, dass es in Verbindung mit Socketverbindungen seit dem zu Problemen kommt. Ist das so oder handelt es sich um einen Einzelfall/Einzelfälle?

    Falls nicht: Ist das Problem bekannt und wird daran gearbeitet? Gibt es evtl. einen anderen Weg, um auf die Socket-Eingangsdaten zuzugreifen?

    Grüße
    Tobias

    Kommentar


      #3
      Also bei mir gehts nach wie vor (ich bleibe aber bei: das war "sehr schlampig!")

      Mach doch mal deine komplette Konstellation bekannt:
      - welcher Denon
      - wo steckt er genau dran
      - ...

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

      Kommentar


        #4
        Ich hab das gleiche Problem. Weder vom Denon AVR-X1000 noch von meiner Mobotix werden seit PL 38 noch Pakete per Socket empfangen oder von den Plugins verarbeitet. Leider kann ich gerade nicht selbst danach schauen...

        Viele Grüße

        Micha

        Kommentar


          #5
          Hi!

          Ist ein Denon AVR-2113.

          Kommuniziert wird über eine Socketverbindung. Zwischen Wiregate und Denon befindet sich nur ein HP ProCurve 1810G - 24 ohne Sachen wie VLAN o.ä.

          Code:
          F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
          0 S root      2663     1  1  80   0 -  1093 poll_s Nov04 ?        03:44:35 /usr/bin/socat /dev/dmx,raw,b38400,cs8,icanon=1,eol=71 tcp-listen:10001,reuseaddr
          0 S root     25819     1  0  80   0 -  1104 poll_s 07:18 ?        00:00:13 /usr/bin/socat tcp-connect:192.168.0.6:23,cr,interval=10,forever udp-datagram:localhost:50105,bind=localhost:50106,reuseaddr
          Die andere dient zur Ansteuerung des dmx über ein NanoDMX USB Interface.

          Die Socketverbindung wird dann in dem Plugin verwendet:

          Code:
          # Plugin Denon-AVR
          # Kommunikation via UDP - socat separat einzurichten
          # Version: 0.1 2011-01-31
          
          ##################
          ### DEFINITION ###
          ##################
          
          my $socknum = 3;                # Eindeutige Nummer des Sockets +1
          
          # Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
          $plugin_info{$plugname.'_cycle'} = 600;
          
          my $send_ip = "localhost"; # Sendeport (UDP, sie in Socket-Einstellungen)
          my $send_port = "50106"; # Sendeport (UDP, sie in Socket-Einstellungen)
          my $recv_ip = "localhost"; # Empfangsport (UDP, sie in Socket-Einstellungen)
          my $recv_port = "50105"; # Empfangsport (UDP, sie in Socket-Einstellungen)
          
          my $denon_ip;
          #$denon_ip = "172.17.2.89:23";  # uncomment to use direct telnet without socat
          
          my $basega = "6/3/0";
          my $numgas = 20;
          # Startadresse
          # 0=PW 1=PWStatus
          
          #######################
          ### ENDE DEFINITION ###
          #######################
          
          # Hauptverarbeitung
          if (!$socket[$socknum]) { # socket erstellen
              if ($denon_ip) {
                  $socket[$socknum] = IO::Socket::INET->new(PeerAddr => $denon_ip, Timeout => 120, Blocking => 0)
                       or return ("open of $denon_ip  failed: $!");
              } else {
                  $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                            Proto => "udp",
                                            LocalAddr => $recv_ip,
                                            PeerPort  => $send_port,
                                            PeerAddr  => $send_ip,
                                            ReuseAddr => 1
                                             )
                           or return ("open of $recv_ip : $recv_port failed: $!");
              }
          
              $socksel->add($socket[$socknum]); # add socket to select
          
              $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
              return "opened Socket $socknum";
          } 
          
          if (%msg) { # telegramm vom KNX
            if ($msg{'apci'} eq "A_GroupValue_Write") {
                my $idx = str2addr($msg{'dst'}) - str2addr($basega);
                if ($idx==0) {
                    my @vals = qw/PWSTANDBY PWON/; #1bit on/off
                    syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
          #      } elsif ($idx==1) { 
          #          syswrite($socket[$socknum], "PW?\r");
                } elsif ($idx==2) { 
                    my @vals = qw /MVDOWN MVUP/; #1bit master-vol
                    syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
                } elsif ($idx==3) { # 1byte 0-99
                    syswrite($socket[$socknum], sprintf("MV%02d\r",$msg{'data'}));
          #      } elsif ($idx==4) { # 1byte 0-99
          #          syswrite($socket[$socknum], "MV?\r");
                } elsif ($idx==5) {
                    my @vals = qw /MUOFF MUON/; #1bit mute
                    syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
          #      } elsif ($idx==6) {
          #         syswrite($socket[$socknum], "MU?\r");
                } elsif ($idx==7) { #1byte source 5=TV 11=ipod 19=usb
                    my @vals = qw /PHONO CD TUNER DVD BD TV SAT\/CBL DVR GAME V.AUX DOCK IPOD NET\/USB NAPSTER LASTFM FLICKR FAVORITES IRADIO SERVER USB\/IPOD/;
                    syswrite($socket[$socknum], "SI".$vals[$msg{'data'}]."\r");
                #8=SI?
                } elsif ($idx==9) { #1byte sourround mode 2=ST 6=MCHST 10=Matrix
                    my @vals = ("DIRECT","PURE DIRECT","STEREO","STANDARD","DOLBY DIGITAL","DTS SUROUND","MCH STEREO","ROCK ARENA","JAZZ CLUB","MONO MOVIE","MATRIX","VIDEO GAME","VIRTUAL");
                    syswrite($socket[$socknum], "MS".$vals[$msg{'data'}]."\r");
                #10=MS?
                } elsif ($idx==11) { # 1byte 0-99
                    syswrite($socket[$socknum], sprintf("TPAN%02d\r",$msg{'data'}));
                } elsif ($idx==13) { 
                    my @vals = qw /TFANDOWN TFANUP/; #1bit master-vol
                    syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
                } else {
                    return "dunno? recv KNX $msg{'dst'} $msg{'data'}";
                }
            }
            return;
          } elsif ($fh) { # incoming dgram
              my $buf = <$fh>;
              my $bufhex = unpack("H*",$buf);
              chomp $buf;
              my $fn = substr($buf,0,2);
              # this is still very dumb
              if ($fn eq "PW") {
                  my @vals = qw/PWSTANDBY PWON/; #1bit on/off
                  my( $val )= grep { $vals[$_] eq $buf } 0..$#vals;
                  knx_write(addr2str(str2addr($basega)+1) ,$val,1);
                  return "$val - @vals - $buf";
              } elsif ($fn eq "MV" and $buf !~ /^MVMAX/) { # MVMAX is undocumented?
                  # broken, just sends every 2, .5 isn't considered
                  knx_write(addr2str(str2addr($basega)+4),substr($buf,2,2),5.010);
                  return "recv $buf ($bufhex)";
              } elsif ($fn eq "TF" and $buf !~ /^MVMAX/) { # MVMAX is undocumented?
                  knx_write(addr2str(str2addr($basega)+12),substr($buf,4,6),7.001);
                  return "recv $buf ($bufhex)";
              } else {
                  return "dunno recv $buf ($bufhex)";
              }
              return;
          }
          
          for (my $i=0; $i<$numgas;$i++) {
              $plugin_subscribe{$basega}{$plugname} = 1;
              $basega = addr2str(str2addr($basega)+1,1);
          }
          
          # insert all commands to be sent cyclic
          syswrite($socket[$socknum],"PW?\r");
          
          return;
          Die Steuerung des Denon klappt prima. Nur die Rückantworten fehlen halt seit einiger Zeit.

          Im wiregate_plugin.log finden sich dazu folgende Einträge:
          2014-11-17 10:30:39.038,Denon.pl,opened Socket 3,0s,
          2014-11-17 21:11:13.066,Denon.pl,dunno? recv KNX 5/1/1 07 D0,0s, 2014-11-17 22:48:08.719,Denon.pl,opened Socket 3,0s
          2014-11-18 03:10:15.883,Denon.pl,opened Socket 3,0s,
          2014-11-18 10:05:31.675,Denon.pl,opened Socket 3,0s,
          2014-11-18 18:35:55.655,Denon.pl,dunno? recv KNX 5/1/1 07 14,0s,Für mich sieht es so aus als würde das Plugin keine Daten von dem Socket bekommen. Kannst du damit was anfangen oder benötigst du weitere Angaben?

          Danke und Gruß
          Tobias

          Kommentar


            #6
            Hi Tobias,

            nun, irgendwas muss ja noch zwischen Denon und UDP stecken - und da liegt vermutlich das Problem..

            Das Telnet-Interface des Denon ist leider alles andere als zuverlässig (dafür kann das Plugin nichts..) - der Verzicht darauf spart auch 5-10W Standby;

            Mein Tipp: hänge den mit einem RS232/Moxa/whatever ins Netz!
            Meine hängen auch mit USB->Serial->socat->UDP dran (das geht auch via Cat5 über 20m..)
            (bei Bedarf mehr Details..)

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

            Kommentar


              #7
              Hallo!

              Danke für bisherige Hilfe Makki!

              Habe mal angefangen das Problem einzugrenzen:

              Code:
              root@wiregatexxx:~# telnet 192.168.0.6
              Trying 192.168.0.6...
              Connected to 192.168.0.6.
              Escape character is '^]'.
              BridgeCo AG Telnet server
              MUOFF
              Kommunikation vom wiregate scheint also prinzipiell zu funktionieren.

              Der Versuch mit socat auf der Konsole sieht auch ganz gut aus:

              Code:
              root@wiregatexxx:~# /usr/bin/socat - tcp-connect:192.168.0.6:23,cr,interval=10,forever
              MUON
              MUOFF
              MUON
              MUOFF
              Klappt auch in Verbindung mit dem senden:

              Code:
              root@wiregatexxx:~# /usr/bin/socat - tcp-connect:192.168.0.6:23,cr,interval=10,forever
              MVUP
              MV455
              MVMAX 98
              MVDOWN
              MV45
              MVMAX 98
              Habe im Plugin über ein Return noch eine Ausgabe machen lassen wenn weder eine neue Message noch ein Datagramm angekommen ist. Diese Ausgabe sehe ich dann mehrfach in der Sekunde in dem Plugin-Log.

              Sieht für mich aktuell so aus, als würde das Plugin sehr häufig aufgerufen ohne das neue Daten vorliegen.
              Kann ich feststellen, wer für den Aufruf verantwortlich ist? Socket/GA/Zyklus?

              Würde versuchen morgen noch weiter zu suchen, sollte jemand noch ein paar Ideen haben nur her damit.

              Gruß
              Tobias

              Kommentar


                #8
                Hi Tobias,

                das mit dem Telnet und dem Denon geht theoretisch, ja.
                Leider jedoch nicht praktisch (ich bin selbst daran gescheitert..)

                Wir können da jetzt tagelang weitersuchen und uns am Ende auf die Schultern klopfen, das wir alle Unzulänglichkeiten gefunden und einen Workaround dafür haben. (plane schonmal einen Aktor ein, der den Denon resettet!)
                - oder du tust uns beiden einen gefallen und steckst eine RS232 an den Denon, wir halten fest das die Telnet-Schnittstelle unbrauchbar ist, sparen uns >5W im Standby, ..
                Und es funktioniert einfach..

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

                Kommentar


                  #9
                  Hi Makki!

                  Ich hoffe ich habe dich richtig verstanden, dass du nur an der Telnet-Kommunikation mit dem Denon zweifelst aber die Kobination Plugin - Socketverbindung - Telnet Server prinzipiell funktionieren sollte?

                  Würde dann morgen mal einen Telnet-Server auf einer meiner Linux-Kisten installieren und probieren ob ich damit eine vernünftige Kommunikation hin bekomme.

                  PS: Der Denon wird und wurde immer mit verlassen des Hauses über einen Aktor ausgeschaltet. Vielleicht lief es daher seit einem Jahr doch sehr zufriedenstellend.

                  Kommentar


                    #10
                    Du hast mich exakt richtig verstanden, wenn man dem plempel regelmässig den Stecker zieht, geht das halbwegs..

                    Aber das ist ja keine wirkliche Lösung..
                    Ich bleibe dabei: nimm besser die RS232..

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

                    Kommentar


                      #11
                      Hallo Tobias, Makki,

                      auch wenn die RS232-Anbindung bei den Denons stabiler ist, kann ich die Beobachtung bestätigen, dass seit dem Update auf PL38.x der Empfang von Daten über Socat/UDP im Plugin nicht mehr funktioniert. Ich hatte in gleicher Weise meine Heizung per USB/CAN-Adapter angebunden, mir fehlt im Moment aber die Zeit für die tiefere Analyse was hier schief geht.

                      Schöne Grüße
                      Christian

                      Kommentar


                        #12
                        Zitat von makki Beitrag anzeigen
                        Mein Tipp: hänge den mit einem RS232/Moxa/whatever ins Netz!
                        Meine hängen auch mit USB->Serial->socat->UDP dran (das geht auch via Cat5 über 20m..)
                        (bei Bedarf mehr Details..)
                        Hallo Makki,

                        da ich auch gerade mit dem Gedanken spiele einen Denon X1100 anzuschaffen und ich den auch gerne über KNX steuern würde: Kannst Du das etwas detailierter ausführen? Ich verstehe nun nicht ganz was ich an zusätzlicher HW benötige und wie das Ganze verkabelt werden muß um das Plugin zum laufen zu bekommen...

                        Gruß
                        Andi
                        Gruß
                        Andi

                        Kommentar


                          #13
                          Es gibt wie gesagt 2 Möglichkeiten zur bidirektionalen Kommunikation mit dem Denon:

                          - LAN
                          - RS232

                          Bei LAN brauchst du ausser einer LAN Verbindung nix. Aber es kann sein, dass es wie oben geschrieben nicht funktioniert falls der BUG in den Socketverbindungen noch besteht (hab ich nicht getestet).

                          Für RS232 kannst du entweder den Port an der Rückseite des Wiregate oder einen USB -> RS232 Wandler einsetzen.

                          Mehr wird als HW im Prinzip nicht benötigt ausser du musst mit dem RS232 über Lankabel ins Rack oder sonnst wo hin. Aber das können wir leider nicht aus der Glaskugel lesen...
                          Gruss Patrik alias swiss

                          Kommentar


                            #14
                            Hier im openHAB Bereich gibt es auch einen Thread in dem die Steuerung des Denon per Http-Anfragen diskutiert wird.

                            Das wohl der Weg den auch die Denon App geht und funktioniert ganz gut, ist allerdings offiziell nicht dokumentiert. Hat allerdings den z.B. nicht die Probleme der Telnet Schnittstelle.

                            Vor dem Kauf einer weiteren Hardware würde ich das durchaus erst mal ausprobieren.

                            Kommentar


                              #15
                              Zitat von swiss Beitrag anzeigen

                              Für RS232 kannst du entweder den Port an der Rückseite des Wiregate oder einen USB -> RS232 Wandler einsetzen.

                              Habe das gelesen und nu ein serielles Kabel vom WG an meinen DENON AVRX4000 geschraubt.

                              Wie sehen dazu die Einstellungen im WG aus?

                              Und was genau ist die socketnummer bzw. wo kommt die her?
                              PHP-Code:
                              my $socknum 2# Eindeutige Nummer des Sockets +1 
                              anbei meine Settings:

                              Merci!
                              Angehängte Dateien

                              Kommentar

                              Lädt...
                              X