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. setState findet manuell erzeugtes Objekt nicht

NEWS

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

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

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.1k

setState findet manuell erzeugtes Objekt nicht

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
19 Beiträge 3 Kommentatoren 962 Aufrufe 2 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.
  • S Offline
    S Offline
    Shai0Hulud
    schrieb am zuletzt editiert von Shai0Hulud
    #1

    Mein Javascript für meinen NodeRed-Adapter konnte ich mangels eigener Skills mit ChatGPT vereinfachen und übersichtlicher gestalten.

    Nur bei meiner Funktion, die den täglichen Durchschnittsverbrauch seit bestimmten Tagen (01.01.23, 01.07.23 usw) anzeigen soll, gibt es einen mir unerklärlichen Fehler (bzw. Warnung, die aber dazu führt, dass diese Werte nicht aktualisiert werden), sondern noch die Werte beinhalten, die durch mein altes umständliches Script berechnet wurden.

    Am Anfang des Scripts wird z.B. folgende Variable definiert:

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

    (Consumption per Day since 230101, also Verbrauch pro Tag seit 01.01.23)


    6aeac086-e902-4574-a9aa-88e61b79d468-image.png

    In der von ChatGPT vorgeschlagenen Funktion soll dann dieses Objekt mit dem Durchschnittsverbrauch seit dem 01.01.23 gefüttert werden, diese sieht so aus:

    function calculateAverageConsumption(startDateString, consTarget, 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
    
        var fullID = `${idSetPrefix}${year}${month}${day}`;
        console.log(fullID); // Debugging fullID
    
        const currentDate = new Date().valueOf();
        const daysDifference = Math.round((currentDate - startDate.valueOf()) / (1000 * 60 * 60 * 24));
    
        const consumptionDifference = consTarget - getState(idGetStrombezug).val;
        const averageConsumption = (Math.round((consumptionDifference / daysDifference) * -1000) / 1000).toLocaleString('de-DE', { maximumFractionDigits: 3 });
        
        console.log(averageConsumption); // Debugging averageConsumption
    
        setState(fullID, `${averageConsumption.replace(".", ",")} kWh`, true);
    }
    

    Die Debugging-Zeile für die fullID gibt folgendes aus:

    info javascript.0 (1017) script.js.Zuhause.Solar.Node-Red-Dashboard_v2: idSetConsPerDay230101

    Die Debuging-Zeile für den errechneten Durchschnittsverbrauch (averageConsumption) folgendes:

    info javascript.0 (1017) script.js.Zuhause.Solar.Node-Red-Dashboard_v2: 8,014

    Aufgerufen wird die Funktion wie folgt:

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

    (6321.6 ist der Gesamtstromverbrauch meines Hauses vom 01.01.23)

    Sieht mMn erstmal korrekt aus!

    Trotzdem werden die Objekte im iobroker nicht aktualisiert. Das ist mir erst aufgefallen, nachdem ich sie manuell mit "0 kWh" überschrieben habe.

    **Das Log vom iobroker meckert folgendermaßen:

    warn State "idSetConsPerDay230101" not found**

    Dieser Zustand/Objekt existiert doch aber, was ist hier also das Problem?

    Danke!


    PS: Hier noch die Darstellung über NodeRed: 9c700ecf-9bf0-4fb0-9e0f-0b14019c58ac-image.png

    CodierknechtC paul53P 2 Antworten Letzte Antwort
    0
    • S Shai0Hulud

      Mein Javascript für meinen NodeRed-Adapter konnte ich mangels eigener Skills mit ChatGPT vereinfachen und übersichtlicher gestalten.

      Nur bei meiner Funktion, die den täglichen Durchschnittsverbrauch seit bestimmten Tagen (01.01.23, 01.07.23 usw) anzeigen soll, gibt es einen mir unerklärlichen Fehler (bzw. Warnung, die aber dazu führt, dass diese Werte nicht aktualisiert werden), sondern noch die Werte beinhalten, die durch mein altes umständliches Script berechnet wurden.

      Am Anfang des Scripts wird z.B. folgende Variable definiert:

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

      (Consumption per Day since 230101, also Verbrauch pro Tag seit 01.01.23)


      6aeac086-e902-4574-a9aa-88e61b79d468-image.png

      In der von ChatGPT vorgeschlagenen Funktion soll dann dieses Objekt mit dem Durchschnittsverbrauch seit dem 01.01.23 gefüttert werden, diese sieht so aus:

      function calculateAverageConsumption(startDateString, consTarget, 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
      
          var fullID = `${idSetPrefix}${year}${month}${day}`;
          console.log(fullID); // Debugging fullID
      
          const currentDate = new Date().valueOf();
          const daysDifference = Math.round((currentDate - startDate.valueOf()) / (1000 * 60 * 60 * 24));
      
          const consumptionDifference = consTarget - getState(idGetStrombezug).val;
          const averageConsumption = (Math.round((consumptionDifference / daysDifference) * -1000) / 1000).toLocaleString('de-DE', { maximumFractionDigits: 3 });
          
          console.log(averageConsumption); // Debugging averageConsumption
      
          setState(fullID, `${averageConsumption.replace(".", ",")} kWh`, true);
      }
      

      Die Debugging-Zeile für die fullID gibt folgendes aus:

      info javascript.0 (1017) script.js.Zuhause.Solar.Node-Red-Dashboard_v2: idSetConsPerDay230101

      Die Debuging-Zeile für den errechneten Durchschnittsverbrauch (averageConsumption) folgendes:

      info javascript.0 (1017) script.js.Zuhause.Solar.Node-Red-Dashboard_v2: 8,014

      Aufgerufen wird die Funktion wie folgt:

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

      (6321.6 ist der Gesamtstromverbrauch meines Hauses vom 01.01.23)

      Sieht mMn erstmal korrekt aus!

      Trotzdem werden die Objekte im iobroker nicht aktualisiert. Das ist mir erst aufgefallen, nachdem ich sie manuell mit "0 kWh" überschrieben habe.

      **Das Log vom iobroker meckert folgendermaßen:

      warn State "idSetConsPerDay230101" not found**

      Dieser Zustand/Objekt existiert doch aber, was ist hier also das Problem?

      Danke!


      PS: Hier noch die Darstellung über NodeRed: 9c700ecf-9bf0-4fb0-9e0f-0b14019c58ac-image.png

      CodierknechtC Offline
      CodierknechtC Offline
      Codierknecht
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

      warn State "idSetConsPerDay230101" not found

      Ist das Leerzeichen da zufällig drin?

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

      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
      HmIP|ZigBee|Tasmota|Unifi
      Zabbix Certified Specialist
      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

      S 1 Antwort Letzte Antwort
      0
      • CodierknechtC Codierknecht

        @shai0hulud sagte in setState findet manuell erzeugtes Objekt nicht:

        warn State "idSetConsPerDay230101" not found

        Ist das Leerzeichen da zufällig drin?

        S Offline
        S Offline
        Shai0Hulud
        schrieb am zuletzt editiert von
        #3

        @codierknecht

        Ich kann kein überflüssiges Leerzeichen entdecken.

        CodierknechtC 1 Antwort Letzte Antwort
        0
        • S Shai0Hulud

          @codierknecht

          Ich kann kein überflüssiges Leerzeichen entdecken.

          CodierknechtC Offline
          CodierknechtC Offline
          Codierknecht
          Developer Most Active
          schrieb am zuletzt editiert von
          #4

          @shai0hulud
          6e5d4e57-19c6-4a88-a733-3457016a6a90-grafik.png

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

          Proxmox 9.1.1 LXC|8 GB|Core i7-6700
          HmIP|ZigBee|Tasmota|Unifi
          Zabbix Certified Specialist
          Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

          S 1 Antwort Letzte Antwort
          0
          • S Shai0Hulud

            Mein Javascript für meinen NodeRed-Adapter konnte ich mangels eigener Skills mit ChatGPT vereinfachen und übersichtlicher gestalten.

            Nur bei meiner Funktion, die den täglichen Durchschnittsverbrauch seit bestimmten Tagen (01.01.23, 01.07.23 usw) anzeigen soll, gibt es einen mir unerklärlichen Fehler (bzw. Warnung, die aber dazu führt, dass diese Werte nicht aktualisiert werden), sondern noch die Werte beinhalten, die durch mein altes umständliches Script berechnet wurden.

            Am Anfang des Scripts wird z.B. folgende Variable definiert:

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

            (Consumption per Day since 230101, also Verbrauch pro Tag seit 01.01.23)


            6aeac086-e902-4574-a9aa-88e61b79d468-image.png

            In der von ChatGPT vorgeschlagenen Funktion soll dann dieses Objekt mit dem Durchschnittsverbrauch seit dem 01.01.23 gefüttert werden, diese sieht so aus:

            function calculateAverageConsumption(startDateString, consTarget, 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
            
                var fullID = `${idSetPrefix}${year}${month}${day}`;
                console.log(fullID); // Debugging fullID
            
                const currentDate = new Date().valueOf();
                const daysDifference = Math.round((currentDate - startDate.valueOf()) / (1000 * 60 * 60 * 24));
            
                const consumptionDifference = consTarget - getState(idGetStrombezug).val;
                const averageConsumption = (Math.round((consumptionDifference / daysDifference) * -1000) / 1000).toLocaleString('de-DE', { maximumFractionDigits: 3 });
                
                console.log(averageConsumption); // Debugging averageConsumption
            
                setState(fullID, `${averageConsumption.replace(".", ",")} kWh`, true);
            }
            

            Die Debugging-Zeile für die fullID gibt folgendes aus:

            info javascript.0 (1017) script.js.Zuhause.Solar.Node-Red-Dashboard_v2: idSetConsPerDay230101

            Die Debuging-Zeile für den errechneten Durchschnittsverbrauch (averageConsumption) folgendes:

            info javascript.0 (1017) script.js.Zuhause.Solar.Node-Red-Dashboard_v2: 8,014

            Aufgerufen wird die Funktion wie folgt:

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

            (6321.6 ist der Gesamtstromverbrauch meines Hauses vom 01.01.23)

            Sieht mMn erstmal korrekt aus!

            Trotzdem werden die Objekte im iobroker nicht aktualisiert. Das ist mir erst aufgefallen, nachdem ich sie manuell mit "0 kWh" überschrieben habe.

            **Das Log vom iobroker meckert folgendermaßen:

            warn State "idSetConsPerDay230101" not found**

            Dieser Zustand/Objekt existiert doch aber, was ist hier also das Problem?

            Danke!


            PS: Hier noch die Darstellung über NodeRed: 9c700ecf-9bf0-4fb0-9e0f-0b14019c58ac-image.png

            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #5

            @shai0hulud sagte: warn State "idSetConsPerDay230101" not found

            Das ist eine ungültige ID. Es muss an idSetPrefix der String "0_userdata.0.Zuhause.ConsPerDay" übergeben werden.

            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 1 Antwort Letzte Antwort
            0
            • CodierknechtC Codierknecht

              @shai0hulud
              6e5d4e57-19c6-4a88-a733-3457016a6a90-grafik.png

              S Offline
              S Offline
              Shai0Hulud
              schrieb am zuletzt editiert von
              #6

              @codierknecht

              Da ist tatsächlich kein Leerzeichen. Ich hab die Zeile aus dem Log komplett kopiert und in Notepad++ eingefügt.

              Wenn ich meinen Text aus meinem Beitrag markiere, ist auch kein Leerzeichen erkennbar.

              1 Antwort Letzte Antwort
              0
              • paul53P paul53

                @shai0hulud sagte: warn State "idSetConsPerDay230101" not found

                Das ist eine ungültige ID. Es muss an idSetPrefix der String "0_userdata.0.Zuhause.ConsPerDay" übergeben werden.

                S Offline
                S Offline
                Shai0Hulud
                schrieb am zuletzt editiert von
                #7

                @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 paul53P 2 Antworten Letzte Antwort
                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)

                  CodierknechtC Offline
                  CodierknechtC Offline
                  Codierknecht
                  Developer Most Active
                  schrieb am zuletzt editiert von
                  #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 9.1.1 LXC|8 GB|Core i7-6700
                  HmIP|ZigBee|Tasmota|Unifi
                  Zabbix Certified Specialist
                  Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                  S 1 Antwort Letzte Antwort
                  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
                    schrieb am zuletzt editiert von 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 Antworten Letzte Antwort
                    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
                      schrieb am zuletzt editiert von
                      #10

                      @codierknecht

                      Bisher mit 'idSetConsPerDay'

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

                      Alle Warnungen weg, Werte im Dashboard werden wieder aktualisiert.

                      CodierknechtC 1 Antwort Letzte Antwort
                      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
                        schrieb am zuletzt editiert von
                        #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 Antwort Letzte Antwort
                        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
                          schrieb am zuletzt editiert von 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 9.1.1 LXC|8 GB|Core i7-6700
                          HmIP|ZigBee|Tasmota|Unifi
                          Zabbix Certified Specialist
                          Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                          S 1 Antwort Letzte Antwort
                          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
                            schrieb am zuletzt editiert von
                            #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 :smirk:

                            1 Antwort Letzte Antwort
                            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
                              schrieb am zuletzt editiert von
                              #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 Antwort Letzte Antwort
                              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
                                schrieb am zuletzt editiert von 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 9.1.1 LXC|8 GB|Core i7-6700
                                HmIP|ZigBee|Tasmota|Unifi
                                Zabbix Certified Specialist
                                Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                S 1 Antwort Letzte Antwort
                                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
                                  schrieb am zuletzt editiert von
                                  #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 Antwort Letzte Antwort
                                  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
                                    schrieb am zuletzt editiert von
                                    #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 9.1.1 LXC|8 GB|Core i7-6700
                                    HmIP|ZigBee|Tasmota|Unifi
                                    Zabbix Certified Specialist
                                    Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                    S 1 Antwort Letzte Antwort
                                    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
                                      schrieb am zuletzt editiert von
                                      #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 Antwort Letzte Antwort
                                      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
                                        schrieb am zuletzt editiert von 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 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

                                        380

                                        Online

                                        32.4k

                                        Benutzer

                                        81.5k

                                        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