FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: grizu am 13 Januar 2022, 20:56:08

Titel: [gelöst] Aufruf einer subroutine in 99_myUtils - Name als String vorhanden
Beitrag von: grizu am 13 Januar 2022, 20:56:08
Hallo,

ich möchte euch um Hilfe zu folgender Aufgabe bitten:
Ich bin gerade dabei, ein Nextion-Display als komfortable Steuerung für meine FHEM Installation einzurichten - Das sieht so aus:
- die Daten, die vom Nextion z.B. bei einem Tastendruck geschickt werden, gehen über ein notify an eine subroutine in myUtils
- die holt sich aus einer Config-Datei die entsprechende Kommando-Zeile raus, in der das auszuführende Kommando als String steht
- Dieser String wird dann mit fhem("..") ausgeführt

Kleines Beispiel:

Nextion sendet       H65 H04 H0f H01   (Button mit der ID 0f auf Page 04 gedrückt)

in meiner Config-Datei wird die Zeile   H04 H0f H01 set*IT_Dose_2*on      gefunden

es wird fhem("set IT_Dose_2 on");  ausgeführt

- soweit so gut.

Für eine neue Funktion müsste ich allerdings keinen fhem-Befehl ausführen, sondern eine andere sub aus myUtils, und da komme ich nicht weiter.

Meine Zeile in der Config würde zum Beispiel so aussehen:H05 H0a H01 {sendWindowOpenMail()}

das würde bei mir in einem Aufruf fhem("{sendWindowOpenMail()}") münden, und das geht ja soweit nicht, wenn ich das richtig verstanden habe (oder doch? wäre zumindest für mein Problem der einfachste, weil generische Ansatz).

Habt ihr vielleicht einen anderen Tipp für mich ?
Wenn nicht anders möglich, muss ich in der config-Datei eine Unterscheidung treffen zwischen fhem- und perl-Aufrufen, in dem Fall bliebe noch die Frage, wie ich in perl eine sub aufrufe, deren Name als String in einer variable steht.

Danke schon im Voraus für eure Hilfe!
Chris
Titel: Antw:Aufruf einer subroutine in 99_myUtils - Name als String vorhanden
Beitrag von: Otto123 am 13 Januar 2022, 21:17:49
Hi Chris,

es ist egal ob Du {Perlsub()} in der FHEM Kommandozeile ausführst oder als fhem("{Perlsub()}") in Perl aufrufst.

Gruß Otto
Titel: Antw:Aufruf einer subroutine in 99_myUtils - Name als String vorhanden
Beitrag von: frober am 13 Januar 2022, 21:24:33
Warum willst du von Perl nach Fhem um dort Perl aufzurufen?

Rufe doch die sub direkt in Perl auf.
Titel: Antw:Aufruf einer subroutine in 99_myUtils - Name als String vorhanden
Beitrag von: grizu am 14 Januar 2022, 07:59:51
Hallo,

und danke für eure Antworten!

Otto: Ok, dann muss ich mir das nochmal ansehen, ich hab bei der Variante immer im Log "Unknown Command.." bekommen - wahrscheinlich hab ich wo einen Syntaxfehler irgendwo mit den Quotes.. da muss ich nochmal in mich gehen, jedenfalls weiss ich jetzt, in welche Richtung ich weitergehen kann, danke :)

Frober: ja, das wäre mein 2. Ansatz gewesen, allerdings ists dann eben nicht so generisch - im Moment kann ich in der Config einfach eine neue Zeile dazugeben, um eine neue Funktion zu integrieren, sonst müßte ich jedesmal die Routine anpassen.. Weiters weiss ich als Perl-Azubi noch nicht, wie ich eine Funktion aufrufe, von der ich nur den Namen in einer Variable habe.

Schöne Grüße,
Chris
Titel: Antw:Aufruf einer subroutine in 99_myUtils - Name als String vorhanden
Beitrag von: grizu am 14 Januar 2022, 08:21:39
Hi Leute,

Ottos Tipp hat mich auf die richtige Spur gebracht..

