openHAB uptime aus exec Rückgabe herausschnippeln

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

openHAB uptime aus exec Rückgabe herausschnippeln

Beitrag von nw378 »

Moin,

um in der Sitemap anzeigen zu können, wie lange OH läuft (nicht der Raspi; das ginge per Systeminfo Binding), habe ich ein exec-Thing:

Code: Alles auswählen

Thing exec:command:openhab_uptime  "openHAB Uptime"  [command="sudo /bin/systemctl status openhab.service", interval=3600, timeout=5] 
aus dem ich per Rule die Laufzeit herausschnippel:

Code: Alles auswählen

rule "openHAB Uptime"
when 
    Item BefehlOutputOpenHabUptime changed 
then
    var newValue = ""
    if (Sommerzeit.state == ON)
      newValue = newState.toString.split('CEST; ').get(1).split(' ago').get(0).trim 
    else
      newValue = newState.toString.split('CET; ').get(1).split(' ago').get(0).trim
    OpenHabUptime.postUpdate(newValue)
end
Jetzt frage ich mich, ob das eleganter geht, auch, um das log nicht voll zu müllen. Per Regex oder ähnlichem?
von udo1toni » 29. Aug 2024 20:45
nw378 hat geschrieben: 29. Aug 2024 17:53 Das Abschneiden bei "e" scheitert am Tuesday
Argh...
Dann andersrum...
Script:

Code: Alles auswählen

#! /bin/bash

   LINE=`systemctl status openhab.service | grep since`
  DATUM=`echo ${LINE} | cut -d' ' -f6`
UHRZEIT=`echo ${LINE} | cut -d' ' -f7`
     TZ=`echo ${LINE} | cut -d' ' -f8 | cut -d';' -f1`
     ST='+0100'
if [[ "$TZ" == "CEST" ]]; then
     ST='+0200';
fi
echo ${DATUM}T${UHRZEIT}${ST}
Dies spuckt den Zeitstempel im von openHAB erwarteten Format aus. Das heißt, Du kannst den Output Channel direkt mit einem DateTime Item verlinken (ohne weitere Rule)
Geht mit absoluter Sicherheit wesentlich eleganter, aber obwohl ich nun schon seit zwei Jahrzehnten mit der Bash rumhantiere, habe auch ich so meine Probleme mit der exakten Syntax... Der Code extrahiert Datum, Zeit und Zeitzone und schreibt diese Daten in anderer Form in die Ausgabe :)

Eine alternative wäre das direkte Übergeben der Zeitspanne in Sekunden (wichtig, sonst klappt es in openHAB nicht):

Code: Alles auswählen

#! /bin/bash
# Uptime in Sekunden ausgeben

   LINE=`systemctl status openhab.service | grep since`
  DATUM=`echo ${LINE} | cut -d' ' -f6`
UHRZEIT=`echo ${LINE} | cut -d' ' -f7`
     TZ=`echo ${LINE} | cut -d' ' -f8 | cut -d';' -f1`
     ST='+0100'
if [[ "$TZ" == "CEST" ]]; then
     ST='+0200';
fi

echo $(($(date  "+%s") - $(date -d "${DATUM}T${UHRZEIT}${ST}" "+%s")))
Dazu gehört dann ein spezielles Item:

Code: Alles auswählen

Number:Time OHUptimeSecs "Uptime" {channel="exec:command:uptimeoh:output",unit="s", stateDescription=""[pattern="%.2f d"]}
Die Anzeige ist natürlich etwas gewöhnungsbedürftig, da sie in Tagen und Bruchteilen von Tagen erfolgt. :) Alternativ kann man den Wert auch von einem Script in ein Proxy Item übernehmen lassen :) z.B.

Code: Alles auswählen

rule "uptime formatieren"
when
    Item OHUptimeSecs changed
then
    var int iInput = (newState as Number).intValue
    var iSecs      = iInput % 60
    var iMinutes   = (iInput / 60) % 60
    var iHours     = (iInput / 60 / 60) % 24
    var iDays      = (iInput / 60 / 60 / 24).intValue
    OHUptimeText.postUpdate(iDays.toString + " Tage "+iHours.toString+" Std. "+iMinutes.toString+" Min. "+iSecs.toString+" Sek.")
