Hallo,
ich muss mich zunächst entschuldigen, vermtl. ist das falsche Bereich, aber in Developers habe ich keine Schreibrechte (mehr).
Ich habe eine selbstgebaute Haussteuerung, die basiert auf physikalisch CAN. Die ist mittlerweile schon 11 Jahre alt und lief recht stabil über alle fhem Updates hinweg.
Da ich damals viel FS20 und den CUL hatte, hatte ich mich seinerzeit dazu entschlossen, die logischen CAN-Nachrichten im FS20-Format zu bauen um somit nur ein eingenes IO-Modul basteln zu müssen.
Von CAN-Microkontroller geht es über einen XPORT per Telnet zu fhem.
Da ich nur recht beschränkte Perl-Kenntnisse habe, habe ich damals 00_CUL genommen und ein bißchen angespasst. Deswegen auch der Post hier im Board.
Das lief bisher auch recht gut und zuverlässig. Bis zum letzten Update. Mein vorheriger Stand war Oktober 2021.
In der Zwischenzeit muss etwas geändert worden sein, sodass mein Modul nicht mehr richtig läuft.
Ich verfolge seit einer Woche verschiedenste Irrlichter, komme aber nicht weiter.
Hier der Code wo ich das Problem sehe:
sub
CAN_Parse($$$$$)
{
my ($hash, $iohash, $name, $rmsg, $initstr) = @_;
my $dmsg = $rmsg;
Log3( $name, 4, "CAN ($name) - CAN_parse(): Rohnachricht dmsg=$dmsg len=" . length($dmsg));
#Translate Message from CAN to FHZ
next if(!$dmsg || length($dmsg) < 1); # Bogus messages
my $fn = substr($dmsg,0,1);
my $len = length($dmsg);
#--------------------------------------------------------------------------------------------------------------------
if($fn eq "F" && $len >= 9) { # Reformat for 10_FS20.pm
Log3( $name, 3, "CAN ($name) - CAN_parse(): Ignoring message " . $dmsg );
return; #return bedeutet ignorieren.
#--------------------------------------------------------------------------------------------------------------------
} elsif($fn eq "P" && $len >= 8) { # CAN-Proxy-Nachricht
Log3( $name, 4, "CAN ($name) - CAN_parse(): CAN-Proxy-Nachricht Debug: unformated P>fn=$fn len=$len dmsg=$dmsg " );
;
#--------------------------------------------------------------------------------------------------------------------
} elsif($fn eq "P" && $len == 7) { # FS20-CAN-Nachricht [z.B. P111631] T.B.D.
# hier noch filtern auf CMDs
Log3( $name, 3, "CAN ($name) - CAN_parse(): FS20-CAN-Nachricht Debug: unformated P>fn=$fn len=$len dmsg=$dmsg " );
#CAN-Doubletten: fn=P len=7 dmsg=P111631
#Translate Message from CAN to FHZ
my $tdmsg = "";
my $fs20cmd = (hex substr($dmsg,5,2));
if ($fs20cmd >= 0x20 && $fs20cmd <= 0x3f) {
Log3( $name, 3, "CAN ($name) - CAN_parse(): FS20-CAN-Nachricht Debug: fs20cmd=$fs20cmd (in DEC)" );
$tdmsg = sprintf("81%02x04xx0101a001%s0100%02x",
$len/2+8, substr($dmsg,1,4), ($fs20cmd-0x20));
$tdmsg = lc($tdmsg);
$dmsg = $tdmsg ;
Log3( $name, 3, "CAN ($name) - CAN_parse(): FS20-CAN-Nachricht Debug: reformated P>tdmsg=$tdmsg" );
} else {
Log3( $name, 3, "CAN ($name) - CAN_parse(): Doubletten: no valid fs20cmd=$fs20cmd " );
}
# return; # verwirft das Telegramm
#--------------------------------------------------------------------------------------------------------------------
} elsif($fn eq "D" && $len >= 6) { # DBG-Meldung des Gateways ignorieren
Log3( $name, 1, "CAN ($name) - CAN_parse(): DBG-Meldung des Gateways: $dmsg" );
return;
#--------------------------------------------------------------------------------------------------------------------
} else {
DoTrigger($name, "UNKNOWNCODE $dmsg");
Log3( $name, 1, "CAN ($name) - CAN_parse(): unknown message $dmsg" );
return;
}
$hash->{"${name}_MSGCNT"}++;
$hash->{"${name}_TIME"} = TimeNow();
$hash->{RAWMSG} = $rmsg;
my %addvals = (RAWMSG => $rmsg);
Dispatch($hash, $dmsg, \%addvals);
}
In dem alten Setup läuft es. Die Nachricht wird erkannt und dann dispatched.
2022.05.11 17:47:28 4: CAN (MyCAN) - CAN_parse(): Rohnachricht dmsg=P2A10E50FAF12003A len=17
2022.05.11 17:47:28 4: CAN (MyCAN) - CAN_parse(): CAN-Proxy-Nachricht Debug: unformated P>fn=P len=17 dmsg=P2A10E50FAF12003A
2022.05.11 17:47:28 5: MyCAN: dispatch P2A10E50FAF12003A
2022.05.11 17:42:51 4: CAN (MyCAN) - CAN_parse(): Rohnachricht dmsg=P2A10E5FAAD12003A len=17
2022.05.11 17:42:51 4: CAN (MyCAN) - CAN_parse(): CAN-Proxy-Nachricht Debug: unformated P>fn=P len=17 dmsg=P2A10E5FAAD12003A
2022.05.11 17:42:51 5: MyCAN: dispatch P2A10E5FAAD12003A
2022.05.11 17:42:51 3: MyCAN: Unknown code P2A10E5FAAD12003A, help me!
Dann kommt das, was ich nicht verstehe:
Anscheinend wir es auch richtig erkannt und dispatched.
Dann kommt aber anschließend noch eine Meldung, dass des einen Unkown Code gibt?
Ich stehe total auf dem Schlauch.
Für einen Schubs in die richtige Richtung wäre ich dankbar...
Dank Restore läuft es zwar erstmal, aber ich würde gerne aus Kompatibelitätsgründen gerne fhem hin und wieder updaten.
Danke & Gruß
sweetie-pie