openHAB Systembefehle per Schalter ausführen
In diesem Beitrag erkläre ich wie ihr openHAB Systembefehle per Schalter ausführen könnt. Doch worum geht es genau? Mir geht es um die folgenden Systembefehle, die jeder der openHAB auf einem Raspberrry Pi installiert hat nutzt.
sudo systemctl stop openhab2.service sudo systemctl start openhab2.service sudo systemctl restart openhab2.service sudo shutdown sudo reboot
Wir nutzen hierfür das Exec Binding. Das Exec Binding könnt ihr für diverse Anwendungen nutzen. Eine davon ist eben das ausführen von gängigen openHAB Systembefehlen. So muss ich für einen Neustart des openHAB 2 Service oder einem Reboot des RAspberry Pi nicht extra per ssh auf die Kiste.
openHAB Systembefehle – openHAB Exec Binding installieren
Als erstes müsst ihr das Exec Binding installieren. Entweder ihr installiert ihr das Binding über die Paper UI. Geht auf Add-ons (1), auf Bindings (2) sucht nach exec und drückt install (3). Alternativ pflegt ihr die addons.cfg (meine Empfehlung).
openHAB Systembefehle – ohne Passwort erlauben
Ohne Passwort? Naja, nicht ganz. Es geht darum, dass ihr das ausführen der Befehle ohne Passwort erlauben müsst, sonst funktioniert es nicht. Ihr kennt das wahrscheinlich. Ihr loggt euch per ssh auf dem Raspberry Pi ein und beim ersten sudo Befehl müsst ihr das Passwort einmalig neu eingeben. Dies verhindert aber das ausführen per exec Binding. Ohne Passwort heißt hier also nur, dass ihr das erste Passwort nicht mehr eingeben braucht. Das Passwort ist beim Login natürlich weiterhin aktiv.
Loggt euch also per ssh auf dem Raspberry Pi ein.
sudo visudo -f /etc/sudoers.d/010_pi-nopasswd
Nun fügt ihr in der Datei eine neue Zeile ein. Als erstes steht der User, den ihr verwenden wollt. Da ich openHABian nutze, ist es bei mir openhab. Hinter NOPASSWD: könnt ihr noch die Befehle eingrenzen. Ich habe es komplett geöffnet, da nur ich per Passwort an openHAB komme.
openhab ALL=(ALL) NOPASSWD: ALL
openHAB Systembefehle – openHAB Exec Things, Items Sitemap
Für jeden Befehl legt ihr euch entweder ein Thing an. Oder nutzt so wie ich dynamische Feldzuweisung, in dem ihr z.B. bei sudo einfach shutdown oder reboot per Switch Mapping in der Sitemap nutzt. Legt ein .things file an und nutzt den folgenden Inhalt.
Thing exec:command:oh2service [command="sudo /bin/systemctl %2$s openhab2.service", autorun=true] Thing exec:command:piservice [command="sudo %2$s", autorun=true]
Die erste Zeile ist für den Neustart von openHAB2. Die zweite Zeile ist zum Neustart oder herunterfahren des Raspberry Pi. %2$s wird durch eine Zeichenkette über das Item gefüllt. Autorun heißt, dass der Befehl bei Wertänderung direkt ausgeführt wird. Erthält also z.B. das Thing exec:command:piservice den Wert shutdown, so wird sudo shutdown ausgeführt.
Nun nutzt eine bestehende Itemdatei oder legt eine neue an. Hier kommt folgendes rein. Über Thingsnamen + angehängtem :input, übernehmt ihr den Wert aus der Sitemap.
String OH2_Service "OH2 Service" { channel="exec:command:oh2service:input" } String PI_Service "PI Service" { channel="exec:command:piservice:input" }
In die Sitemap könnt ihr nun folgendes einfügen.
Frame label="Systemfunktionen" { Group item=gSystem Switch item=OH2_Service mappings=[restart="Restart" ] Switch item=PI_Service mappings=[reboot="Reboot", shutdown="Shutdown"] }
Nun bekommt ihr folgende Knöpfe in der Systemmap.
Ihr könnt wie geschrieben auch viele andere Dinge machen. Unter den folgenden Links einige Beispiele wie Python per openHAB (englisch) ausführen.
Ihr nutzt das Exec Binding auch? Wofür hinterlasst ein Kommentar.
Nette idee aber leider funktioniert „%2$s“ nicht und bringt immer Fehlermeldungen.
Ohne %2$s wird der Befehl aber nicht genutzt
Hallo,
funktioniert bei mir einwandfrei. Welche Fehlermeldung kommt denn?
Beste Grüße
Thomas
Danke, hat geklappt!
Hatte erst als User „openhabian“ in der /etc/sudoers.d/010_pi-nopasswd angegeben weil ich dachte, wenn ich den User bei SSH angeben muss dann auch dort. Dass es den User „openhab“ gibt wusste ich gar nicht.
Wie immer top Tutorial
Hallo,
ich habe alles nach ANleitung durchgeführt, leider funktioniert es aber nicht.
Im LOG File kommt lediglich die Meldung: „OH2_Service predicted to become NULL“
bzw. „PI_OH2_Service predicted to become NULL“
Jedoch keine Reaktion vom System. Was könnte ich falsch gemacht haben?
Vielen Dank und Grüße
Oliver
Hallo,
bei mir werden in der BasicUI an Stelle der Buttons Switches dargestellt.
Der PI_Service hat ausserdem nur eine Switch.
Muss ich noch etwas einstellen, damit ich die Buttons angezeigt bekomme?
Besten Dank!
Hallo,
erst einmal möchte ich sagen, dass dies hier eine super Anleitung ist! Bei mir haben alle 3 Systembefehle auf Anhieb funktioniert.
Als einziger Wermutstropfens spamt der Fehler „Format specifier ‚%2$s“ mein Log-File ziemlich voll.
Ich versuche leider erfolglos in org.ops4j.pax.logging.cfg den Fehler heraus zu filtern. Meine Konfiguration sieht hierbei wie folgend aus:
# custom filter
log4j2.appender.event.filter.uselessjunk.type = RegexFilter
log4j2.appender.event.filter.uselessjunk.regex = .*(%2$s|astro_|Netatmo|SysInfoPi).*
log4j2.appender.event.filter.uselessjunk.onMatch = DENY
log4j2.appender.event.filter.uselessjunk.onMisMatch = ACCEPT
Die 3 anderen Wildcards funktionieren sehr gut. Zum Beispiel wird das Astro-Binding im Log-File perfekt heraus gefiltert. (Mit einer Aktualisierung alle 3 Minuten war das auch nervig.)
Auch andere Filter-/Suchbegriffe wie „exec“ oder „Format specifier“ helfen nicht.
Hat jemand eine Idee wie man den Fehler entweder im Log-File filtern kann oder wie man ihn umgehen kann?
Vielen Dank & Grüße!
Leider bekommt ich im Log folgenden Fehler
Tried to execute ’sudo %2$s‘, but it is not contained in whitelist.
Kann jemand Abhilfe leisten?
Gruß Joe
Hallo Joe,
danke für den Hinweis.
Das exec Binding war unsicher und daher müssen die Kommandos nun in eine whitelist. Trage die Befehle hier ein
misc/exec.whitelist
Den Beitrag aktualisiere ich bei Gelegenheit.
Beste Grüße und bleib gesund
Thomas
Hallo Thomas,
vielen Dank erstmal für deine super Blogs!
Wie ist das mit der whitelist?
Was muss ich in misc/exec.whitelist einfügen und wie ist dies zu gestalten?
Vielen Dank im Voraus!
Hallo Uli,
In die Datei muss folgendes:
sudo %2$s
sudo /bin/systemctl %2$s openhab2.service
Gruß Tom
Statt den Befehlen steht bei mir NULL.
Die witelist habe ich ergänzt.
Woran könnte es liegen?
Hallo Tom,
danke für die Antwort.
BG
Thomas
Hallo,
Leider Funktionert deine Anleitung nicht mehr nach dem neuen Openhab update.
Vor dem hatte ich OP2.5.1 da ging alles ohne Probleme.
Nach dem Update 2.6.2 auf und an legen der exce.withelist geht es bei mir nicht mehr, in der log wird gesagt der befehl seht nicht in der liste ob. Ich habe das eingetragen was ein parr Zeilen vorher geschrieben wurde.
Gruß Chris
Guten Tag Thomas,
über eine Suche bei Google bin ich hier gelandet. Ich habe mMn alles so umgesetzt, wie Du das beschrieben hast. Auch die Whitelist-Datei habe ich angelegt.
Nur – ich bekomme keine „Reaktion vom System“. Es erfolgt z.B. kein Restart oder ein Shutdown.
Was mache ich falsch? Hier ein Auszug aus dem Logfile:
2020-07-24 12:43:12.536 [ome.event.ItemCommandEvent] – Item ‚PI_Service‘ received command shutdown
2020-07-24 12:43:12.582 [nt.ItemStatePredictedEvent] – PI_Service predicted to become shutdown
2020-07-24 12:44:22.265 [ome.event.ItemCommandEvent] – Item ‚OH2_Service‘ received command restart
2020-07-24 12:44:22.304 [nt.ItemStatePredictedEvent] – OH2_Service predicted to become restart
Über eine Antwort freue ich mich.
Beste Grüße
Marc
dito auch bei mir, außer Log Einträgen passiert nix:
2020-08-20 21:24:09.705 [ome.event.ItemCommandEvent] – Item ‚OH2_Service‘ received command restart
2020-08-20 21:24:09.708 [nt.ItemStatePredictedEvent] – OH2_Service predicted to become restart
2020-08-20 21:24:21.874 [ome.event.ItemCommandEvent] – Item ‚PI_Service‘ received command reboot
2020-08-20 21:24:21.879 [nt.ItemStatePredictedEvent] – PI_Service predicted to become reboot
Hi,
anscheinend ist ein Rebbot vom RPi nach Pflege von
„sudo visudo -f /etc/sudoers.d/010_pi-nopasswd“ notwendig, damit es funktioniert.
Hat jedenfalls hier geholfen: https://community.openhab.org/t/perfom-reboot-command-by-openhab/103564/12
(Mir hat die Anleitung sehr geholfen und ich war so frei, sie im OH-Forum zu verlinken)
Gruß Florian
Hallo zusammen,
es funktioniert fehlerlos obwohl ich nicht viele Ahnung habe.
Selbsterklärend
Vielen lieben Dank
Servus, vielen Dank für die Anleitung. Leider erhalte ich diese Fehlermeldung:
2020-11-26 21:01:01.515 [ome.event.ItemCommandEvent] – Item ‚PI_Service‘ received command reboot
2020-11-26 21:01:01.532 [nt.ItemStatePredictedEvent] – PI_Service predicted to become NULL
2020-11-26 21:01:15.362 [ome.event.ItemCommandEvent] – Item ‚OH2_Service‘ received command restart
2020-11-26 21:01:15.370 [nt.ItemStatePredictedEvent] – OH2_Service predicted to become NULL
Whitelist habe ich angepasst:
sudo %2$s
sudo /bin/systemctl %2$s openhab2.service
(genau so reinkopiert, das sollte passen, oder nicht?)
Wer kann mir bitte helfen?
Hat nun doch geklappt, verd…. Tippfehler. *ärger*
Bei mir leider das Gleiche:
2020-12-28 14:59:20.728 [ome.event.ItemCommandEvent] – Item ‚OH2_Service‘ received command restart
2020-12-28 14:59:20.732 [nt.ItemStatePredictedEvent] – OH2_Service predicted to become NULL
2020-12-28 14:59:22.346 [ome.event.ItemCommandEvent] – Item ‚PI_Service‘ received command reboot
2020-12-28 14:59:22.350 [nt.ItemStatePredictedEvent] – PI_Service predicted to become NULL
@MARCO: Was war der Tippfehler? Vielleicht liegts bei mir auch daran?
Also bei mir funktioniert es so leider auch nicht. Was mir noch fehlt ist die exec.whitelist. Das muss rein. War bei mir jetzt leider nicht die Ursache.
Mhm, also ich dachte man müsste außerdem noch sudo adduser openhab sudo ausführen.
Ich musste neustarten, damit es ging