ioBroker JavaScript – Exec

In diesem Artikel zeige ich Dir den Exec Befehl, mit dem Du Systembefehle direkt in ioBroker ausführen kannst. 

Für meine Systemview der Visualisierung wollte ich die Prozessorauslastung ausgeben. In Linux kann die Prozessorleistung mit dem Befehl „top“ ausgegeben werden. Der Befehlt „top“ zeigt eine dynamische Übersicht der auf dem System laufenden Prozesse. Diesen Befehl können wir mittels JavaScript über die exec() Funktion ausführen und das Ergebnis in einen Datenpunkt schreiben.

Die exec() Funktion besitzt die folgende Signatur:

exec(cmd, callback);

 

Über dem ersten Parameter „cmd“ wird der auszuführende Befehl an die Funktion übergeben. Die Callback-Funktion wird nach der Ausführung des Befehls ausgeführt und liefert Informationen über die Ausführung zurück.

Um die Funktion nutzen zu können, müssen vorher die Einstellungen „Erlaube das Kommando setObject“ und „Erlaube das Kommando exec“ im JavaScript-Adapter aktiviert werden.

 

Nach einem Neustart des Adapters kann dann der folgende JavaScript ausgeführt werden:

 
exec('top', function (error, stdout, stderr) { setState('Datenpunkte.0.SystemInfos.Prozessorauslastung',stdout); }); 

Wie oben schon erwähnt führt die exec() Funktion die Funktion „top“ auf dem Host-Betriebssystem aus und schreibt das Ergebnis über die setState-Funktion in den entsprechenden Datenpunkt in ioBroker. Mit dieser Vorgehensweise haben wir somit eine Vielzahl von Möglichkeiten für den Zugriff auf das ioBroker Host-System. In meiner Produktivumgebung arbeite ich mit einem RaspberryPI unter Linux. Die exec Funktion lässt sich aber auch unter Windows Host-Systemen einsetzen. Hierfür muss dann die Befehlssyntax aus der jeweiligen Betriebssystem-Umgebung genutzt werden.

Ich hoffe euch gefällt dieser Artikel. Über Kommentare unterhalb des Artikels oder per E-Mail freue ich mich wie immer 🙂

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

3 Gedanken zu „ioBroker JavaScript – Exec

  • Pingback: VIS – Reboot Linux über die Visualisierung – smarthome-tricks.de

  • 12. Juni 2019 um 15:43
    Permalink

    Hallo Herr Korte, zunächst möchte ich Ihnen sagen, dass ich schon sehr viel nach Ihren Anleitungen mit dem ioBroker gemacht habe und alles perfekt passte. Dafür herzlichen Dank.
    Zu diesem Tutorial habe ich folgende Frage: Gebe ich das Script ein – Datenpunkt habe ich angelegt –
    exec(‚top‘, function (error, stdout, stderr)
    { setState(‚Test.0.Prozessorauslastung‘,stdout); });
    erhalte ich folgende Warnung:
    15:25:56.522 warn javascript.0 at script.js.common.Test_und_Übungen.exec_Übung_:2:4
    In den Datenpunkt wird kein Wert geschrieben (welcher auch?).
    Wenn ich in Putty den Befehl „top“ eingebe, kommen viele Angaben, von denen ich einige auch in den Objekten rpi2.0 finde. Darunter dann eine fortlaufende Tabelle.
    Meine Frage also: Wie bekomme ich konkrete Werte? stdout und stderr sind ja wohl nur „Umleitungen“. Muss da nicht noch nach einem Wert gefragt werden?
    Herzliche Grüße
    U. Weisswange

    Antwort
  • 9. Februar 2020 um 17:10
    Permalink

    Zum Thema kann ich vielleicht noch kurz was beitragen.
    Ausgangssituation: Multi-Host-Setup. Master ist eine VM, Slave ein RPi3 mit 433MHz Sender.
    Genau hier lag auch meine lange Recherche, warum der exec-Befehl mit ’sudo /home/raspberry-remote/./send 110011 2 1′ nicht funktionieren wollte.

    Erstmal muss man natürlich einen zweiten Skript-Adapter für den Slave in ioBroker installieren.
    Dann das Skript auf die Instanz vom Slave stellen und jetzt das, wodrann ich gescheitert war:

    Der Benutzer iobroker muss noch in die Gruppe der su’doers aufgenommen werden (alles auf dem Slave ausführen):
    sudo adduser iobroker sudo

    Anschließend habe ich noch die /etc/sudoers angepasst:
    sudo visudo

    Eintrag hinzufügen:
    iobroker ALL=(ALL) NOPASSWD: ALL
    iobroker ALL=NOPASSWD:/sbin/reboot
    iobroker ALL=NOPASSWD:/sbin/shutdown

    Das war’s dann auch schon.

    Dass das nicht unbedingt einer Sicherheitsrichtlinie entspricht, ist mir durchaus bewusst.
    Ein Gedankengang, dem ich nicht gefolgt bin, wäre das Verzeichnis mit dem Programm vom 433MHz Sender in /home/iobroker/ zu kopieren und die Rechte anzupassen. Aber das wird dann wieder komplizierter, da das Programm zum senden unbedingt den sudo Befehl braucht, da nur su’doer die GPIO’s ansprechen dürfen.

    Vielleicht mag Hr. Korte hierzu noch einen weiteren Artikel verfassen. Auf meiner Suche nach der Lösung bin ich auf viele Leute mit dem gleichen Problem getroffen aber keiner kannte so richtig eine Lösung. Das würde bestimmt ne Menge Leute glücklich machen.

    Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.