Na ja, Es reicht ja, die Millisekunden durch 1000 / 60 / 60 / 24 zu teilen, aber als Float oder Double zu speichern. Natürlich sind Tagesbruchteile nicht sonderlich intuitiv. Du kannst den Zahlenwert auch gemischt angeben, dazu muss das Item natürlich vom Typ String sein.
Ich habe so eine Funktion als JS für Minuten und Sekunden geschrieben und hier mal für Tage, Stunden, Minuten und Sekunden angepasst (ungetestet, müsste aber so hinkommen). Input wäre die Dauer in Millisekunden. Man könnte das Script in einer Datei /etc/openhab/transform/ms2dhms.js abspeichern (für "Millisekunden Zu Tage Stunden Minuten Sekunden")
Code: Alles auswählen
(function(seconds){
seconds = Math.floor(seconds / 1000);
var days = Math.floor(seconds / 60 / 60 / 24);
seconds = seconds % (60 * 60 * 24);
var hours = Math.floor(seconds / 60 / 60);
seconds = seconds % (60 * 60);
var minutes = Math.floor(seconds / 60);
seconds = seconds % 60;
var retval = days + "t";
if (hours < 10)
retval = retval + "0";
retval = retval + hours + "h";
if (minutes < 10)
retval = retval + "0";
retval = retval + minutes + "'";
if (seconds < 10)
retval = retval + "0";
retval = retval + seconds + "\"";
return retval;
})(input)
Der Eingangswert wird in eine Variable seconds übernommen (zu dem Zeitpunkt sind es allerdings noch Millisekunden).
Erste Amtshandlung ist also, aus den Millisekunden Sekunden zu machen. Math.floor() schneidet die Nachkommastellen ab.
Die Variable days wird mit dem Ganzzahlanteil der Sekunden durch die Anzahl Sekunden pro Tag belegt. Anschließend wird eine Modulo Operation ausgeführt, die nur den Rest übrig lässt.
Das gleiche passiert für den Stundenanteil und Minutenanteil. Übrig bleiben zum Schluss die Sekunden.
Danach wird der String zusammengesetzt, wobei das Trennzeichen t Tage von Stunden trennt, h trennt Stunden von Minuten, das ' trennt Minuten von Sekunden und " schließt die Sekunden ab. (analog zu den Winkelrgaden). Falls Stunden, Minuten und/oder Sekunden einstellig sind, wird jeweils eine führende 0 ergänzt.
Die Rule sähe dann so aus:
Code: Alles auswählen
rule "Beginn der Messung Tasmota 042"
when
Time cron "0 * * * * ?" or
Item Tasmota042_Dunstabzug_Messbeginn changed
then
var dtStart = new DateTime((Tasmota042_Dunstabzug_Messbeginn.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli)
val Diff = now.millis - dtStart.millis
val strDur = transform("JS","ms2dhms.js",Diff)
Tasmota042_Dunstabzug_Messdauer.postUpdate(strDur)
end
Es wird also lediglich die Anzahl Millisekunden berechnet und dieser Wert anschließend dem JavaScript Script übergeben. Als Rückgabewert wird der String zum Schluss in das String Item geschrieben.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet