Rückmeldung von Script wenn beendet

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Benutzeravatar
Florian.Reinartz
Beiträge: 106
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

Moin Zusammen,
gibt es eine Möglichkeit z.B: ein Switch-Item auf OFF zu setzen wenn ein Script.sh beendet ist?
Ich sucht seit ein paar Stunden im WWW aber werder aus den Antworten nicht schlau...
Danke und Gruß
Florian
Zuletzt geändert von Florian.Reinartz am 5. Jul 2022 16:51, insgesamt 2-mal geändert.
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
peter-pan
Beiträge: 2568
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Rückmeldung von Script wenn beendet

Beitrag von peter-pan »

...bestimmt(..vielleicht ;) ). Aber du solltest evtl. deine Frage etwas genauer detaillieren, also den Ablauf skizzieren. Einfach etwas mehr Hintergrundinformationen.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Benutzeravatar
Florian.Reinartz
Beiträge: 106
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

Ich habe ein Backup-Script welches seit Jahren super dienste leistet.
Nun wollte ich einen Switch konstruieren welcher das Backup auch manuell auslöst und nach Abschluss des Scriptes den Switch für den Start automatisch wieder auf OFF setzt.
So sieht das Script aus - backup.sh -

Code: Alles auswählen

#!/bin/bash

#Variablen
BACKUP_PFAD="/home/openhabian/openHAB_Backup"
BACKUP_ANZAHL="7"
BACKUP_NAME="Sicherung"
DIENSTE_START_STOP="service mysql"

#Stoppe Dienste vor Backup
#read "Dienste werden beendet..."
#${DIENSTE_START_STOP} stop

#Festplatte einbinden
read -t 2 -p "verbinde NAS-Laufwerk..."$'\n'
mount -t nfs -o soft 192.168.0.1:/volume1/RaspberryPi/openHAB /home/openhabian/openHAB_Backup

#Backup erstellen
read -t 2 -p "erstell Backup..."$'\n'
dd if=/dev/mmcblk0 of=${BACKUP_PFAD}/${BACKUP_NAME}-$(date +%Y%m%d).img bs=1MB

#Alte Sicherung löschen
read -t 2 -p "kopiere Backup auf NAS..."$'\n'
pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm; popd

#30 Sekunden warten vor unmount
read -t 15 -p "Kopiervorgang wird beendet..."$'\n'

#Festplatte auswerfen
read -t 2 -p "trenne NAS-Laufwerk..."$'\n'
umount /home/openhabian/openHAB_Backup

#Starte Dienste nach Backup
#read "Dienste werden gestartet..."
#${DIENSTE_START_STOP} start

#Fertig-Meldung
read -t 2 -p "fertig"$'\n'
Habe mir bisher mit einem Zeitglied geholfen aber das ist eben eher mit Pfusch zu vergleichen.
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rückmeldung von Script wenn beendet

Beitrag von udo1toni »

Wenn das Script über exec gestartet wird (run-Channel auf ON), sollte der Schalter automatisch von ON auf OFF springen, wenn das Script fertig ist. Das sollte komplett ohne Rule funktinoieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 106
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

...danke für die Info.
Werde ich morgen mal testen...
Ich melde mich dann wieder.
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
peter-pan
Beiträge: 2568
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Rückmeldung von Script wenn beendet

Beitrag von peter-pan »

...wusst ich's doch, dass Udo da eine Idee hat. Hatte das Exec-Binding in OH3 gar nicht mehr installiert.
Ich hab's dann testweise gleich ausprobiert und hat sofort geklappt. Super !!! Und gleich auch nochmal was über "bash - read" gelernt. Kannte ich bisher nicht.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Benutzeravatar
Florian.Reinartz
Beiträge: 106
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

...es ist echt irre wieviel Wissen in manchen Menschen gebündelt ist !!!
Vielleicht komme ich da auch mal hin ;-)

Kann mir jetzt vielleicht auch nochj jemand sagen warum meine exec-Things nicht ausgeführt werden.

Meine exec.things sa bisher soaus:

Code: Alles auswählen

