Wie ersetzte ich "system.exec" durch die CUx-D Variante?

16.03.2019 / kaju74 / 12.058

Um aus einem Programm (bzw. einem HomeMatic-Skript) heraus andere Funktionalitäten aufzurufen, wie z.B. das Versenden einer Push-Notification, wird üblicherweise der Befehl "system.exec" benutzt. Aber auch heute noch ist dieser Aufruf nicht in allen Variationen besonders "stabil" und kann die Zentrale zum Absturz bringen.

Auch im Zeitalter von OCCU und RaspberryMatic mit all seinen Verbesserungen und Ergänzungen war genau dieser Befehl bei mir Ausschlaggebend für unerklärbare und scheinbar zufällige Abstürze. Zwar kommt es auch darauf an, wie der Befehl in einem Skript ausgeführt wird (z.B. durch das Anhängen eines kaufmännischen Und's für eine parallele Ausführung), aber es gibt auch eine "sicherere" Variante.

Das AddOn CUx-Daemon bringt neben der Anbindung HomeMatic fremder Komponenten auch die ein oder andere (erweiterte) Systemfunktion mit. Eine solche Funktion ist der absturzsichere System-Exec Befehl, der nachfolgend in einem Beispiel näher erläutert werden soll.

Nachdem Du das AddOn installiert hast, muss zunächst ein neues Gerät vom Typ "(28) System" angelegt werden. Dieses bekommt im Regelfall den Namen "CUX2801001". Sollte das Gerät bei Dir anders heißen, ist das nachfolgende Skript entsprechend anzupassen. Weitere Informationen zu den Möglichkeiten von CUx-D kannst Du dem ausführlichen Handbuch entnehmen.

Nehmen wir als nächstes ein Beispiel aus einem etwas älteren Skript von "pocket control" (mit dem oben angesprochenen, kaufmännischen 'Und' am Ende) zum Versenden einer Push-Notification:

system.Exec("wget -q -O /dev/null '--post-data=" # msg  # "' " # url # " &");

Um diese nun durch die CUx-D Variante zu ersetzen, ist die letzte Zeile wie folgt abzuändern:

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null '--post-data=" # msg  # "' " # url # " &");

Entscheidend ist hier die eingesetzte Geräteadresse (CUX2801001), die ggf. abzuändern ist. Der eigentliche Befehl (also alles hinter "wget"...) bleibt dabei absolut gleich.

Nach diesem Prinzip können "problematische" Aufrufe entsprechend ersetzt werden.

- Code scannen, um zur Orginalseite zu gelangen -