Eigenes Modul will nicht mehr nach Update

Begonnen von sweetie-pie, 11 Mai 2022, 17:59:56

Vorheriges Thema - Nächstes Thema

sweetie-pie

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

Beta-User

Vermutlich hängt es mit der etwas geänderten Logik in fhem-pl-Dispatch (https://svn.fhem.de/trac/changeset/25456/trunk/fhem/fhem.pl) zusammen. Auf die Schnelle vielleicht als Einstieg: https://forum.fhem.de/index.php/topic,125292.msg1207182.html#msg1207182.

Es gab ein paar mehr Module, bei denen das Probleme gab, hier z.B. der Patch für esera-One-Wire: https://svn.fhem.de/trac/changeset/25555/trunk/fhem/FHEM
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

sweetie-pie

Erstmal vielen Dank, die Richtung war genau die Richtige...

Ich hatte testweise einfach mal die alte Abfrage aus der Dispatch-Funktion in die aktuelle fhem-Version kopiert.
Siehe da, es lief wieder, aber ich muss zugeben, ich habe noch nicht durchblickt wo das Problem genau liegt.

Ich habe jetzt in meinem physischen Modul 00_CAN.pm in der Funktion CAN_Initialize() folgendes:
  $hash->{Clients} = ":FS20:MYNODE:MYKLIMA:MYKWL:MYCOUNT:";
 
  $hash->{MatchList} = { "1:FS20"      => "^81..(04|0c)..0101a001",
                         "2:MYNODE"    => "^P....E..*",
                         "3:MYKLIMA"   => "^P....40............",
                         "4:MYKWL"     => "^P....(42|43)................",
                         "5:MYCOUNT"   => "^P....(60|62)........" };

Das stand da eigentlich schon immer drin.

und im logischen Module 73_MYNODE.pm (zum Beispiel) habe ich nun in der Funktion MYNODE_Initialize() folgendes:
  $hash->{Match}     = "P....E..*";
Das habe ich neu hinzugefügt.

So schient es jetzt wohl zu laufen. Verstanden habe ich es noch nicht ganz.
Wir gesagt ich bin absoluter Perl-Laie und nach einigem hin und her ging es auf einmal.
-> Blindes Huhn und Korn und so..  oder Beharlichkeit zahlt sich aus ... ;)

Ist das jetzt so wie es es sein sollte?

Und noch mal eine andere Frage in dem Zusammenhang:
Reicht es nach Änderungen an diesen Listen NICHT aus, nur ein Reload des Moduls zu machen?
Ich hatte viel getestet und es ging immer nicht, dann nach einem richtigten Neustart ging es dann auf einmal...  ::)

Gruß
sweetie-pie


Beta-User

Das sollte es gewesen sein (ich tu mich aber auch immer schwer mit solchen Sachen).

Das Problem beim reload ist, dass eben nur die Funktion _getauscht_ (oder erneuert) wird, aber eben nicht _ausgeführt_. Alle Instanzen löschen, dazwischen irgenwann ein reload und dann wieder "define" wäre wohl ausreichend gewesen.

(Über den Punkt bin ich aber auch erst neulich gestolpert im Zusammenhang mit RHASSPY...).

Freut mich jedenfalls, wenn nun alles wieder läuft wie es soll. Die Änderung an der relativ zentralen Stelle war wichtig, weil es ohne diesen Patch in manchen Situationen zu erheblichen Verzögerungen bei "unknown"-Messages gekommen war...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files