Thing exec:command:Enterprise_shutdown "Exec Shutdown Enterprise"
    [
        command="sudo /etc/openhab/scripts/enterprise_shutdown.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]

Thing exec:command:DWS_Beelink_ShutDown "Exec Shutdown Beelink"
    [
        command="sudo /etc/openhab/scripts/DWS_Beelink_ShutDown.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]

Thing exec:command:DWS_HP_ShutDown "Exec Shutdown DWS-HP"
    [
        command="sudo /etc/openhab/scripts/DWS_HP_ShutDown.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]

Thing exec:command:FritzBox_reboot "Exec ReBoot Fritz!Box"
    [
        command="sudo /etc/openhab/scripts/fritz_reboot.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]

Thing exec:command:raspberry_model "Exec Raspberry-Modell"
    [
        command="/etc/openhab/scripts/raspberry_model.sh",
        interval=120,
        transform="REGEX((.*?))",
        timeout=2,
        autorun=true
    ]

Thing exec:command:openHAB_Backup "Exec openHAB Backup"
    [
        command="sudo /etc/openhab/scripts/backup.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]
und nach viel Recherchen sieht sie jetzt so aus:

Code: Alles auswählen

Thing exec:command:Enterprise_shutdown "Exec Shutdown Enterprise"
    [
        command="sudo -u openhab /etc/openhab/scripts/enterprise_shutdown.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]

Thing exec:command:DWS_Beelink_ShutDown "Exec Shutdown Beelink"
    [
        command="sudo -u openhab /etc/openhab/scripts/DWS_Beelink_ShutDown.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]

Thing exec:command:DWS_HP_ShutDown "Exec Shutdown DWS-HP"
    [
        command="sudo -u openhab /etc/openhab/scripts/DWS_HP_ShutDown.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]

Thing exec:command:FritzBox_reboot "Exec ReBoot Fritz!Box"
    [
        command="sudo -u openhab /etc/openhab/scripts/fritz_reboot.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]

Thing exec:command:raspberry_model "Exec Raspberry-Modell"
    [
        command="/etc/openhab/scripts/raspberry_model.sh",
        interval=120,
        transform="REGEX((.*?))",
        timeout=2,
        autorun=true
    ]

Thing exec:command:openHAB_Backup "Exec openHAB Backup"
    [
        command="sudo -u openhab /etc/openhab/scripts/backup.sh",
        interval=0,
        timeout=5,
        autorun=false
    ]
Ausgeführt wird aber einzig und allein das Thing "Exec Raspberry-Modell".
Darum auch kein sudo oder dergleichen...

Ich vermute es hat was micht den Rechten zu tun. In OH2.5 lief das alles ohne sudo und ohne sudo -u openhab.
Habe auch schon sudo innerhalb der scripte ausprobiert... Alles ohne erfolg.
Über ein Terminal kann ich die Scripte ausführen! Da bin ich dan mit dem usernamen "openhabian" angemeldet.

Hat einer von Euch einen Anhalt oder besser, einen Wink mir dem Gartenzaun?
Danker und Gruß
Florian
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Benutzeravatar
peter-pan
Beiträge: 2568
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: Rückmeldung von Script wenn beendet

Beitrag von peter-pan »

Ich zeig dir's am einfachsten mit meinem Test.


*.things :

Code: Alles auswählen

Thing exec:command:my_test  "Mein Test" @ "Buero"  
                  [command="/bin/bash /etc/openhab/scripts/test.sh", interval=120, timeout=30, transform="REGEX((.*?))"]
Der Schalter zum Starten:

*.items:

Code: Alles auswählen

Switch   Dummy_10   "Test Switch EXEC [%s] "   ["Switch"]  { channel="exec:command:my_test:run", stateDescription="pattern" [pattern="MAP(de.map):%s"], synonyms="Schalter"}
Und dann musst du das Ganze auch noch "validieren", wie bisher.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Benutzeravatar
udo1toni
Beiträge: 13948
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rückmeldung von Script wenn beendet

Beitrag von udo1toni »

Alle aufgerufenen Befehlszeilen exakt wie angegeben in der whitelist hinterlegt?

Verstanden, wie das Exec Binding funktioniert?
Es gibt je Thing eine feste Liste von Channels, welche man nicht selbst definieren kann: input, output, exit, run und lastexecution.
input wird verwendet, um dem Befehl einen variablen Eingangswert mitzugeben (Platzhalter muss im command mit angegeben werden).
output liefert im Gegenzug die Ausgabe des Befehls zurück.
exit gibt den Exit Code des Aufrufs zurück. Gewöhnlich sollte hier nach einem Aufruf immer 0 kommen, alles andere deutet erst mal auf einen Fehler im externen Script hin.
lastexecution ist ein Zeitstempel und gibt an, wann der Befehl zuletzt ausgeführt wurde.
run ist als einziger Channel bidirektional. Ein ON--Befehl startet den angegebenen Befehl, der Status ON verrät, dass der Befehl gerade ausgeführt wird, ein Status OFF bedeutet, dass die Ausführung beendet wurde.

Parameter (abgesehen von command):
autorun=true bedeutet, dass das Script automatisch gestartet wird, wenn auf input ein neuer Wert empfangen wird. Das ist praktisch, wenn man verschiedene Eingangswerte vom selben Script abarbeiten lassen will. Bei reinen Steuerungsbefehlen (reboot, shutdown usw.) wird man hingegen gewöhnlich gar keinen Parameter übergeben, also ist autorun=true auch sinnlos, stattdessen startet man den Befehl über den run-Channel.
interval sorgt für zyklisches Ausführen.
timeout sorgt dafür, dass nach x Sekunden das Script automatisch abgebrochen wird (das System geht dann von einem Fehler aus, man sollte timeout also mit Bedacht wählen).
transform schließlich wandelt den Output des Scripts, bevor er in den output Channel geschrieben wird, z.B. um aus "Temperatur: 27,3 °C" ein "27.3" zu machen. Allerdings ist output als Channel immer ein String Channel, das reicht also leider nicht, um den Wert anschließend auch in einem Number Item zu speichern. Das lässt sich dann aber über das Profile erreichen, wenn der Wert schon mal separiert wurde...

By the way: Das scripts-Verzeichnis unterhalb /etc/openhab/ bzw. /etc/openhab2/ dient nicht der Aufnahme der Scripte, die openHAB ausführen darf. Stattdesen müssen die Pfade immer absolut angegeben werden. Das scripts-Verzeichnis ist für openHAB Scripte gedacht und hat nichts mit der GNU/Linux-Shell zu tun.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Florian.Reinartz
Beiträge: 106
Registriert: 11. Apr 2022 08:47
Wohnort: bei Schwerin

Re: Rückmeldung von Script wenn beendet

Beitrag von Florian.Reinartz »

Moin Zusammen,
das Grundprinzip habe ich verstanden.
Die Ausführung im Bezug auf " input, output, exit, und lastexecution" haben mir sehr geholfen es noch besser zu verstehen.
Allerdings habe ich noch fragen zum Inhalt des Scriptes und den Rechten.
1.
Was bedeutet /bin/bash beim Aufruf bzw. #!/bin/bash innerhalb des Scripts.
2.
Aus dem Terminal (eingeloggt als openhabian) kann ich das Script mit dem Befehl wie er in der exec.things bzw. der exce.whitelist geschrieben steht starten.
Der String /etc/openhab/scripts/Backup.sh ist also korrekt.
Warum startet es nicht aus openhab?
Meine anderen Skripte laufen...
3.
lösche ich den Inhalt des Skriptes "backup.sh" und schreibe den Inhalt eines anderesn Skriptes rein z.B.:

Code: Alles auswählen

net rpc shutdown -I 192.168.0.3 -U WINUSER%WINKENNWORT -f -C openHAB -t 300
wird es ausgeführt.
Rückmeldung vom exec.thing => 0 und in Windows kommt die Meldung Donwnload vorgesehen.
Es muss also am Script liegen bzw. an den Rechten.
Wenn openHAB ein Skript ausführt, wer ist denn dann der ausführende user?
Kann ich openhab nicht befähigen die relevanten befehle auszuführen?
Beim Anlegen der backup.sh soll man nach dem erstellen der Datei die Datei "ausführbar" machen:

Code: Alles auswählen

sudo chmod 755 /etc/openhab/scripts/Backup.sh 
...liegt da vielleicht der Hund begraben?
aber chmod 777 hilft auch nicht...
Bei OH2.5 hat es bestens über Jahre funktioniert.
4.
beinhaltet backups.sh den mount Befehl mit sudo

Code: Alles auswählen

sudo mount -t nfs -o soft 192.168.0.1:/volume1/RaspberryPi/openHAB /home/openhabian/openHAB_Backup
kommt als Rückmeldung 1
schreibe ich den mount Befehl ohne sudo kommt als Rückmeldung 32.

Ich glaube ich muss die Überschrift dieses Theams ändern, sin ein bisschen von der ursprünglichen Frage abgekommen.

Danke und Gruß
Florian
openHAB 4.1.0 (64 bit) auf einem Raspberry Pi 5 Model B Rev 1.0 mit 8GB

Antworten