[gelöst]: AnalyzeCommandChain - Fehler wenn Funktion am Ende von AT, NOTIFY od. DOIF

Begonnen von bertl, 06 Mai 2024, 11:32:54

Vorheriges Thema - Nächstes Thema

bertl

Hallo Rudi,

ich habe bei mir folgendes eigenartiges Verhalten festgestellt:
Wenn ich eine Funktion welche ich in myUtils hinterlegt habe in einem AT, NOTIFY oder DOIF aufrufe, kommt ein return Wert (Fehlermeldung laut https://wiki.fhem.de/wiki/DevelopmentModuleAPI#AnalyzeCommandChain) wenn diese am Ende aufgerufen wird.

Beispiel um meine kryptische Beschreibung verständlich zu machen:

Wenn die Funktion 'nonBlocking' am Ende des notify aufgerufen wird, gibt das notify einen return Wert im Log zurück.
defmod ntf_LAN_switch notify LAN_.*:(PoE_on|PoE_off|Port_on|Port_off) {
  Log 1, "$SELF: notify $NAME - $EVENT (nonBlocking)";
  nonBlocking( "$SELF", "$NAME;$EVENT" );
}
2024.05.06 10:23:12 1: ntf_LAN_switch: notify LAN_TPL_Port4 - PoE_on (nonBlocking)
2024.05.06 10:23:12 3: ntf_LAN_switch return value: HASH(0xa943070)

Wenn die Funktion 'nonBlocking' NICHT am Ende des notify aufgerufen wird, gibt das notify KEINEN return Wert im Log zurück.
defmod ntf_LAN_switch notify LAN_.*:(PoE_on|PoE_off|Port_on|Port_off) {
  nonBlocking( "$SELF", "$NAME;$EVENT" );
  Log 1, "$SELF: notify $NAME - $EVENT (nonBlocking)";
}
2024.05.06 10:24:57 1: ntf_LAN_switch: notify LAN_TPL_Port4 - PoE_off (nonBlocking)
Soweit ich das durchblicken konnte, kommt dieser return Wert von deiner Funktion 'AnalyzeCommandChain' welche im AT, NOTIFY und DOIF verwendet wird.

Gibt es einen plausiblen Grund für dieses Verhalten oder ist das ein Bug?

Danke für die Info
Robert

betateilchen

Zitat von: bertl am 06 Mai 2024, 11:32:54Gibt es einen plausiblen Grund für dieses Verhalten oder ist das ein Bug?

Das hat nix mit AnalyzeCommandChain() selbst zu tun, das ist ein völlig normales Verhalten in perl.

Der Ausführungsteil Deines notify wird immer den Rückgabewert der letzten aufgerufenen Funktion zurückgeben. In Deinem ersten Beispiel ist das die Rückgabe von nonBlocking(), im zweiten Beispiel ist es der Rückgabewert von Log().

Und wenn Du Dir jetzt das Ende der Funktion Log() anschaust, wirst Du herausfinden, dass da "return undef" steht. Deshalb liefert die Funktion keinen Wert im Log.

Das Verhalten hängt also davon ab, welchen Rückgabewert Deine eigene Funktion nonBlocking() zurückliefert.
Aber diese Funktion und deren Rückgabewert hast Du uns hier leider nicht genannt. Man könnte vereinfacht sagen: Eine perl Funktion ohne return; zu beenden, funktioniert zwar, aber es ist schlechter Stil.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bertl

Hallo betateilchen,

danke für die schnelle Antwort - habe ich wieder was gelernt.

Nachdem ich perl hauptsächlich durch 'Copy & Paste' verwende (so auch die Funktion 'nonBlocking'), habe ich mir keine weiteren Gedanken über den Rückgabewert gemacht.

Zitat von: betateilchen am 06 Mai 2024, 12:41:15Eine perl Funktion ohne return; zu beenden, funktioniert zwar, aber es ist schlechter Stil.
Zukünftig werde ich deine Anregung berücksichtigen.

Schönne Tag
Robert