FHEM Forum

FHEM => Automatisierung => Thema gestartet von: sisi am 26 Juni 2020, 13:53:59

Titel: Filelog: Absturtz durch Modulo eventOnThreshold
Beitrag von: sisi am 26 Juni 2020, 13:53:59
Hallo Zusammen,

der erste Post... lasst Gnade walten! ;)

System:
Aktuelle FHEM Installation (Update all von heute) auf einem Raspbery 1 mit einem SignalDuino CUL 433MHz.

Problem:
FHEM Abstürze im gefühlt Minuten bis Sekundentakt.

Bisherige Untersuchungen und Informationen:
htop zeigt anhand der Laufzeit dauernd Resets an (Laufzeit immer klein) - also es stürzt wirklich das Perl/FHEM ab.
Ohne Signalduino scheint die Welt in Ordnung zu sein, mit dem Stick treten die Abstürze auf. Ein Wechsel des Arduino Nano Boards hatte keinen Einfluss, ebensowenig wie das flashen der stable oder experimental firmware des SignalDuino. Der NanoCUL zeigt dahingehend keine Probleme wurde aber zum Eingrenzen des Problems abgezogen.
Verbose 5 ist gesetzt


Jetzt tritt im Log folgender "Illegal modulus zero" auf, aus dem ich nicht schlau werde. Leider konnte ich dazu weiter nichts finden:
2020.06.26 12:47:03 4: SigDuino433 Hideki_Parse: incomming P12#7546BA4ACFBEC251544003
2020.06.26 12:47:03 4: SigDuino433 Hideki crcCheck ok: cs1/cs2 0/64, rawData=7546BA4ACFBEC251544003, count+2=9, length=11
2020.06.26 12:47:03 4: SigDuino433 Hideki_Parse: raw=7546BA4ACFBEC251544003, decoded=75cacede51c246f3fc4003
2020.06.26 12:47:03 5: SigDuino433 Hideki_Parse: getSensorType for 222
2020.06.26 12:47:03 4: SigDuino433 Hideki_Parse: SensorTyp = 30 decodedString = 75cacede51c246f3fc4003
2020.06.26 12:47:03 4: SigDuino433 decoded Hideki protocol model=Hideki_30, sensor id=ca, channel=5, cnt=3, bat=ok, temp=25.1, humidity=46, comfort=Hum. OK. Temp. uncomfortable (>24.9 or <20)
2020.06.26 12:47:03 5: SigDuino433 Hideki_Parse deviceCode: Hideki_30_5
2020.06.26 12:47:03 5: Starting notify loop for Hideki_30_5, 2 event(s), first is temperature: 25.1
Illegal modulus zero at ./FHEM/92_FileLog.pm line 333.
2020.06.26 12:47:07 5: Initializing Type Library:
2020.06.26 12:47:07 1: Including fhem.cfg
2020.06.26 12:47:07 5: Cmd: >attr global userattr cmdIcon devStateIcon:textField-long devStateStyle icon sortby webCmd webCmdLabel:textField-long widgetOverride<
2020.06.26 12:47:07 5: Cmd: >attr global autoload_undefined_devices 1<
2020.06.26 12:47:07 5: Cmd: >attr global autosave 0<

und dann scheint FHEM neu zu starten.

Im File 92_FileLog.pm ab Zeile 333 befindet sich diese If-Abfrage... leider weiß ich nciht was genau dort verarbeitet wird...
  if($eot && ($owr+$written) % $eot == 0) {
    readingsSingleUpdate($log, "linesInTheFile", $owr+$written, 1);
  } else {
    setReadingsVal($log, "linesInTheFile", $owr+$written, $tn);
  }


Soweit dazu. Dieser Hideki Sensor liefert Feuchtigkeit und Temperatur. Das wird auch ordentlich angezeigt und zumindest scheinbar durchwegs geloggt.

Wie bekomme ich einen stabilen Lauf im FHEM her? Ich kann fast nicht damit arbeiten und es einrichten, weil ich permanent Verbindungsabbrüche habe wegen der Abstürze.


Vielen Dank Euch schon vorab für die Unterstützung und viele Grüße!
SISI
Titel: Antw:Signalduino 433MHz, FHEM Abstürze im Minutentakt, Illegal modulus zero
Beitrag von: sisi am 26 Juni 2020, 15:57:03
Hallo Leute,

es scheint, als hätte ich das Problem selbst gelöst, allerdings verstehe ich den Hintergrnd nicht so ganz.

In der Datei 92_FileLog.pm steht $eot ja für "Event-on-threshold". Für das Hideki Log hatte ich ein solches EOT (also EventOnChange+Threshold) definiert mit einem Schwellwert von 0.2. Nun ist 0.2 aber ja nicht "NULL".

Frage 1:
Warum also wird der Fehler "Illegal modulus zero " ausgegeben!? Wird die Größe Gerundet? Das hatte ich in der Doku nicht gelesen, dass EOT nur ganzzahlige positive Werte annehmen darf.

