[Gelöst] diverse Devices werden nach I2C-Lesefehler in RPII2C nicht mehr aktuali

Begonnen von yoda_gh, 08 Mai 2018, 21:55:52

Vorheriges Thema - Nächstes Thema

yoda_gh

Hallo

Ich suche seit ein paar Tagen nach einem hässlichen Fehler: nach einem I2C-Lesefehler in 52_I2C_HDC1008 (die ich vermutlich aus Hardware-Gründen häufig habe) werden plötzlich alle I2C-Devices und merkwürdigerweise auch die HTTPMOD-Devices nicht mehr aktualisiert.

Nachdem ich eine wildgewordene Exception in Verdacht hatte und den Aufruf "CallFn(... "I2CWrtFn", direction  =>   "i2cread" ...)" in ein "eval" gepackt habe, bekam ich diesen Fehler:

2018.05.08 00:27:54 1: PERL WARNING: Exiting eval via last at ./FHEM/00_RPII2C.pm line 526.

Ich bin leider kein Perl-Experte, aber schlummert hier vielleicht ein hinterhältiger Bug schon lange? Die "last"-Kommandos in RPII2C in Zeilen 515 und 526 stehen nicht in einer Schleife (im Gegensatz zu z.B Zeilen 488 und 498). Könnte es sein, dass diese die nächsthöhere Schleife außerhalb von RPII2C abbrechen und damit u.U. Teile der FHEM-Infrastruktur lahmlegen?

Ich vermute, das ist ein Copy-Paste-Ergebnis und man bräuchte hier entweder eine künstliche Schleife in i2cread, damit "last" das gewünschte tut - oder man müsste das "last" durch etwas wie "goto" oder "die/eval" ersetzen, oder?

klausw

Da muss ich mal in Ruhe drüberschauen.
Einen PC sehe ich aber erst am Montag wieder. [emoji4]
Ich hatte das Konzept so häufig geändert, da kann was drin geblieben sein was nich hingehört.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

yoda_gh

Ich hab jetzt zumindest eine Pseudo-Schleife mit einer Iteration an die fragliche Stelle in RPII2C eingebaut und damit läuft es jetzt seit 1,5 Tagen stabil. Davor war meist nach wenigen Stunden Feierabend bei den I2C-devices, kann aber auch noch Zufall sein...


klausw

Hallo yoda,

läuft es immer noch stabil bei dir?
Das last hat da wirklich nix zu suchen.
Ersetze bitte das "last" in den von dir genannten Zeilen durch
return "error";
Damit sollte es korrekt laufen.
Nach positiver Rückmeldung werde ich den Fehlerzähler noch an diesen Stellen einbauen und die Korrektur hochladen.

Klaus
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

yoda_gh

Hallo Klaus!

Zitat von: klausw am 22 Mai 2018, 16:24:46
läuft es immer noch stabil bei dir?

Ja, alles wunderbar hier seit ich vor 11 Tagen quick,dirty&hässlich eine Pseudo-Schleife eingebaut habe:


@@ -504,6 +504,7 @@
$clientmsg->{received} = $rmsg if($rmsg);   #Daten als Scalar uebertragen
# } elsif ($clientmsg->{direction} eq "i2cblockread") { #blockweise lesen
} elsif ($clientmsg->{direction} eq "i2cread") { #blockweise lesen
+   for (my $ii = 0; $ii < 2; $ii++) {
my $nbyte = defined($clientmsg->{nbyte}) ? $clientmsg->{nbyte} : 1;
#Log3 $hash, 1, "test Blockweise lese menge: |$nbyte|, reg: |". $clientmsg->{reg} ."|";
my $rmsg = "";
@@ -532,6 +533,7 @@
$rmsg =~ s/(.|\n)/sprintf("%u ",ord($1))/eg;
#Log3 $hash, 1, "test Blockweise lesen ergebnis: |$rmsg|";
$clientmsg->{received} = $rmsg if($rmsg); #Daten als Scalar uebertragen
+   }
}
$hash->{STATE} = $status;
$hash->{ERRORCNT} = defined($hash->{ERRORCNT}) ? $hash->{ERRORCNT} += 1 : 1 if $status ne "Ok";


