Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
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 ?
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..
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...
@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
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.
@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
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);
}
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar