OpenHab Uptime in der Sitemap ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: OpenHab Uptime in der Sitemap ?

Beitrag von udo1toni »

Das schreit aber nach Optimierung der Formatierung...

Code: Alles auswählen

rule "Startup Area"
when
    System started
then
    OH_Uptime.postUpdate(new DateTimeType())        // Set Start Up Time
end


rule "OH Readable Up Time "
when
    Item OH_Uptime changed or                       // System started ist hier nicht nötig!
    Time cron "0 0/30 * 1/1 * ? *"
then
    if (!(OH_Uptime.state instanceof DateTimeType)) return;

    var DateTime dateTime_OH_Uptime = new DateTime((OH_Uptime.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
    var diff                        = ((now.millis - dateTime_OH_Uptime.millis) / 1000).intValue
    var String tmp                  = null

    // http://stackoverflow.com/questions/13018550/time-since-ago-library-for-android-java
    val Number MINUTE = 60 
    val Number HOUR   = 60 * MINUTE
    val Number DAY    = 24 * HOUR

    switch(true) {
        case diff <      MINUTE : tmp = "gerade eben"
        case diff <  2 * MINUTE : tmp = "einer Minute"
        case diff < 50 * MINUTE : tmp = String::format("%.0f", diff / MINUTE) + " Minuten"
        case diff < 90 * MINUTE : tmp = "einer Stunde"
        case diff < 24 * HOUR   : tmp = String::format("%.0f", diff / HOUR) + " Stunden"
        case diff < 48 * HOUR   : tmp = "gestern"
        default                 : tmp = String::format("%.0f", diff / DAY) + " Tage"
    }

    OH_Uptime_HumanReadable.postUpdate(tmp)

    logInfo("OHUpTime", "-----------------------------------------------------------------------------")
    logInfo("OHUpTime", "Human Readable Time is " + OH_Uptime_HumanReadable.state)
    logInfo("OHUpTime", "-----------------------------------------------------------------------------")
end
Das Item dazu muss dann so aussehen:

Code: Alles auswählen

String OH_Uptime_HumanReadable "Online seit [%s]" <time>
Da wir uns nicht für die Millisekunden interessieren, können wir die schon gleich zu Beginn entfernen. Dadurch können wir auch die entsprechenden Konstanten vereinfachen.
switch-case kann auch als Ersatz für verkettete if-else-Anweisungen genutzt werden. Die erste zutreffende Bedingung wird genutzt, alle weiteren werden übersprungen (es ist also genau wie vorher wichtig, die Reihenfolge einzuhalten).
Nachkommastellen sind hier totaler Quatsch, ich will ja nicht wissen, dass openHAB seit 2.3 Tagen läuft, oder seit 33.33 Minuten (also 33 Minuten 20 Sekunden...)
Das Semikolon ist nur an einer Stelle in openHAB Rules wichtig, nämlich beim Befehl return;

Da bei System started das Item OH_Uptime verändert wird, triggert die Rule auch ohne System started. Evtl. kann man deshalb sogar auf die Prüfung auf DateTimeType verzichten.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: OpenHab Uptime in der Sitemap ?

Beitrag von PeterA »

:)
- OpenHab 2.4
#PWRUP

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

Re: OpenHab Uptime in der Sitemap ?

Beitrag von udo1toni »

Ich hab noch ein paar warme Worte dazu geschrieben ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: OpenHab Uptime in der Sitemap ?

Beitrag von PeterA »

Wie immer! Vielen Dank für die Erklärung des Codes!
Wieder etwas gelernt.

Gruß Peter

;) nur noch mit der RestAPI das Item "OH_Uptime" zum richtigen Systemstart zurück gedreht und schon passt es auch mit
der Ursprünglichen Rule ungefähr zusammen :)
- OpenHab 2.4
#PWRUP

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

Re: OpenHab Uptime in der Sitemap ?

Beitrag von udo1toni »

:D
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: OpenHab Uptime in der Sitemap ?

Beitrag von PeterA »

Hi Udo,