Zitat von: klausw am 22 Mai 2018, 16:24:46
Ersetze bitte das "last" in den von dir genannten Zeilen durch

return "error";

Dadurch wird aber der STATE nicht korrekt gesetzt, oder? Macht das was? Eine schöne Lösung (abgesehen von goto) ist mir leider auch nicht eingefallen, bin aber auch kein Perl-Experte.

Ich habe den Code auf jeden Fall mal wie von Dir vorgeschlagen angepasst und sage Bescheid, sollte ich wieder einen Hänger sehen!

Zitat von: klausw am 22 Mai 2018, 16:24:46
Nach positiver Rückmeldung werde ich den Fehlerzähler noch an diesen Stellen einbauen und die Korrektur hochladen.

Wirklich positiv  rückmelden kann ich erst in ein paar Tagen, da es im Schnitt immer 2-3 Tage gedauert hat, bis der Fehler aufgetreten ist. Ich weiß nicht, ob es Sinn macht, so lange zu warten, der Bug ist ja relativ klar...

klausw

Zitat von: yoda_gh am 22 Mai 2018, 22:05:28
Dadurch wird aber der STATE nicht korrekt gesetzt, oder? Macht das was? Eine schöne Lösung (abgesehen von goto) ist mir leider auch nicht eingefallen, bin aber auch kein Perl-Experte.

Ich habe den Code auf jeden Fall mal wie von Dir vorgeschlagen angepasst und sage Bescheid, sollte ich wieder einen Hänger sehen!

Wirklich positiv  rückmelden kann ich erst in ein paar Tagen, da es im Schnitt immer 2-3 Tage gedauert hat, bis der Fehler aufgetreten ist. Ich weiß nicht, ob es Sinn macht, so lange zu warten, der Bug ist ja relativ klar...

STATE und den Fehlerzähler werden in der fertigen Lösung gesetzt werden.
Die sind aber nur informativ und ich wollte die Änderung für dich möglichst gering halten.

Warten hat noch nie geschadet ;)
Aber da es bei dir durch die eingebaute Schleife schon funktoniert werde ich das Update schonmal machen.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

klausw

Zitat von: yoda_gh am 22 Mai 2018, 22:05:28
Ich habe den Code auf jeden Fall mal wie von Dir vorgeschlagen angepasst und sage Bescheid, sollte ich wieder einen Hänger sehen!

Wirklich positiv  rückmelden kann ich erst in ein paar Tagen, da es im Schnitt immer 2-3 Tage gedauert hat, bis der Fehler aufgetreten ist. Ich weiß nicht, ob es Sinn macht, so lange zu warten, der Bug ist ja relativ klar...

wie schaut es aus yoda?  8)
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

yoda_gh

Zitat von: klausw am 29 Mai 2018, 16:32:20
wie schaut es aus yoda?  8)

Also mit dem "return error" hat es vier Tage lang einwandfrei funktioniert. Samstag früh habe ich dann ein FHEM-Update gemacht, ohne zu merken, dass dabei die RPII2C-Änderung wieder überschrieben wurde - und erst gestern Abend bemerkt, dass wieder alles kaputt war. Samstag früh hat es gerade mal 45 Minuten gedauert, bis der Sensor wieder tot war und diverse andere Devices ebenfalls den Betrieb eingestellt hatten - und gestern Abend nach einem FHEM-Restart auch nur 1,5 Std,

Leider habe ich also nur 4 Tage mit dem Fix getestet, aber da der Bug aktuell in wenigen Stunden zuschlägt, bin ich ziemlich sicher, dass der Fix greift.

Ich wäre also dankbar, wenn Du das im SVN einbaust, bevor ich es beim nächsten FHEM-Update ohne Nachdenken wieder kaputt mache. :)

klausw

neue Version im SVN ich habe es noch ein bisschen umgebaut und grob getestet
funktioniert hoffentlich  8)
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

yoda_gh


yoda_gh

Zitat von: klausw am 30 Mai 2018, 01:14:40
neue Version im SVN ich habe es noch ein bisschen umgebaut und grob getestet
funktioniert hoffentlich  8)

Schaut gut aus, seit dem Update hatte ich hier keine Probleme mehr, sollte also gefixt sein, danke!

klausw

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280