Eigene Funktion mit Call() aufrufen -- aber mit Parameter!

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
TinkyWinky
Beiträge: 36
Registriert: 27.08.2019, 12:14
Hat sich bedankt: 18 Mal

Eigene Funktion mit Call() aufrufen -- aber mit Parameter!

Beitrag von TinkyWinky » 28.08.2019, 23:44

Ich habe hier im Forum die undokumentierte ReGaHss-Funktion `Call()` gefunden, mit der ich eine in einer Datei gespeicherte Funktion aufrufen kann. Super! Es gelang mir jedoch nicht, herauszufinden, wie ich dieser Funktion einen Parameter (String) übergeben kann.

Alles nix:

Code: Alles auswählen

Call ("../../usr/local/scripts/foo.fn::foo(bar)");
Call ("../../usr/local/scripts/foo.fn::foo(\"bar\"")");
string bar = "bar";
Call ("../../usr/local/scripts/foo.fn::foo(" + bar + ")");
Call ("../../usr/local/scripts/foo.fn::foo()", bar);
Was helfen mir unparametrisierbare Funktionen?? Kann jemand helfen?

Benutzeravatar
Black
Beiträge: 5480
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: Eigene Funktion mit Call() aufrufen -- aber mit Parameter!

Beitrag von Black » 29.08.2019, 06:48

Über den stackpointer wie in "normalen" Programmiersprachen geht's auch nicht.
Hm-script ist da ja auch keine normale scriptsprache sondern was besonderes.

Willst du was übergeben, dann im aufrufenden script normale scriptvariablen setzen und diese im aufrufenden script Abfragen.

Weil lokale scriptvariablen sind gar nicht so lokal

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Eigene Funktion mit Call() aufrufen -- aber mit Parameter!

Beitrag von jp112sdl » 29.08.2019, 07:17

Ist Call überhaupt für den Aufruf aus dem Kontext eines WebUI-Skripts gedacht?
Selbst wenn ich diese einfache Funktion aufrufe
Call("../../usr/local/test.fn::myFunc()");

Code: Alles auswählen

function ::myFunc() {
 Write("Hallo Welt");
}
kommt

Code: Alles auswählen

local0.err ReGaHss: ERROR: ScriptRuntimeError:  {  Write("Hallo Welt"); }  [ExecError():iseESPexec.cpp:12686]
@TinkyWinky: Oder soll das gar nicht über ein WebUI Skript aufgerufen werden?

Ansonsten gäbe es auch noch die Möglichkeit mit tclsh ein TCL-Skript aufzurufen. Auch mit Parametern.

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Benutzeravatar
Black
Beiträge: 5480
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 424 Mal
Danksagung erhalten: 1074 Mal
Kontaktdaten:

Re: Eigene Funktion mit Call() aufrufen -- aber mit Parameter!

Beitrag von Black » 29.08.2019, 08:49

probier mal:

Call ("../usr/local/test.fn::myFunc()");

in der Firmware macht EQ3 auch viel gebrauch von dieser Function.

Wichtig ist zu wissen: Der Pfad wird serverseitig mit /www/rega/ geprefixt, das kann per Directory Traversal umgangen werden
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Benutzeravatar
jmaus
Beiträge: 9862
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 464 Mal
Danksagung erhalten: 1880 Mal
Kontaktdaten:

Re: Eigene Funktion mit Call() aufrufen -- aber mit Parameter!

Beitrag von jmaus » 29.08.2019, 09:47

jp112sdl hat geschrieben:
29.08.2019, 07:17
Ist Call überhaupt für den Aufruf aus dem Kontext eines WebUI-Skripts gedacht?
Genau so ist es! Und auch wenn es vielleicht irgendwie gehen mag, so ist die Call() Funktion ganz klar eine Krücke die man besser nicht in seinem eigenen WebUI Programm/Skript nutzen sollte. Nicht nur kennt sie eben keine Argumentenübergabe oder return werte, sondern es gibt wie Black schon gesagt hatte das Prinzip von lokalen Variablen in der ReGa/HM-Skriptsprache schon nicht. Ich rate daher stark davon ab die Call() Funktion in eigenen WebUI Programmen zu verwenden. Die ist dafür einfach nicht vorgesehen und daher eben auch nicht dokumentiert und kann bei falscher Verwendung zu unliebsamen Nebeneffekten führen.
RaspberryMatic 3.75.7.20240420 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

TinkyWinky
Beiträge: 36
Registriert: 27.08.2019, 12:14
Hat sich bedankt: 18 Mal

Re: Eigene Funktion mit Call() aufrufen -- aber mit Parameter!

Beitrag von TinkyWinky » 29.08.2019, 21:42

Verstehe. Schade.

Es schien eine verlockende Möglichkeit zu sein, eine Funktion logString(string s) ohne CuxD, ohne Tcl und ohne sonstige Addons und Workarounds zu implementieren. Also Aus einem Script Debug-Ausgaben in ein Logfile zu senden, um nachvollziehen zu können, warum die Logikschicht ihre Entscheidungen nicht so trifft, wie erwartet. Die anderen gefundenen Ansätze habe ich an einem Abend nicht zum Laufen bekommen und ohne ordentliches Logging kann ich nicht effizient coden.

Noch dazu könnte eine solche Funktion dann als "normale" Datei gespeichert unter ein Versionsmanagement gestellt werden...

Mit einer Parameterübergabe per Variablen kann ich auch leben. Hatte nur nicht damit gerechnet, dass die Skriptsprache auch hier so... altmodisch ist (*facepalm*). Neugierig macht dennoch der Hinweis auf Nebeneffekten bei falscher Verwendung. Wiedereintrittsfestigkeit wird sicher problematisch sein, falls HomeMatic parallele Abarbeitung von Triggern kann. Aber sonst...?

Die dunkle Seite der Macht hat immer die besseren Argumente. :D

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“