Ankündigung

Einklappen
Keine Ankündigung bisher.

DMX RGBW Controller

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

    [WireGate-Plugin] DMX RGBW Controller

    Dies ist der Software Teil meines Projektes RGBW LEDs über das Wiregate zu steuern. Zu der Hardware Bastelanleitung geht es hier: Hardware

    Disclaimer: Ebenso wie für die Hardware gilt hier auch, dass dies mein erstes Projekt
    war. Daher werden Verbesserungsvorschläge gerne angenommen und Fehler nicht ausgeschlossen. Ich habe aber versucht meine Hürden (und da waren so einige) hier
    zu dokumentieren, damit dies evt. als Vorlage für andere dienen kann.


    So nun aber los:

    Nach anstecken, des USB-RS232 Wandlers, sollte dieser in der Liste angeschlossener Adapter im Menü 'Seriell/LAN/Socket Verbindungen' auftauchen (am unteren Rand der Seite). Mit folgenden Einstellungen wird dann ein Socket erstellt, den
    wir gleich in einem Plugin benutzen, um den Controller zu steuern. Natürlich muß der
    /dev/... Pfad für Euren USB Wandler stimmen.
    Evt. im Eiwomisa in den Settings noch mal kontrollieren, dass er auf 9600, 8N, 1 steht, das sind die default Einstellungen hier. Es muss halt eben auf beiden Seiten passen.




    Nachdem der Socket steht, ist dieser prinzipiell über das Netzwerk erreichbar.
    D.h. nicht nur ein Plugin (über localhost), sondern auch ein beliebiger anderer Rechner im Netz kann auf Port 50015 Pakete schicken, die dann über die serielle Schnittstelle weitergeleitet werden.
    Hilfreich zum testen oder debuggen kann auch das Programm HS-IP von Alfred hier aus dem Forum sein, dass, entgegen dem Namen, keinen HS benötigt, sondern es recht einfach erlaubt bestimmte Bytes (auch in Hex-Schreibweise, hier wichtig) übers Netz zu schicken. Damit sollte es möglich sein einzelne oder mehrere Kanäle schon mal übers Netz zu steuern.

    Damit das ganze jetzt auch noch per KNX-GA funktioniert kommt ein WG-Plugin zum Einsatz:

    Code:
    # Plugin Eiwomisa RGB DMX-Controller
    # Version: 0.1 2011-01-21
    # Benötigt Eiwomisa RGB DMX Controller und socat Eintrag für USB-RS232 Wandler
    
    ##################
    ### DEFINITION ###
    ##################
    
    my $socknum = 9;                # Eindeutige Nummer des Sockets +1
    
    # Eigenen Aufruf-Zyklus setzen (Initialisierung/zyklisches prüfen)
    $plugin_info{$plugname.'_cycle'} = 300;
    # Gruppenadressen <-> DMX 
    # 8Bit/1Byte Dimmwerte werden 1:1 auf DMX-Adressen übersetzt
    my $knx_startGA = "11/1/0"; # DMX-Kanal 0, DMX-Kanal 256=11/1/255, DMX-Kanal 257..512=11/2/0..255
    my $dmx_channels = 8;       # Anzahl der DMX-Kanäle, hier 4 für RGBW Eiwomisa, +3 für externen RGB DMX Empfänger [+1, da 0 nicht benutzt]
    
    
    my $dmx_send_ip = "localhost"; # Sendeport (UDP, sie in Socket-Einstellungen)
    my $dmx_send_port = "50015";   # Sendeport (UDP, sie in Socket-Einstellungen)
    
    # pre-defining bytes for serial data stream to Eiwomisa DMX controller
    my $byte1 = 0;
    my $byte2 = 0;
    my $byte3 = 0;
    my $byte4 = 0;
    my $byte5 = 0;
    my $byte6 = 0;
    
    #######################
    ### ENDE DEFINITION ###
    #######################
    
    # Hauptverarbeitung
    if (!$socket[$socknum]) { # socket erstellen
        if (defined $socket[$socknum]) { #debug
            if ($socket[$socknum]->opened) { $socket[$socknum]->close(); }
            undef $socket[$socknum];
        }  #debug
        $socksel->remove($socket[$socknum]);
        $socket[$socknum] = IO::Socket::INET->new(
                                  Proto => "udp",
                                  PeerPort  => $dmx_send_port,
                                  PeerAddr  => $dmx_send_ip,
                                  ReuseAddr => 1
                                   )
             or return ("open of $dmx_send_ip : $dmx_send_port failed: $!");
        $socksel->add($socket[$socknum]); # add socket to select
        
        $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
        for (my $i=0; $i<$dmx_channels;$i++) {
            $plugin_subscribe{$knx_startGA}{$plugname} = 1;
            $knx_startGA = addr2str(str2addr($knx_startGA)+1,1);
        }
        return "opened UDP-Socket $socknum";
    } 
    if (%msg) { # telegramm vom KNX
    
        my $destN = str2addr($msg{'dst'});
        my $startN = str2addr($knx_startGA);
        my $dmxchan = $destN - $startN;
      if ($msg{'apci'} eq "A_GroupValue_Write" and $destN >= $startN and $destN <= $startN+$dmx_channels) {
    
    
    #---- section specific to Eiwomisa controller --- 
    # Encoding value and DMX channel number into specific protocol.
    # For detailed protocol definitions check the website eiwomisa.de
    # Each serial command consists of 6 bytes: 112233445566h 
    # 1. Byte = Startbyte, must be 255
    # 2. Byte = 1. part of value, can be 0-254
    # 3. Byte = 2. part of value, can be 0-1
    # 4. Byte = 1. part of channel, can be 0-254
    # 5. Byte = 2. part of channel, can be 0-254
    # 6. Byte = 3. part of channel, can be 0-4
    
        $byte1 = 255;     # Settting start byte
            
        # encode value
        if(hex($msg{'data'})>254) {
            $byte2 = 254; # setting byte 2 to FEh
            $byte3 = 1;   # setting byte 3 to 1h -> Byte 2+3 == FF
        }else {
            $byte2 = hex($msg{'data'}); # byte 2 can take up all values until FE
            $byte3 = 0;                 # byte 3 will remain empty
        }
    
        # encode DMX channel
        if($dmxchan>512) {    # 254+254+4 == 512
            $byte4 = 254;     # setting byte 4 
            $byte5 = 254;     # setting byte 5 
            $byte6 = 4;       # setting byte 6 
        }
        elsif ($dmxchan>508) {       
            $byte4 = 254;      
            $byte5 = 254;      
            $byte6 = $dmxchan-508;   
        } 
        elsif($dmxchan>254) {
            $byte4 = 254;      
            $byte5 = $dmxchan-254;   
            $byte6 = 0;        
        }
        else {
            $byte4 = $dmxchan;       
            $byte5 = 0;        
            $byte6 = 0;        
        }
    #---- End of Eiwomisa protocol encode ---
    
    
            # putting bytes together
            my $dgram = pack("C[6]",$byte1,$byte2,$byte3,$byte4,$byte5,$byte6);
    
            # sending to existing socket (via UDP to socat)
            $socket[$socknum]->send($dgram) or return "send failed: $!";
    
          ## --uncomment this section for debugging--
           # my @myArray=unpack('C*', $dgram);              # re-converting $dgram 
           # my $myStringHex = '';                          # into HEX to be able 
           #   foreach my $c (@myArray) {                   # to see 
           #    $myStringHex .= "" . sprintf ("%lX", $c);   # what was sent
           #   }
          ## print debug output to logfile
           #return "Received GA: $msg{'dst'}, value: $msg{'data'}h, which I will send to DMX channel $dmxchan. Serial byte stream: $myStringHex " ; # debug output
          ##-- end of debug code -- 
          
         }
    } 
    
    return;
    Im Code ist bereits einiges dokumentiert. Wie man in der Definition oben sehen kann, ist das Plugin schon darauf angelegt, weit mehr als nur die 4 Kanäle des Eiwomisa zu steuern.

    Im Prinzip kümmert sich der Eiwomisa nicht darum, was er bekommt, er schiebt einfach die Werte von seriell auf die entsprechenden DMX Kanäle. Dabei sind seine eigenen auf bestimmte (bei mir 1-4) konfiguriert.

    #2
    Das ist ein sehr interessantes Projekt, vielen Dank dafür...

    Kommentar


      #3
      wie Socketverbindung einrichten?

      Hallo Luigi4711,
      ich habe hier ziemlich den gleichen Aufbau wie bei dir auch. Nun hakt es bei mir bei der Erstellung der Socketverbindung im Wiregate. Könntest du das bitte nochmal geauer erklären.
      Eiwomisa steht auf 9600. Aber was ist 8N und 1?

      Danke und Gruß Bernd

      Kommentar


        #4
        Datenlänge 8Bit, Ohne Parität, 1StopBit


        Sent from my iPad using Tapatalk

        Kommentar


          #5
          Einstellungen der serillen

          9600 Baud
          N Parität keine
          8 Datenbit
          1 Stopbit
          EPIX
          ...und möge der Saft mit euch sein...
          Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

          Kommentar


            #6
            und was ist mit dem Socket...

            ok vielen Dank euch schonmal.
            Ich denke aber das das Problem eher bei dem nicht eingerichteten Socket liegt. Könnt ihr da auch was zu sagen?

            Kommentar


              #7
              Was steht denn unter "Socket..." ?
              9600 8N1 ist übrigens default

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

              Kommentar


                #8
                hmm, vielleicht hab ich mich schlecht ausgedrückt,

                aber es gibt ja auf der einen Seite Einstellungen im Eiwomisa (den hab ich auf DMX-Receiver stehen und 9600 Baud. 8N und 1 sind nicht einstellbar)
                Luigi4711 schreibt doch aber für die Einstellungen des Wiregate:
                Nach anstecken, des USB-RS232 Wandlers, sollte dieser in der Liste angeschlossener Adapter im Menü 'Seriell/LAN/Socket Verbindungen' auftauchen (am unteren Rand der Seite). Mit folgenden Einstellungen wird dann ein Socket erstellt, den
                wir gleich in einem Plugin benutzen, um den Controller zu steuern. Natürlich muß der
                /dev/... Pfad für Euren USB Wandler stimmen.
                Ich hab den Wandler aus dem Wiregateshop, und der erscheint auch wie beschrieben am unteren Rand der Seite. Aber ich kenne halt nicht die Einstellungen mit denen dann der "neue Socket" erstellt werden muss, oder verstehe ich da was falsch???

                Kommentar


                  #9
                  Aber die Einstellunges sind doch auf den Screenshot im obersten Beitrag zu sehen. Mehr ist nicht nötig. Nur der Pfad unter soket1 muss ggf. entsprechend angepasst werden. Mach doch mal ein screenshot von deiner soketverbindung.
                  Gruss Patrik alias swiss

                  Kommentar


                    #10
                    außer dem Code hab ich im ersten Beitrag kein Screenshot

                    und von meiner Socketverbindung kann ich keinen Screenshot machen, weil es noch keine gibt, weil ich keinen Plan habe was ich einstellen soll, sorry.

                    Kommentar


                      #11
                      Also. Ich sehe den scrennshot und er ist devinitiv da aber wir werden das auch so hinbekommen

                      Als erstes must du eine neue Socketverbindung anlegen. Dazu must du auf die Schaltfläche "Neu" klicken. Dann brauchst du folgende Parameter:

                      Name: Ist Egal und dient nur für dich zur Erkennung. z.B. EiWoMiSa USB-Seriell
                      Hacken bei aktiv und bei bidirektional

                      Unter socket1...

                      Das pulldown muss leer sein "-"
                      Socket: pfad zu deinem USB-Seriell wandler. Läst sich unten auf der Seite ablesen. z.B. /dev/usbserial2-3.1
                      Optionen: raw

                      Unter socket2...

                      Im pulldown muss udp-recv ausgewählt werden
                      Socket: 50015 oder einer der noch nicht belegt ist
                      Optionen: bleiben leer

                      Damit sollte es klappen.
                      Gruss Patrik alias swiss

                      Kommentar


                        #12
                        Hi Izeman,
                        Du kannst keinen Screenshot oben sehen!?

                        Hier noch mal. Ist der gleiche wie oben im Text:



                        luigi

                        Kommentar


                          #13
                          @Luigi: versteh ich zwar irgendwie nicht, weil ich auch sonst kein Problem habe die Bilder der Leute zu sehen, aber da is bei mir irgendwie nichts...

                          @Patrik: ...ist aber auch egal, da deine Erklärung so klasse war, dass neben mir nun das LED-Modul je nach meinen wünschen in den den verschiedensten Farben leuchtet
                          Total Geeeeeiiiiiil
                          Vielen vielen Dank.

                          Kannst du wenn du Lust und Zeit hast vielleicht mal kurz schreiben, was wir nun gemacht haben und warum diese Einstellungen???

                          Werde ich aber erst morgen lesen können.

                          Also 1000 Dank
                          Bernd

                          Kommentar


                            #14
                            Also mit den einzelnen Parameter tu ich mich auch noch etwas hart aber diese Socketverbindung ist noch relativ einfach.

                            Eine Socketverbindung ist eine art Übersetzer und Vermittler zwischen verschiedenen Schnittstellen und Protokolle. In dieser Socketverbindung wurde also folgendes gemacht:

                            Den Hacken unter bidirektional barauchen wir, da wir auf der USB-Schnittstelle lesen und schreiben wollen.

                            Unter socket1 wurde der physikalische Pfad zur USB-Schnittstelle eingegeben, damit die Socketverbindung weiss über welchen USB-Seriellwandler du senden willst. Du kannst nämlich fast beliebig viele USB-Seriellwandler am WG paralell betreiben.

                            Die Option raw hat zur Folge dass die Daten unverändert also 1:1 weitergereicht werden.

                            ---

                            Unter socket2 wird so zu sagen das andere Ende der Schnittstelle definiert.

                            Hier haben wir im pulldownmenue udp-recv gewählt. Damit werden auf ankommende Telegramme über UDP reagiert.

                            Unter Socket haben wir hier die Portnummer für die UDP-Verbindung eingetragen. Diese Portnummer muss unbedingt frei sein da sonst fehler auftreten.


                            Die Frage wäre jetzt wozu das ganze...

                            Plugin -> UDP ->socket -> USB -> Seriell

                            Die Antwort ist recht einfach. Die Socketverbindung kümmert sich um die gesammte Übertragungs- und Verbindungsgeschichte. Somit muss man sich im Plugin nicht um die Datenübertragung kümmern sondern sendet einfach alles an die virtuelle UDP-Verbindung und die erledigt den rest.
                            Gruss Patrik alias swiss

                            Kommentar


                              #15
                              @Bernd: vielleicht irgendein lustiger Ad-Blocker o.ä. der übers Ziel hinaus schiesst?
                              Ich sehe jedenfalls auch beide Bilder..

                              Den Rest hat swiss schon gesagt: der socat dient primär dazu, das man sich im Plugin nicht um all die hässlichen Details kümmern muss..

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

                              Kommentar

                              Lädt...
                              X