Transformation Zeit > 1 Stunde falsch

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Galadriel13
Beiträge: 218
Registriert: 30. Dez 2019 20:29
Answers: 0

Transformation Zeit > 1 Stunde falsch

Beitrag von Galadriel13 »

Liebe Community,

ich hätte eine Frage an die Transformation-Spezialisten:

Ich habe das PLC Logo-Binding und stelle dabei schon für andere Bereiche (Ausschaltverzögerungen) beispielsweise eine Solldauer ein.
Dazu nutze ich folgendes Script:

Umrechnung_Min_Std.js

Code: Alles auswählen

/*
Javascript transform function to change the number
of minutes of CPU time from the System Info Binding
into a more readable format
eg: 2365 into '1 day 15 hours 25 minutes

The item in the items file is defined as follow:
Number LocalComputer_Cpu_SystemUptime "[JS(CPUTime.js):%s]"
and linked via PaperUI to the System uptime channel
of the System Info Thing
*/

(function(i) {
    if (i == 'NULL') { return i; }
    if (i == '-') { return 'Undefined'; }
    var val = parseInt(i); // The value sent by OH is a string so we parse into an integer
    var days = 0; // Initialise variables
    var hours = 0;
    var minutes = 0;
    if (val >= 1440) { // 1440 minutes in a days
        days = Math.floor(val / 1440); // Number of days
        val = val - (days * 1440); // Remove days from val
    }
    if (val >= 60) { // 60 minutes in an hour
       hours = Math.floor(val /60); // Number of hours
        val = val - (hours * 60); // Remove hours from val
    }
    minutes = Math.floor(val); // Number of minutes

    var stringDays = ''; // Initialse string variables
    var stringHours = '';
    var stringMinutes = '';
    if (days === 1) {
        stringDays = '1 day '; // Only 1 day so no 's'
    } else if (days > 1) {
        stringDays = days + ' days '; // More than 1 day so 's'
    } // If days = 0 then stringDays remains ''

    if (hours === 1) {
        stringHours = '1 hour '; // Only 1 hour so no 's'
    } else if (hours > 1) {
        stringHours = hours + ' hours '; // More than 1 hour so 's'
    } // If hours = 0 then stringHours remains ''

    if (minutes === 1) {
        stringMinutes = '1 minute'; // Only 1 minute so no 's'
    } else if (minutes > 1) {
        stringMinutes = minutes + ' minutes'; // More than 1 minute so 's'
    } // If minutes = 0 then stringMinutes remains ''

    var returnString =  stringDays + stringHours + stringMinutes
    return returnString.trim(); // Removes the extraneous space at the end

})(input)
Sobald ich über 60 Minuten gehe, zeigt mir openHAB Werte in Tagen und Stunden an, anstatt in Minuten:Stunden.
Der minimalste Wert soll dabei 1.800 (für 30 min) sein, der maximalste Wert 10.800 (für 3 Stunden).
Ich würde gerne in 30-Minuten-Schritten den Sollwert per Schieberegler anpassen.

Kann mir bitte jemand einen Tipp geben, was ich hier falsch mache?

Dankeschön.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Hausautomation zu 95% mit Siemens Logo! (5x 0BA8).
Gartenbewässerung, Rollosteuerung, Lichtsteuerung, etc.
Abfrage von Temperaturen, Helligkeit, Füllstand Zisterne Leistung Photovoltaik.

openHAB 4.0.4 mit folgenden Bindings:

- Bosch Indego Binding
- Tankerkönig Binding
- iCalendar Binding
- iCloud Binding
- Anwesenheit via iCloud
- ComfoAir Binding (Zehnder AirComfort A350)
- SolarEdge Binding (PV)
- OpenWeatherMap Binding
- DWD Pollenflug Binding
- DWD Unwetter Binding
- FritzBox TR064 Binding
- PLCLogo Binding
- WIFI LED Binding
- Luxtronikheatpump (Novelan-WP)
- BEOK Raumthermostate
- myenergi

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

