FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Ellert am 29 September 2016, 11:26:48

Titel: DOIF: Tools, Fehlersuche - qualifizierte Angaben, Verhaltensanalyse
Beitrag von: Ellert am 29 September 2016, 11:26:48
Die aktuelle Version gibt es im FHEMwiki Tools, Fehlersuche - qualifizierte Angaben, Verhaltensanalyse (https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche)

Dies ist der Versuch einige Hilfen aufzuzeigen, damit ein fehlerhaftes DOIF selbst korrigiert werden kann und wenn dies nicht zum Ziel führt, notwendige Angaben für eine Anfrage im Forum zusammenzustellen.

Eine verlässliche Basis zur Fehlereingrenzung schaffen.
Standardisierte Geräteerstellung und Bearbeitung
Im Folgenden wird davon ausgegangen, dass zum Erstellen (https://wiki.fhem.de/wiki/Erste_Schritte_in_fhem#Device_anlegen_-_define) des DOIF und zur Befehlseingabe die Eingabezeile des Web-Frontends benutzt wird und mit dem DEF-Editor (https://wiki.fhem.de/wiki/Erste_Schritte_in_fhem#Bestehende_Devices_ver.C3.A4ndern_.E2.80.93_modify) (auf DEF klicken) in der sich öffnenden Geräteübersicht (DeviceOverview) bearbeitet wird, ohne eine cfg-Datei zu editieren.

Nutzung des integrierten DEF-Editors mit Codemirror-Erweiterung, Codemirror einrichten und bedienen (https://wiki.fhem.de/wiki/Konfiguration#Syntaxhervorhebung), siehe ergänzend DOIF: Tips leichtere Bedienung Syntaxhervorhebung Klammerprüfung Suchen&Ersetzen (https://forum.fhem.de/index.php/topic,45373.0.html)

Strukturierung der Definition
Eine einzeilige Definition, die über mehrere Seiten verschoben werden muss oder über mehrere Zeilen umgebrochen wird ist unübersichtlich. Der DEF-Editor bietet die Möglichkeit zur Strukturierung der Definition. Man könnte wie folgt strukturieren:

## 1
(<Bedingung>)
   (<Befehle>)
## 2
DOELSEIF (<Bedingung>)
   (<Befehle>)
## 3
DOELSEIF (<Bedingung>)
   (<Befehle>)
...


FHEM aktuell halten
Die Befehlsreferenz (http://fhem.de/commandref_DE.html#DOIF) im Netz beschreibt die Eigenschaften des aktuellen Moduls. Möchte man die neusten Eigenschaften nutzen, ist eine Aktualisierung durchzuführen. Wird nur das Modul aktualisiert, kann das zu unerwartetem Verhalten des DOIF führen.

Prüfen ob ein Update für DOIF vorliegt mit update check

FHEM aktualisieren mit update

Nach einem "update" immer ein shutdown restart durchführen.

"shutdown restart" kann man per notify automatisieren mit
define shutdown_restart notify global:UPDATE shutdown restart

Der Befehl version liefert die "Latest Revision:" und die aktuell geladenen Modulversionen.

Fehlersuche
Fehler in der Syntax der Definition
Diese Fehler werden durch die Benutzung des DEF-Editors mit Codemirror-Erweiterung reduziert.
Der Editor unterstützt:

Einige Syntaxfehler werden im Frontend bei der Erstellung des Gerätes oder im globalen Logfile angezeigt. Das globale Logfile ist über den Menüpunkt "Logfile" im Hauptmenü des Frontends zu erreichen.
Fehler oder Warnungen, die erst zur Laufzeit offensichtlich werden, stehen in der Geräteübersicht oder im globalen Logfile.

Logische Fehler
Diese Fehler werden erst zur Laufzeit sichtbar und das DOIF verhält sich nicht wie erwartet.
Die Fehler entstehen z.B. durch:

- Angabe einer falsche Rangfolge von Operatoren (https://wiki.selfhtml.org/wiki/Perl/Operatoren#Operatorenrangfolge) in der Bedingung: [A] and [B] or [C] geschrieben, aber [A] and ([B] or [C]) gemeint.
- Nichtbeachtung des unterschiedlichen Verhalten von auslösenden und nicht auslösenden Readings.
- Ein unerwartetes Auslösen von DOELSE.
- Unerwartete Ereignisse eines Gerätes, die in einer Bedingung nicht abgefangen werden.
- Falsche Angabe der Events eines beteiligten Gerätes.

Besonderheit des Error-Reading
Das Reading "error" enthält Fehlermeldungen oder Rückgabewerte von Befehlen, die nicht 0, "", undef. also logisch "falsch" entsprechen. Die Ausführung des Befehls
({my $var = 1})
setzt das Error-Reading
error      {my $var =1 }: 1
Diese falsche Fehlermeldung kann vermieden werden, durch Erzeugen eines Rückgabewertes, der logisch "falsch" entspricht.
({my $var = 1;; 0})
Die mit ";; 0" angehängte Null verhindert das Setzen des Error-Readings.

Fehler eingrenzen
Wenn der Hinweis in der Fehlermeldung nicht ausreicht, um den Fehler zu beseitigen, empfiehlt es sich die Definition des DOIF Schritt für Schritt neu aufzubauen und die Fehlermeldung zu beobachten, um den Fehlerort einzugrenzen. Der letzte Schritt, der zur Fehlermeldung geführt hat, muss dann genauer untersucht werden.

DOIF zum Testen
Eine weitere Möglichkeit wäre ein DOIF zum Testen anzulegen. Darin können Befehle, Bedingungen oder Bedingungsteile, verschiedene Schreibweisen oder alternative Operanden verwendet und ausprobiert werden, bis der eine Lösung gefunden wurde.

Hilfsmittel zu Fehleranalyse
Befehlsreferenz zum DOIF
Die Hilfe (http://fhem.de/commandref_DE.html#DOIF) immer wieder problembezogen lesen.

Stacktrace
Zur Ursachenermittlung von Perl-Warnungen kann das globale Attribut stacktrace auf 1 gesetzt werden.
attr global stacktrace 1

Verboselevel
In manchen Fällen bekommt man hilfreiche Informationen, wenn der Verboselevel von betroffenen Geräten erhöht wird.
attr <gerätename> verbose 5

Eventmonitor
Der Eventmonitor ist über den Menüpunkt "Event monitor" im Hauptmenü des Frontends zu erreichen. Er enthält einen Filter, um die Anzeige der Events zu beschränken, um z.B. nur die Events eines Gerätes anzuzeigen, etwa des DOIF.

Detailansicht des DOIF
Das Schaltverhalten des DOIF kann in der Detailansicht (DeviceOverview) des DOIF und/oder im Eventmonitor beobachtet werden.
Bei der Detailansicht ist zu beachten, dass nicht alle sich ändernden Readings aktualisiert werden. Um diese geänderten Readings anzuzeigen, muss die  Ansicht im Browser aktualisiert werden.

Gerätedefinition ausgeben
Eine Gerätedefinition einschliesslich der Attribute kann man sich mit dem Befehl "exportdevice" anzeigen lassen und zum Posten verwenden.
exportdevice <DOIFname>

Listing des DOIF
Eine Momentaufnahme vom Status des DOIF im Fehlerfall kann man sich mit dem Befehl "list" anzeigen lassen.
list <DOIFname>

Verhaltensanalyse des DOIF
Das komplette Verhalten des DOIF kann über ein extra Logfile protokolliert werden. Dazu können alle Geräte einbezogen werden, die im DOIF enthalten sind; z.B. als tägliches Logfile.
define DOIF_Log FileLog ./log/DOIF_Log-%j.log <DOIFname>:.*|<Gerät 1>:.*|<Gerät 2>:.* ...

Mit dem Attribut mseclog lässt sich ein genauerer Zeitstempel einstellen, damit können zusammengehörende Events erkannt werden.
attr DOIF_Log mseclog 1

In dem Logfile kann das Verhalten des DOIF und der dazugehörenden Operanden genau nachvollzogen werden. Wenn Abweichungen zum erwarteten Verhalten erkannt werden, hat man einen Anhaltspunkt für weitere Untersuchungen oder sogar den Auslöser gefunden.

Die Protokollierung mit FileLog hat den Vorteil, dass die Definition recht einfach in der Geräteübersicht zusammengestellt werden kann. Die Definition muss nach Gebrauch nicht gelöscht werden, sondern kann mit dem Attribut "disable" abgeschaltet werden. Später kann das Gerät wieder aktiviert werden, etwa um ein anderes DOIF zu loggen.

Qualifizierte Angaben zur Anfrage im Forum
Dem Helfenden sollten alle zum Problem gehörenden Informationen gegeben werden, die dem Fragenden auch zur Verfügung stehen.
Nicht immer sind alle Angaben notwendig, bei komplexen Problemen schon eher.
Titel: Antw:DOIF: Tools, Fehlersuche - qualifizierte Angaben, Verhaltensanalyse
Beitrag von: OliWee am 07 Oktober 2016, 08:17:10
Vielen Dank!

Ich weiß, es ist eine undankbare Aufgabe, aber solche Infos würde ich mir im Wiki wünschen...  ;)

Gruß
Oli
Titel: Antw:DOIF: Tools, Fehlersuche - qualifizierte Angaben, Verhaltensanalyse
Beitrag von: Ellert am 07 Oktober 2016, 12:32:34
Zitat von: OliWee am 07 Oktober 2016, 08:17:10
Vielen Dank!

Ich weiß, es ist eine undankbare Aufgabe, aber solche Infos würde ich mir im Wiki wünschen...  ;)

Gruß
Oli
Du darfst den Beitrag ins Wiki übertragen, damit habe ich kein Problem.
Titel: Antw:DOIF: Tools, Fehlersuche - qualifizierte Angaben, Verhaltensanalyse
Beitrag von: OliWee am 12 Oktober 2016, 09:42:54
Zitat von: Ellert am 07 Oktober 2016, 12:32:34
Du darfst den Beitrag ins Wiki übertragen, damit habe ich kein Problem.
Erledigt...  :)