jetzt ist mir wiedermal etwas aufgefallen: :)
OpenHab (hier 2.4) triggert "System started" ja nicht nur nach einem Neustart sondern auch
wenn die betreffende Rule welche System started enthält und AUCH wenn Items Files nach einer Änderung neu geladen werden.

System-based Triggers
System started is triggered upon openHAB startup, after the rule file containing the System started trigger is modified, or after item(s) are modified in a . items file.


Was nun aber dazu führt das meine UptimeInit Rule dann jedes mal getriggert wird und somit der Zeitstempel verloren geht.
(Was ich über die RestAPI wieder hinbiegen kann)

Code: Alles auswählen

// https://openhabforum.de/viewtopic.php?p=24405#p24405 by udo1toni
rule "Startup Area"
when
    System started
then
    OH_Uptime.postUpdate(new DateTimeType())        // Set Start Up Time
end

Code: Alles auswählen

// https://openhabforum.de/viewtopic.php?p=24405#p24405 by udo1toni
rule "OH Readable Up Time "
when
    Item OH_Uptime changed or                        // System started ist hier nicht nötig!
    Time cron "0 0/30 * 1/1 * ? *"
then
    if (!(OH_Uptime.state instanceof DateTimeType)) return;

    var DateTime dateTime_OH_Uptime = new DateTime((OH_Uptime.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
    var diff                        = ((now.millis - dateTime_OH_Uptime.millis) / 1000).intValue
    var String tmp                  = null

    // http://stackoverflow.com/questions/13018550/time-since-ago-library-for-android-java
    val Number MINUTE = 60 
    val Number HOUR   = 60 * MINUTE
    val Number DAY    = 24 * HOUR

    switch(true) {
        case diff <      MINUTE : tmp = "gerade eben"
        case diff <  2 * MINUTE : tmp = "einer Minute"
        case diff < 50 * MINUTE : tmp = String::format("%.0f", diff / MINUTE) + " Minuten"
        case diff < 90 * MINUTE : tmp = "einer Stunde"
        case diff < 24 * HOUR   : tmp = String::format("%.0f", diff / HOUR) + " Stunden"
        case diff < 48 * HOUR   : tmp = "gestern"
        default                 : tmp = String::format("%.0f", diff / DAY) + " Tage"
    }

    OH_Uptime_HumanReadable.postUpdate(tmp)

    logInfo("OHUpTime", "-----------------------------------------------------------------------------")
    logInfo("OHUpTime", "Human Readable Time is " + OH_Uptime_HumanReadable.state)
    logInfo("OHUpTime", "-----------------------------------------------------------------------------")
end
Wie könnte ich denn das verhindern ?

Gruß Peter
- OpenHab 2.4
#PWRUP

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

Re: OpenHab Uptime in der Sitemap ?

Beitrag von udo1toni »

Jeden der Fälle kannst Du nicht abfangen, aber zumindest einen Teil, nämlich, indem Du zunächst testest, ob das Item schon einen gültigen Wert enthält:

Code: Alles auswählen

rule "Startup Area"
when
    System started
then
    if(!(OH_Uptime.state instanceof DateTimeType))
        OH_Uptime.postUpdate(new DateTimeType())        // Set Start Up Time
end
Das Item bekommt also nur dann einen neuen wert, wenn es noch kein gültiges Datum enthält. Ein Reset des Items wird damit aber nicht abgefangen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: OpenHab Uptime in der Sitemap ?

Beitrag von PeterA »

Hmm... Könne ich aber einen early return = Abbruch der Rule einbauen welcher z.b. nach 5min greift ?
Und somit dann später verhindert das das Item bei Änderungen am System einen Reset erhält ?
- OpenHab 2.4
#PWRUP

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

Re: OpenHab Uptime in der Sitemap ?

Beitrag von udo1toni »

Wenn die Rule nichts anderes macht, geht auch ein return;, aber es ist ja nun nicht möglich, innerhalb der Rule zuverlässig zu entscheiden, ob das System neu gestartet wurde.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: OpenHab Uptime in der Sitemap ?

Beitrag von PeterA »

Dann eben den Status des Items extern Speichern und via RestApi wieder setzen.

First World Problems [emoji3]
- OpenHab 2.4
#PWRUP

Antworten