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 🙂
Pingback: VIS – Reboot Linux über die Visualisierung – smarthome-tricks.de
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
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.