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] on Funktion u.Daten Array nimmt immer letzten Wert

NEWS

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

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

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

[gelöst] on Funktion u.Daten Array nimmt immer letzten Wert

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
14 Beiträge 4 Kommentatoren 911 Aufrufe 3 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.
  • etvE Offline
    etvE Offline
    etv
    schrieb am zuletzt editiert von etv
    #1

    Liebe Leute,
    ich häng grad bei einem kleinen Problem.
    Es soll aus einem Datenarray eine on-Funktion generiert werden und in der anschließenden Funktion dann Werte summiert werden...
    ...jo - klingt eigentlich einfach, aber ich bekomme es nicht gebacken.
    Problem ist, dass egal wie ich es verschachtle, immer der letzte Datensatz aus dem Array genommen wird, egal wer die On-Funktion ausgelöst hat.

    var datenpunkt={
        'ScooterCharger':{
            id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
            name    : 'ScooterCharger'
        },
        'editPC':{
            id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
            name    : 'editPC'
        }
    };
    
    // Init
    for (was in datenpunkt) {
        on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
            helper = obj.state.val;
            was = datenpunkt[was].name;
            fn_akumuliere(helper, was);
            log('====================================' + was);
    })};
    
    
    // Hauptteil
    function fn_akumuliere(obj, was) {
        // abfangen von Änderungen kurz nach Mitternacht - da erfolgen ja die ganzen Transfers
        if (compareTime("00:00", "00:01", "between")){
            if (debug){log('========== Update ausgelöst von '+ was +' aber es ist Mitternacht, daher Abbruch')}
            return;
        }
        if (debug){log('========== Update ausgelöst von '+ was +'...')}
        neuer_Wert = obj;
        alter_Wert = getState(root+was+'.internal_counter').val;
        if (debug){log('========== alter Wert: '+ alter_Wert)}
        if (debug){log('========== neuer Wert: '+ neuer_Wert)}
        diff = neuer_Wert - alter_Wert;
        // ist diff gleuch Null, dann Abbruch...
        if (diff === 0) {
            if (debug){log('========== Objekt Update ohne Änderung ... exit!')}
            return;
        }
        // wenn diff negativ ist, dann hat ein reset des Counter stattgefunden
        // ist es positiv, wird der Wert dazu gezählt
        if (diff < 0) {
            if (debug){log('========== RESET erkannt - Differenz ist negativ: '+ diff)}
            // check auf neuer Wert = 0, dann wird 0,00000001 addiert um den INIT abzufangen
            if (neuer_Wert === 0){neuer_Wert = 0.0000000001}
            setState(root+was+'.internal_counter', neuer_Wert, true);
        } else {
            // check auf alter Wert genau 0 - dann wird dieser Wert gerade zum ersten Mal gelesen....
            if (alter_Wert === 0){
                if (debug){log('========== INIT erkannt - alter Wert genau 0, daher wurde noch nie ein Wert gelesen/geschrieben.')}
                // nun wird ohne Addition der neue Wert im Counter gespeichert
                setState(root+was+'.internal_counter', neuer_Wert, true);
                return; // und Abbruch, weil wir sind fertig...denke ich...
            }
            if (debug){log('========== Differenz '+ diff +' wird addiert...')}
            helper = getState(root+was+'.1-DAY').val;
            setState(root+was+'.1-DAY', (helper + diff), true);
            helper = getState(root+was+'.2-WEEK').val;
            setState(root+was+'.2-WEEK', (helper + diff), true);
            helper = getState(root+was+'.3-MONTH').val;
            setState(root+was+'.3-MONTH', (helper + diff), true);
            helper = getState(root+was+'.4-YEAR').val;
            setState(root+was+'.4-YEAR', (helper + diff), true);
            setState(root+was+'.internal_counter', neuer_Wert, true);
        }
    }; // Ende Function / Hauptteil
    

    d.h. im obigen Beispiel ist "was" immer der editPC, auch wenn der Auslöser der ScooterCharger war.

    Bitte löst mir meinen Knoten im Kopf 😎

    Liebe Grüße
    Tom

    …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

    haus-automatisierungH CodierknechtC Ro75R 3 Antworten Letzte Antwort
    0
    • etvE etv

      Liebe Leute,
      ich häng grad bei einem kleinen Problem.
      Es soll aus einem Datenarray eine on-Funktion generiert werden und in der anschließenden Funktion dann Werte summiert werden...
      ...jo - klingt eigentlich einfach, aber ich bekomme es nicht gebacken.
      Problem ist, dass egal wie ich es verschachtle, immer der letzte Datensatz aus dem Array genommen wird, egal wer die On-Funktion ausgelöst hat.

      var datenpunkt={
          'ScooterCharger':{
              id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
              name    : 'ScooterCharger'
          },
          'editPC':{
              id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
              name    : 'editPC'
          }
      };
      
      // Init
      for (was in datenpunkt) {
          on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
              helper = obj.state.val;
              was = datenpunkt[was].name;
              fn_akumuliere(helper, was);
              log('====================================' + was);
      })};
      
      
      // Hauptteil
      function fn_akumuliere(obj, was) {
          // abfangen von Änderungen kurz nach Mitternacht - da erfolgen ja die ganzen Transfers
          if (compareTime("00:00", "00:01", "between")){
              if (debug){log('========== Update ausgelöst von '+ was +' aber es ist Mitternacht, daher Abbruch')}
              return;
          }
          if (debug){log('========== Update ausgelöst von '+ was +'...')}
          neuer_Wert = obj;
          alter_Wert = getState(root+was+'.internal_counter').val;
          if (debug){log('========== alter Wert: '+ alter_Wert)}
          if (debug){log('========== neuer Wert: '+ neuer_Wert)}
          diff = neuer_Wert - alter_Wert;
          // ist diff gleuch Null, dann Abbruch...
          if (diff === 0) {
              if (debug){log('========== Objekt Update ohne Änderung ... exit!')}
              return;
          }
          // wenn diff negativ ist, dann hat ein reset des Counter stattgefunden
          // ist es positiv, wird der Wert dazu gezählt
          if (diff < 0) {
              if (debug){log('========== RESET erkannt - Differenz ist negativ: '+ diff)}
              // check auf neuer Wert = 0, dann wird 0,00000001 addiert um den INIT abzufangen
              if (neuer_Wert === 0){neuer_Wert = 0.0000000001}
              setState(root+was+'.internal_counter', neuer_Wert, true);
          } else {
              // check auf alter Wert genau 0 - dann wird dieser Wert gerade zum ersten Mal gelesen....
              if (alter_Wert === 0){
                  if (debug){log('========== INIT erkannt - alter Wert genau 0, daher wurde noch nie ein Wert gelesen/geschrieben.')}
                  // nun wird ohne Addition der neue Wert im Counter gespeichert
                  setState(root+was+'.internal_counter', neuer_Wert, true);
                  return; // und Abbruch, weil wir sind fertig...denke ich...
              }
              if (debug){log('========== Differenz '+ diff +' wird addiert...')}
              helper = getState(root+was+'.1-DAY').val;
              setState(root+was+'.1-DAY', (helper + diff), true);
              helper = getState(root+was+'.2-WEEK').val;
              setState(root+was+'.2-WEEK', (helper + diff), true);
              helper = getState(root+was+'.3-MONTH').val;
              setState(root+was+'.3-MONTH', (helper + diff), true);
              helper = getState(root+was+'.4-YEAR').val;
              setState(root+was+'.4-YEAR', (helper + diff), true);
              setState(root+was+'.internal_counter', neuer_Wert, true);
          }
      }; // Ende Function / Hauptteil
      

      d.h. im obigen Beispiel ist "was" immer der editPC, auch wenn der Auslöser der ScooterCharger war.

      Bitte löst mir meinen Knoten im Kopf 😎

      Liebe Grüße
      Tom

      haus-automatisierungH Offline
      haus-automatisierungH Offline
      haus-automatisierung
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      @etv sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

      Bitte löst mir meinen Knoten im Kopf

      Nutze kein var, sondern const. Und weise was nicht innerhalb neu zu, wenn Du es außerhalb des Callbacks definiert hast (in der Schleife). Insgesamt ist der Code echt schwer lesbar.

      🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
      🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
      📚 Meine inoffizielle ioBroker Dokumentation

      1 Antwort Letzte Antwort
      0
      • etvE etv

        Liebe Leute,
        ich häng grad bei einem kleinen Problem.
        Es soll aus einem Datenarray eine on-Funktion generiert werden und in der anschließenden Funktion dann Werte summiert werden...
        ...jo - klingt eigentlich einfach, aber ich bekomme es nicht gebacken.
        Problem ist, dass egal wie ich es verschachtle, immer der letzte Datensatz aus dem Array genommen wird, egal wer die On-Funktion ausgelöst hat.

        var datenpunkt={
            'ScooterCharger':{
                id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
                name    : 'ScooterCharger'
            },
            'editPC':{
                id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
                name    : 'editPC'
            }
        };
        
        // Init
        for (was in datenpunkt) {
            on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
                helper = obj.state.val;
                was = datenpunkt[was].name;
                fn_akumuliere(helper, was);
                log('====================================' + was);
        })};
        
        
        // Hauptteil
        function fn_akumuliere(obj, was) {
            // abfangen von Änderungen kurz nach Mitternacht - da erfolgen ja die ganzen Transfers
            if (compareTime("00:00", "00:01", "between")){
                if (debug){log('========== Update ausgelöst von '+ was +' aber es ist Mitternacht, daher Abbruch')}
                return;
            }
            if (debug){log('========== Update ausgelöst von '+ was +'...')}
            neuer_Wert = obj;
            alter_Wert = getState(root+was+'.internal_counter').val;
            if (debug){log('========== alter Wert: '+ alter_Wert)}
            if (debug){log('========== neuer Wert: '+ neuer_Wert)}
            diff = neuer_Wert - alter_Wert;
            // ist diff gleuch Null, dann Abbruch...
            if (diff === 0) {
                if (debug){log('========== Objekt Update ohne Änderung ... exit!')}
                return;
            }
            // wenn diff negativ ist, dann hat ein reset des Counter stattgefunden
            // ist es positiv, wird der Wert dazu gezählt
            if (diff < 0) {
                if (debug){log('========== RESET erkannt - Differenz ist negativ: '+ diff)}
                // check auf neuer Wert = 0, dann wird 0,00000001 addiert um den INIT abzufangen
                if (neuer_Wert === 0){neuer_Wert = 0.0000000001}
                setState(root+was+'.internal_counter', neuer_Wert, true);
            } else {
                // check auf alter Wert genau 0 - dann wird dieser Wert gerade zum ersten Mal gelesen....
                if (alter_Wert === 0){
                    if (debug){log('========== INIT erkannt - alter Wert genau 0, daher wurde noch nie ein Wert gelesen/geschrieben.')}
                    // nun wird ohne Addition der neue Wert im Counter gespeichert
                    setState(root+was+'.internal_counter', neuer_Wert, true);
                    return; // und Abbruch, weil wir sind fertig...denke ich...
                }
                if (debug){log('========== Differenz '+ diff +' wird addiert...')}
                helper = getState(root+was+'.1-DAY').val;
                setState(root+was+'.1-DAY', (helper + diff), true);
                helper = getState(root+was+'.2-WEEK').val;
                setState(root+was+'.2-WEEK', (helper + diff), true);
                helper = getState(root+was+'.3-MONTH').val;
                setState(root+was+'.3-MONTH', (helper + diff), true);
                helper = getState(root+was+'.4-YEAR').val;
                setState(root+was+'.4-YEAR', (helper + diff), true);
                setState(root+was+'.internal_counter', neuer_Wert, true);
            }
        }; // Ende Function / Hauptteil
        

        d.h. im obigen Beispiel ist "was" immer der editPC, auch wenn der Auslöser der ScooterCharger war.

        Bitte löst mir meinen Knoten im Kopf 😎

        Liebe Grüße
        Tom

        CodierknechtC Online
        CodierknechtC Online
        Codierknecht
        Developer Most Active
        schrieb am zuletzt editiert von Codierknecht
        #3

        @etv
        Ich sehe da kein Array.

        Bei mir sähe das eher so aus:

        const datenpunkt = [
            'ScooterCharger': {
                id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
                name    : 'ScooterCharger'
            },
            'editPC': {
                id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
                name    : 'editPC'
            }
        ];
        

        "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

        haus-automatisierungH 1 Antwort Letzte Antwort
        0
        • CodierknechtC Codierknecht

          @etv
          Ich sehe da kein Array.

          Bei mir sähe das eher so aus:

          const datenpunkt = [
              'ScooterCharger': {
                  id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
                  name    : 'ScooterCharger'
              },
              'editPC': {
                  id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
                  name    : 'editPC'
              }
          ];
          
          haus-automatisierungH Offline
          haus-automatisierungH Offline
          haus-automatisierung
          Developer Most Active
          schrieb am zuletzt editiert von
          #4

          @codierknecht sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

          Ich sehe da kein Array.
          Bei mir sähe das eher so aus:

          Das ist Quatsch so. Dann müsstest die Attribute auch entfernen.

          🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
          🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
          📚 Meine inoffizielle ioBroker Dokumentation

          CodierknechtC 1 Antwort Letzte Antwort
          0
          • haus-automatisierungH haus-automatisierung

            @codierknecht sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

            Ich sehe da kein Array.
            Bei mir sähe das eher so aus:

            Das ist Quatsch so. Dann müsstest die Attribute auch entfernen.

            CodierknechtC Online
            CodierknechtC Online
            Codierknecht
            Developer Most Active
            schrieb am zuletzt editiert von Codierknecht
            #5

            @haus-automatisierung sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

            Das ist Quatsch so

            Was ist Quatsch?
            Ein Array wird nach meinem Kenntnisstand mit eckigen Klammern notiert.
            In diesem Fall ein Array mit Objekten.

            Wo ist da mein Denkfehler?

            "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

            haus-automatisierungH 1 Antwort Letzte Antwort
            0
            • CodierknechtC Codierknecht

              @haus-automatisierung sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

              Das ist Quatsch so

              Was ist Quatsch?
              Ein Array wird nach meinem Kenntnisstand mit eckigen Klammern notiert.
              In diesem Fall ein Array mit Objekten.

              Wo ist da mein Denkfehler?

              haus-automatisierungH Offline
              haus-automatisierungH Offline
              haus-automatisierung
              Developer Most Active
              schrieb am zuletzt editiert von
              #6

              @codierknecht sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

              Wo ist da ein Denkfehler?

              Dass es dann so aussehen müsste.

              const datenpunkt = [
                  {
                      id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
                      name    : 'ScooterCharger'
                  },
                  {
                      id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
                      name    : 'editPC'
                  }
              ];
              

              Aber ist schon okay wie es war. Nur ist dann ein Objekt und kein Array. Das war aber eh nicht die Fragestellung.

              🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
              🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
              📚 Meine inoffizielle ioBroker Dokumentation

              1 Antwort Letzte Antwort
              0
              • etvE etv

                Liebe Leute,
                ich häng grad bei einem kleinen Problem.
                Es soll aus einem Datenarray eine on-Funktion generiert werden und in der anschließenden Funktion dann Werte summiert werden...
                ...jo - klingt eigentlich einfach, aber ich bekomme es nicht gebacken.
                Problem ist, dass egal wie ich es verschachtle, immer der letzte Datensatz aus dem Array genommen wird, egal wer die On-Funktion ausgelöst hat.

                var datenpunkt={
                    'ScooterCharger':{
                        id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
                        name    : 'ScooterCharger'
                    },
                    'editPC':{
                        id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
                        name    : 'editPC'
                    }
                };
                
                // Init
                for (was in datenpunkt) {
                    on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
                        helper = obj.state.val;
                        was = datenpunkt[was].name;
                        fn_akumuliere(helper, was);
                        log('====================================' + was);
                })};
                
                
                // Hauptteil
                function fn_akumuliere(obj, was) {
                    // abfangen von Änderungen kurz nach Mitternacht - da erfolgen ja die ganzen Transfers
                    if (compareTime("00:00", "00:01", "between")){
                        if (debug){log('========== Update ausgelöst von '+ was +' aber es ist Mitternacht, daher Abbruch')}
                        return;
                    }
                    if (debug){log('========== Update ausgelöst von '+ was +'...')}
                    neuer_Wert = obj;
                    alter_Wert = getState(root+was+'.internal_counter').val;
                    if (debug){log('========== alter Wert: '+ alter_Wert)}
                    if (debug){log('========== neuer Wert: '+ neuer_Wert)}
                    diff = neuer_Wert - alter_Wert;
                    // ist diff gleuch Null, dann Abbruch...
                    if (diff === 0) {
                        if (debug){log('========== Objekt Update ohne Änderung ... exit!')}
                        return;
                    }
                    // wenn diff negativ ist, dann hat ein reset des Counter stattgefunden
                    // ist es positiv, wird der Wert dazu gezählt
                    if (diff < 0) {
                        if (debug){log('========== RESET erkannt - Differenz ist negativ: '+ diff)}
                        // check auf neuer Wert = 0, dann wird 0,00000001 addiert um den INIT abzufangen
                        if (neuer_Wert === 0){neuer_Wert = 0.0000000001}
                        setState(root+was+'.internal_counter', neuer_Wert, true);
                    } else {
                        // check auf alter Wert genau 0 - dann wird dieser Wert gerade zum ersten Mal gelesen....
                        if (alter_Wert === 0){
                            if (debug){log('========== INIT erkannt - alter Wert genau 0, daher wurde noch nie ein Wert gelesen/geschrieben.')}
                            // nun wird ohne Addition der neue Wert im Counter gespeichert
                            setState(root+was+'.internal_counter', neuer_Wert, true);
                            return; // und Abbruch, weil wir sind fertig...denke ich...
                        }
                        if (debug){log('========== Differenz '+ diff +' wird addiert...')}
                        helper = getState(root+was+'.1-DAY').val;
                        setState(root+was+'.1-DAY', (helper + diff), true);
                        helper = getState(root+was+'.2-WEEK').val;
                        setState(root+was+'.2-WEEK', (helper + diff), true);
                        helper = getState(root+was+'.3-MONTH').val;
                        setState(root+was+'.3-MONTH', (helper + diff), true);
                        helper = getState(root+was+'.4-YEAR').val;
                        setState(root+was+'.4-YEAR', (helper + diff), true);
                        setState(root+was+'.internal_counter', neuer_Wert, true);
                    }
                }; // Ende Function / Hauptteil
                

                d.h. im obigen Beispiel ist "was" immer der editPC, auch wenn der Auslöser der ScooterCharger war.

                Bitte löst mir meinen Knoten im Kopf 😎

                Liebe Grüße
                Tom

                Ro75R Online
                Ro75R Online
                Ro75
                schrieb am zuletzt editiert von
                #7

                @etv versuche es mal so:

                const arrayListe1 = ['shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy','shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'];
                
                on({id: arrayListe1, change: 'ne'}, function (dp) {
                    for(let i = 0; i < arrayListe1.length; i++) {
                        console.log(getState(arrayListe1[i]).val);
                    }
                });
                

                Ro75.

                SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                CodierknechtC 1 Antwort Letzte Antwort
                0
                • haus-automatisierungH Offline
                  haus-automatisierungH Offline
                  haus-automatisierung
                  Developer Most Active
                  schrieb am zuletzt editiert von
                  #8

                  Ich würde generell die Stuktur von datenpunkte überdenken. Da sind ja redundante Informationen drin. z.B. die Objekt-ID als Key nutzen. Dann kann man darin noch weitere Attribute speichern (falls nötig) und kommt auch leichter an die Meta-Daten:

                  const datenpunkt = {
                      'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy': {
                          name: 'ScooterCharger'
                      },
                      'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy': {
                          name: 'editPC'
                      },
                  };
                   
                  // Init
                  for (const objId in datenpunkt) {
                      on({ id: objId, change: 'ne' }, (obj) => {
                          const name = datenpunkt[obj.id].name;
                  
                          fn_akumuliere(obj.state.val, name);
                          log('====================================' + name);
                      });
                  }
                  
                  // ...
                  

                  🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                  🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                  📚 Meine inoffizielle ioBroker Dokumentation

                  etvE 1 Antwort Letzte Antwort
                  1
                  • Ro75R Ro75

                    @etv versuche es mal so:

                    const arrayListe1 = ['shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy','shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'];
                    
                    on({id: arrayListe1, change: 'ne'}, function (dp) {
                        for(let i = 0; i < arrayListe1.length; i++) {
                            console.log(getState(arrayListe1[i]).val);
                        }
                    });
                    

                    Ro75.

                    CodierknechtC Online
                    CodierknechtC Online
                    Codierknecht
                    Developer Most Active
                    schrieb am zuletzt editiert von Codierknecht
                    #9

                    Hier stand jetzt tatsächlich Quatsch :grin:

                    "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

                    1 Antwort Letzte Antwort
                    0
                    • haus-automatisierungH haus-automatisierung

                      Ich würde generell die Stuktur von datenpunkte überdenken. Da sind ja redundante Informationen drin. z.B. die Objekt-ID als Key nutzen. Dann kann man darin noch weitere Attribute speichern (falls nötig) und kommt auch leichter an die Meta-Daten:

                      const datenpunkt = {
                          'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy': {
                              name: 'ScooterCharger'
                          },
                          'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy': {
                              name: 'editPC'
                          },
                      };
                       
                      // Init
                      for (const objId in datenpunkt) {
                          on({ id: objId, change: 'ne' }, (obj) => {
                              const name = datenpunkt[obj.id].name;
                      
                              fn_akumuliere(obj.state.val, name);
                              log('====================================' + name);
                          });
                      }
                      
                      // ...
                      
                      etvE Offline
                      etvE Offline
                      etv
                      schrieb am zuletzt editiert von etv
                      #10

                      @haus-automatisierung , der "doppelte Name" stand da bei meinem x'ten Versuch drinnen, weil ich irgendwie den Namen nicht mehr rausbekommen hab - den brauch ich unten aber, um die richtigen Ordner der Daten zu erreichen.

                      @Ro75, das reicht leider nicht, da ich eben dann weiter unten meine Daten in den einzelnen id's zugeordnete Ordner speichere - dazu brauch ich aber eben den Namen des auslösenden Objektes und zwar in "Reinschrift" = mein vergebener Name, sonst hab ich nur mehr Ordner mit shelly.1.SHPLG-S#B529BXXX und keine Ahnung, wo ich dann welchen Verbrauch sehe...

                      Die Variablen Definition mit const hat leider nix gebracht.

                      Hier nochmal der Code den ich aktuell hab, ohne die "verwirrenden Zeilen"

                      var root = '0_userdata.0.Logging.Kleinverbraucher.';
                      var datenpunkt={
                          'ScooterCharger':{
                              id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
                              name    : 'ScooterCharger'
                          },
                          'editPC':{
                              id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
                              name    : 'editPC'
                          }
                      };
                      
                      // Init
                      for (was in datenpunkt) {
                          on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
                              helper = obj.state.val; // der neue gelesene Wert aus dem shelly
                              was = datenpunkt[was].name; // welcher Shelly hat ausgelöst als Klarname - das ist eben im Hauptteil NICHT mehr richtig vorhanden, sondern IMMER "editPC"
                              fn_akumuliere(helper, was);
                      })};
                      
                      // Hauptteil
                      function fn_akumuliere(obj, was) {
                       
                          if (debug){log('========== Update ausgelöst von '+ was +'...')}
                          neuer_Wert = obj; // der neue gelesene Wert aus dem shelly
                          alter_Wert = getState(root+was+'.internal_counter').val; // hier wird eben aus dem WAS Klarnamen der richtige Datenspeicher Ordner des jeweiligen Shelly ausgewählt
                          if (debug){log('========== alter Wert: '+ alter_Wert)}
                          if (debug){log('========== neuer Wert: '+ neuer_Wert)}
                          diff = neuer_Wert - alter_Wert; // macht da jetzt augenscheinlich keinen Sinn, wird aber zum Abfangen eines reset des shelly Wertes verwendet, z.B. wenn er ausgesteckt war...
                              if (debug){log('========== Differenz '+ diff +' wird addiert...')}
                              helper = getState(root+was+'.1-DAY').val;
                              setState(root+was+'.1-DAY', (helper + diff), true);
                      }; // Ende Function / Hauptteil
                      

                      Wie gesagt, das Problem ist, dass es IMMER im Ordner

                      0_userdata.0.Logging.Kleinverbraucher.editPC.1-DAY
                      

                      gespeichert wird, auch wenn der ScooterCharger ausgelöst hat, also "verliere" ich irgendwo die Verbindung zwischen auslösendem Objekt und den Zuordnungen im Array (oder wie das da oben auch immer heißen mag...)

                      Liebe Grüße
                      Tom

                      PS: ich verwende diese Arrays öfter, jedoch leider noch nie mit einer ON Funktion gemeinsam...

                      …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

                      Ro75R CodierknechtC 2 Antworten Letzte Antwort
                      0
                      • etvE etv

                        @haus-automatisierung , der "doppelte Name" stand da bei meinem x'ten Versuch drinnen, weil ich irgendwie den Namen nicht mehr rausbekommen hab - den brauch ich unten aber, um die richtigen Ordner der Daten zu erreichen.

                        @Ro75, das reicht leider nicht, da ich eben dann weiter unten meine Daten in den einzelnen id's zugeordnete Ordner speichere - dazu brauch ich aber eben den Namen des auslösenden Objektes und zwar in "Reinschrift" = mein vergebener Name, sonst hab ich nur mehr Ordner mit shelly.1.SHPLG-S#B529BXXX und keine Ahnung, wo ich dann welchen Verbrauch sehe...

                        Die Variablen Definition mit const hat leider nix gebracht.

                        Hier nochmal der Code den ich aktuell hab, ohne die "verwirrenden Zeilen"

                        var root = '0_userdata.0.Logging.Kleinverbraucher.';
                        var datenpunkt={
                            'ScooterCharger':{
                                id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
                                name    : 'ScooterCharger'
                            },
                            'editPC':{
                                id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
                                name    : 'editPC'
                            }
                        };
                        
                        // Init
                        for (was in datenpunkt) {
                            on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
                                helper = obj.state.val; // der neue gelesene Wert aus dem shelly
                                was = datenpunkt[was].name; // welcher Shelly hat ausgelöst als Klarname - das ist eben im Hauptteil NICHT mehr richtig vorhanden, sondern IMMER "editPC"
                                fn_akumuliere(helper, was);
                        })};
                        
                        // Hauptteil
                        function fn_akumuliere(obj, was) {
                         
                            if (debug){log('========== Update ausgelöst von '+ was +'...')}
                            neuer_Wert = obj; // der neue gelesene Wert aus dem shelly
                            alter_Wert = getState(root+was+'.internal_counter').val; // hier wird eben aus dem WAS Klarnamen der richtige Datenspeicher Ordner des jeweiligen Shelly ausgewählt
                            if (debug){log('========== alter Wert: '+ alter_Wert)}
                            if (debug){log('========== neuer Wert: '+ neuer_Wert)}
                            diff = neuer_Wert - alter_Wert; // macht da jetzt augenscheinlich keinen Sinn, wird aber zum Abfangen eines reset des shelly Wertes verwendet, z.B. wenn er ausgesteckt war...
                                if (debug){log('========== Differenz '+ diff +' wird addiert...')}
                                helper = getState(root+was+'.1-DAY').val;
                                setState(root+was+'.1-DAY', (helper + diff), true);
                        }; // Ende Function / Hauptteil
                        

                        Wie gesagt, das Problem ist, dass es IMMER im Ordner

                        0_userdata.0.Logging.Kleinverbraucher.editPC.1-DAY
                        

                        gespeichert wird, auch wenn der ScooterCharger ausgelöst hat, also "verliere" ich irgendwo die Verbindung zwischen auslösendem Objekt und den Zuordnungen im Array (oder wie das da oben auch immer heißen mag...)

                        Liebe Grüße
                        Tom

                        PS: ich verwende diese Arrays öfter, jedoch leider noch nie mit einer ON Funktion gemeinsam...

                        Ro75R Online
                        Ro75R Online
                        Ro75
                        schrieb am zuletzt editiert von Ro75
                        #11

                        @etv sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

                        das reicht leider nicht, da ich eben dann weiter unten meine Daten in den einzelnen id's zugeordnete Ordner speichere

                        dann eben so:

                        const arrayListe1 = ['shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy','shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'];
                        const arrayListe1DP = ['ScooterCharger','editPC'];
                        
                        on({id: arrayListe1, change: 'ne'}, function (dp) {
                            for(let i = 0; i < arrayListe1.length; i++) {
                                console.log(getState(arrayListe1[i]).val);
                                console.log(getState(arrayListe1DP[i]).val); 
                            }
                        });
                        

                        Ro75.

                        SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                        etvE 1 Antwort Letzte Antwort
                        1
                        • etvE etv

                          @haus-automatisierung , der "doppelte Name" stand da bei meinem x'ten Versuch drinnen, weil ich irgendwie den Namen nicht mehr rausbekommen hab - den brauch ich unten aber, um die richtigen Ordner der Daten zu erreichen.

                          @Ro75, das reicht leider nicht, da ich eben dann weiter unten meine Daten in den einzelnen id's zugeordnete Ordner speichere - dazu brauch ich aber eben den Namen des auslösenden Objektes und zwar in "Reinschrift" = mein vergebener Name, sonst hab ich nur mehr Ordner mit shelly.1.SHPLG-S#B529BXXX und keine Ahnung, wo ich dann welchen Verbrauch sehe...

                          Die Variablen Definition mit const hat leider nix gebracht.

                          Hier nochmal der Code den ich aktuell hab, ohne die "verwirrenden Zeilen"

                          var root = '0_userdata.0.Logging.Kleinverbraucher.';
                          var datenpunkt={
                              'ScooterCharger':{
                                  id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/,
                                  name    : 'ScooterCharger'
                              },
                              'editPC':{
                                  id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/,
                                  name    : 'editPC'
                              }
                          };
                          
                          // Init
                          for (was in datenpunkt) {
                              on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
                                  helper = obj.state.val; // der neue gelesene Wert aus dem shelly
                                  was = datenpunkt[was].name; // welcher Shelly hat ausgelöst als Klarname - das ist eben im Hauptteil NICHT mehr richtig vorhanden, sondern IMMER "editPC"
                                  fn_akumuliere(helper, was);
                          })};
                          
                          // Hauptteil
                          function fn_akumuliere(obj, was) {
                           
                              if (debug){log('========== Update ausgelöst von '+ was +'...')}
                              neuer_Wert = obj; // der neue gelesene Wert aus dem shelly
                              alter_Wert = getState(root+was+'.internal_counter').val; // hier wird eben aus dem WAS Klarnamen der richtige Datenspeicher Ordner des jeweiligen Shelly ausgewählt
                              if (debug){log('========== alter Wert: '+ alter_Wert)}
                              if (debug){log('========== neuer Wert: '+ neuer_Wert)}
                              diff = neuer_Wert - alter_Wert; // macht da jetzt augenscheinlich keinen Sinn, wird aber zum Abfangen eines reset des shelly Wertes verwendet, z.B. wenn er ausgesteckt war...
                                  if (debug){log('========== Differenz '+ diff +' wird addiert...')}
                                  helper = getState(root+was+'.1-DAY').val;
                                  setState(root+was+'.1-DAY', (helper + diff), true);
                          }; // Ende Function / Hauptteil
                          

                          Wie gesagt, das Problem ist, dass es IMMER im Ordner

                          0_userdata.0.Logging.Kleinverbraucher.editPC.1-DAY
                          

                          gespeichert wird, auch wenn der ScooterCharger ausgelöst hat, also "verliere" ich irgendwo die Verbindung zwischen auslösendem Objekt und den Zuordnungen im Array (oder wie das da oben auch immer heißen mag...)

                          Liebe Grüße
                          Tom

                          PS: ich verwende diese Arrays öfter, jedoch leider noch nie mit einer ON Funktion gemeinsam...

                          CodierknechtC Online
                          CodierknechtC Online
                          Codierknecht
                          Developer Most Active
                          schrieb am zuletzt editiert von Codierknecht
                          #12

                          @etv sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

                          also "verliere" ich irgendwo die Verbindung zwischen auslösendem Objekt und den Zuordnungen im Array (oder wie das da oben auch immer heißen mag...)

                          Kann ja auch nicht.
                          In der Schleife erzeugst Du zwar einen Trigger für jedes der Objekte. Aber im Trigger selbst ist nur noch das Objekt (bzw. dessen ID) bekannt. Der Bezug zu .name ist da nicht mehr vorhanden.

                          Das Beispiel von @haus-automatisierung behebt diesen Mangel, denn dort hast Du noch immer das Array als Konstante und kannst im Trigger mit datenpunkt[obj.id].name den Namen ermitteln.

                          "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

                          1 Antwort Letzte Antwort
                          1
                          • Ro75R Ro75

                            @etv sagte in on Funktion und Daten Array nimmt immer letzten Wert...:

                            das reicht leider nicht, da ich eben dann weiter unten meine Daten in den einzelnen id's zugeordnete Ordner speichere

                            dann eben so:

                            const arrayListe1 = ['shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy','shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'];
                            const arrayListe1DP = ['ScooterCharger','editPC'];
                            
                            on({id: arrayListe1, change: 'ne'}, function (dp) {
                                for(let i = 0; i < arrayListe1.length; i++) {
                                    console.log(getState(arrayListe1[i]).val);
                                    console.log(getState(arrayListe1DP[i]).val); 
                                }
                            });
                            

                            Ro75.

                            etvE Offline
                            etvE Offline
                            etv
                            schrieb am zuletzt editiert von
                            #13

                            @ro75 ...aja, auch eine sehr gute Idee!

                            …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

                            etvE 1 Antwort Letzte Antwort
                            0
                            • etvE etv

                              @ro75 ...aja, auch eine sehr gute Idee!

                              etvE Offline
                              etvE Offline
                              etv
                              schrieb am zuletzt editiert von
                              #14

                              Ich hab es!!
                              Hab nun in meinen alten Backups ein Script gefunden, welches ich vor Jahren für das automatische EIN/AUS diverse Geräte in Abhängigkeit von Anwesenheit und Helligkeit draußen geschrieben hab (oder von irgendwo hier im Forum zusammen gebastelt...) und in diesem Script mache ich es "richtig rum"...

                              Anbei nun das gesamte Script falls es noch wer "studieren" möchte.

                              // Kleinverbraucher Logging - V1.0 - 07.10.2024
                              // Kopie vom ersten Scrit dieser Art, IONIQ5 Logging...
                              // Teil der neuen Logging Scripte - klein, leicht und auf meine Bedürfnisse zugeschnitten
                              // 2do:::::::::::::::::::::::::::::::::::::::::
                              // createState in der History automatisieren...
                              
                              var debug = true;
                              var root = '0_userdata.0.Logging.Kleinverbraucher.';
                              var was, neuer_Wert, alter_Wert, diff, helper, tag, monat, jahr, wochentag;
                              // WAS soll geloggt werden?
                              const datenpunkt={
                                  'ScooterCharger':{
                                      id_wert : 'shelly.1.SHPLG-S#C38D1F#1.Relay0.Energy'/*Energy*/
                                  },
                                  'editPC':{
                                      id_wert : 'shelly.1.SHPLG-S#B529B7#1.Relay0.Energy'/*Energy*/
                                  }
                              };
                              
                              // Init
                              fn_init();
                              // Funktion initialize für die Subscribes
                              function fn_init() {for (was in datenpunkt) {fn_on_Schleifen(was)}};
                              
                              // Hauptteil
                              function fn_on_Schleifen(was){
                                  on({id: datenpunkt[was].id_wert, change:'ne'}, function (obj) {
                                      // abfangen von Änderungen kurz nach Mitternacht - da erfolgen ja die ganzen Transfers
                                      if (compareTime("00:00", "00:01", "between")){
                                          if (debug){log('========== Update ausgelöst von '+ was +' aber es ist Mitternacht, daher Abbruch')}
                                          return;
                                      }
                                      if (debug){log('========== Update ausgelöst von '+ was +'...')}
                                      neuer_Wert = obj.state.val;
                                      alter_Wert = getState(root+was+'.internal_counter').val;
                                      if (debug){log('========== alter Wert: '+ alter_Wert)}
                                      if (debug){log('========== neuer Wert: '+ neuer_Wert)}
                                      diff = neuer_Wert - alter_Wert;
                                      // ist diff gleuch Null, dann Abbruch...
                                      if (diff === 0) {
                                          if (debug){log('========== Objekt Update ohne Änderung ... exit!')}
                                          return;
                                      }
                                      // wenn diff negativ ist, dann hat ein reset des Counter stattgefunden
                                      // ist es positiv, wird der Wert dazu gezählt
                                      if (diff < 0) {
                                          if (debug){log('========== RESET erkannt - Differenz ist negativ: '+ diff)}
                                          // check auf neuer Wert = 0, dann wird 0,00000001 addiert um den INIT abzufangen
                                          if (neuer_Wert === 0){neuer_Wert = 0.0000000001}
                                          setState(root+was+'.internal_counter', neuer_Wert, true);
                                      } else {
                                           // check auf alter Wert genau 0 - dann wird dieser Wert gerade zum ersten Mal gelesen....
                                          if (alter_Wert === 0){
                                              if (debug){log('========== INIT erkannt - alter Wert genau 0, daher wurde noch nie ein Wert gelesen/geschrieben.')}
                                              // nun wird ohne Addition der neue Wert im Counter gespeichert
                                              setState(root+was+'.internal_counter', neuer_Wert, true);
                                              return; // und Abbruch, weil wir sind fertig...denke ich...
                                          }
                                          if (debug){log('========== Differenz '+ diff +' wird addiert...')}
                                          helper = getState(root+was+'.1-DAY').val;
                                          setState(root+was+'.1-DAY', (helper + diff), true);
                                          helper = getState(root+was+'.2-WEEK').val;
                                          setState(root+was+'.2-WEEK', (helper + diff), true);
                                          helper = getState(root+was+'.3-MONTH').val;
                                          setState(root+was+'.3-MONTH', (helper + diff), true);
                                          helper = getState(root+was+'.4-YEAR').val;
                                          setState(root+was+'.4-YEAR', (helper + diff), true);
                                          setState(root+was+'.internal_counter', neuer_Wert, true);
                                      }
                                  }); // Ende on
                              }; // Ende Hauptteil
                              
                              // Tages-/Wochen-/Monats-/Jahreswechsel
                              // läuft jeden Tag um Punkt 00:00:01
                              clearSchedule(sh_Tageswechel);
                              var sh_Tageswechel = schedule('1 0 0 * * *', fn_Tageswechsel);
                              
                              //fn_Tageswechsel();
                              function fn_Tageswechsel(){
                                  // erst mal das neue Datum holen UND zwar in eizelnen Variablen
                                  tag = formatDate(new Date(), 'TT');
                                  monat = formatDate(new Date(), 'MM');
                                  jahr = parseInt(formatDate(new Date(), 'YYYY'));
                                  wochentag = formatDate(new Date(), 'W');
                                  // Start der Schleife für ALLE Datenpunkte in dieser Kategorie
                                  for (was in datenpunkt) {
                                      log('Schleife START');
                                      // nun check auf die ganzen Wechsel, wobei Jahr vor Monat vor Tag
                                      // Check auf JAHRESWECHSEL
                                      if ((monat == '01') && (tag == '01')){
                                          jahr = jahr - 1;
                                          log('========== JAHRESWECHSEL erkannt: '+datenpunkt[was].id_wert +' ==========');
                                          // 1. Jahresverbrauch in HISTORY schreiben
                                          setState(root+was+'.HISTORY.'+ jahr, getState(root+was+'.4-YEAR').val, true);
                                          // 2. Jahresverbrauch in .BEFORE schreiben
                                          setState(root+was+'.4-YEAR.BEFORE', getState(root+was+'.4-YEAR').val, true);
                                          setState(root+was+'.4-YEAR', 0, true);   
                                      } // Ende Jahreswechsel
                                      // Check auf MONATSWECHSEL
                                      if (tag == '01'){
                                          // if (monat == '01'){jahr = jahr - 1}
                                          helper = parseInt(monat);
                                          helper = helper - 1; // wir brauchen ja den Vormonat
                                          if (helper === 0){helper = 12}
                                          if (helper < 10) {monat = '0' + helper.toFixed(0)}
                                          else {monat = helper.toFixed(0)}
                                          log('========== MONATSWECHSEL erkannt: '+datenpunkt[was].id_wert +' ==========');
                                          // 1. Monatsverbrauch in HISTORY schreiben
                                          setState(root+was+'.HISTORY.'+ jahr +'.' + monat, getState(root+was+'.3-MONTH').val, true);
                                          // 2. Monatsverbrauch in .BEFORE schreiben
                                          setState(root+was+'.3-MONTH.BEFORE', getState(root+was+'.3-MONTH').val, true);
                                          setState(root+was+'.3-MONTH', 0, true);
                                      } // Ende Monatswechsel
                                      // Check auf Wochenwechsel
                                      if (wochentag == 'Mo'){
                                          log('========== WOCHENWECHSEL erkannt: '+datenpunkt[was].id_wert +' ==========');
                                          // 1. Wochenverbrauch in .BEFORE schreiben
                                          setState(root+was+'.2-WEEK.BEFORE', getState(root+was+'.2-WEEK').val, true);
                                          setState(root+was+'.2-WEEK', 0, true);            
                                      } // Ende Wochenwechsel
                                      // Tageswechsel - der kommt - no na - IMMER dran...
                                      setState(root+was+'.1-DAY.BEFORE', getState(root+was+'.1-DAY').val, true);
                                      setState(root+was+'.1-DAY', 0, true);
                                  } // Ende for-Schleife
                              } // Ende Tages-/Wochen-/Monats-/Jahreswechsel
                              // ENDE Script
                              
                              

                              Im Prinzip das Ersatz Script für den guten alten Betriebsstundenzähler von @looxer01 .
                              Ich hab das Programm geliebt und bis heute in Betrieb, aber es macht mir Sorge, dass immer mehr Fehler im Prorammcode angezeigt werden (rote Wellenlinien) und es irgendwann nicht mehr geht. Viele der Funktionen hab ich in seinem Script nie verwendet - eigentlich hauptsächlich das aufsummieren von Verbräuchen - und so hab ich mir nun das eigene kleine und schlanke Script geschrieben, bevor das alte "absemmelt" 😎

                              Liebe Grüße
                              Tom

                              PS: @Ro75 : für deine Methode hab ich schon einen Anwendungsfall! Danke für diese Idee...

                              …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

                              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

                              744

                              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