Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Gelöst] Javascript Abfrage Letzte Änderung eines States?

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

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

    This topic has been deleted. Only users with topic management privileges can see it.
    • O
      Oli last edited by Oli

      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?

      Asgothian 1 Reply Last reply Reply Quote 0
      • Asgothian
        Asgothian Developer @Oli last edited by

        @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.

        O 1 Reply Last reply Reply Quote 0
        • O
          Oli @Asgothian last edited by Oli

          @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.

          Asgothian 1 Reply Last reply Reply Quote 0
          • Asgothian
            Asgothian Developer @Oli last edited by

            @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.

            O 1 Reply Last reply Reply Quote 0
            • O
              Oli @Asgothian last edited by Oli

              @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);
                  };
              });    
              
              Asgothian 1 Reply Last reply Reply Quote 0
              • Asgothian
                Asgothian Developer @Oli last edited by

                @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.

                O 1 Reply Last reply Reply Quote 0
                • O
                  Oli @Asgothian last edited by Oli

                  @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

                  Asgothian 1 Reply Last reply Reply Quote 0
                  • Asgothian
                    Asgothian Developer @Oli last edited by Asgothian

                    @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.

                    O 1 Reply Last reply Reply Quote 0
                    • O
                      Oli @Asgothian last edited by

                      @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.

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      657
                      Online

                      31.8k
                      Users

                      80.0k
                      Topics

                      1.3m
                      Posts

                      javascript
                      2
                      9
                      435
                      Loading More Posts
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes
                      Reply
                      • Reply as topic
                      Log in to reply
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                      The ioBroker Community 2014-2023
                      logo