Frage 2:
Könnte man also nicht hier die "unzulänglichkeit" der Programmiersprache umgehen indem eine Abfrage des EOT Wertes das auffängt? Dann gäbe es die Resets vermutlich nicht... könnte aber evtl. auf die Geschwindigkeit gehen!? Mal ganz nebenbei bemerkt ist mathematisch gesehen "x modulo 0 = x" - es ist also definiert!


Viele Grüße!

Titel: Antw:Signalduino 433MHz, FHEM Abstürze im Minutentakt, Illegal modulus zero
Beitrag von: amenomade am 26 Juni 2020, 21:14:18
Das ist Perl, das bei einer Modulo Kalkulation nur das Integer Teil des Modulus nutzt.
ZitatIf the operands $m and $n are floating point values and the absolute value of $n (that is abs($n)) is less than (UV_MAX + 1) , only the integer portion of $m and $n will be used in the operation (Note: here UV_MAX means the maximum of the unsigned integer type).
https://perldoc.perl.org/perlop.html#Multiplicative-Operators

my $eot = 0.5;
print 1000 % 0.5;
ergibt die gleiche Fehlermeldung.

Und es nutzt nichts, es mit 'if ($eot)' zu schützen, da $eot eh definiert ist.

Verschiebe bitte dein Thread ins Automatisierung Subforum (Knopf ganz unten links) und ändere den Titel mit etwas wie "Filelog: Absturtz durch Modulo eventOnThreshold"
11 File                         Maintainer           Forum
12 =========================================================================
437 FHEM/92_FileLog.pm           rudolfkoenig         Automatisierung


EDIT: Das stimmt übrigens nicht ganz:
ZitatMal ganz nebenbei bemerkt ist mathematisch gesehen "x modulo 0 = x" - es ist also definiert!
Modulo ist mathematisch definiert als "Rest von der Division" und man kann nicht durch 0 dividieren...  Es sei denn, Du redest von Kongruenz modulo 0...
"x modulo 1 = x"
Einige Programmiersprachen gehen das um wie Du es sagst, aber Perl eben nicht.
Titel: Antw:Signalduino 433MHz, FHEM Abstürze im Minutentakt, Illegal modulus zero
Beitrag von: sisi am 27 Juni 2020, 10:05:47
Hi amenomade,

Du hast natürlich Recht, es müsste Kongruenz Modulo heißen. Aber Mathematisch ist das wie gesagt definiert.

Dumm ist nur, dass die Temperaturanzeigen im zehntel-Raster auflaufen und ich die Logeinträge so - zumindest nur auf direktem Wege - nur in Grad Schritten eindämmen könnte. Ansonsten bliebe natürlich nur eine unkomfortable Lösung über eine verzehn- oder verhunderfachung des Wertes um dann entsprechend mit der Modulo Berechnung auf die Schwelleneingrenzung zu kommen. Da müsste ich dann ein neues Log mit einer zwischendruch separat berechneten Größe anlegen, korrekt? Oder gibt es einen direkteren Weg? Sorry für die vielen Fragen... wie gesagt noch FHEM beginner.

Beitrag wird verschoben!

Danke und viele Grüße!
Sven



Titel: Antw:Signalduino 433MHz, FHEM Abstürze im Minutentakt, Illegal modulus zero
Beitrag von: amenomade am 27 Juni 2020, 11:28:17
Zitat von: sisi am 27 Juni 2020, 10:05:47

Du hast natürlich Recht, es müsste Kongruenz Modulo heißen. Aber Mathematisch ist das wie gesagt definiert.

Naja.... stimmt wiederum nicht ganz.
Das mathematische Ergbnis von a % 0 ist nicht definiert.
Aber wenn es um Kongruenzrelation geht, kann man mit 0 arbeiten. Siehe Bemerkung hier: https://de.wikipedia.org/wiki/Kongruenz_(Zahlentheorie)#Restklassen
Oder wenn es um Restklassenringe geht: https://de.wikipedia.org/wiki/Restklassenring#Eigenschaften
Weil keine Division in der mathematischen Definition  dieser Sachen vorkommt.

Zitat von: sisi am 27 Juni 2020, 10:05:47
Dumm ist nur, dass die Temperaturanzeigen im zehntel-Raster auflaufen und ich die Logeinträge so - zumindest nur auf direktem Wege - nur in Grad Schritten eindämmen könnte.

Das kann man evtl. besser mit :Schwelle in event-on-change-reading regeln. https://fhem.de/commandref_DE.html#event-on-change-reading

Und vielleicht nochmal in CommandRef lesen, wofür eventOnThreshold gedacht ist. Meiner Meinung nach hast Du hier einen Denkfehler:
Zitat von: CommandRefeventOnThreshold
Falls es auf eine (nicht Null-) Zahl gesetzt ist, dann wird das linesInTheFile Event generiert, falls die Anzahl der Zeilen in der Datei ein Mehrfaches der gesetzen Zahl ist. 
Es geht hier nur um die Anzahl Events zu reduzieren, die vom FileLog Device generiert werden, nicht vom Quelldevice. Deswegen sind dezimale Zahlen heir auch Unsinn - es gibt keine dezimale Anzahl von Zeilen in der Log (sollte aber vom Modul gefangen werden, und nicht zum Absturz führen, deswegen die Bitte, das Thread zu verschieben, damit Rudi was tut)