Ankündigung

Einklappen
Keine Ankündigung bisher.

eBus->USB->Plugin->KNX

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

    und es wird noch doller: ich habe die CRCs von einem Posting von kleinklausi jetzt mal mit meiner Routine überprüft, und sie stimmen!

    Was ist da nur los? Bei meinen Logs stimmen die CRCs nicht, bei anderen schon.

    Unhappy!
    Fry

    Kommentar


      Naja grundsätzlich sieht das Telegramm o.k. aus ... wenn das CRC nicht wäre.
      Broadcast (ZZ=oxFE) ohne ACKs. Ich bin ratlos ... was sagt Wolf ?
      Umgezogen? Ja! ... Fertig? Nein!
      Baustelle 2.0 !

      Kommentar


        Zitat von JuMi2006 Beitrag anzeigen
        Also beim Versuch nach einem SYN zu senden wird im Fehlerfall hier 14 SYN Zeichen gewartet und dann erneut gesendet. Das Ganze wiederholt sich dann 7 mal ?
        Nein: skip += retry*2;

        Code:
        Lauf skip  retry
        1      0      0
        2      2      1
        3      4      2
        4      6      3
        5      8      4
        6     10      5
        7     12      6

        Kommentar


          Ich kann ja immer nur theoretisch mitspielen, aber aus Erfahrung von anderem:
          Es würde mich absolut nicht wundern, wenn der CRC "Hersteller-Individuell" wäre, die Protokollbeschreibung ist ja schon scary genug

          Viel Glück, ich glaube ihr seid auf einem verdammt guten Weg, wenn er auch bedingt durch die Sache blutig ist..

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

          Kommentar


            Zitat von makki Beitrag anzeigen
            Es würde mich absolut nicht wundern, wenn der CRC "Hersteller-Individuell" wäre, die Protokollbeschreibung ist ja schon scary genug
            Das wäre aber schön blöd bzw. will ich das nicht glauben.

            Wieviele SYN pro Sekunden rauschen den bei Euch so durch?

            Bei mir sind es im Schnitt ~20

            Kommentar


              Ich glaube nicht, dass der CRC herstellerspezifisch anders berechnet wird. Sonst hätte kleinklausi ja auch andere CRCs.

              Warten wir mal ab, ich bin gespannt was passiert, wenn ich nochmal am Poti drehe. Vielleicht gibt es ja doch einen systematischen Übertragungsfehler, der irgendwie immer die gleichen Bits verdreht...

              VG
              Fry

              Kommentar


                Zitat von yuhu Beitrag anzeigen
                Wieviele SYN pro Sekunden rauschen den bei Euch so durch?
                Bei mir sind es im Schnitt ~20
                Ja, vergleichbar viele sind es hier.
                Fry

                Kommentar


                  Just for the record: ich habe als Beispiel die obige Bytefolge F1 FE 05 03 08 02 08 00 FF 66 FF 29 FF genauer untersucht.

                  In meinem ebus-Log kommt diese Folge 62mal vor und die CRC ist jedesmal 74.

                  Dann habe ich die CRC mal mit verschiedenen Generatorpolynomen nachgerechnet.

                  Mit dem Polynom 0x9B (ebus-Standard) kommt 18 raus. Mit KEINEM Generatorpolynom kommt 74h raus.

                  Schon ein wenig ratlos....
                  Fry

                  Kommentar


                    @kleinklausi: wärst du so nett, mal ein paar zig Zeilen raw-Dump hier zu posten? Ich würde gerne mal sehen, ob deine CRCs ia mit meiner Berechnung übereinstimmen.
                    VG, Fry

                    Kommentar


                      Jetzt habe ich bei weiteren Telegrammen meine CRC-Routinen erfolgreich getestet. Und ja, auch Wolf verwendet die Standard-Ebus-CRCs, da gibt es nichts Herstellerspezifisches (hätte mich auch sehr gewundert...).

                      Ich glaube daher mittlerweile fest an Übertragungsfehler. Genauer gesagt: Fehler beim Wandeln in der e-service-Schnittstelle. (denn auf fast jedes CRC im Log folgt ein ACK -> auf dem Bus scheinen die Telegramme noch heil zu sein). Werde nächste Woche am Poti der Schnittstelle drehen und dann sehen.

                      I keep you posted.

                      Fry

                      Kommentar


                        Zitat von Fry Beitrag anzeigen
                        @kleinklausi: wärst du so nett, mal ein paar zig Zeilen raw-Dump hier zu posten? Ich würde gerne mal sehen, ob deine CRCs ia mit meiner Berechnung übereinstimmen.
                        VG, Fry
                        Hi,
                        hier ein Dump von meiner Wolf.

                        Gruß Moritz
                        Angehängte Dateien

                        Kommentar


                          Zitat von kleinklausi Beitrag anzeigen
                          Hi,
                          hier ein Dump von meiner Wolf.
                          Danke, hab es mal durch meinen CRC-Check laufen lassen: alle CRCs korrekt, kein einziger Fehler.
                          VG, Fry

                          Kommentar


                            Zitat von Fry Beitrag anzeigen
                            Danke, hab es mal durch meinen CRC-Check laufen lassen: alle CRCs korrekt, kein einziger Fehler.
                            Gut für mich - tschuldige bitte

                            Kommentar


                              Project auf Autotools umstellen?

                              Wie angekündigt ist das tools Verzeichnis nun unter ebusd.

                              Dem ganzen habe ich neue Makefiles gebaut, damit sich jeder alles bauen kann.

                              Zitat von yuhu Beitrag anzeigen
                              Das mit den Makefiles für die Autotools sieht gut aus. Nur kenne ich mich damit überhaupt nicht aus.

                              Den Rest müsste dann jemand machen, der sich mit dem Autozeugs wirklich auskennt.
                              Das war ernst gemeint. Ich habe wirklich keine Ahnung was ich da machen muss.

                              Einfach mal lokal bauen, wenn es funzt mir bitte bescheid geben, und dann einfach rein ins SVN.

                              Kommentar


                                Proof of concept .

                                So ich hatte heute nachmittag mal ne kleine Perl Stunde. Anbei zwei Codes (dirty,dirty,dirty) zum testen und zeigen was eine config so alles kann. Die config ist erstmal "hardcoded".

                                Das Script für die Kommandozeile liest die entsprechenden Werte aus und wählt je nach config deren Bearbeitung. Das senden auf den KNX ist dort natürlich nicht unterstützt.

                                Das script als WireGate Plugin ist bitte nur zum test zu verwenden. Laufzeit ist viel zu hoch, läuft bei mir aber auf einem separaten CommunityGate (meine Testplattform). Aufs Original kommt das so nicht. Also nochmal: ACHTUNG NUR ZUM TEST !!!
                                Dafür kann es auch die 3 wichtigsten Befehle die ich brauche auf den via KNX auf den eBus senden.

                                Kommandozeile:
                                Code:
                                #!/usr/bin/perl
                                
                                #return; 
                                #use warnings;
                                use strict;
                                
                                my $ebus_send = "/root/ebus/tools/ebus_send -a 00 -r 5 -s /dev/usbserial-AEVO0GRK";
                                
                                my (@ebusd,@sets);
                                
                                push @ebusd, { name => "eBus_AT", 	    telegramm => "08B509030D0600",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/200", dpt => 9};
                                push @ebusd, { name => "eBus_HK_VL_Soll",   telegramm => "15B509030D0500",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/202", dpt => 9};
                                push @ebusd, { name => "Wochentag",         telegramm => "08B509030D2A00",	data => "integer",    databytes => "1",		ga => "0/5/206", dpt => 9};
                                push @ebusd, { name => "eBus_HK_VL_Ist",    telegramm => "08B509030D0300",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/203", dpt => 9};
                                push @ebusd, { name => "eBus_Quelle_VL",    telegramm => "08B509030D0F00",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/204", dpt => 9};
                                push @ebusd, { name => "eBus_Quelle_RL",    telegramm => "08B509030D0800",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/205", dpt => 9};
                                
                                ############EMPFANG###########
                                
                                foreach my $ebus (@ebusd) {
                                my $value = qx ($ebus_send $ebus->{telegramm});
                                select(undef, undef, undef, 1);
                                chomp $value;
                                print ("Vom Bus gelesen: $value","\n");
                                
                                ### try variable data-handling ###
                                
                                my $subname = $ebus->{data}; 
                                my $subref = \&$subname; 
                                my @arr = split(/ /, $value);
                                my @data_arr = split(/,/, $ebus->{databytes});
                                
                                print ("Datenbytes zur Auswertung: @data_arr[0],@data_arr[1]","\n");
                                print ("Inhalt Datenbytes: @arr[@data_arr[0]+1],@arr[@data_arr[1]+1]","\n");
                                my $val = &$subref(@arr[@data_arr[0]+1],@arr[@data_arr[1]+1]);
                                print ("Codierung: $ebus->{data}","\n");
                                print ("Name und Wert: $ebus->{name} $val","\n");
                                
                                ### try variable data-handling ###
                                
                                if ($value eq "")
                                {
                                return "Error";
                                }
                                
                                }
                                
                                
                                ############################################
                                ### D A T E N K O N V E R T I E R U N G ####
                                ############################################
                                
                                sub integer{
                                return $_[0];
                                }
                                
                                ### BCD ###
                                #FIX ME !!!!!
                                
                                #sub decode_bcd {
                                #    return (unpack "H*", pack "C*",hex($_[0]));
                                #	#unpack "H*", $_[0]; ####?????
                                #}
                                
                                sub decode_bcd {
                                        my $z = $_[0];
                                        my $high = hex($z) >> 4;
                                        my $low  = hex($z) & 15;
                                        return $high * 10 + $low;
                                }
                                
                                sub encode_bcd {
                                	return pack 'H*', join '', $_[0];
                                }
                                
                                ### DATA1b ###
                                
                                sub decode_d1b{         #1byte signed 
                                    my $val = hex(shift);
                                    return $val > 127 ? $val-256 : $val;
                                }
                                
                                sub encode_d1b {        #### F I X M E !!!!!
                                    my $y = shift;
                                    $y *= 256;
                                    $y = $y & 0xffff if ($y < 0);
                                    my $hb = int $y/256;
                                    return (sprintf("%0.2X", $hb));
                                }
                                
                                
                                ### DATA1c ###
                                
                                sub decode_d1c {
                                my $y = hex ($_[0])/2;
                                return $y;
                                }
                                
                                sub encode_d1c {
                                    return sprintf "%x",(($_[0])*2);
                                }
                                
                                
                                ### DATA2b ###
                                
                                sub decode_d2b { 
                                	return unpack("s", pack("s", hex($_[1].$_[0]))) / 256; 
                                }
                                
                                sub encode_d2b {
                                	my ($hb, $lb) = unpack("H[2]H[2]", pack("s", $_[0] * 256));
                                	return $lb.$hb;
                                }
                                
                                
                                ### DATA2c ###
                                
                                sub decode_d2c{
                                my $high = $_[1];
                                my $low = $_[0];
                                return unpack("s",(pack("H4", $low.$high)))/16;
                                }
                                
                                sub encode_d2c{
                                my $val = $_[0];
                                my $temp_hex = unpack("H4", pack("n", ($val)*16));
                                # change lowbyte/highbyte -> lowbyte first
                                return substr($temp_hex,2,4).substr($temp_hex,0,2);
                                }
                                Als Plugin:
                                Code:
                                #return; 
                                use warnings;
                                use strict;
                                
                                my $ebus_send = "/root/ebus/tools/ebus_send -a 00 -r 5 -s /dev/usbserial-AEVO0GRK";
                                
                                $plugin_info{$plugname.'_cycle'} = 60;
                                my (@ebusd,@sets);
                                
                                push @ebusd, { name => "eBus_AT", 	    telegramm => "08B509030D0600",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/200", dpt => 9};
                                push @ebusd, { name => "eBus_HK_VL_Soll",   telegramm => "15B509030D0500",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/202", dpt => 9};
                                push @ebusd, { name => "Wochentag",         telegramm => "08B509030D2A00",	data => "integer",    databytes => "1",		ga => "0/5/206", dpt => 9};
                                push @ebusd, { name => "eBus_HK_VL_Ist",    telegramm => "08B509030D0300",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/203", dpt => 9};
                                push @ebusd, { name => "eBus_Quelle_VL",    telegramm => "08B509030D0F00",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/204", dpt => 9};
                                push @ebusd, { name => "eBus_Quelle_RL",    telegramm => "08B509030D0800",	data => "decode_d2c", databytes => "1,2",	ga => "0/5/205", dpt => 9};
                                
                                push @sets, { name => "WW_mode", GA => "0/5/120", telegramm => "25B509040E3B00",	data => "integer"};
                                push @sets, { name => "HK_mode", GA => "0/5/110", telegramm => "50B509040E2B00",	data => "integer"};	
                                push @sets, { name => "Speiche", GA => "0/5/123", telegramm => "FEB5050206",		data => "integer"};
                                
                                ############EMPFANG###########
                                foreach my $ebus (@ebusd) {
                                my $value = qx ($ebus_send $ebus->{telegramm});
                                select(undef, undef, undef, 1);
                                chomp $value;
                                plugin_log($plugname,"Vom Bus gelesen: $value");
                                
                                ### try variable data-handling ###
                                my $subname = $ebus->{data}; 
                                my $subref = \&$subname; 
                                my @arr = split(/ /, $value);
                                my @data_arr = split(/,/, $ebus->{databytes});
                                
                                plugin_log($plugname,"Datenbytes zur Auswertung: @data_arr[0],@data_arr[1]");
                                plugin_log($plugname,"Inhalt Datenbytes: @arr[@data_arr[0]+1],@arr[@data_arr[1]+1]");
                                my $val = &$subref(@arr[@data_arr[0]+1],@arr[@data_arr[1]+1]);
                                knx_write ($ebus->{ga},$val,$ebus->{dpt});
                                plugin_log($plugname,"Codierung: $ebus->{data}");
                                plugin_log($plugname,"Name und Wert: $ebus->{name} $val");
                                ### try variable data-handling ###
                                
                                if ($value eq "")
                                {
                                return "Error";
                                }
                                
                                }
                                
                                
                                #############SENDEN###########
                                foreach my $set(@sets){
                                $plugin_subscribe{$set->{GA}}{$plugname} = 1;   # An Gruppenadresse anmelden
                                
                                if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $set->{GA} && defined $msg{'value'})   # Auf eintreffendes KNX-Telegramm reagiern + anhand der GA filtern
                                {
                                my $var = $msg{'value'};                                		# Wert aus Telegramm filtern
                                #my $subname = $set->{name}; 
                                #my $subref = \&$subname;                                		# jetzt wird $subref die entsprechende sub zugewiesen
                                plugin_log($plugname, "Befehlsgruppe: $set->{name} Value: $var"); 	# Logging der Befehlsgruppe
                                #my $command = addCRC(&$subref($var));
                                if ($set->{data} eq "integer"){
                                $var = sprintf "%02d",int($var);
                                my $command = $set->{telegramm}.$var;
                                plugin_log($plugname, "Befehl: $command");
                                my $send = qx (/root/ebus/tools/ebus_send -a 00 -r 5 -s /dev/usbserial-AEVO0GRK $command);
                                return $send;
                                }
                                }
                                }
                                
                                
                                
                                ############################################
                                ### D A T E N K O N V E R T I E R U N G ####
                                ############################################
                                
                                sub integer{
                                return $_[0];
                                }
                                
                                ### BCD ###
                                #FIX ME !!!!!
                                
                                #sub decode_bcd {
                                #    return (unpack "H*", pack "C*",hex($_[0]));
                                #	#unpack "H*", $_[0]; ####?????
                                #}
                                
                                sub decode_bcd {
                                        my $z = $_[0];
                                        my $high = hex($z) >> 4;
                                        my $low  = hex($z) & 15;
                                        return $high * 10 + $low;
                                }
                                
                                sub encode_bcd {
                                	return pack 'H*', join '', $_[0];
                                }
                                
                                ### DATA1b ###
                                
                                sub decode_d1b{         #1byte signed 
                                    my $val = hex(shift);
                                    return $val > 127 ? $val-256 : $val;
                                }
                                
                                sub encode_d1b {        #### F I X M E !!!!!
                                    my $y = shift;
                                    $y *= 256;
                                    $y = $y & 0xffff if ($y < 0);
                                    my $hb = int $y/256;
                                    return (sprintf("%0.2X", $hb));
                                }
                                
                                
                                ### DATA1c ###
                                
                                sub decode_d1c {
                                my $y = hex ($_[0])/2;
                                return $y;
                                }
                                
                                sub encode_d1c {
                                    return sprintf "%x",(($_[0])*2);
                                }
                                
                                
                                ### DATA2b ###
                                
                                sub decode_d2b { 
                                	return unpack("s", pack("s", hex($_[1].$_[0]))) / 256; 
                                }
                                
                                sub encode_d2b {
                                	my ($hb, $lb) = unpack("H[2]H[2]", pack("s", $_[0] * 256));
                                	return $lb.$hb;
                                }
                                
                                
                                ### DATA2c ###
                                
                                sub decode_d2c{
                                my $high = $_[1];
                                my $low = $_[0];
                                return unpack("s",(pack("H4", $low.$high)))/16;
                                }
                                
                                sub encode_d2c{
                                my $val = $_[0];
                                my $temp_hex = unpack("H4", pack("n", ($val)*16));
                                # change lowbyte/highbyte -> lowbyte first
                                return substr($temp_hex,2,4).substr($temp_hex,0,2);
                                }
                                Grüße
                                Umgezogen? Ja! ... Fertig? Nein!
                                Baustelle 2.0 !

                                Kommentar

                                Lädt...
                                X