Seite 1 von 3

Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 27. Jan 2020 20:11
von N1d45
Huhu.

Der liebe Shelly liefert seine Betriebszeit in Sekunden an ein Item. Diese Zahl wird natürlich sehr groß mit der Zeit und sieht auf der Sitemap unanschaulich und unüberschaubar aus.

Was für möglichkeiten hat man, um sich das in Tag : Stunden : Minuten : Sekunden anzeigen zu lassen?

Kann man das direkt in der Sitemap irgendwie formatieren, ähnlich wie das nach Komma abrunden?

Oder muß man da sogar eine Rule erstellen?

Wenn ja, muss man dann für jeden Shelly eine Rule erstellen? Oder kann man da irgendwie eine allgemein gültige Rule erstellen?

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 28. Jan 2020 00:30
von udo1toni
Es bietet sich an, das mit einer Transformation zu machen, in diesem Fall Java Script.

Das Script kommt ins Verzeichnis transform, unter dem Namen sectohms.js

Code: Alles auswählen

(function(seconds){
    var retval = "";
    var hours = Math.floor(seconds / 3600)
    var minutes = Math.floor(seconds / 60)
    seconds = seconds % 60
    retval = retval + hours + ":";
    if (minutes < 10)
        retval = retval + "0";
    retval = retval + minutes + ":";
    if (seconds < 10)
        retval = retval + "0";
    retval = retval + seconds;
    return retval;
})(input)
Im Label der Items setzt Du dann jeweils das Script zur Transformation:

Code: Alles auswählen

Number myNumber "Betriebsdauer [JS(sectohms.js):%d]"
Natürlich muss die JS-Transformation installiert sein.
Die Transformation kann auch entsprechend erweitert werden, um auch die Anzahl Tage auszugeben, oder gar nur dann Tage, Stunden oder Minuten anzuzeigen, wenn die jeweiligen Grenzen überschritten werden.

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 30. Jan 2020 21:10
von N1d45
Danke, bin erst heute dazu gekommen.

Es zeigt mir auf der Sitemap aber "104:6252:29" an bei 375270 Sekunden. Da scheint noch etwas nicht ganz zu stimmen?

Mal etwas damit ich es besser verstehe. Math.floor rundet ab?

Ich vermute die Stunden werden von den Minuten nicht abgezogen. Mal sehen ob ich da etwas selber zusammen frikeln kann.

--------------------------------------------------------------------------------
Edit 1:
Ich habe noch

Code: Alles auswählen

 minutes = minutes % 60 
hinzugefügt. Damit funktioniert es.

Damit ich es richtig verstehe. gibt den Rest von geteilt durch 60 an? Oder wie genau kann man das verstehen? Gibt es irgendwo eine deutsche Doku zu diesen Befehlen?

Und Danke :)

--------------------------------------------------------------------------------
Edit 2:
So, nun habe ich es mal Final für mich angepasst.

Code: Alles auswählen

(function(seconds){
    var retval  = "";
    var days    = Math.floor(seconds / 3600 / 24)
    var hours   = Math.floor(seconds / 3600)
    var minutes = Math.floor(seconds / 60)
    hours       = hours % 24
    minutes     = minutes % 60
    seconds     = seconds % 60
    retval      = retval + days + "d " + hours + "h ";
    if (minutes < 10)
        retval      = retval + "0";
    retval      = retval + minutes + "m ";
    if (seconds < 10)
        retval      = retval + "0";
    retval      = retval + seconds + "s";
    return retval;
})(input)
Auf der Sitemap kommt dann folgendes herraus

Code: Alles auswählen

Betriebsdauer    4d 8h 31m 36s

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 31. Jan 2020 00:48
von udo1toni
Ach, Mist, ja, ich hatte die falsche Datei kopiert und war dann zu faul, noch mal nachzuschauen...

% ist der Modulo Operator. Das ist der Rest einer Division. (also z.B. 5 % 3 ergibt 2)

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 29. Mai 2020 01:20
von maseb
Hallo,

auf meiner sitemap wird für die Batterie Time to go sekunden angezeigt .
Failed transforming the state '83279.9921875'

Wie kann ich diese in Tage und stunden Tage , h
umformatieren.

Was muss ich bei dem Skript ändern.
Wie kann ich das Skript in den items ansprechen.

%d wars ja nicht.

Gruß
Rudi

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 29. Mai 2020 12:29
von udo1toni
Das ist ein Float Wert... Aber ob das tatsächlich Sekunden sein sollen?

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 29. Mai 2020 23:55
von maseb
Hallo,

ich habe die Funktion folgendermassen in .items eingesetzt

