NEWS

[Gelöst] Javascript Abfrage Letzte Änderung eines States?


  • Hallo zusammen,
    ich versuche mit folgenden Codeschnipsel herauszufinden, wann sich der Inhalt eines States das letzte mal geändert hat.

    setState(praefix + "Thermostat.LastChange", getState("linkeddevices.0.Heizung.EG.Wohnzimmer.1.Solltemperatur").lc);
    

    Aber leider funktioniert das nicht so wie ich mir das vorstelle, ich verwende in meiner Vis das "basic Last Change Timestamp" Widget

    Wenn ich im Widget den State direkt einbinde ist das Ergebnis korrekt, verwende ich den Datenpunkt vom JavaScript erscheint ein falsches Ergebnis

    Wo habe ich den Fehler?

  • Developer

    @Oli
    Poste doch mal

    • ein paar mehr Skript Zeilen drum herum.
    • die Fehlermeldungen wenn es welche gibt
    • das "falsche" Ergebnis von dem du Sprichst.

    ansonsten ist das stochern im dunklen.

    A.


  • @Asgothian

    erstmal danke für deine Antwort.

    Hier das Ergebnis in der Vis, wenn ich den Datenpunkt des Gerätes direkt einbinde
    071ae873-edf0-48a4-9e8b-283607b6b7c6-image.png

    Im Widget ist folgender Datenpunkt unter Objekt ID eingebunden:

    linkeddevices.0.Heizung.EG.Wohnzimmer.1.Solltemperatur
    

    Hier das Ergebnis aus dem Javascript Datenpunkt
    1f083a0f-ee83-4e58-92dc-046f96e887b3-image.png

    Und hier der Code der es ausführen soll

    function temp() {   
        var raum = getState(hcpraefix + "vis.ChoosenRoom").val;    
        var heizung = getState(praefix + "Thermostat.Auswahl").val;
        setState(praefix + "Raumthermostat.Ist", 0);
        
        if (raum == "Bad") {
            var etage = "DG";
        } else {
            var etage = "EG";
        }
    
        let STATE_ID1 = "linkeddevices.0.Heizung." + etage + "." + raum + "." + heizung + ".Ist-Temperatur";  //linkeddevices.0.Heizung.EG.Wohnzimmer.1.HeatingMode
        if( existsState(STATE_ID1) ) {        
            var ist1 = getState("linkeddevices.0.Heizung." + etage + "." + raum + "." + heizung + ".Ist-Temperatur").val;
            var soll1 = getState("linkeddevices.0.Heizung." + etage + "." + raum + "." + heizung + ".Solltemperatur").val;
            var ventil1 = getState("linkeddevices.0.Heizung." + etage + "." + raum + "." + heizung + ".Ventilstellung").val;
            var modus1 = getState("linkeddevices.0.Heizung." + etage + "." + raum + "." + heizung + ".HeatingMode").val;        
    
            setState(praefix + "Thermostat.Ist", ist1);
            setState(praefix + "Thermostat.Soll", soll1);
            setState(praefix + "Thermostat.Ventil", ventil1);
            setState(praefix + "Thermostat.Modus", modus1);
            setState(praefix + "Thermostat.Vorhanden", "Ja");
            setState(praefix + "Thermostat.LastChange", getState("linkeddevices.0.Heizung." + etage + "." + raum + "." + heizung + ".Solltemperatur").lc);              
    
            if (modus1 == 3) {
                setState(praefix + "Thermostat.Boost", true);
            } else {
                setState(praefix + "Thermostat.Boost", false);
            };            
        
        } else {
            setState(praefix + "Thermostat.Vorhanden", "Nein");        
        };
    
        let STATE_ID2 = "linkeddevices.0.Heizung." + etage + "." + raum + ".4.Ist-Temperatur";  //linkeddevices.0.Heizung.EG.Wohnzimmer.1.HeatingMode
        if( existsState(STATE_ID2) ) {
            var ist1 = getState("linkeddevices.0.Heizung." + etage + "." + raum + ".4.Ist-Temperatur").val;
            setState(praefix + "Raumthermostat.Ist", ist1);
        }        
    };
    

    Fehlermeldungen gibt es keine.

  • Developer

    @Oli
    Kannst du bitte im Objektbaum direkt mal vergleichen:

    den dp Thermostat.LastChange
    den Eintrag bei linkeddevices.0.Heizung.EG.Wohnzimmer.1.Solltemperatur

    Beides bitte direkt aus dem Objektbaum auslesen.

    Zusätzlich: Wann genau wird die Function temp() aufgerufen ?

    A.


  • @Asgothian

    ich löse das Script aus wenn sich ein bestimmter Datenpunkt ändert, der durch ein Auswahlfeld getriggert wird (siehe Beispielvideo)
    Ich verstehe auch nicht, warum sich der Datenpunkt immer auch null ändert.

    Dialog.gif

    Durch diese Änderungen wird das Script ausgelöst

    // Ausführen bei Änderung Thermostatauswahl
    on({id:praefix + "Thermostat.Auswahl", change: 'any'}, temp);
    
    // Ausführen bei Raumwechsel
    on({id:hcpraefix + "vis.ChoosenRoom", change: 'any'}, temp); 
    
    // Ausführen bei Änderung Thermostatmodus
    on({id:praefix + "Thermostat.Modus", change: 'any'}, function (obj) {
        var modus = getState(praefix + "Thermostat.Modus").val;
        if (modus == 3) {
            setState(praefix + "Thermostat.Boost", true);
        } else {
            setState(praefix + "Thermostat.Boost", false);
        };
    });    
    
  • Developer

    @Oli

    Ok.. aber wie sehen die Werte im DP aus. Stimmt der im Datenpunkt ankommende Wert mit dem .lc wert überein ? Bisher prüfst Du das ja mit einem Widget und einer Anzeige.

    A.


  • @Asgothian

    Folgender Wert wir in den Datenpunkt geschrieben
    8c73a932-43f4-4b6b-a894-b06576c7fa4e-image.png

    18:28:05.202	info	javascript.0 (22120) script.js.Gewerke.Heizpläne: 1608094803558
    

    Die Werte sind identisch

  • Developer

    @Oli das bedeutet das das Widget

    • entweder noch zusätzliche Berechnungen veranstaltet bevor es den Wert anzeigt
    • ggf. entgegen dem Namen nicht den "last change" sondern den "timestamp" anzeigt.

    Die Tatsache das die Werte identisch sind deuten darauf hin das dein Skript korrekt läuft.

    A.

    Nachtrag: Mir ist gerade noch etwas aufgefallen - was heisst "wenn du statt des States den Datenpunkt vom JS einbindest" ? ggf, bekommst du nicht den Wert des eingetragenen DP's sondern dessen "last changed" oder "timestamp" angezeigt ?

    Ich habe keine Vis und kann das nicht analysieren.


  • @Asgothian

    ich habe es gelöst, manchmal sieht man den Walt vor lauter Bäumen nicht.

    Den "last change" berechne ich jetzt im Script und nehme einfach ein anderes Widget.

    Danke für deinen letzten Tipp, dass hat mir die Scheuklappen von den Augen genommen.

Suggested Topics

752
Online

38.4k
Users

43.9k
Topics

613.2k
Posts