end
auch diese Formatierung könnte man direkt im Bash Script erledigen... so viele Möglichkeiten...
Gehe zur vollständigen Antwort
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Beitrag von udo1toni »

Mein Tipp wäre, ein Shell Script zu schreiben, z.B.

Code: Alles auswählen

#! /bin/bash
systemctl status openhab.service | grep since | cut -d';' -f2
liefert als Ausgabe dann z.B.

Code: Alles auswählen

1 week 3 days ago
Oder die Zeile

Code: Alles auswählen

systemctl status openhab.service | grep since | cut -d'e' -f4 | cut -d';' -f1
liefert

Code: Alles auswählen

 Sun 2024-08-18 20:29:51 CEST
Was als Input für ein DateTime Item funktionieren sollte. Du könntest mit diesem Inhalt also die sekundengenaue Laufzeit bestimmen, einfach indem Du diesen Wert vom aktuellen Zeitpunkt abziehst :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Beitrag von nw378 »

Der zweite Weg klingt charmant. Ich breche mir gerade die Ohren, den Rückgabewert "2024-08-27 19:51:08 CEST" in ein DateTime Item zu überführen.

Irgendwie mit

Code: Alles auswählen

import java.text.SimpleDateFormat 

rule "..:"
...
 val SimpleDateFormat dateFormatter = new SimpleDateFormat( "yyyy-MM-dd HH:mm" ) 

???

Achso, ich habe deinen Vorschlag leicht modifiziert, in

Code: Alles auswählen

systemctl status openhab.service | grep since | cut -d'c' -f4 | cut -d';' -f1
Das Abschneiden bei "e" scheitert am Tuesday ;)
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Beitrag von udo1toni »

nw378 hat geschrieben: 29. Aug 2024 17:53 Das Abschneiden bei "e" scheitert am Tuesday
Argh...
Dann andersrum...
Script:

Code: Alles auswählen

#! /bin/bash

   LINE=`systemctl status openhab.service | grep since`
  DATUM=`echo ${LINE} | cut -d' ' -f6`
UHRZEIT=`echo ${LINE} | cut -d' ' -f7`
     TZ=`echo ${LINE} | cut -d' ' -f8 | cut -d';' -f1`
     ST='+0100'
if [[ "$TZ" == "CEST" ]]; then
     ST='+0200';
fi
echo ${DATUM}T${UHRZEIT}${ST}
Dies spuckt den Zeitstempel im von openHAB erwarteten Format aus. Das heißt, Du kannst den Output Channel direkt mit einem DateTime Item verlinken (ohne weitere Rule)
Geht mit absoluter Sicherheit wesentlich eleganter, aber obwohl ich nun schon seit zwei Jahrzehnten mit der Bash rumhantiere, habe auch ich so meine Probleme mit der exakten Syntax... Der Code extrahiert Datum, Zeit und Zeitzone und schreibt diese Daten in anderer Form in die Ausgabe :)

Eine alternative wäre das direkte Übergeben der Zeitspanne in Sekunden (wichtig, sonst klappt es in openHAB nicht):

Code: Alles auswählen

#! /bin/bash
# Uptime in Sekunden ausgeben

   LINE=`systemctl status openhab.service | grep since`
  DATUM=`echo ${LINE} | cut -d' ' -f6`
UHRZEIT=`echo ${LINE} | cut -d' ' -f7`
     TZ=`echo ${LINE} | cut -d' ' -f8 | cut -d';' -f1`
     ST='+0100'
if [[ "$TZ" == "CEST" ]]; then
     ST='+0200';
fi

echo $(($(date  "+%s") - $(date -d "${DATUM}T${UHRZEIT}${ST}" "+%s")))
Dazu gehört dann ein spezielles Item:

Code: Alles auswählen

