NEWS
(gelöst) Zeitdifferenz in Bindings errechnen
-
ich möchte die Zeitdifferenz zwischen der letzten Aktualisierung eines DP und der aktuellen Zeit mittels eines Bindings in VIS errechnen. Mein Ansatz ist wie folgt:
- als aktuelle Zeit entnehme ich dem DP
javascript.0.variables.dayTime.lc(der sollte ja minütlich aktualisiert werden) - DP ist ein HmIP-Fenstersensor
Im HTML-Widget errechne die Werte wie folgt:
{wert1:hm-rpc.0.001234567890123.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;(((parseInt(wert2)-parseInt(wert1))/1000)/3600)/24}d {wert3:hm-rpc.0.001234567890123.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;(((parseInt(wert4)-parseInt(wert3))/1000)/3600)%24}h {wert5:hm-rpc.0.001234567890123.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;(((parseInt(wert6)-parseInt(wert5))/1000)%3600)/60}mdie Ausgabe ist VIS ist jedoch:
NaNd NaNh NaNmhat da evt. jemanden einen Tipp zur Lösung?
BTW:
das WidgetLast change Timestampmit "Als Intervall" habe ich gesehen: da stört mich jedoch die ellenlange Ausgabevor 4 Stunden und 42 Minuten - als aktuelle Zeit entnehme ich dem DP
-
ich möchte die Zeitdifferenz zwischen der letzten Aktualisierung eines DP und der aktuellen Zeit mittels eines Bindings in VIS errechnen. Mein Ansatz ist wie folgt:
- als aktuelle Zeit entnehme ich dem DP
javascript.0.variables.dayTime.lc(der sollte ja minütlich aktualisiert werden) - DP ist ein HmIP-Fenstersensor
Im HTML-Widget errechne die Werte wie folgt:
{wert1:hm-rpc.0.001234567890123.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;(((parseInt(wert2)-parseInt(wert1))/1000)/3600)/24}d {wert3:hm-rpc.0.001234567890123.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;(((parseInt(wert4)-parseInt(wert3))/1000)/3600)%24}h {wert5:hm-rpc.0.001234567890123.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;(((parseInt(wert6)-parseInt(wert5))/1000)%3600)/60}mdie Ausgabe ist VIS ist jedoch:
NaNd NaNh NaNmhat da evt. jemanden einen Tipp zur Lösung?
BTW:
das WidgetLast change Timestampmit "Als Intervall" habe ich gesehen: da stört mich jedoch die ellenlange Ausgabevor 4 Stunden und 42 Minuten@ice987 "Direkt" teilen geht IMO nicht, da er dies fehl interpretiert. Versuche mal:
{wert1:hm-rpc.0.001234567890123.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;(((parseInt(wert2)-parseInt(wert1))/(1000))/(3600))/(24)}dBeim ".lc" müsste es auch direkt ohne "parseInt" funktionieren. Der wird gleich als Integer interpretiert.
- als aktuelle Zeit entnehme ich dem DP
-
@ice987 "Direkt" teilen geht IMO nicht, da er dies fehl interpretiert. Versuche mal:
{wert1:hm-rpc.0.001234567890123.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;(((parseInt(wert2)-parseInt(wert1))/(1000))/(3600))/(24)}dBeim ".lc" müsste es auch direkt ohne "parseInt" funktionieren. Der wird gleich als Integer interpretiert.
@sborg
Vielen Dank für deine Rückmeldung. Ich kriege auch die folgenden beiden Bindings nicht zum laufen. Als resultat erhalte ich immerNaNd NaNh NaNm:{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;(((wert2-wert1)/(1000))/(3600))/(24)}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;(((wert4-wert3)/(1000))/(3600))%(24)}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;(((wert6-wert5)/(1000))%(3600))/(60)}m{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;(((parseInt(wert2)-parseInt(wert1))/(1000))/(3600))/(24)}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;(((parseInt(wert4)-parseInt(wert3))/(1000))/(3600))%(24)}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;(((parseInt(wert6)-parseInt(wert5))/(1000))%(3600))/(60)}mgibt da evtl. einen weiteren Trick?
-
@sborg
Vielen Dank für deine Rückmeldung. Ich kriege auch die folgenden beiden Bindings nicht zum laufen. Als resultat erhalte ich immerNaNd NaNh NaNm:{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;(((wert2-wert1)/(1000))/(3600))/(24)}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;(((wert4-wert3)/(1000))/(3600))%(24)}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;(((wert6-wert5)/(1000))%(3600))/(60)}m{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;(((parseInt(wert2)-parseInt(wert1))/(1000))/(3600))/(24)}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;(((parseInt(wert4)-parseInt(wert3))/(1000))/(3600))%(24)}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;(((parseInt(wert6)-parseInt(wert5))/(1000))%(3600))/(60)}mgibt da evtl. einen weiteren Trick?
@ice987 Ich habe es eben mal ausprobiert, so funktioniert es. "parseInt" ist doch nötig, da er beim teilen sonst direkt float aus dem Ergebnis macht:
{v:0_userdata.0.xxx.lc;v1:0_userdata.0.yyy.lc; parseInt((v1-v)/(86400000))} Tage oder als Langversion: {v:0_userdata.0.xxx.lc;v1:0_userdata.0.yyy.lc; parseInt((v1-v)/(1000)/(3600)/(24))} Tage -
@ice987 Ich habe es eben mal ausprobiert, so funktioniert es. "parseInt" ist doch nötig, da er beim teilen sonst direkt float aus dem Ergebnis macht:
{v:0_userdata.0.xxx.lc;v1:0_userdata.0.yyy.lc; parseInt((v1-v)/(86400000))} Tage oder als Langversion: {v:0_userdata.0.xxx.lc;v1:0_userdata.0.yyy.lc; parseInt((v1-v)/(1000)/(3600)/(24))} Tage@sborg sagte in Zeitdifferenz in Bindings errechnen:
@ice987 Ich habe es eben mal ausprobiert, so funktioniert es. "parseInt" ist doch nötig, da er beim teilen sonst direkt float aus dem Ergebnis macht:
{v:0_userdata.0.xxx.lc;v1:0_userdata.0.yyy.lc; parseInt((v1-v)/(86400000))} Tageich krieg's nach wie vor nicht hin: auch dein genannter Vorschlag gibt (bei mir)
NaN TageMeine Untersuchung:
{v:hm-rpc.0.00123456789012.1.STATE.lc;typeof(v)}AUSGABE:
string{v1:javascript.0.variables.dayTime.lc;typeof(v1)}AUSGABE:
string{v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;typeof(v1-v)}AUSGABE:
number{v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;v1-v} {v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;(v1-v)} {v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;parseInt(v1-v)} {v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;parseInt(v1)-parseInt(v)}AUSGABE immer:
NaNirgendwie leuchtet mir das (noch) nicht ein...
-
@sborg sagte in Zeitdifferenz in Bindings errechnen:
@ice987 Ich habe es eben mal ausprobiert, so funktioniert es. "parseInt" ist doch nötig, da er beim teilen sonst direkt float aus dem Ergebnis macht:
{v:0_userdata.0.xxx.lc;v1:0_userdata.0.yyy.lc; parseInt((v1-v)/(86400000))} Tageich krieg's nach wie vor nicht hin: auch dein genannter Vorschlag gibt (bei mir)
NaN TageMeine Untersuchung:
{v:hm-rpc.0.00123456789012.1.STATE.lc;typeof(v)}AUSGABE:
string{v1:javascript.0.variables.dayTime.lc;typeof(v1)}AUSGABE:
string{v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;typeof(v1-v)}AUSGABE:
number{v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;v1-v} {v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;(v1-v)} {v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;parseInt(v1-v)} {v:hm-rpc.0.00123456789012.1.STATE.lc;v1:javascript.0.variables.dayTime.lc;parseInt(v1)-parseInt(v)}AUSGABE immer:
NaNirgendwie leuchtet mir das (noch) nicht ein...
@ice987 String ist "ok" (ja, eigentlich falsch), denn Bindings werden immer als "String" gelesen.
Nutzt du den aktuellen JS-Controller/JS?
Ich habe es jetzt noch anders probiert, sogar mit "dayTime", funktioniert...
Kann ich mir zwar nicht vorstellen, aber was ich nicht nachstellen kann ist HM, da ich keins habe/nutze. "dayTime" funktioniert, sonst alles richtig, deswegen nimm doch mal testweise einen anderen Nicht-HM-Datenpunkt....oder noch testweise (beides in der Syntax identische Unix-Timestamps?):
{hm-rpc.0.00123456789012.1.STATE.lc} {javascript.0.variables.dayTime.lc} -
@ice987 String ist "ok" (ja, eigentlich falsch), denn Bindings werden immer als "String" gelesen.
Nutzt du den aktuellen JS-Controller/JS?
Ich habe es jetzt noch anders probiert, sogar mit "dayTime", funktioniert...
Kann ich mir zwar nicht vorstellen, aber was ich nicht nachstellen kann ist HM, da ich keins habe/nutze. "dayTime" funktioniert, sonst alles richtig, deswegen nimm doch mal testweise einen anderen Nicht-HM-Datenpunkt....oder noch testweise (beides in der Syntax identische Unix-Timestamps?):
{hm-rpc.0.00123456789012.1.STATE.lc} {javascript.0.variables.dayTime.lc}wenn ich nur die Berechnung (alle in einem HTML-Widget) wie folgt laufen lasse bekomme ich
NaN{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert2-wert1))/(1000))/(3600))/(24))}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert4-wert3))/(1000))/(3600))%(24))}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert6-wert5))/(1000))%(3600))/(60))}mwenn ich jedoch die Berechnung inkl. der einzelnen DP's ohne Berechnung laufen lasse (alle in einem HTML-Widget), funktioniert es. Jedoch muss ich nun noch runden, da sonst die Kommastellen angezeigt werden:
{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert2-wert1))/(1000))/(3600))/(24))}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert4-wert3))/(1000))/(3600))%(24))}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert6-wert5))/(1000))%(3600))/(60))}m {javascript.0.variables.dayTime.lc} {hm-rpc.0.00123456789012.1.STATE.lc}das System ist aktuell:
vis: v1.3.4
Node.js: v12.21.0
NPM: 6.14.11
JS-Controller: 3.2.16 -
wenn ich nur die Berechnung (alle in einem HTML-Widget) wie folgt laufen lasse bekomme ich
NaN{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert2-wert1))/(1000))/(3600))/(24))}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert4-wert3))/(1000))/(3600))%(24))}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert6-wert5))/(1000))%(3600))/(60))}mwenn ich jedoch die Berechnung inkl. der einzelnen DP's ohne Berechnung laufen lasse (alle in einem HTML-Widget), funktioniert es. Jedoch muss ich nun noch runden, da sonst die Kommastellen angezeigt werden:
{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert2-wert1))/(1000))/(3600))/(24))}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert4-wert3))/(1000))/(3600))%(24))}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;Math.floor((((parseInt(wert6-wert5))/(1000))%(3600))/(60))}m {javascript.0.variables.dayTime.lc} {hm-rpc.0.00123456789012.1.STATE.lc}das System ist aktuell:
vis: v1.3.4
Node.js: v12.21.0
NPM: 6.14.11
JS-Controller: 3.2.16@ice987 sagte in Zeitdifferenz in Bindings errechnen:
edoch muss ich nun noch runden, da sonst die Kommastellen angezeigt werden:
Das liegt am "falschen" Klammern. Du subtrahierst zwei Ganzzahlen (dessen Ergebnis wieder eine Ganzzahl ist), das konvertierst du dann als Ganzzahl und teilst dann, was eine Fließkommazahl zum Ergebnis hat, die du nun ganzzahlig rundest.
Einfacher: parseInt((wert1-wert)/(1000)/(3600)/(24)) oder weiter reduziert: parseInt((wert1-wert)/(86400000))
Das "parseInt" über die gesamte Berechnung = Ergebnis als GanzzahlZum eigentlichen Problem: ich kann es nicht nachstellen, funktioniert wie erwartet/gewünscht. Einzig den Homematic-Teil kann ich mangels Hardware nicht nachstellen. Hast du es mal mit einem anderen Datenpunkt (nicht aus Homematic) probiert?
Aktuelles System ist es bei mir ebenfalls, bliebe ev. noch Linux (bei mir) oder Windows (darf aber auch keinen Unterschied machen)? -
@ice987 sagte in Zeitdifferenz in Bindings errechnen:
edoch muss ich nun noch runden, da sonst die Kommastellen angezeigt werden:
Das liegt am "falschen" Klammern. Du subtrahierst zwei Ganzzahlen (dessen Ergebnis wieder eine Ganzzahl ist), das konvertierst du dann als Ganzzahl und teilst dann, was eine Fließkommazahl zum Ergebnis hat, die du nun ganzzahlig rundest.
Einfacher: parseInt((wert1-wert)/(1000)/(3600)/(24)) oder weiter reduziert: parseInt((wert1-wert)/(86400000))
Das "parseInt" über die gesamte Berechnung = Ergebnis als GanzzahlZum eigentlichen Problem: ich kann es nicht nachstellen, funktioniert wie erwartet/gewünscht. Einzig den Homematic-Teil kann ich mangels Hardware nicht nachstellen. Hast du es mal mit einem anderen Datenpunkt (nicht aus Homematic) probiert?
Aktuelles System ist es bei mir ebenfalls, bliebe ev. noch Linux (bei mir) oder Windows (darf aber auch keinen Unterschied machen)?@sborg
so funktioniert es tatsächlich:{wert1:hm-rpc.0.00123456789012.1.STATE.lc;wert2:javascript.0.variables.dayTime.lc;parseInt((wert2-wert1)/(1000)/(3600)/(24))}d {wert3:hm-rpc.0.00123456789012.1.STATE.lc;wert4:javascript.0.variables.dayTime.lc;parseInt((wert4-wert3)/(1000)/(3600)%(24))}h {wert5:hm-rpc.0.00123456789012.1.STATE.lc;wert6:javascript.0.variables.dayTime.lc;parseInt((wert6-wert5)/(1000)%(3600)/(60))}mVielen Dank!
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden