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
Code: Alles auswählen
String OH_Uptime_HumanReadable "Online seit [%s]" <time>
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.