Wenn ich eine neue sub schreibe, kastrier ich die immer erst mal, damit ich nix kaputt mache, schreibe also statt
fhem("..");
das hier:
print("fhem: ...\r\n");
und seh mir die Ausgabe an, bevor ich das scharfschalte.

Und in einem Anfall geistiger Umnachtung habe ich vergessen, beim Scharfschalten den Zeilensprung zu löschen  :o
Korrigiert, funktioniert!

Danke und schönes Wochenende!
Chris
Titel: Antw:Aufruf einer subroutine in 99_myUtils - Name als String vorhanden
Beitrag von: DeeSPe am 14 Januar 2022, 09:22:29
Zitat von: grizu am 14 Januar 2022, 08:21:39
Hi Leute,

Ottos Tipp hat mich auf die richtige Spur gebracht..

Wenn ich eine neue sub schreibe, kastrier ich die immer erst mal, damit ich nix kaputt mache, schreibe also statt
fhem("..");
das hier:
print("fhem: ...\r\n");
und seh mir die Ausgabe an, bevor ich das scharfschalte.

Und in einem Anfall geistiger Umnachtung habe ich vergessen, beim Scharfschalten den Zeilensprung zu löschen  :o
Korrigiert, funktioniert!

Danke und schönes Wochenende!
Chris

Genau für solches Debugging wurde die Funktion "Debug" in FHEM erstellt.
Tausche einfach
fhem('bla bla bla');
durch
Debug('bla bla bla');
und der eigentlich in FHEM ausgeführte Befehl landet als String im Log/Event-Monitor.

Gruß
Dan
Titel: Antw:Aufruf einer subroutine in 99_myUtils - Name als String vorhanden
Beitrag von: DeeSPe am 14 Januar 2022, 09:27:23
Zitat von: grizu am 14 Januar 2022, 07:59:51Frober: ja, das wäre mein 2. Ansatz gewesen, allerdings ists dann eben nicht so generisch - im Moment kann ich in der Config einfach eine neue Zeile dazugeben, um eine neue Funktion zu integrieren, sonst müßte ich jedesmal die Routine anpassen..

Und mit dem direkten Editieren der "fhem.cfg" machst Du Dir hier auch keine Freunde, das machen selbst Profis nicht (mehr).
Davon sollte man tunlichst die Finger lassen und die Eingaben über FHEMWEB oder über Telnet machen, denn nur so greifen auch die Überprüfungsmechanismen der Eingaben von FHEM. Sprich man kann einfach viel weniger Fehler eingeben.

Gruß
Dan
Titel: Antw:Aufruf einer subroutine in 99_myUtils - Name als String vorhanden
Beitrag von: Beta-User am 14 Januar 2022, 09:55:37
Zitat von: DeeSPe am 14 Januar 2022, 09:27:23
Und mit dem direkten Editieren der "fhem.cfg" machst Du Dir hier auch keine Freunde, das machen selbst Profis nicht (mehr).
Definitiv.

Ansonsten:
Es wäre auch einfacher zu helfen (und für eventuelle Nachleser/Nachahmer verständlicher), wenn der Gesamt-Code-Kontext (z.B. ein notify im RAW-Format) gegeben wäre.

"fhem()" ist nur ein "wrapper" für alles, was man auch so in die Kommandozeile werfen könnte. Hat einen (kleinen) Overhead, was aber in der Regel für seltene Aufrufe vernachlässigbar ist. 

Für solche "Dispatch"-Geschichten bieten sich übrigens Hashes an, die man dann per "defined?" befragen kann um dann den passenden Schluss draus zu ziehen, z.B., indem man erst einen "Set-Kommandos-Hash" festlegt, den Event auf Passung dazu prüft und dann dasselbe für einen "Perl-Kommando-Hash" macht.

Für "Spezialisten": martinp876 hat in https://forum.fhem.de/index.php/topic,123886.msg1184509.html#msg1184509 eine Variante vorgestellt, die den lookup per userattr-Liste macht, zwei Beiträge weiter steht dann meine Variante für was ähnliches mit "if"-Abfragen und "Direktkommandos".