Seite 1 von 1

openHAB uptime aus exec Rückgabe herausschnippeln

Verfasst: 29. Aug 2024 09:21
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?

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Verfasst: 29. Aug 2024 15:16
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 :)

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Verfasst: 29. Aug 2024 17:53
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 ;)

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Verfasst: 29. Aug 2024 20:45
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...

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Verfasst: 30. Aug 2024 10:43
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!

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Verfasst: 30. Aug 2024 14:24
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.

Re: openHAB uptime aus exec Rückgabe herausschnippeln

Verfasst: 30. Aug 2024 17:37
von nw378
Die Nadel im Heuhaufen... :ugeek: