Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. setState findet manuell erzeugtes Objekt nicht

NEWS

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    11
    2
    214

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    7.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.7k

setState findet manuell erzeugtes Objekt nicht

setState findet manuell erzeugtes Objekt nicht

Scheduled Pinned Locked Moved JavaScript
javascript
19 Posts 3 Posters 960 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Shai0Hulud

    @paul53 said in setState findet manuell erzeugtes Objekt nicht:

    0_userdata.0.Zuhause.ConsPerDay

    Danke! Das funktioniert tatsächlich. Verwirrt mich aber als JS-Noob etwas. Andere Werte übergebe ich doch auch mit z.B.

    setState(idSetStromverbrauch, nStrBez, true) statt setState('0_userdata.0.Zuhause.StromverbrauchGZ', nStrBez, true)

    CodierknechtC Offline
    CodierknechtC Offline
    Codierknecht
    Developer Most Active
    wrote on last edited by
    #8

    @shai0hulud
    Die Frage ist: Mit welchem Wert für "idSetPrefix" wird die Funktion aufgerufen?

    function calculateAverageConsumption(startDateString, consTarget, idSetPrefix)
    

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

    Proxmox 8.2.4 LXC|8 GB|Core i7-6700
    HmIP|ZigBee|Tasmota|Unifi + dies & das
    Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

    S 1 Reply Last reply
    0
    • S Shai0Hulud

      @paul53 said in setState findet manuell erzeugtes Objekt nicht:

      0_userdata.0.Zuhause.ConsPerDay

      Danke! Das funktioniert tatsächlich. Verwirrt mich aber als JS-Noob etwas. Andere Werte übergebe ich doch auch mit z.B.

      setState(idSetStromverbrauch, nStrBez, true) statt setState('0_userdata.0.Zuhause.StromverbrauchGZ', nStrBez, true)

      paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by paul53
      #9

      @shai0hulud sagte: Verwirrt mich aber als JS-Noob etwas.

      Du hast uns den Aufruf der Funktion calculateAverageConsumption(startDateString, consTarget, idSetPrefix) nicht gezeigt. Man kann beim Aufruf auch eine Variable übergeben, die allerdings den richtigen String enthalten muss.

      @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

      mit ChatGPT

      ist kein guter JS-Programmierer.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      S 2 Replies Last reply
      0
      • CodierknechtC Codierknecht

        @shai0hulud
        Die Frage ist: Mit welchem Wert für "idSetPrefix" wird die Funktion aufgerufen?

        function calculateAverageConsumption(startDateString, consTarget, idSetPrefix)
        
        S Offline
        S Offline
        Shai0Hulud
        wrote on last edited by
        #10

        @codierknecht

        Bisher mit 'idSetConsPerDay'

        nun mit '0_userdata.0.Zuhause.ConsPerDay'

        Alle Warnungen weg, Werte im Dashboard werden wieder aktualisiert.

        CodierknechtC 1 Reply Last reply
        0
        • paul53P paul53

          @shai0hulud sagte: Verwirrt mich aber als JS-Noob etwas.

          Du hast uns den Aufruf der Funktion calculateAverageConsumption(startDateString, consTarget, idSetPrefix) nicht gezeigt. Man kann beim Aufruf auch eine Variable übergeben, die allerdings den richtigen String enthalten muss.

          @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

          mit ChatGPT

          ist kein guter JS-Programmierer.

          S Offline
          S Offline
          Shai0Hulud
          wrote on last edited by
          #11

          @paul53

          Doch, ich hatte es erwähnt:

          "Aufgerufen wiurd die Funktion wie folgt:

                  calculateAverageConsumption("2023/01/01", 6321.6, 'idSetConsPerDay');
          
          

          "

          Nun nutze ich

                  calculateAverageConsumption("2023/01/01", 6321.6, '0_userdata.0.Zuhause.ConsPerDay');
          
          
          1 Reply Last reply
          0
          • S Shai0Hulud

            @codierknecht

            Bisher mit 'idSetConsPerDay'

            nun mit '0_userdata.0.Zuhause.ConsPerDay'

            Alle Warnungen weg, Werte im Dashboard werden wieder aktualisiert.

            CodierknechtC Offline
            CodierknechtC Offline
            Codierknecht
            Developer Most Active
            wrote on last edited by Codierknecht
            #12

            @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

            Bisher mit 'idSetConsPerDay'

            In Hochkommata? Dann wird nur dieser String übergeben.
            Du willst ja nicht den Namen dieser Variablen übergeben, sondern den Inhalt derselben.

            Also so:

                    calculateAverageConsumption("2023/01/01", 6321.6, idSetConsPerDay);
            

            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

            Proxmox 8.2.4 LXC|8 GB|Core i7-6700
            HmIP|ZigBee|Tasmota|Unifi + dies & das
            Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

            S 1 Reply Last reply
            0
            • paul53P paul53

              @shai0hulud sagte: Verwirrt mich aber als JS-Noob etwas.

              Du hast uns den Aufruf der Funktion calculateAverageConsumption(startDateString, consTarget, idSetPrefix) nicht gezeigt. Man kann beim Aufruf auch eine Variable übergeben, die allerdings den richtigen String enthalten muss.

              @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

              mit ChatGPT

              ist kein guter JS-Programmierer.

              S Offline
              S Offline
              Shai0Hulud
              wrote on last edited by
              #13

              @paul53 said in setState findet manuell erzeugtes Objekt nicht:

              @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

              mit ChatGPT

              ist kein guter JS-Programmierer.

              Besser als ich 😏

              1 Reply Last reply
              0
              • CodierknechtC Codierknecht

                @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

                Bisher mit 'idSetConsPerDay'

                In Hochkommata? Dann wird nur dieser String übergeben.
                Du willst ja nicht den Namen dieser Variablen übergeben, sondern den Inhalt derselben.

                Also so:

                        calculateAverageConsumption("2023/01/01", 6321.6, idSetConsPerDay);
                
                S Offline
                S Offline
                Shai0Hulud
                wrote on last edited by
                #14

                @codierknecht

                idSetConsPerDay ist keine Variable, sondern nur das Prefix, welches über die Funktion mit dem jeweiligen Datum ergänzt wird und zur korrekten Variable zusammengebastelt wird, also z.B. idSetConsPerDay230101.

                calculateAverageConsumption("2023/01/01", 6321.6, idSetConsPerDay);
                

                gibt direkt einen Fehler "Cannot find name". Kann er ja auch nicht finden.

                CodierknechtC 1 Reply Last reply
                0
                • S Shai0Hulud

                  @codierknecht

                  idSetConsPerDay ist keine Variable, sondern nur das Prefix, welches über die Funktion mit dem jeweiligen Datum ergänzt wird und zur korrekten Variable zusammengebastelt wird, also z.B. idSetConsPerDay230101.

                  calculateAverageConsumption("2023/01/01", 6321.6, idSetConsPerDay);
                  

                  gibt direkt einen Fehler "Cannot find name". Kann er ja auch nicht finden.

                  CodierknechtC Offline
                  CodierknechtC Offline
                  Codierknecht
                  Developer Most Active
                  wrote on last edited by Codierknecht
                  #15

                  @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

                  idSetConsPerDay ist keine Variable

                  Sehe ich in Deinem Eingangspost aber anders:

                  var idSetConsPerDay230101 = '0_userdata.0.Zuhause.ConsPerDay230101'; 
                  

                  Natürlich ist das etwas anderes.
                  Wobei da auch besser const stehen sollte.

                  Wozu wird das zu Beginn mit "230101" definiert?
                  Alles etwas schwierig ohne den Gesamtüberblick

                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                  Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                  HmIP|ZigBee|Tasmota|Unifi + dies & das
                  Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                  S 1 Reply Last reply
                  0
                  • CodierknechtC Codierknecht

                    @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

                    idSetConsPerDay ist keine Variable

                    Sehe ich in Deinem Eingangspost aber anders:

                    var idSetConsPerDay230101 = '0_userdata.0.Zuhause.ConsPerDay230101'; 
                    

                    Natürlich ist das etwas anderes.
                    Wobei da auch besser const stehen sollte.

                    Wozu wird das zu Beginn mit "230101" definiert?
                    Alles etwas schwierig ohne den Gesamtüberblick

                    S Offline
                    S Offline
                    Shai0Hulud
                    wrote on last edited by
                    #16

                    @codierknecht Sorry, nicht eindeutig genug ausgeführt. Der 01.01.23 war nur beispielhaft gezeigt, es gibt mehrere Daten, für die der tägliche Durchschnittsverbrauch angezeigt wird:

                    bd215b55-2cad-4c37-be95-0352377630df-image.png

                    Gesamtes Funktionsteil sieht so aus (wird alle 60minuten aktuialisiert):

                    function calculateAverageConsumption(startDateString, consPast, idSetPrefix) {
                        const startDate = new Date(startDateString);
                        const year = startDate.getFullYear().toString().slice(-2); // Die letzten beiden Stellen des Jahres
                        const month = ('0' + (startDate.getMonth() + 1)).slice(-2); // Monat mit führender Null, um zweistellig zu sein
                        const day = ('0' + startDate.getDate()).slice(-2); // Tag mit führender Null, um zweistellig zu sein
                    
                        const fullID = `${idSetPrefix}${year}${month}${day}`;
                    //    console.log(fullID); // Debugging-Anweisung hinzufügen
                    
                        const currentDate = new Date().valueOf();
                        const daysDifference = Math.round((currentDate - startDate.valueOf()) / (1000 * 60 * 60 * 24));
                    
                        const consumptionDifference = getState(idGetStrombezug).val - consPast;
                        const averageConsumption = (Math.round((consumptionDifference / daysDifference) * 1000) / 1000).toLocaleString('de-DE', { maximumFractionDigits: 3 });
                    //    console.log(averageConsumption);
                    
                        setState(fullID, `${averageConsumption.replace(".", ",")} kWh`, true);
                    }
                    
                        // Initialisierung der Variable, um mehrfache Aufrufe zu verhindern
                        if (!NRDB.averageConsumptionCalculated) {
                            calculateAverageConsumption("2023/01/01", 6321.6, '0_userdata.0.Zuhause.ConsPerDay');
                            calculateAverageConsumption("2023/07/01", 8165.5, '0_userdata.0.Zuhause.ConsPerDay');
                            calculateAverageConsumption("2023/09/01", 8340.0, '0_userdata.0.Zuhause.ConsPerDay');
                            calculateAverageConsumption("2023/11/01", 8667.0, '0_userdata.0.Zuhause.ConsPerDay');
                            calculateAverageConsumption("2024/01/01", 9220.3, '0_userdata.0.Zuhause.ConsPerDay');
                            NRDB.averageConsumptionCalculated = true;
                    
                            // Setzen von NRDB.averageConsumptionCalculated auf false und Starten des Timers
                            setTimeout(function () {
                                NRDB.averageConsumptionCalculated = false;
                            }, 60 * 60 * 1000); // 60 Minuten in Millisekunden
                        }
                    
                    
                    CodierknechtC 1 Reply Last reply
                    0
                    • S Shai0Hulud

                      @codierknecht Sorry, nicht eindeutig genug ausgeführt. Der 01.01.23 war nur beispielhaft gezeigt, es gibt mehrere Daten, für die der tägliche Durchschnittsverbrauch angezeigt wird:

                      bd215b55-2cad-4c37-be95-0352377630df-image.png

                      Gesamtes Funktionsteil sieht so aus (wird alle 60minuten aktuialisiert):

                      function calculateAverageConsumption(startDateString, consPast, idSetPrefix) {
                          const startDate = new Date(startDateString);
                          const year = startDate.getFullYear().toString().slice(-2); // Die letzten beiden Stellen des Jahres
                          const month = ('0' + (startDate.getMonth() + 1)).slice(-2); // Monat mit führender Null, um zweistellig zu sein
                          const day = ('0' + startDate.getDate()).slice(-2); // Tag mit führender Null, um zweistellig zu sein
                      
                          const fullID = `${idSetPrefix}${year}${month}${day}`;
                      //    console.log(fullID); // Debugging-Anweisung hinzufügen
                      
                          const currentDate = new Date().valueOf();
                          const daysDifference = Math.round((currentDate - startDate.valueOf()) / (1000 * 60 * 60 * 24));
                      
                          const consumptionDifference = getState(idGetStrombezug).val - consPast;
                          const averageConsumption = (Math.round((consumptionDifference / daysDifference) * 1000) / 1000).toLocaleString('de-DE', { maximumFractionDigits: 3 });
                      //    console.log(averageConsumption);
                      
                          setState(fullID, `${averageConsumption.replace(".", ",")} kWh`, true);
                      }
                      
                          // Initialisierung der Variable, um mehrfache Aufrufe zu verhindern
                          if (!NRDB.averageConsumptionCalculated) {
                              calculateAverageConsumption("2023/01/01", 6321.6, '0_userdata.0.Zuhause.ConsPerDay');
                              calculateAverageConsumption("2023/07/01", 8165.5, '0_userdata.0.Zuhause.ConsPerDay');
                              calculateAverageConsumption("2023/09/01", 8340.0, '0_userdata.0.Zuhause.ConsPerDay');
                              calculateAverageConsumption("2023/11/01", 8667.0, '0_userdata.0.Zuhause.ConsPerDay');
                              calculateAverageConsumption("2024/01/01", 9220.3, '0_userdata.0.Zuhause.ConsPerDay');
                              NRDB.averageConsumptionCalculated = true;
                      
                              // Setzen von NRDB.averageConsumptionCalculated auf false und Starten des Timers
                              setTimeout(function () {
                                  NRDB.averageConsumptionCalculated = false;
                              }, 60 * 60 * 1000); // 60 Minuten in Millisekunden
                          }
                      
                      
                      CodierknechtC Offline
                      CodierknechtC Offline
                      Codierknecht
                      Developer Most Active
                      wrote on last edited by
                      #17

                      @shai0hulud

                      Ich habe noch immer nicht verstanden, warum Du das zu Beginn gleich für "230101" definierst.

                      var idSetConsPerDay230101 = '0_userdata.0.Zuhause.ConsPerDay230101'; 
                      

                      Ich würde das (prinzipiell) in etwa so machen:

                      var moment = require('moment');
                      
                      const statePrefix = '0_userdata.0.Zuhause.ConsPerDay'; 
                      
                      function calculateAverageConsumption(startDateString, consTarget, idSetPrefix) {
                          let date = moment(startDateString).format('YYMMDD');
                          const fullID = `${statePrefix}${date}`;
                          ...
                      }
                      

                      Eine stündliche Ausführung würde ich über einen Schedule lösen und nicht per Timeout.

                      Dass Du den Code ab Zeile 20 eingerückt hast, ist der Lesbarkeit nicht wirklich zuträglich.
                      Ich weiß: Klingt nach Erbesenzählerei, aber die Lesbarkeit ist das A und O für die spätere Wartung und Erweiterung von Code.

                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                      Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                      HmIP|ZigBee|Tasmota|Unifi + dies & das
                      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                      S 1 Reply Last reply
                      1
                      • CodierknechtC Codierknecht

                        @shai0hulud

                        Ich habe noch immer nicht verstanden, warum Du das zu Beginn gleich für "230101" definierst.

                        var idSetConsPerDay230101 = '0_userdata.0.Zuhause.ConsPerDay230101'; 
                        

                        Ich würde das (prinzipiell) in etwa so machen:

                        var moment = require('moment');
                        
                        const statePrefix = '0_userdata.0.Zuhause.ConsPerDay'; 
                        
                        function calculateAverageConsumption(startDateString, consTarget, idSetPrefix) {
                            let date = moment(startDateString).format('YYMMDD');
                            const fullID = `${statePrefix}${date}`;
                            ...
                        }
                        

                        Eine stündliche Ausführung würde ich über einen Schedule lösen und nicht per Timeout.

                        Dass Du den Code ab Zeile 20 eingerückt hast, ist der Lesbarkeit nicht wirklich zuträglich.
                        Ich weiß: Klingt nach Erbesenzählerei, aber die Lesbarkeit ist das A und O für die spätere Wartung und Erweiterung von Code.

                        S Offline
                        S Offline
                        Shai0Hulud
                        wrote on last edited by
                        #18

                        @codierknecht Ich kann Dir das nicht erklären, warum ich da so in dieser Form zu Beginn definiere. JS-Noob und so. Ich habe mir das alles mit Google zusammengeschustert und war happy, dass der NodeRed-Adapter am Ende meine Werte so anzeigen konnte wie von mir gewünscht.

                        ChatGPT kam erst am Ende ins Spiel, habe nur um Vereinfachung gebeten. Woraufhin das Script mit 170 Zeilen auf immerhin 130 Zeilen geschrumpft ist. Und bis auf diesen Teil mit den täglichen Durchschnittsverbrauchswerten ab bestimmten Tagen hat auch alles sofort funktioniert.

                        Das Einrücken ist nicht bewusst passiert, ist glaube ich durch das Copy und Paste von ChatGPT gekommen.

                        Danke für Deinen Vorschlag, das probier ich mal aus!

                        VG!

                        S 1 Reply Last reply
                        0
                        • S Shai0Hulud

                          @codierknecht Ich kann Dir das nicht erklären, warum ich da so in dieser Form zu Beginn definiere. JS-Noob und so. Ich habe mir das alles mit Google zusammengeschustert und war happy, dass der NodeRed-Adapter am Ende meine Werte so anzeigen konnte wie von mir gewünscht.

                          ChatGPT kam erst am Ende ins Spiel, habe nur um Vereinfachung gebeten. Woraufhin das Script mit 170 Zeilen auf immerhin 130 Zeilen geschrumpft ist. Und bis auf diesen Teil mit den täglichen Durchschnittsverbrauchswerten ab bestimmten Tagen hat auch alles sofort funktioniert.

                          Das Einrücken ist nicht bewusst passiert, ist glaube ich durch das Copy und Paste von ChatGPT gekommen.

                          Danke für Deinen Vorschlag, das probier ich mal aus!

                          VG!

                          S Offline
                          S Offline
                          Shai0Hulud
                          wrote on last edited by Shai0Hulud
                          #19

                          @shai0hulud

                          Vorschlag funktioniert, konnte "idSetPrefix" aus der Funktion so natürlich entfernen, brauche jetzt nur noch 2 Optionen für die Funktion und hab mir von ChatGPT mit den Datumsformaten helfen lassen, da bei der restlichen Funktion ein anderes Datumsformat genutzt wurde und damit die Differenz in Tagen extrem groß wurde (knapp 20000 Tage statt nur 400 z.B.).

                          Danke nochmal!

                          Dass mit dem Schedule statt Timeout schaue ich mir auch noch an.

                          1 Reply Last reply
                          0
                          Reply
                          • Reply as topic
                          Log in to reply
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes


                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          50

                          Online

                          32.4k

                          Users

                          81.3k

                          Topics

                          1.3m

                          Posts
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          ioBroker Community 2014-2025
                          logo
                          • Login

                          • Don't have an account? Register

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Recent
                          • Tags
                          • Unread 0
                          • Categories
                          • Unreplied
                          • Popular
                          • GitHub
                          • Docu
                          • Hilfe