Re: Transformation Zeit > 1 Stunde falsch

Beitrag von udo1toni »

Das ist aber nicht das, was der Code macht.
Der Code errechnet den Ganzzahlanteil des Wertes bei einer Division durch 1440 und zieht anschließend diesen Anteil (multipliziert mit 1440) ab. Das sind die Tage.
Aus dem Rest berechnet er den Ganzzahlanteil bei einer Division durch 60 und zieht anschließend diesen Anteil (multipliziert mit 60) ab. Das sind die Stunden.
Der Rest ist dann kleiner als 60 und entspricht dem Minutenanteil.

Eventuell kommt der Eingangswert in Sekunden? Dann müsstest Du die Zahlen entsprechend jeweils mit 60 multiplizieren, damit es passt.
val als Variablenname ist übrigens nicht gut, selbst wenn dies in JavaScript kein reserviertes Schlüsselwort ist.
Du kannst so oder so beim Errechnen eine Variable und eine Berechnung einsparen:

Code: Alles auswählen

    var minutes = parseInt(i); // The value sent by OH is a string representing minutes, so we parse into an integer
    var days    = Math.floor(minutes / 1440); // Number of full days
    minutes     = minutes - (days * 1440);    // Remove full days from minutes
    var hours   = Math.floor(minutes /60);    // Number of full hours
    minutes     = minutes - (hours * 60);     // Remove full hours from minutes
days und hours ist jeweils ein Integer Wert, da Math.floor() ein Integer liefert. Eine Fallunterscheidung kostet nur unnötig Zeit. Der Rest in der Variablen minutes entspricht nach Abzug der Tage und Stunden schon dem Minutenwert und muss auch nicht mehr gerundet werden :)

Die Berechnung der Texte ist natürlich Geschmacksache :) meine Version dazu:

Code: Alles auswählen

    var stringDays = days + ' day';
    if (days != 1) {
        stringDays = stringDays + 's';
    } 
    stringDays = stringDays + ' ';
    var stringHours = hours + ' hour';
    if (hours != 1) {
        stringHours = 	stringHours + 's';
    }
    stringHours = stringHours + ' ';
    var stringMinutes = minutes + ' minute';
    if (minutes != 1) {
        stringMinutes = stringMinutes + 's';
    } 
    var returnString =  (days > 0) ? stringDays : '' + (hours > 0) ? stringHours : '' + (minutes > 0) ? stringMinutes : ''
Möchte man auch die 0-Werte mit angezeigt bekommen, so lässt man einfach die ternären Operatoren weg, also als letzte Zeile

Code: Alles auswählen

    var returnString =  stringDays + stringHours + stringMinutes
Aber wie gesagt, Geschmacksache.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Galadriel13
Beiträge: 218
Registriert: 30. Dez 2019 20:29
Answers: 0

Re: Transformation Zeit > 1 Stunde falsch

Beitrag von Galadriel13 »

Vielen Dank udo1toni,

und sorry für die verspätete Rückmeldung.
Das ist es.
Damit funktioniert es, wie gewollt.

Schönen Abend.
Hausautomation zu 95% mit Siemens Logo! (5x 0BA8).
Gartenbewässerung, Rollosteuerung, Lichtsteuerung, etc.
Abfrage von Temperaturen, Helligkeit, Füllstand Zisterne Leistung Photovoltaik.

openHAB 4.0.4 mit folgenden Bindings:

- Bosch Indego Binding
- Tankerkönig Binding
- iCalendar Binding
- iCloud Binding
- Anwesenheit via iCloud
- ComfoAir Binding (Zehnder AirComfort A350)
- SolarEdge Binding (PV)
- OpenWeatherMap Binding
- DWD Pollenflug Binding
- DWD Unwetter Binding
- FritzBox TR064 Binding
- PLCLogo Binding
- WIFI LED Binding
- Luxtronikheatpump (Novelan-WP)
- BEOK Raumthermostate
- myenergi

Antworten