Number PV_battery_time_to_go "Battery TimeToGo [JS(sectohms.js):%d]" {mqtt="<[ccgx:N/b827eb74cb1f/system/0/Dc/Battery/TimeToGo:state:JSONPATH($.value)]"}

Die Fehlermeldung lautet
2020-05-29 23:49:43.695 [WARN ] [rest.core.item.EnrichedItemDTOMapper] - Failed transforming the state '103139.9921875' on item 'PV_battery_time_to_go' with pattern 'JS(sectohms.js):%d': Cannot format state '103139.9921875' to format '%d'

Wie muss die Funktion aufgerufen werden?

Gruß
Rudi

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 30. Mai 2020 08:45
von EmptySoft
ich speichere die Zeit als Sekunden (leichter zum bearbeiten in Rules) und mache den Transform in der Sitemap

Code: Alles auswählen

Text item=Laufzeit_Today label="Laufzeit ist [JS(secToHM.js):%s]"
Variable und Scriptname an Deine anpassen

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 15. Dez 2020 10:05
von tanzehn
N1d45 hat geschrieben: 30. Jan 2020 21:10 Danke, bin erst heute dazu gekommen.

Es zeigt mir auf der Sitemap aber "104:6252:29" an bei 375270 Sekunden. Da scheint noch etwas nicht ganz zu stimmen?

Mal etwas damit ich es besser verstehe. Math.floor rundet ab?

Ich vermute die Stunden werden von den Minuten nicht abgezogen. Mal sehen ob ich da etwas selber zusammen frikeln kann.

--------------------------------------------------------------------------------
Edit 1:
Ich habe noch

Code: Alles auswählen

 minutes = minutes % 60 
hinzugefügt. Damit funktioniert es.

Damit ich es richtig verstehe. gibt den Rest von geteilt durch 60 an? Oder wie genau kann man das verstehen? Gibt es irgendwo eine deutsche Doku zu diesen Befehlen?

Und Danke :)

--------------------------------------------------------------------------------
Edit 2:
So, nun habe ich es mal Final für mich angepasst.

Code: Alles auswählen

(function(seconds){
    var retval  = "";
    var days    = Math.floor(seconds / 86400 / 24)
    var hours   = Math.floor(seconds / 3600)
    var minutes = Math.floor(seconds / 60)
    hours       = hours % 24
    minutes     = minutes % 60
    seconds     = seconds % 60
    retval      = retval + days + "d " + hours + "h ";
    if (minutes < 10)
        retval      = retval + "0";
    retval      = retval + minutes + "m ";
    if (seconds < 10)
        retval      = retval + "0";
    retval      = retval + seconds + "s";
    return retval;
})(input)
Auf der Sitemap kommt dann folgendes herraus

Code: Alles auswählen

Betriebsdauer    4d 8h 31m 36s

Re: Sitemap Sekunden als Tag:stunden:minuten:sekunden anzeigen lassen.

Verfasst: 15. Dez 2020 10:07
von tanzehn
N1d45 hat geschrieben: 30. Jan 2020 21:10 Danke, bin erst heute dazu gekommen.

Es zeigt mir auf der Sitemap aber "104:6252:29" an bei 375270 Sekunden. Da scheint noch etwas nicht ganz zu stimmen?

Mal etwas damit ich es besser verstehe. Math.floor rundet ab?

Ich vermute die Stunden werden von den Minuten nicht abgezogen. Mal sehen ob ich da etwas selber zusammen frikeln kann.

--------------------------------------------------------------------------------
Edit 1:
Ich habe noch

Code: Alles auswählen

 minutes = minutes % 60 
hinzugefügt. Damit funktioniert es.

Damit ich es richtig verstehe. gibt den Rest von geteilt durch 60 an? Oder wie genau kann man das verstehen? Gibt es irgendwo eine deutsche Doku zu diesen Befehlen?

Und Danke :)

--------------------------------------------------------------------------------
Edit 2:
So, nun habe ich es mal Final für mich angepasst.

Code: Alles auswählen

(function(seconds){
    var retval  = "";
    var days    = Math.floor(seconds / 86400 / 24)   [b]<---- ein Tag hat 86400 sekunden[/b]
    var hours   = Math.floor(seconds / 3600)
    var minutes = Math.floor(seconds / 60)
    hours       = hours % 24
    minutes     = minutes % 60
    seconds     = seconds % 60
    retval      = retval + days + "d " + hours + "h ";
    if (minutes < 10)
        retval      = retval + "0";
    retval      = retval + minutes + "m ";
    if (seconds < 10)
        retval      = retval + "0";
    retval      = retval + seconds + "s";
    return retval;
})(input)
Auf der Sitemap kommt dann folgendes herraus

Code: Alles auswählen

Betriebsdauer    4d 8h 31m 36s