[gelöst] Aufruf einer subroutine in 99_myUtils - Name als String vorhanden

Begonnen von grizu, 13 Januar 2022, 20:56:08

Vorheriges Thema - Nächstes Thema

grizu

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

Otto123

Hi Chris,

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

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

frober

Warum willst du von Perl nach Fhem um dort Perl aufzurufen?

Rufe doch die sub direkt in Perl auf.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

grizu

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

grizu

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

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

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".
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files