Number:Time OHUptimeSecs "Uptime" {channel="exec:command:uptimeoh:output",unit="s", stateDescription=""[pattern="%.2f d"]}
Die Anzeige ist natürlich etwas gewöhnungsbedürftig, da sie in Tagen und Bruchteilen von Tagen erfolgt. :) Alternativ kann man den Wert auch von einem Script in ein Proxy Item übernehmen lassen :) z.B.

Code: Alles auswählen

rule "uptime formatieren"
when
    Item OHUptimeSecs changed
then
    var int iInput = (newState as Number).intValue
    var iSecs      = iInput % 60
    var iMinutes   = (iInput / 60) % 60
    var iHours     = (iInput / 60 / 60) % 24
    var iDays      = (iInput / 60 / 60 / 24).intValue
    OHUptimeText.postUpdate(iDays.toString + " Tage "+iHours.toString+" Std. "+iMinutes.toString+" Min. "+iSecs.toString+" Sek.")
end
auch diese Formatierung könnte man direkt im Bash Script erledigen... so viele Möglichkeiten...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Beitrag von nw378 »

Udo, das ist super! Und zaubert mir ein Grinsen ins Gesicht. :D :D :D

Und ich habe nochwas dazugelernt: es gibt einen Unterschied zwischen SH und BASH. Ich hatte den Befehl zuerst mit "sh oh_uptime.sh" aufgerufen, und den Fehler
oh_uptime.sh: 8: [[: not found
erhalten. Mit bash klappt's.

Einzige Anpassung aufgrund meines inneren Monks: :mrgreen: :mrgreen: :mrgreen:

Code: Alles auswählen

    var zeit   = iDays.toString + " Tage "
    switch iDays.intValue {
     case 0 : zeit = ""
     case 1 : zeit = "1 Tag " }
    zeit += iHours.toString + " Std. " + iMinutes.toString + " Min. "
    OHUptimeText.postUpdate(zeit) 
Ein böhmisches Dorf für mich ist aber der cut-Befehl. Deine Bash-Datei tut was sie soll, rufe ich den Befehl über die Konsole auf, ist die Ausgabe an ganz anderer Stelle "geschnippelt".

Also,

Code: Alles auswählen

openhabian@openhabian:/home $ sudo systemctl status openhab.service | grep since | cut -d' ' -f6
Active:

Hinterfrage ich einfach nicht, läuft ja :lol:

Ich habe das gleich mal für einen ähnlichen Fall adaptiert; ich lasse mir auch die openHAB Version in der Sitemap anzeigen.
Bisher habe ich das recht umständlich mit folgender Rule gemacht:

Code: Alles auswählen

var newValue = BefehlOutputOpenHabVersion.state.toString.split('Version: ').get(1).split('(Build)').get(0).replace("(","").trim
das Thing dazu war:

Code: Alles auswählen

Thing exec:command:openhab_version "openHAB Version" [command="openhab-cli info", interval=86400, timeout=5] 
Nach deinem Ansatz viel smarter als BASH:

Code: Alles auswählen

#! /bin/bash

  LINE=`openhab-cli info | grep Version`
  VERSION=`echo ${LINE} | cut -d' ' -f2`
  echo ${VERSION}
Danke!
Zuletzt geändert von nw378 am 31. Aug 2024 10:24, insgesamt 3-mal geändert.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Beitrag von udo1toni »

nw378 hat geschrieben: 30. Aug 2024 10:43 Ein böhmisches Dorf für mich ist aber der cut-Befehl. Deine Bash-Datei tut was sie soll, rufe ich den Befehl über die Konsole auf, ist die Ausgabe an ganz anderer Stelle "geschnippelt".
Ja, das liegt an der Ausgabe von systemctl status, wenn Du Dir das Ergebnis des grep Befehls anschaust, wirst Du feststellen, dass die Zeile mit mehreren Leerzeichen beginnt. Interessanterweise werden die beim Umweg über die Variablen dann weggetrimmt, weshalb das cut sauber auf die entsprechenden Stellen verweist. Ohne Umweg über die Variable musst Du 5(?) dazu addieren, um auf den richtigen Bereich in der Zeile zu kommen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Beitrag von nw378 »

Die Nadel im Heuhaufen... :ugeek:
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Antworten