Bug in 70_SISPM.pm

Begonnen von 3des, 03 November 2014, 16:15:15

Vorheriges Thema - Nächstes Thema

3des

Hallo,

bin mir nicht sicher ob ich hier mit diesem Problem wirklich richtig bin aber beim Forum "Fehlerberichte" steht "Dieses Forum ist geschlossen. Bitte schreibt Beiträge in den modulspezifischen Foren." und ein modulspezifisches Forum zu SISPM konnte ich nicht finden?

SISPM übergibt per $hash->{FD} nicht wie von FHEM erwartet die fileno sondern das handle was dann bei select FHEM crashen läßt. Hat sich da in letzter Zeit irgendwas geändert und das Modul wurde noch nicht nachgezogen?

Hier ein Patch mit dem's wieder laufen sollte:

--- 70_SISPM.pm 2014-11-03 16:09:27.303000000 +0100
+++ 70_SISPM.pm_org 2014-11-03 15:18:57.507000000 +0100
@@ -224,9 +224,8 @@
   my @a = split("[ \t][ \t]*", $def);
   my $name = $hash->{NAME};

-  if(defined($hash->{SISPMCTL})) {
-      close($hash->{SISPMCTL});
-      delete $hash->{SISPMCTL};
+  if(defined($hash->{FD})) {
+      close($hash->{FD});
       delete $hash->{FD};
   }
   delete $selectlist{"$name.pipe"};
@@ -264,8 +263,7 @@
return "SISPM Can't open pipe: $dev: $!";
     }

-    $hash->{SISPMCTL}=$FH;
-    $hash->{FD}=fileno($FH);
+    $hash->{FD}=$FH;
     $selectlist{"$name.pipe"} = $hash;
     Log 4, "SISPM pipe opened";
     $hash->{STATE} = "running";
@@ -287,15 +285,15 @@

     Log 4, "SISPM Read entered";

-    if(!defined($hash->{SISPMCTL})) {
+    if(!defined($hash->{FD})) {
Log 3, "Oops, SISPM FD undef'd";
return undef;
     }
-    if(!$hash->{SISPMCTL}) {
+    if(!$hash->{FD}) {
Log 3, "Oops, SISPM FD empty";
return undef;
     }
-    $FH = $hash->{SISPMCTL};
+    $FH = $hash->{FD};

     Log 4, "SISPM reading started";

@@ -382,7 +380,7 @@
    Log 5, "SISPM found SISPM device number $1 (sispmctl v3)";
    $tmpnr=$1;
}
- if($tmpnr >= 0 && $inputline =~ /^USB information:  bus .*, device (\d+)/) {
+ if($tmpnr >= 0 && $inputline =~ /^USB information:  bus 001, device (\d+)/) {
    Log 5, "SISPM found SISPM device number $tmpnr as USB $1";
    if($tmpnr < $hash->{NUMUNITS}) {
if($hash->{UNITS}{$tmpnr}{USB}!=$1) {
@@ -436,7 +434,6 @@

     if($eof) {
close($FH);
- delete $hash->{SISPMCTL};
delete $hash->{FD};
delete $selectlist{"$name.pipe"};
InternalTimer(gettimeofday()+ $hash->{Timer}, "SISPM_GetStatus", $hash, 1);


Kann das bitte jemand (wusel?) einspielen?

Schöne Grüße,
Manfred

rudolfkoenig

Hier steht, wo man was posten soll, du bist also hier richtig.

Ich weiss nicht, ob wusel mitliest, ich habe ihn in der Mitgliederliste mit seinem Pseudonymen (painseeker/real-wusel) nicht gefunden, und er hat das Modul seit zwei Jahren nicht angefasst. Falls er sich innerhab von 3 Wochen nicht meldet, dann muessen wir einen neuen Maintainer suchen.

Und ich habe gerade eben einen Kandidaten gefunden :)

3des

lol... patch ist "invertiert".

So sollts passen:

--- 70_SISPM.pm 2014-11-03 16:58:53.593000000 +0100
+++ 70_SISPM.pm_neu 2014-11-03 17:07:12.018000000 +0100
@@ -224,8 +224,9 @@
   my @a = split("[ \t][ \t]*", $def);
   my $name = $hash->{NAME};

-  if(defined($hash->{FD})) {
-      close($hash->{FD});
+  if(defined($hash->{SISPMCTL})) {
+      close($hash->{SISPMCTL});
+      delete $hash->{SISPMCTL};
       delete $hash->{FD};
   }
   delete $selectlist{"$name.pipe"};
@@ -263,7 +264,8 @@
return "SISPM Can't open pipe: $dev: $!";
     }

-    $hash->{FD}=$FH;
+    $hash->{SISPMCTL}=$FH; 
+    $hash->{FD}=fileno($FH);
     $selectlist{"$name.pipe"} = $hash;
     Log 4, "SISPM pipe opened";
     $hash->{STATE} = "running";
@@ -285,15 +287,15 @@

     Log 4, "SISPM Read entered";

-    if(!defined($hash->{FD})) {
+    if(!defined($hash->{SISPMCTL})) {
Log 3, "Oops, SISPM FD undef'd";
return undef;
     }
-    if(!$hash->{FD}) {
+    if(!$hash->{SISPMCTL}) {
Log 3, "Oops, SISPM FD empty";
return undef;
     }
-    $FH = $hash->{FD};
+    $FH = $hash->{SISPMCTL};

     Log 4, "SISPM reading started";

@@ -380,7 +382,7 @@
    Log 5, "SISPM found SISPM device number $1 (sispmctl v3)";
    $tmpnr=$1;
}
- if($tmpnr >= 0 && $inputline =~ /^USB information:  bus 001, device (\d+)/) {
+ if($tmpnr >= 0 && $inputline =~ /^USB information:  bus .*, device (\d+)/) {
    Log 5, "SISPM found SISPM device number $tmpnr as USB $1";
    if($tmpnr < $hash->{NUMUNITS}) {
if($hash->{UNITS}{$tmpnr}{USB}!=$1) {
@@ -434,6 +436,7 @@

     if($eof) {
close($FH);
+ delete $hash->{SISPMCTL};
delete $hash->{FD};
delete $selectlist{"$name.pipe"};
InternalTimer(gettimeofday()+ $hash->{Timer}, "SISPM_GetStatus", $hash, 1);


ich will wusel hier nicht seinen Job streitig machen, habe ja selbst noch so einige Module geplant...

sollte sich wusel aber wirklich garnicht melden, können wir ja nochmal drüber reden, vielleicht hab ich bis dahin ja dann auch meine "benamten" und zyklischen Timer ;)