Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Gelöst] Javascript Abfrage Letzte Änderung eines States?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    15
    1
    491

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    616

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.9k

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
9 Beiträge 2 Kommentatoren 769 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • O Online
    O Online
    Oli
    schrieb am zuletzt editiert von Oli
    #1

    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?

    Gruß
    Oliver

    AsgothianA 1 Antwort Letzte Antwort
    0
    • O 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?

      AsgothianA Offline
      AsgothianA Offline
      Asgothian
      Developer
      schrieb am zuletzt editiert von
      #2

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

      ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
      "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

      O 1 Antwort Letzte Antwort
      0
      • AsgothianA Asgothian

        @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 Online
        O Online
        Oli
        schrieb am zuletzt editiert von Oli
        #3

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

        Gruß
        Oliver

        AsgothianA 1 Antwort Letzte Antwort
        0
        • O 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.

          AsgothianA Offline
          AsgothianA Offline
          Asgothian
          Developer
          schrieb am zuletzt editiert von
          #4

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

          ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
          "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

          O 1 Antwort Letzte Antwort
          0
          • AsgothianA Asgothian

            @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 Online
            O Online
            Oli
            schrieb am zuletzt editiert von Oli
            #5

            @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);
                };
            });    
            

            Gruß
            Oliver

            AsgothianA 1 Antwort Letzte Antwort
            0
            • O 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);
                  };
              });    
              
              AsgothianA Offline
              AsgothianA Offline
              Asgothian
              Developer
              schrieb am zuletzt editiert von
              #6

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

              ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
              "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

              O 1 Antwort Letzte Antwort
              0
              • AsgothianA Asgothian

                @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 Online
                O Online
                Oli
                schrieb am zuletzt editiert von Oli
                #7

                @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

                Gruß
                Oliver

                AsgothianA 1 Antwort Letzte Antwort
                0
                • O 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

                  AsgothianA Offline
                  AsgothianA Offline
                  Asgothian
                  Developer
                  schrieb am zuletzt editiert von Asgothian
                  #8

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

                  ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
                  "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

                  O 1 Antwort Letzte Antwort
                  0
                  • AsgothianA 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 Online
                    O Online
                    Oli
                    schrieb am zuletzt editiert von
                    #9

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

                    Gruß
                    Oliver

                    1 Antwort Letzte Antwort
                    0
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    545

                    Online

                    32.6k

                    Benutzer

                    81.9k

                    Themen

                    1.3m

                    Beiträge
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Anmelden

                    • Du hast noch kein Konto? Registrieren

                    • Anmelden oder registrieren, um zu suchen
                    • Erster Beitrag
                      Letzter Beitrag
                    0
                    • Home
                    • Aktuell
                    • Tags
                    • Ungelesen 0
                    • Kategorien
                    • Unreplied
                    • Beliebt
                    • GitHub
                    • Docu
                    • Hilfe