OpenHab: System reboot, Neustart OH, Neustart einzelner Bindings von der Benutzeroberfläche aus

  • Da ich mir jedesmal einen Wolf suche und es zu den OpenHab Community Beiträgen seit OH 3 Abweichungen gibt, wollte ich euch hier kurz erklären, wie ich es mit meiner Installation (Raspberry Pi mit openHABian) hinbekommen habe.

    Warum möchte man das überhaupt haben?

    • Irgendwas läuft nicht sauber und man möchte das ganze System neu starten
    • Man hat relevante Dinge in OH geändert und möchte nur den OpenHab Dienst neu starten
    • Ein Binding hat sich aufgehängt und man muss es neu starten
    • ...

    Man kann sehr viel umsetzen und auch beispielsweise Regeln erstellen, die ein Binding neu starten, wenn die Verbindung zu dem entsprechenden Dienst verloren ging.

    Sicherung, SSH?

    Vorab: Erstelle eine Sicherung der SD-Karte.


    Dann musst Du dich per SSH mit einem Rechner auf dem OH läuft verbinden (erkläre ich hier nicht, denn wenn Du dies nicht kannst, solltest Du das hier besser nicht machen). Verwende den openhabian Benutzer (falls Du das Standardpasswort nicht geändert hast, es lautet auch "openhabian" - aber ändere es bitte!).

    Reboot, Shutdown, Neustart OH

    1. Führe folgendes Kommando aus um den openhab Benutzer (als welcher OH ausgeführt wird) sudo Rechte zu geben: sudo adduser openhab sudo
    2. Starte visudo um die Rechte des Benutzers zu ändern und die Ausführung von Kommandos ohne Passwortabfrage zu ermöglichen : sudo visudo
    3. Nun musst Du der Datei die folgende Zeile hinzufügen (am besten oberhalb der includes). Das Speichern erfolgt über die Nachfragen nach Eingabe von Strg+X. Speicher ohne dem Anhang ".tmp".
    Code: /etc/sudoers
    # Allow openhab user to execute shutdown, poweroff, and systemctl commands
    openhab   ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/poweroff, /bin/systemctl, /sbin/reboot, /usr/bin/ssh

    Das war es schon... fast... Um in OpenHab jetzt einen Reboot/Shutdown durchführen zu können, legst Du am besten Items vom Typ Switch an mit welchem du die entsprechenden Aktionen auslöst.


    Hier ein Codebeispiel:

    Neustart von Bindings

    Falls Du Bindings neustarten können möchtest, muss man weitere Schritte gehen:

    1. Wechsel mit cd nach /home/openhabian/
    2. Erlaube dem Benutzer das Schreiben in dieses Verzeichnis (warum auch immer das nicht möglich ist): chmod 777 /home/openhabian/
    3. Erstelle für den openhab Benutzer einen Schlüssel. Bei der Nachfrage nach einen Kennwort, bitte "keins" auswählen: sudo -u openhab ssh-keygen -t rsa -f openhab.id_rsa
    4. Kopiere den Schlüssel aus /home/openhabian/openhab.id_rsa.pub. Den Anfang "ssh-rsa " und das Ende "openhab@openhabian" weglassen.
    5. Füge den Schlüssel als neue Zeile unterhalb der Kommentare in die Datei /var/lib/openhab/etc/keys.properties ein. Vorne kommt ein "openhab=" und hinten ",_g_:admingroup" dazu. Die neue Zeile sieht verkürzt dann etwa so aus: openhab=AAAAB {...} yqOCrAK8=,_g_:admingroup
    6. Falls das folgende Kommando ohne Passwortabfrage ausgeführt wird, hast Du es geschafft: sudo -u openhab ssh -p 8101 -i /home/openhabian/openhab.id_rsa openhab@localhost. Eventuell kommt hier eine Nachfrage, ob der Rechner vertrauenwürdig ist... antworte mit "yes".
    7. Um ganz sicher zu gehen kannst Du noch mit sudo su zum Superuser werden, dann mit su openhab zum openhab Benutzer wechseln und das Kommando ssh -p 8101 -i /home/openhabian/openhab.id_rsa openhab@localhost ausführen. Auch dies sollte ohne Passwortabfrage möglich sein.

    Auch hier gibt es ein kurzes Codebeispiel:


    Viel Spaß damit ;) :vulcan:

  • Hmmm...
    Da sich bei mir öfters mal die Verbindung in die Cloud verabschiedet wollte ich mir einen Button einbauen, der dann den Pi einfach neu startet. Ein einfaches stoppen und starten von OpenHab hat leider nichts gebracht. Bei myopenhab.org erschien mein System trotzdem offline...

    Wie dem auch sei.
    Ich habe einen Switch als Thing in mein Model aufgenommen und es ihn in die Page aufgenommen.
    Der Switch heißt "NeustartPi".


    Weiterhin habe ich folgende Rule erstellt:




    Zu beginn habe ich noch folgende Erweiterung per Nano in die visudo eingefügt und gespeichert "visudo: /etc/sudoers.tmp"


    Löse ich nun den Schalter aus, wäre meine Annahme, dass der Pi neu startet. Es passiert aber rein gar nichts :)
    Wo ist mein Fehler? Kannst Du mir da ggf. weiter helfen griffix ?

  • Hast Du denn mal in der Konsole den Befehl sudo -u openhab reboot ausgeführt um zu testen, ob Dein Eintrag in der sodoers erfolgreich war?

    Ja, gerade eben....
    Es funktioniert nicht.


    User openhabian is logged in on sshd.

    Please retry operation after closing inhibitors and logging out other users.

    Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.

  • Ich habe das openhabian image auf die SD-Karte gespielt.
    Der Rest ging von allein.

    Ich habe nur noch das Update von OH2 auf OH3 durchlaufen lassen.

    Ich habe ziemlich Häufig das Problem, dass mein OH nicht mehr aus der Cloud erreichbar ist, kann mir aber nicht erklären warum. Lokal läuft alles.


    Manchmal fängt er sich von allein wieder aber heißt hilft nur ein Neustart des Pi

    Update:
    Das Problem scheint gelöst.
    Ich habe das Cloud Bindung gelöscht und neu eingerichtet. Seitdem ist die Verbindung stabil.

    Trotzdem scheint die Berechtigung noch nicht so ganz zu passen. Der erbot Button funktioniert noch immer nicht...

  • griffix

    Im Beitrag oben hattest Du im Script executeCommandLine("sudo","reboot")

    geschrieben was in der Konsole sudo -u openhab reboot ersetzt.

    In der Konsole wird mir aber vorgeschlagen stattdessen sudo systemctl reboot -i zu nutzen, da der user openhabian angemeldet ist.
    Wenn ich das nun in das Script übernehme würde das folgendermaßen aussehen:
    executeCommandLine("sudo","systemctl","reboot","-I")


    oder sehe ich da was falsch?

  • Im Beitrag oben hattest Du im Script executeCommandLine("sudo","reboot")

    geschrieben was in der Konsole sudo -u openhab reboot ersetzt.

    Jein... Das -u openhab ist nur dafür da um zu testen, ob dieses Kommando auch mit diesem Benutzer ausführbar ist. In der konsole bist Du i.d.R. als openhabian unterwegs, das ist aber nicht der Benutzer, der die executeCommandLine-Befehle ausführt.

  • So, nun Brauche ich doch noch einmal Deine Hilfe griffix


    Ich habe jetzt in OH 3.4.0 ein Item erstellt und als Switch eingebunden.
    Dann habe ich eine Rule erstellt die im Ablauf folgendermaßen aussieht:

    Wenn Schalter "Shutdown" auf "ON" geschaltet wird
    Dann führe folgendes DSL-Script aus und setze Schalter wieder auf OFF


    Das Ergebnis endet in folgendem Fehler:


    Die Berechtigung für Openhab funktioniert. Als User Openhab kann ich Shutdown, Reboot etc. über die Konsole ausführen.

    Die Regel habe ich folgendermaßen angelegt:



    Der gesamte Code der Rule sieht folgendermaßen aus:


    configuration: {}

    triggers:

    - id: "1"

    configuration:

    itemName: ShutDownPi

    state: ON

    previousState: OFF

    type: core.ItemStateChangeTrigger

    conditions: []

    actions:

    - inputs: {}

    id: "2"

    configuration:

    itemName: ShutDownPi

    state: OFF

    type: core.ItemStateUpdateAction

    - inputs: {}

    id: "3"

    configuration:

    type: application/vnd.openhab.dsl.rule

    script: |-

    rule "System Shutdown"

    when

    Item HealingShutdownServer changed to ON

    then

    executeCommandLine("sudo","poweroff")

    end

    type: script.ScriptAction


    Als ECMA-Script ändert sich an dem Ergebnis leider nicht, außer das in der Fehlermeldung die Unterstriche nicht vorhanden sind.

  • Habe da schon alles durch,
    das kommt wohl öfters vor, wenn man von 2 auf 3 umsteigt. Da müssen Scripte teilweise umgeschrieben werden.
    Aber ich habe auch Beispiele gefunden, die eigentlich genau so funktionieren sollten.
    Bei vielen ist der gleiche Fehler hoch gekommen weil vorher noch ein Timer mit eingebaut war und der Timer Befehl in der Form nicht mehr unterstützt wird.

    Ich werde noch mal etwas rumprobieren, kann mir aber nicht vorstellen, dass in jeder Zeile ein Fehler ist und das Feld "undefined" ist. Das kann eigentlich nur eine Kleinigkeit sein.


    griffix wenn Du bei der Umstellung von 2 auf 3 die gleichen Fehler bekommst, gib mal bitte Bescheid.

  • Das Beispiel aus dem initialen Beitrag ist die Version, die in meiner 3er Version von OH anstandslos läuft.

    Hast Du die Rule auf die gleiche Weise hinterlegt wie ich?
    Also über den Configurator gegangen und die Regel als DSL eingegeben?

    Oder kannst Du einmal den kompletten Code einstellen, der unter der Rule hinterlegt ist?

  • Hast Du die Rule auf die gleiche Weise hinterlegt wie ich?
    Also über den Configurator gegangen und die Regel als DSL eingegeben?

    Oder kannst Du einmal den kompletten Code einstellen, der unter der Rule hinterlegt ist?

    Nein, habe ich nicht.


    Das, was im Beispiel als Code system.rules erwähnt wird, ist der komplette Code. Ich arbeite ausschließlich Datei-basiert und daher reicht diese Datei aus.

  • Nein, habe ich nicht.


    Das, was im Beispiel als Code system.rules erwähnt wird, ist der komplette Code. Ich arbeite ausschließlich Datei-basiert und daher reicht diese Datei aus.

    Könntest Du ggf. mal einen Versuch starten und eine Dummy Rule über die UI erstellen um zu schauen ob er bei Dir das Script ausführen würde?
    Reicht ja ein Logeintrag wenn ein Schalter betätigt wird...

  • Könntest Du ggf. mal einen Versuch starten und eine Dummy Rule über die UI erstellen um zu schauen ob er bei Dir das Script ausführen würde?
    Reicht ja ein Logeintrag wenn ein Schalter betätigt wird...

    Würde ich, wenn ich Zugriff hätte. Meine einzige 3er Instanz ist von mir 1200km entfernt und remote teste ich dort nichts.

    Kann ich gerne machen sobald ich hier ein 3er System fertig und gesichert habe.

  • Also nach meiner Erfahrung ist der Neustart des ganzen OpenHAB so gut wie nie notwendig.

    Wenn es Probleme mit einem Binding gibt, reicht es eigentlich immer, dies neu zu starten.


    Wenn es Probleme mit der OpenHAB-Cloud gibt (was in letzter Zeit leider öfter passiert), dann reicht es ebenfalls das entsprechende Binding neu zu starten.


    Das mache ich z. B. mit einem Putty-Script, den ich über eine OpenHAB-Rule aufrufe und der folgenden Befehl absetzt:


    bundle:restart 'openHAB Add-ons :: Bundles :: IO :: openHAB Cloud Connector'


    Danach war bei mir immer wieder alles am Start.


    Mittlerweile überwache ich die Connection zur OpenHAB-Cloud über einen kleinen WatchDog, der selbst erkennt, wenn die Verbindung nicht mehr steht und dann das Binding automatisch neu startet....


    Gruß Ralph

  • Also nach meiner Erfahrung ist der Neustart des ganzen OpenHAB so gut wie nie notwendig.

    Wenn es Probleme mit einem Binding gibt, reicht es eigentlich immer, dies neu zu starten.

    Die Notwendigkeit nicht nur einzelne Bindings, sondern auch OH oder das ganze System neustarten zu können, ergab sich bei mir durch das 1200km entfernte Ferienhaus. Dort bin ich nur alle 3-4 Monate und habe entsprechend immer diverse Notfallregeln um das System stabil zu halten oder wieder zu bekommen - Du glaubst gar nicht, wie scheiße es ist im Winter das System nicht mehr erreichen zu können und nicht zu wissen, ob die Frostwächter laufen usw.

  • Tupper


    Hat mir keine Ruhe gelassen...


    In der Konsole wird mir aber vorgeschlagen stattdessen sudo systemctl reboot -i zu nutzen, da der user openhabian angemeldet ist.
    Wenn ich das nun in das Script übernehme würde das folgendermaßen aussehen:
    executeCommandLine("sudo","systemctl","reboot","-I")


    oder sehe ich da was falsch?

    Ich würde behaupten, das funktioniert gar nicht, hast du das auf der Konsole denn Mal ausprobiert also sudo -u openhab systemctl reboot -i?

    Da kommt ein lustiger Dialog und es scheitert bei mir vermutlich am nicht vorhandenen PSW für den User openhab.


    Was allerdings funktioniert ist zuerst Mal als openhab an der Konsole anmelden

    sudo -u openhab /bin/bash

    Und dann als "openhab@openhabian/..."

    sudo reboot

    (Wobei ich tatsächlich lieber sudo shutdown -rnehme, da bleibt noch Zeit die Sitzung ordentlich zu schließen.)


    Zur Steuerung aus der UI-Rule:


    Es reicht nur der Befehl im DSL scribt als Action:


    Ich denke eine Rule in einer Rule zu schreiben funktioniert nicht gut, u.a. da der Trigger ja schon da war 🤔

    Sieht im Code (ohne Trigger) dann so aus:


    Code
    configuration: {}
    triggers: []
    conditions: []
    actions:
    - inputs: {}
    id: "1"
    configuration:
    type: application/vnd.openhab.dsl.rule
    script: executeCommandLine("sudo","reboot")
    type: script.ScriptAction

    Das einzige was mir bei Dir Sorge macht, ist das editieren der original visudo (steht da extra, dass man das lieber in ner eigenen File machen soll) und dann noch mit dem nano🤔


    Viel Spass weiterhin🖖🏻

  • Warum nutzt Du für Fernzugriff kein VPN? Dann kanst Du auf dem Rechner alles machen.

    Wenn OH in einem container läuft kann man den entsprechenden Container über eine Oberfläche wie z.B. Portainer komplett neu starten. Das geht auch vom Tablet oder Handy.

    Das livisi binding ist nach meiner Erfahrung super stabil. Viel besser als das Innogy binding weil ohne cloud.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!