Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Vorlage] Stromverbrauch protokollieren (Tag, Woche, Monat, Quartal, Jahr)

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Vorlage] Stromverbrauch protokollieren (Tag, Woche, Monat, Quartal, Jahr)

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

      ! ```
      `/* Strom Zaehlerstaende, Verbrauch und Kosten
      ! Skript dient zur Ermittlung des Stromverbrauchs bei Geräten,
      die mit den Homematic Zwischenstecker-Schaltaktor mit Leistungsmessung oder den FS20 EM1000 verbunden sind
      ! Zählerstände werden gespeichert jeweils
      -jeden Tag
      -jede Woche Montag
      -jeden Monatsersten
      -jeden Quartalsersten
      -jedes Neujahr
      wenn ein neuer Wert reinkommt.
      ! Der Strompreis wird in die Variable "Strompreis_aktuell" geschrieben.
      Änderungen des Strompreispreises müssen rechtzeitig per Cronjob programmiert werden.
      ! Die Stromkosten (Verbrauch * Preis) werden ebenso
      -jeden Tag
      -jede Woche Montag
      -jeden Monatsersten
      -jeden Quartalsersten
      -jedes Neujahr
      ! genullt und bis dahin durch die Berechnung (der Differenz des aktuellen Zählerstandes - Zählerstand Beginn des Zeitraums) * Strompreis ermittelt
      ! Der kumulierte Zählerstand berücksichtigt evtl. Resets und Überläufe der realen Zählerstände der Geräte.
      ! Todo: Wenn aktueller Zählerstand < letzter Zählerstand, dann push und korrektur
      wie hier: http://homematic-forum.de/forum/viewtopic.php?f=27&t=23688&p=201954&hilit=HM+ES+PMSw1+Pl+Zähler#p201959
      ! erstellt: 09.02.2016 von pix auf Basis des alten Skriptes
      01.03.2016 Leerzeichen werden aus Gerätenamen gelöscht
      */
      ! var logging = false;
      var instanz = 'javascript.0'; instanz = instanz + '.';
      var pfad = 'Strom.'; // Pfad innerhalb der Instanz
      var blacklist= ['-']; // persönliche Blacklist: Diese Teile werden aus den Homematic Gerätenamen entfernt
      ! // Variablen erstellen, Zählerstände einlesen und Stromkosten errechnen (pro Gerät)
      // Strompreis
      createState(pfad + 'Preis.aktuell.Arbeitspreis', 0.23, {
      name: 'Strompreis - aktueller Arbeitspreis (brutto)',
      unit: '€/kWh'
      });
      createState(pfad + 'Preis.aktuell.Grundpreis', 3.95, { // wird noch nicht eingerechnet
      name: 'Strompreis - aktueller Grundpreis (brutto)',
      unit: '€/Monat'
      });
      ! var idStrompreis = instanz + pfad + 'Preis.aktuell.Arbeitspreis';
      ! // Einlesen der aktuellen Daten vom Zähler
      on({id: /.METER|.ENERGY_COUNTER$/
      }, function(obj) {

      var idbyname = getIdByName(obj.common.name, true);
      if (logging) {   
          log('-------- Strommesser ---------');
          log('RegExp-Funktion ausgelöst');
          log('Gewerk:       ' + obj.role);   // undefined
          log('Beschreibung: ' + obj.desc);   // undefined
          log('id:           ' + obj.id);
          log('Name:         ' + obj.common.name);   // Waschmaschine Küche:2.ENERGY_COUNTER !!!!! Mac mini Strommessung.METER
          log('channel ID:   ' + obj.channelId);     // hm-rpc.0.MEQ0170864.2
          log('channel Name: ' + obj.channelName);   // Waschmaschine Küche:2
          log('device ID:    ' + obj.deviceId);      // hm-rpc.0.MEQ0170864
          log('device name:  ' + obj.deviceName);    // Küche Waschmaschine
          log('neuer Wert:   ' + obj.newState.val);  // 16499.699982
          log('alter Wert:   ' + obj.oldState.val);  // 16499.699982
          log('Einheit:      ' + obj.common.unit);   // Wh
          log('IDbyNameFunktion: ' + idbyname[0]); // hm-rpc.0.MEQ0170864.2.ENERGY_COUNTER
      }
      // Gerätenamen erstellen
      

      var geraetename = obj.deviceName;
      geraetename = geraetename.replace(/\s/g, ""); // per Regexp Leerzeichen entfernen
      if (logging) log('Gerätename: ' + geraetename);

      ! // States erstellen (CreateStates für dieses Gerät)
      erstelleStates (geraetename);

      // prüfe eingehende Daten
        // nicht nötig, da subscribe eh nur anspringt, wenn gelieferte Daten = oder > sind als alte (gt)
        // zweiter subscribe übernimmt das
      
      // prüfe und schreibe Daten  
      var idKumuliert =  instanz + pfad + geraetename + '.Zaehlerstand.kumuliert',
          idBackup =     instanz + pfad + geraetename + '.Zaehlerstand.Backup';
      
      if (obj.newState.val >= obj.oldState.val) {                                     // neuer Wert größer alter wert -> alles gut
          setState(idKumuliert, obj.newState.val + getState(idBackup).val);           // Kumulierten Wert mit Ist-Wert (inkl. Backup) synchronisieren
      } else {                                                                        // neuer Wert kleiner als alter Wert -> Achtung Zähler im Gerät übergelaufen oder genullt
          var differenz = obj.oldState.val - obj.newState.val;                        // Differenz berechnen
          setState(idBackup, getState(idBackup).val + differenz);                     // und Differenz und Backup addieren "und den Werteabriss ausgleichen"
          setState(idKumuliert, data.newState.val + getState(idBackup).val);          // damit neuer kumulierter Wert stetig weiter wächst
          meldung = 'Achtung!\n\n' 
                  + 'Der Stromzählerstand (' + geraetename + ') ist übergelaufen oder gelöscht worden (ggf. Stromausfall).\n'
                  + 'Der letzte Zählerstand vor dem Reset wird nun zum Neuen addiert. Bitte unbedingt die Werte prüfen. \n\n '
                  + 'ioBroker';
          betreff = 'ioBroker Meldung';
          prio = getState(OptinPushPrio).val;
          meldung_push(meldung, betreff, prio);
          log('Zählerstand (' + geraetename + ') übergelaufen oder genullt. Backup wird ab jetzt verwendet.', 'error');
      }
      
      // aktualisiere den Verbrauch und die Kosten
      berechneVerbrauchKosten(geraetename, (getState(idKumuliert).val / 1000).toFixed(3), getState(idStrompreis).val); // in kWh
      
      // ETAPPENWERTE SPEICHERN und RESETS DER WERTE #################################
      // Verzögerungen eingebaut. Resets, wenn die ersten Werte der neuen Etappe reinkommen
      if ( zeit(obj.oldState.ts).Stunde > zeit(obj.newState.ts).Stunde ) { // neue Stunde kleiner als alte Stunde (Mitternacht)
          setTimeout(function() {
              resetKostenVerbrauch(geraetename, 'Tag');
          }, 1000);
          setTimeout(function() {
              schreibeZaehlerstand(geraetename, 'Tag');
          }, 1500);
      }  
      if ( zeit(obj.oldState.ts).Wochentag ===  0 && zeit(obj.newState.ts).Wochentag === 1) { // So auf Mo
          setTimeout(function() {
              resetKostenVerbrauch(geraetename, 'Woche');
          }, 2000);
          setTimeout(function() {
              schreibeZaehlerstand(geraetename, 'Woche');
          }, 2500);
      }   
      if ( zeit(obj.oldState.ts).Tag > zeit(obj.newState.ts).Tag ) { // wenn alter Tag größer als neuer Tag (am 1\. eines Monats)   
          setTimeout(function() {
              resetKostenVerbrauch(geraetename, 'Monat');
          }, 3000);
          setTimeout(function() {
              schreibeZaehlerstand(geraetename, 'Monat');
          }, 3500);
      }    
      var old_month = parseInt(zeit(obj.oldState.ts).Monat,10);
      var new_month = parseInt(zeit(obj.state.ts).Monat, 10);
      // wenn obj.oldState.ts im März [3] und obj.newState.ts im April [4] oder
      //      obj.oldState.ts im Juni [6] und obj.newState.ts im Juli [7] oder
      //      obj.oldState.ts im Sept [9] und obj.newState.ts im Okt [10] oder
      //      obj.oldState.ts im Dez [12] und obj.newState.ts im Jan [1], dann Quartal
      //log('Monat (alt): ' + old_month);
      //log('Monat (neu): ' + new_month);
      if ( (old_month === 3 && new_month === 4)  || (old_month === 6 && new_month === 7)  || (old_month === 9 && new_month === 10)  || (old_month === 12 && new_month === 1) ) {
          setTimeout(function() {
              resetKostenVerbrauch(geraetename, 'Quartal');
          }, 4000);
          setTimeout(function() {
              schreibeZaehlerstand(geraetename, 'Quartal');
          }, 4500);
      }
      // wenn obj.oldState.ts im alten Jahr liegt, dann Jahr
      if (zeit(obj.oldState.ts).Jahr < zeit(jetzt).Jahr) {
          setTimeout(function() {
              resetKostenVerbrauch(geraetename, 'Jahr');
          }, 5000);
          setTimeout(function() {
              schreibeZaehlerstand(geraetename, 'Jahr');
          }, 5500);
      }
      if (logging) log('------------ ENDE ------------');
      

      });

      ! function schreibeZaehlerstand(geraet, zeitraum) {
      var idKumuliert = instanz + pfad + geraet + '.Zaehlerstand.kumuliert',
      idZaehlerstand = instanz + pfad + geraet + '.Zaehlerstand.' + zeitraum;
      // Zählerstand für übergebene Zeitraum und das Gerät in Wh auslesen
      setState(idZaehlerstand, parseFloat( (getState(idKumuliert).val / 1000).toFixed(3)) ); // und in kWh (mit drei Dezimalstellen) speichern (also durch 1000)

          // hier externe Protokollierung in Datei einbauen
      
          log('Zählerstände für das Gerät ' + geraet + ' (' + zeitraum + ') gespeichert');
      

      }

      ! function resetKostenVerbrauch(geraet, zeitraum) {
      setState(instanz + pfad + geraet + '.Kosten.' + zeitraum, 0); // Reset der Stromkosten für den übergebenen Zeitraum
      setState(instanz + pfad + geraet + '.Verbrauch.' + zeitraum, 0); // Reset des Stromverbrauchs für den übergebenen Zeitraum
      log('Stromkosten und Stromverbrauch für das Gerät ' + geraet + ' (' + zeitraum + ') zurückgesetzt');
      }
      ! function zeit (time) {
      jetzt = new Date(formatDate(time,"JJJJ.MM.TT SS:mm:ss"));
      var jahr = jetzt.getFullYear();
      var monat = (jetzt.getMonth()+1 < 10) ? '0' + (jetzt.getMonth()+1) : jetzt.getMonth()+1;
      var tag = (jetzt.getDate() < 10) ? '0' + jetzt.getDate() : jetzt.getDate();
      var wochentag = jetzt.getDay(); // startet am Sonntag mit 0
      var stunde = (jetzt.getHours() < 10) ? '0' + jetzt.getHours() : jetzt.getHours();
      var minute = (jetzt.getMinutes() < 10) ? '0' + jetzt.getMinutes() : jetzt.getMinutes();
      var sekunde = (jetzt.getSeconds() < 10) ? '0' + jetzt.getSeconds() : jetzt.getSeconds();
      return {
      'Jahr' : jahr,
      'Monat' : monat,
      'Tag' : tag,
      'Wochentag' : wochentag,
      'Stunde' : stunde,
      'Minute' : minute,
      'Sekunde' : sekunde
      };
      }
      ! function berechneVerbrauchKosten(geraet, zaehler, preis) { // bei jedem eingehenden Wert pro Gerät
      // Tag [Verbrauchskosten = (Zähler_ist - Zähler_Tagesbeginn) * Preis ] --- zaehler muss immer größer sein als Tages, Wochen, etc.-Wert
      setState(instanz + pfad + geraet + '.Verbrauch.Tag', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3) ) ); // Verbrauch an diesem Tag in kWh
      setState(instanz + pfad + geraet + '.Kosten.Tag', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val) * preis).toFixed(3) ) ); // Kosten an diesem Tag in €
      // Woche
      setState(instanz + pfad + geraet + '.Verbrauch.Woche', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val).toFixed(3) ) );
      setState(instanz + pfad + geraet + '.Kosten.Woche', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val) * preis).toFixed(3) ) );
      // Monat
      setState(instanz + pfad + geraet + '.Verbrauch.Monat', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val).toFixed(3) ) );
      setState(instanz + pfad + geraet + '.Kosten.Monat', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val) * preis).toFixed(3) ) );
      // Quartal
      setState(instanz + pfad + geraet + '.Verbrauch.Quartal', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val).toFixed(3) ) );
      setState(instanz + pfad + geraet + '.Kosten.Quartal', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val) * preis).toFixed(3) ) );
      // Jahr
      setState(instanz + pfad + geraet + '.Verbrauch.Jahr', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val).toFixed(3) ) );
      setState(instanz + pfad + geraet + '.Kosten.Jahr', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val) * preis).toFixed(3) ) );
      if (logging) log('Stromverbrauch und -kosten (' + geraet + ') aktualisiert');
      }
      ! function erstelleStates (geraet) {
      // Kumulierter Zählerstand (wird nie kleiner)
      createState(pfad + geraet + '.Zaehlerstand.kumuliert', 0, {name: 'Kumulierter Zählerstand (' + geraet + ') inkl. Backups', type: 'number', unit:'Wh'});

      // Zählerstand
      createState(pfad + geraet + '.Zaehlerstand.Tag',     0, {name: 'Zählerstand Tagesbeginn ('       + geraet + ')', type: 'mixed', unit:'kWh'});
      createState(pfad + geraet + '.Zaehlerstand.Woche',   0, {name: 'Zählerstand Wochenbeginn ('      + geraet + ')', type: 'mixed', unit:'kWh'});
      createState(pfad + geraet + '.Zaehlerstand.Monat',   0, {name: 'Zählerstand Monatsbeginn ('      + geraet + ')', type: 'mixed', unit:'kWh'});
      createState(pfad + geraet + '.Zaehlerstand.Quartal', 0, {name: 'Zählerstand Quartalsbeginn ('    + geraet + ')', type: 'mixed', unit:'kWh'});
      createState(pfad + geraet + '.Zaehlerstand.Jahr',    0, {name: 'Zählerstand Jahresbeginn ('      + geraet + ')', type: 'mixed', unit:'kWh'});
      
      // Backup Zählerstand
      createState(pfad + geraet + '.Zaehlerstand.Backup',  0, {
          name: 'Zählerstand Backup ('+ geraet + '), Differenz aus altem und neuem Wert nach Überlauf oder Reset',
          desc: 'wird beim Umspringen des Original-Zählerstandes (' + geraet + ') zu diesem addiert',
          type: 'number',
          unit: 'Wh'});
      
      // Verbrauch 
      createState(pfad + geraet + '.Verbrauch.Tag',        0, {name: 'Verbrauch seit Tagesbeginn ('    + geraet + ')', type: 'number', unit:'kWh'});
      createState(pfad + geraet + '.Verbrauch.Woche',      0, {name: 'Verbrauch seit Wochenbeginn ('   + geraet + ')', type: 'number', unit:'kWh'});
      createState(pfad + geraet + '.Verbrauch.Monat',      0, {name: 'Verbrauch seit Monatsbeginn ('   + geraet + ')', type: 'number', unit:'kWh'});
      createState(pfad + geraet + '.Verbrauch.Quartal',    0, {name: 'Verbrauch seit Quartalsbeginn (' + geraet + ')', type: 'number', unit:'kWh'});
      createState(pfad + geraet + '.Verbrauch.Jahr',       0, {name: 'Verbrauch seit Jahresbeginn ('   + geraet + ')', type: 'number', unit:'kWh'});
      
      // Stromkosten
      createState(pfad + geraet + '.Kosten.Tag',           0, {name: 'Stromkosten heute ('             + geraet + ')', type: 'number', unit:'€'  });
      createState(pfad + geraet + '.Kosten.Woche',         0, {name: 'Stromkosten Woche ('             + geraet + ')', type: 'number', unit:'€'  });
      createState(pfad + geraet + '.Kosten.Monat',         0, {name: 'Stromkosten Monat ('             + geraet + ')', type: 'number', unit:'€'  });
      createState(pfad + geraet + '.Kosten.Monat',         0, {name: 'Stromkosten Monat ('             + geraet + ')', type: 'number', unit:'€'  });
      createState(pfad + geraet + '.Kosten.Quartal',       0, {name: 'Stromkosten Quartal ('           + geraet + ')', type: 'number', unit:'€'  });
      createState(pfad + geraet + '.Kosten.Jahr',          0, {name: 'Stromkosten Jahr ('              + geraet + ')', type: 'number', unit:'€'  });
      
      if (logging) log('States in der Instanz ' + instanz + pfad + ' erstellt');   
      

      }

      ! function checkBlacklist (name) { // Unterfunktion von entferneDatenpukt
      for(var i = 0; i < blacklist.length; i++) { // Blacklist durchgehen
      if (name.indexOf(blacklist[i]) != -1) { // wenn vorhanden (nicht nicht vorhanden)
      return( name.substring(0, name.indexOf(blacklist[i])) ); // Zeichenketten aus der Blacklist löschen
      }
      }
      }
      ! function entferneDatenpunkt(geraet) {
      var rueckgabe;
      if (geraet.indexOf(":2.ENERGY_COUNTER") != -1) {
      rueckgabe = geraet.substring(0, geraet.indexOf(":2.ENERGY_COUNTER"));
      } else
      if (geraet.indexOf(".METER") != -1) {
      rueckgabe = geraet.substring(0, geraet.indexOf(".METER"));
      }
      // Rückgabe sollte keine Sonderzeichen oder Leerzeichen enthalten. Wenn doch, werden die entfernt oder ersetzt
      // todo
      rueckgabe = checkBlacklist(rueckgabe); // Wenn man keine Blacklist braucht, kann man diesen Teil auskommentieren
      return rueckgabe;
      }`
      ! So läuft das Skript bei mir! mit den gleichen Steckdosen (ein paar mehr davon)[/i][/i]

      1 Reply Last reply Reply Quote 0
      • Homoran
        Homoran Global Moderator Administrators last edited by

        @EVOlutionIX:

        Der nennt sich HM-ES-PMSw1-Pl hab ich aber in meinem anderen Post schon geschrieben 😉 `
        Sorry, ich hielt das für zwei verschiedene Geräte :oops:

        Also nur den einen Messaktor für den Kühlschrank?

        @Adnim:

        So läuft das Skript bei mir! mit den gleichen Steckdosen (ein paar mehr davon) `
        Danke!

        werde ich heute abend mal testen und Feedback geben.

        @pix

        Wenn ich das verifizieren kann, soll ich dann den Code im ersten Post austauschen?

        aut Changelog müsste das dann dieses sein:
        > EDIT 17.12.2017 Lösung für Homematic-Dateinamen mit Punkten gibt es hier (von peoples) - noch nicht eingepflegt
        Meine haben aber keine Punkte.

        Gruß

        Rainer

        1 Reply Last reply Reply Quote 0
        • E
          EVOlutionIX last edited by

          @Adnim:

          ! ```
          `/* Strom Zaehlerstaende, Verbrauch und Kosten
          ! Skript dient zur Ermittlung des Stromverbrauchs bei Geräten,
          die mit den Homematic Zwischenstecker-Schaltaktor mit Leistungsmessung oder den FS20 EM1000 verbunden sind
          ! Zählerstände werden gespeichert jeweils
          -jeden Tag
          -jede Woche Montag
          -jeden Monatsersten
          -jeden Quartalsersten
          -jedes Neujahr
          wenn ein neuer Wert reinkommt.
          ! Der Strompreis wird in die Variable "Strompreis_aktuell" geschrieben.
          Änderungen des Strompreispreises müssen rechtzeitig per Cronjob programmiert werden.
          ! Die Stromkosten (Verbrauch * Preis) werden ebenso
          -jeden Tag
          -jede Woche Montag
          -jeden Monatsersten
          -jeden Quartalsersten
          -jedes Neujahr
          ! genullt und bis dahin durch die Berechnung (der Differenz des aktuellen Zählerstandes - Zählerstand Beginn des Zeitraums) * Strompreis ermittelt
          ! Der kumulierte Zählerstand berücksichtigt evtl. Resets und Überläufe der realen Zählerstände der Geräte.
          ! Todo: Wenn aktueller Zählerstand < letzter Zählerstand, dann push und korrektur
          wie hier: http://homematic-forum.de/forum/viewtopic.php?f=27&t=23688&p=201954&hilit=HM+ES+PMSw1+Pl+Zähler#p201959
          ! erstellt: 09.02.2016 von pix auf Basis des alten Skriptes
          01.03.2016 Leerzeichen werden aus Gerätenamen gelöscht
          */
          ! var logging = false;
          var instanz = 'javascript.0'; instanz = instanz + '.';
          var pfad = 'Strom.'; // Pfad innerhalb der Instanz
          var blacklist= ['-']; // persönliche Blacklist: Diese Teile werden aus den Homematic Gerätenamen entfernt
          ! // Variablen erstellen, Zählerstände einlesen und Stromkosten errechnen (pro Gerät)
          // Strompreis
          createState(pfad + 'Preis.aktuell.Arbeitspreis', 0.23, {
          name: 'Strompreis - aktueller Arbeitspreis (brutto)',
          unit: '€/kWh'
          });
          createState(pfad + 'Preis.aktuell.Grundpreis', 3.95, { // wird noch nicht eingerechnet
          name: 'Strompreis - aktueller Grundpreis (brutto)',
          unit: '€/Monat'
          });
          ! var idStrompreis = instanz + pfad + 'Preis.aktuell.Arbeitspreis';
          ! // Einlesen der aktuellen Daten vom Zähler
          on({id: /.METER|.ENERGY_COUNTER$/
          }, function(obj) {

          var idbyname = getIdByName(obj.common.name, true);
          if (logging) {   
              log('-------- Strommesser ---------');
              log('RegExp-Funktion ausgelöst');
              log('Gewerk:       ' + obj.role);   // undefined
              log('Beschreibung: ' + obj.desc);   // undefined
              log('id:           ' + obj.id);
              log('Name:         ' + obj.common.name);   // Waschmaschine Küche:2.ENERGY_COUNTER !!!!! Mac mini Strommessung.METER
              log('channel ID:   ' + obj.channelId);     // hm-rpc.0.MEQ0170864.2
              log('channel Name: ' + obj.channelName);   // Waschmaschine Küche:2
              log('device ID:    ' + obj.deviceId);      // hm-rpc.0.MEQ0170864
              log('device name:  ' + obj.deviceName);    // Küche Waschmaschine
              log('neuer Wert:   ' + obj.newState.val);  // 16499.699982
              log('alter Wert:   ' + obj.oldState.val);  // 16499.699982
              log('Einheit:      ' + obj.common.unit);   // Wh
              log('IDbyNameFunktion: ' + idbyname[0]); // hm-rpc.0.MEQ0170864.2.ENERGY_COUNTER
          }
          // Gerätenamen erstellen
          

          var geraetename = obj.deviceName;
          geraetename = geraetename.replace(/\s/g, ""); // per Regexp Leerzeichen entfernen
          if (logging) log('Gerätename: ' + geraetename);

          ! // States erstellen (CreateStates für dieses Gerät)
          erstelleStates (geraetename);

          // prüfe eingehende Daten
            // nicht nötig, da subscribe eh nur anspringt, wenn gelieferte Daten = oder > sind als alte (gt)
            // zweiter subscribe übernimmt das
            
          // prüfe und schreibe Daten  
          var idKumuliert =  instanz + pfad + geraetename + '.Zaehlerstand.kumuliert',
              idBackup =     instanz + pfad + geraetename + '.Zaehlerstand.Backup';
          
          if (obj.newState.val >= obj.oldState.val) {                                     // neuer Wert größer alter wert -> alles gut
              setState(idKumuliert, obj.newState.val + getState(idBackup).val);           // Kumulierten Wert mit Ist-Wert (inkl. Backup) synchronisieren
          } else {                                                                        // neuer Wert kleiner als alter Wert -> Achtung Zähler im Gerät übergelaufen oder genullt
              var differenz = obj.oldState.val - obj.newState.val;                        // Differenz berechnen
              setState(idBackup, getState(idBackup).val + differenz);                     // und Differenz und Backup addieren "und den Werteabriss ausgleichen"
              setState(idKumuliert, data.newState.val + getState(idBackup).val);          // damit neuer kumulierter Wert stetig weiter wächst
              meldung = 'Achtung!\n\n' 
                      + 'Der Stromzählerstand (' + geraetename + ') ist übergelaufen oder gelöscht worden (ggf. Stromausfall).\n'
                      + 'Der letzte Zählerstand vor dem Reset wird nun zum Neuen addiert. Bitte unbedingt die Werte prüfen. \n\n '
                      + 'ioBroker';
              betreff = 'ioBroker Meldung';
              prio = getState(OptinPushPrio).val;
              meldung_push(meldung, betreff, prio);
              log('Zählerstand (' + geraetename + ') übergelaufen oder genullt. Backup wird ab jetzt verwendet.', 'error');
          }
          
          // aktualisiere den Verbrauch und die Kosten
          berechneVerbrauchKosten(geraetename, (getState(idKumuliert).val / 1000).toFixed(3), getState(idStrompreis).val); // in kWh
          
          // ETAPPENWERTE SPEICHERN und RESETS DER WERTE #################################
          // Verzögerungen eingebaut. Resets, wenn die ersten Werte der neuen Etappe reinkommen
          if ( zeit(obj.oldState.ts).Stunde > zeit(obj.newState.ts).Stunde ) { // neue Stunde kleiner als alte Stunde (Mitternacht)
              setTimeout(function() {
                  resetKostenVerbrauch(geraetename, 'Tag');
              }, 1000);
              setTimeout(function() {
                  schreibeZaehlerstand(geraetename, 'Tag');
              }, 1500);
          }  
          if ( zeit(obj.oldState.ts).Wochentag ===  0 && zeit(obj.newState.ts).Wochentag === 1) { // So auf Mo
              setTimeout(function() {
                  resetKostenVerbrauch(geraetename, 'Woche');
              }, 2000);
              setTimeout(function() {
                  schreibeZaehlerstand(geraetename, 'Woche');
              }, 2500);
          }   
          if ( zeit(obj.oldState.ts).Tag > zeit(obj.newState.ts).Tag ) { // wenn alter Tag größer als neuer Tag (am 1\. eines Monats)   
              setTimeout(function() {
                  resetKostenVerbrauch(geraetename, 'Monat');
              }, 3000);
              setTimeout(function() {
                  schreibeZaehlerstand(geraetename, 'Monat');
              }, 3500);
          }    
          var old_month = parseInt(zeit(obj.oldState.ts).Monat,10);
          var new_month = parseInt(zeit(obj.state.ts).Monat, 10);
          // wenn obj.oldState.ts im März [3] und obj.newState.ts im April [4] oder
          //      obj.oldState.ts im Juni [6] und obj.newState.ts im Juli [7] oder
          //      obj.oldState.ts im Sept [9] und obj.newState.ts im Okt [10] oder
          //      obj.oldState.ts im Dez [12] und obj.newState.ts im Jan [1], dann Quartal
          //log('Monat (alt): ' + old_month);
          //log('Monat (neu): ' + new_month);
          if ( (old_month === 3 && new_month === 4)  || (old_month === 6 && new_month === 7)  || (old_month === 9 && new_month === 10)  || (old_month === 12 && new_month === 1) ) {
              setTimeout(function() {
                  resetKostenVerbrauch(geraetename, 'Quartal');
              }, 4000);
              setTimeout(function() {
                  schreibeZaehlerstand(geraetename, 'Quartal');
              }, 4500);
          }
          // wenn obj.oldState.ts im alten Jahr liegt, dann Jahr
          if (zeit(obj.oldState.ts).Jahr < zeit(jetzt).Jahr) {
              setTimeout(function() {
                  resetKostenVerbrauch(geraetename, 'Jahr');
              }, 5000);
              setTimeout(function() {
                  schreibeZaehlerstand(geraetename, 'Jahr');
              }, 5500);
          }
          if (logging) log('------------ ENDE ------------');
          

          });

          ! function schreibeZaehlerstand(geraet, zeitraum) {
          var idKumuliert = instanz + pfad + geraet + '.Zaehlerstand.kumuliert',
          idZaehlerstand = instanz + pfad + geraet + '.Zaehlerstand.' + zeitraum;
          // Zählerstand für übergebene Zeitraum und das Gerät in Wh auslesen
          setState(idZaehlerstand, parseFloat( (getState(idKumuliert).val / 1000).toFixed(3)) ); // und in kWh (mit drei Dezimalstellen) speichern (also durch 1000)

              // hier externe Protokollierung in Datei einbauen
              
              log('Zählerstände für das Gerät ' + geraet + ' (' + zeitraum + ') gespeichert');
          

          }

          ! function resetKostenVerbrauch(geraet, zeitraum) {
          setState(instanz + pfad + geraet + '.Kosten.' + zeitraum, 0); // Reset der Stromkosten für den übergebenen Zeitraum
          setState(instanz + pfad + geraet + '.Verbrauch.' + zeitraum, 0); // Reset des Stromverbrauchs für den übergebenen Zeitraum
          log('Stromkosten und Stromverbrauch für das Gerät ' + geraet + ' (' + zeitraum + ') zurückgesetzt');
          }
          ! function zeit (time) {
          jetzt = new Date(formatDate(time,"JJJJ.MM.TT SS:mm:ss"));
          var jahr = jetzt.getFullYear();
          var monat = (jetzt.getMonth()+1 < 10) ? '0' + (jetzt.getMonth()+1) : jetzt.getMonth()+1;
          var tag = (jetzt.getDate() < 10) ? '0' + jetzt.getDate() : jetzt.getDate();
          var wochentag = jetzt.getDay(); // startet am Sonntag mit 0
          var stunde = (jetzt.getHours() < 10) ? '0' + jetzt.getHours() : jetzt.getHours();
          var minute = (jetzt.getMinutes() < 10) ? '0' + jetzt.getMinutes() : jetzt.getMinutes();
          var sekunde = (jetzt.getSeconds() < 10) ? '0' + jetzt.getSeconds() : jetzt.getSeconds();
          return {
          'Jahr' : jahr,
          'Monat' : monat,
          'Tag' : tag,
          'Wochentag' : wochentag,
          'Stunde' : stunde,
          'Minute' : minute,
          'Sekunde' : sekunde
          };
          }
          ! function berechneVerbrauchKosten(geraet, zaehler, preis) { // bei jedem eingehenden Wert pro Gerät
          // Tag [Verbrauchskosten = (Zähler_ist - Zähler_Tagesbeginn) * Preis ] --- zaehler muss immer größer sein als Tages, Wochen, etc.-Wert
          setState(instanz + pfad + geraet + '.Verbrauch.Tag', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3) ) ); // Verbrauch an diesem Tag in kWh
          setState(instanz + pfad + geraet + '.Kosten.Tag', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val) * preis).toFixed(3) ) ); // Kosten an diesem Tag in €
          // Woche
          setState(instanz + pfad + geraet + '.Verbrauch.Woche', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val).toFixed(3) ) );
          setState(instanz + pfad + geraet + '.Kosten.Woche', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val) * preis).toFixed(3) ) );
          // Monat
          setState(instanz + pfad + geraet + '.Verbrauch.Monat', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val).toFixed(3) ) );
          setState(instanz + pfad + geraet + '.Kosten.Monat', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val) * preis).toFixed(3) ) );
          // Quartal
          setState(instanz + pfad + geraet + '.Verbrauch.Quartal', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val).toFixed(3) ) );
          setState(instanz + pfad + geraet + '.Kosten.Quartal', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val) * preis).toFixed(3) ) );
          // Jahr
          setState(instanz + pfad + geraet + '.Verbrauch.Jahr', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val).toFixed(3) ) );
          setState(instanz + pfad + geraet + '.Kosten.Jahr', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val) * preis).toFixed(3) ) );
          if (logging) log('Stromverbrauch und -kosten (' + geraet + ') aktualisiert');
          }
          ! function erstelleStates (geraet) {
          // Kumulierter Zählerstand (wird nie kleiner)
          createState(pfad + geraet + '.Zaehlerstand.kumuliert', 0, {name: 'Kumulierter Zählerstand (' + geraet + ') inkl. Backups', type: 'number', unit:'Wh'});

          // Zählerstand
          createState(pfad + geraet + '.Zaehlerstand.Tag',     0, {name: 'Zählerstand Tagesbeginn ('       + geraet + ')', type: 'mixed', unit:'kWh'});
          createState(pfad + geraet + '.Zaehlerstand.Woche',   0, {name: 'Zählerstand Wochenbeginn ('      + geraet + ')', type: 'mixed', unit:'kWh'});
          createState(pfad + geraet + '.Zaehlerstand.Monat',   0, {name: 'Zählerstand Monatsbeginn ('      + geraet + ')', type: 'mixed', unit:'kWh'});
          createState(pfad + geraet + '.Zaehlerstand.Quartal', 0, {name: 'Zählerstand Quartalsbeginn ('    + geraet + ')', type: 'mixed', unit:'kWh'});
          createState(pfad + geraet + '.Zaehlerstand.Jahr',    0, {name: 'Zählerstand Jahresbeginn ('      + geraet + ')', type: 'mixed', unit:'kWh'});
                  
          // Backup Zählerstand
          createState(pfad + geraet + '.Zaehlerstand.Backup',  0, {
              name: 'Zählerstand Backup ('+ geraet + '), Differenz aus altem und neuem Wert nach Überlauf oder Reset',
              desc: 'wird beim Umspringen des Original-Zählerstandes (' + geraet + ') zu diesem addiert',
              type: 'number',
              unit: 'Wh'});
              
          // Verbrauch 
          createState(pfad + geraet + '.Verbrauch.Tag',        0, {name: 'Verbrauch seit Tagesbeginn ('    + geraet + ')', type: 'number', unit:'kWh'});
          createState(pfad + geraet + '.Verbrauch.Woche',      0, {name: 'Verbrauch seit Wochenbeginn ('   + geraet + ')', type: 'number', unit:'kWh'});
          createState(pfad + geraet + '.Verbrauch.Monat',      0, {name: 'Verbrauch seit Monatsbeginn ('   + geraet + ')', type: 'number', unit:'kWh'});
          createState(pfad + geraet + '.Verbrauch.Quartal',    0, {name: 'Verbrauch seit Quartalsbeginn (' + geraet + ')', type: 'number', unit:'kWh'});
          createState(pfad + geraet + '.Verbrauch.Jahr',       0, {name: 'Verbrauch seit Jahresbeginn ('   + geraet + ')', type: 'number', unit:'kWh'});
                  
          // Stromkosten
          createState(pfad + geraet + '.Kosten.Tag',           0, {name: 'Stromkosten heute ('             + geraet + ')', type: 'number', unit:'€'  });
          createState(pfad + geraet + '.Kosten.Woche',         0, {name: 'Stromkosten Woche ('             + geraet + ')', type: 'number', unit:'€'  });
          createState(pfad + geraet + '.Kosten.Monat',         0, {name: 'Stromkosten Monat ('             + geraet + ')', type: 'number', unit:'€'  });
          createState(pfad + geraet + '.Kosten.Monat',         0, {name: 'Stromkosten Monat ('             + geraet + ')', type: 'number', unit:'€'  });
          createState(pfad + geraet + '.Kosten.Quartal',       0, {name: 'Stromkosten Quartal ('           + geraet + ')', type: 'number', unit:'€'  });
          createState(pfad + geraet + '.Kosten.Jahr',          0, {name: 'Stromkosten Jahr ('              + geraet + ')', type: 'number', unit:'€'  });
                  
          if (logging) log('States in der Instanz ' + instanz + pfad + ' erstellt');   
          

          }

          ! function checkBlacklist (name) { // Unterfunktion von entferneDatenpukt
          for(var i = 0; i < blacklist.length; i++) { // Blacklist durchgehen
          if (name.indexOf(blacklist[i]) != -1) { // wenn vorhanden (nicht nicht vorhanden)
          return( name.substring(0, name.indexOf(blacklist[i])) ); // Zeichenketten aus der Blacklist löschen
          }
          }
          }
          ! function entferneDatenpunkt(geraet) {
          var rueckgabe;
          if (geraet.indexOf(":2.ENERGY_COUNTER") != -1) {
          rueckgabe = geraet.substring(0, geraet.indexOf(":2.ENERGY_COUNTER"));
          } else
          if (geraet.indexOf(".METER") != -1) {
          rueckgabe = geraet.substring(0, geraet.indexOf(".METER"));
          }
          // Rückgabe sollte keine Sonderzeichen oder Leerzeichen enthalten. Wenn doch, werden die entfernt oder ersetzt
          // todo
          rueckgabe = checkBlacklist(rueckgabe); // Wenn man keine Blacklist braucht, kann man diesen Teil auskommentieren
          return rueckgabe;
          }! So läuft das Skript bei mir! mit den gleichen Steckdosen (ein paar mehr davon) ! Genial das Skript läuft bei mir ohne Fehler, die Objekte wurden richtig erzeugt und werden auch schon gefüllt. ! Vielen Dank für die tatkräftige Hilfe hier aus dem Forum ! Gruß Marcus[/i][/i] ```

          1 Reply Last reply Reply Quote 0
          • E
            EVOlutionIX last edited by

            @Homoran:

            @EVOlutionIX:

            Der nennt sich HM-ES-PMSw1-Pl hab ich aber in meinem anderen Post schon geschrieben 😉 `
            Sorry, ich hielt das für zwei verschiedene Geräte :oops:

            Also nur den einen Messaktor für den Kühlschrank?

            @Adnim:

            So läuft das Skript bei mir! mit den gleichen Steckdosen (ein paar mehr davon) `
            Danke!

            werde ich heute abend mal testen und Feedback geben.

            @pix

            Wenn ich das verifizieren kann, soll ich dann den Code im ersten Post austauschen?

            aut Changelog müsste das dann dieses sein:
            > EDIT 17.12.2017 Lösung für Homematic-Dateinamen mit Punkten gibt es hier (von peoples) - noch nicht eingepflegt
            Meine haben aber keine Punkte.

            Gruß

            Rainer `

            Ja richtig im Moment noch, nur ein Messaktor für den Kühlschrank.

            Danke für die tatkräftige Unterstützung Gruß Marcus

            1 Reply Last reply Reply Quote 0
            • Q
              Qlink last edited by

              @pix:

              Ich habe den Code noch nicht angepasst, da ich zum neuen Jahr evtl. das Skript erneuern will. Ich denke, ich werde in Richtung "Auswertung von History Daten" gehen, statt selbst eine Backup-Variable mitlaufen zu lassen.

              Gruß

              Pix `

              Hi pix,

              vielen Dank für das super Skript!

              Wie ist denn der Status deiner geplanten Erneuerung des Skripts ?

              Lässt sich daraus eventuell gleich eine Art Universellen Statistik Adapter daraus erstellen, oder bedeutet das einen ungleich höheren Mehraufwand ?

              Beste Grüße

              1 Reply Last reply Reply Quote 0
              • D
                dering last edited by

                hallo zusammen,

                ich habe das Skript auch genutzt, jedoch immer wieder Problemchen gehabt. Ich habe nun begonnen das Skript zu optimieren und neue Funktionen einzubauen.

                Damit man sich nicht alles aus den Beiträgen zusammen suchen muss, habe ich ein github Repo erstellt:

                https://github.com/hdering/homematic_st … okollieren

                Wenn jemand Probleme hat oder Vorschläge hat, kann sie gerne in github eintragen.

                1 Reply Last reply Reply Quote 0
                • P
                  ple last edited by

                  Erst mal vielen Dank für dein Script.

                  ich bin im Moment auf der Suche nach einem ausfallsicheren Script, da das jetzige leider nach einen Neustart die Werte verliert.

                  Das ist ungünstig.

                  Was ich mir wünschen würde.

                  Speicherung des vorherigen Tages, Woche, Monat und Jahr.

                  Also den Wert kurz vor Mitternacht eben rüberschicken auf vorheriger Tag usw.

                  Das kann man dann schön mit History loggen.

                  Mal schauen ob ich meine WMBus Wärmemengenzähler auch integrieren kann.

                  Gruß

                  1 Reply Last reply Reply Quote 0
                  • K
                    Kampfratte last edited by

                    Hallo zusammen,

                    da ich mich nun erst seit ca. 5 oder 6 Wochen mit ioBroker beschäftige, bin ich noch nicht so fit drin.

                    Würde mein Stromverbrauch auch gerne protokollieren.

                    Könnte mir jemand von euch behilflich sein, wie ich das machen muss, dass das bei mir auch funktioniert?

                    Wäre echt super.

                    Edit: Habe es nun selbst geschafft, das Script von github.com zum laufen zu bringen, da mir das am meissten zu gesagt hat wegen der speicherung von den z. B. letzten 7 Tagen behalten werden und nicht nur der aktuelle Tag erhalten bleibt.

                    1 Reply Last reply Reply Quote 0
                    • J
                      Jan007 last edited by

                      @dering:

                      hallo zusammen,

                      ich habe das Skript auch genutzt, jedoch immer wieder Problemchen gehabt. Ich habe nun begonnen das Skript zu optimieren und neue Funktionen einzubauen.

                      Damit man sich nicht alles aus den Beiträgen zusammen suchen muss, habe ich ein github Repo erstellt:

                      https://github.com/hdering/homematic_st … okollieren

                      Wenn jemand Probleme hat oder Vorschläge hat, kann sie gerne in github eintragen. `

                      Hallo Dering,

                      Dein Script gefällt mir Super und Funktioniert soweit auch…

                      wo ich etwas hänge ist, wo ich die Strompreis - aktueller Arbeitspreis (brutto) und Strompreis - aktueller Grundpreis (brutto) eintragen soll?

                      Wenn ich es wie im OriginalScript (Zeile 41?) mache, kommt zwar kein Fehler, aber die Werte im Iobroker stehen immer noch auf 0 :? Und wenn ich die Werte im Iobroker ändere, werden sie wieder auf 0 geändert.

                      Sorry für die Frage, aber ich bin neu im Iobroker und habe vorher 5 Jahre mit Fhem gearbeitet und lese die Werte über Volkszähler ein und werden auch Berechnet 😄 nur leider kann ich meine Tarife nicht eintragen... Es müssten ja mehrere eingabepunkte im Script sein, weil ich ja auch mein Wasserverbrauch Berechne und der andere Preise als Strom hat.

                      LG Jan

                      1 Reply Last reply Reply Quote 0
                      • Dutchman
                        Dutchman Developer Most Active Administrators last edited by

                        @Jan007:

                        wo ich etwas hänge ist, wo ich die Strompreis - aktueller Arbeitspreis (brutto) und Strompreis - aktueller Grundpreis (brutto) eintragen soll?

                        Wenn ich es wie im OriginalScript (Zeile 41?) mache, kommt zwar kein Fehler, aber die Werte im Iobroker stehen immer noch auf 0 :? `

                        Hast du die neuste Version (1.3.3) laufen ?

                        Die Preise legt man unter dem objecten ab im Script brauch man nichts zu machen

                        Entweder unter Preise oder unter eigenen preis pro Zähler (wen du das im Script auf true gestellt hast)

                        ~~![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201804 ... 1b92b9.jpg">https://uploads.tapatalk-cdn.com/20180417/084b3864e5515d98f9644b42fd1b92b9.jpg</link_text>" />

                        –-----------------------

                        Send from mobile device

                        Das schöne ios hat Auto Korrektur zum k****

                        Wer Schreibfehler findet darf sie behalten oder auf eBay verkaufen, mindest Umsatz 10% für die community~~

                        1 Reply Last reply Reply Quote 0
                        • J
                          Jan007 last edited by

                          Hallo Dutchman,

                          hat geklappt… habe Webseite neu geladen, dann war der Preis da 😄

                          Ich logge ja meinen Zähler über den VolkszählerSript und bekomme die Werte Aktuell als Reading... (744.517 W) und der Stromverbrauchssript hat es am Anfang auch richtig eingelesen nur das Problem ist, das er es scheinbar zu oft einliest oder es falsch versteht... Ich habe den Sript jetzt eine halbe stunde laufen bei kaum schwankenden 750 Watt verbrauch... nur die Berechnung sagt mir einen Tagesverbrauch bis jetzt von über 10 KW an :shock: :?
                          6896_iobroker.jpg

                          1 Reply Last reply Reply Quote 0
                          • M
                            MichaelJaD last edited by

                            Ich wollte dieses Script nutzen um meinen Wert vom Stromzähler auszuwerten den ich mit dem Smartmeter Adapter auslese.

                            Dieser Wert ist aber in kwh. Ich verstehe leider noch nicht ganz wo ich da die Anpassung mach muss? Die berechneten Werte werden alle als Wh gespeichert, obwohl das kWh sind. Heißt eigentlich müssen 9kWh gespeichert werden, es werden aber 0,009kWh gespeichert.

                            Setup:

                            ! //–--------------------------------------------------------------------------//
                            ! // +++++++++ USER ANPASSUNGEN ++++++++++++++++++++++++
                            ! // debug logging
                            ! var logging = true;
                            ! // Aktivieren der History Instanz
                            ! var enable_history = false;
                            ! // history Instanz
                            ! var instance_history = 'history.0';
                            ! // Geräte können unterschiedliche Preise haben
                            ! var enable_unterschiedlichePreise = true;
                            ! // Speichern der Werte in zusätzlichen Objekten.
                            ! // Wenn 0, dann deaktiviert
                            ! var Tag_Anzahl_Werte_in_der_Vergangenheit = 7;
                            ! var Woche_Anzahl_Werte_in_der_Vergangenheit = 4;
                            ! var Monat_Anzahl_Werte_in_der_Vergangenheit = 12;
                            ! var Quartal_Anzahl_Werte_in_der_Vergangenheit = 4;
                            ! var Jahr_Anzahl_Werte_in_der_Vergangenheit = 2;
                            ! // Grundpreis einberechnen
                            ! var enable_Grundpreis_einberechnen = true;
                            ! var instance = '0';
                            ! var instanz = 'javascript.' + instance + '.';
                            ! // Pfad innerhalb der Instanz
                            ! var pfad = 'Verbrauchszaehler.';
                            ! var default_unit = 'Wh';
                            ! var default_unit_kilo = 'kWh';
                            ! // Diese Teile werden aus den Gerätenamen entfernt
                            ! var blacklist = [':1', ':2', ':3', ':4', ':5', ':6', ':7', ':8'];
                            ! var AnzahlKommastellenKosten = 2;
                            ! var AnzahlKommastellenVerbrauch = 3;
                            ! var AnzahlKommastellenZaehlerstand = 3;
                            ! var KumulierterWertIstBereitsInKilo = false;
                            ! var umrechnung = getState("smartmeter.0.1-0:1_8_0255.value").val * 1000;
                            ! log (umrechnung);
                            ! var eigeneDatenpunkte = [
                            ! // Beispiel:
                            ! // ['Datenpunkt', 'Aliasname', 'Einheit kumulierter Wert', 'Einheit berechnete Werte (kilo/1000)' ],
                            ! [ 'smartmeter.0.1-0:1_8_0
                            255.value', 'Verbrauchszähler.Strom', 'Wh', 'kWh' ],
                            ! // [ 'javascript.1.MeinSonoffGeraet1', 'Strom.Sonoff.MeinSonoffGeraet1', 'Wh', 'kWh' ],
                            ! // [ 'javascript.1.MeinSonoffGeraet2', 'Strom.Sonoff.MeinSonoffGeraet2', 'kWh', 'kWh' ],
                            ! // [ 'javascript.1.MeineGas1', 'Gas.MeinGaszaehler1', 'm3', 'm3' ],
                            ! // [ 'javascript.1.MeineGas2', 'Gas.MeinGaszaehler2', 'm3', 'm3' ],
                            ! ];

                            nach dem Start des Sriptes:

                            script.js.Smartmeter.Verbrauchszähler: Alias:Verbrauchszähler.Strom Datenpunkt:smartmeter.0.1-0:1_8_0*255.value Einheit:Wh Einheit_kilo:kWh

                            Log nach dem ein neuer Wert erkannt wurde:

                            ! javascript.0 2018-04-21 06:01:42.298 info script.js.Smartmeter.Verbrauchszähler: –---------- ENDE ------------
                            ! javascript.0 2018-04-21 06:01:42.298 info script.js.Smartmeter.Verbrauchszähler: Stromverbrauch (Verbrauchszähler.Strom) aktualisiert
                            ! javascript.0 2018-04-21 06:01:42.297 info script.js.Smartmeter.Verbrauchszähler: Stromkosten (Verbrauchszähler.Strom) aktualisiert
                            ! javascript.0 2018-04-21 06:01:42.297 info script.js.Smartmeter.Verbrauchszähler: Das Gerät:Verbrauchszähler.Strom hat eigenen Grundpreis: 6.65
                            ! javascript.0 2018-04-21 06:01:42.297 info script.js.Smartmeter.Verbrauchszähler: Das Gerät:Verbrauchszähler.Strom hat eigenen Strompreis: 26.28
                            ! javascript.0 2018-04-21 06:01:42.297 info script.js.Smartmeter.Verbrauchszähler: States in der Instanz javascript.0.Verbrauchszaehler. erstellt
                            ! javascript.0 2018-04-21 06:01:42.297 info script.js.Smartmeter.Verbrauchszähler: Nach der Aufbereitung: Verbrauchszähler.Strom
                            ! javascript.0 2018-04-21 06:01:42.297 info script.js.Smartmeter.Verbrauchszähler: Es wird der Aliasname gesetzt:Verbrauchszähler.Strom
                            ! javascript.0 2018-04-21 06:01:42.297 info script.js.Smartmeter.Verbrauchszähler: entferneDatenpunkt - rueckgabe4:1-0
                            ! javascript.0 2018-04-21 06:01:42.297 info script.js.Smartmeter.Verbrauchszähler: entferneDatenpunkt - rueckgabe3:1-0
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: entferneDatenpunkt - rueckgabe2:1-0
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: entferneDatenpunkt - rueckgabe1:1-0:1_8_0255.value
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: vor der Aufbereitung: 1-0:1_8_0
                            255.value
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: alter Wert: 11630.542
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: neuer Wert: 11630.544
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: device name: null
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: device ID: null
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: channel Name: Zählerstand 1 Summe Wirkarbeit Bezug + (Total)
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: channel ID: smartmeter.0.1-0:1_8_0255
                            ! javascript.0 2018-04-21 06:01:42.296 info script.js.Smartmeter.Verbrauchszähler: Name: 1-0:1_8_0
                            255.value
                            ! javascript.0 2018-04-21 06:01:42.295 info script.js.Smartmeter.Verbrauchszähler: id: smartmeter.0.1-0:1_8_0*255.value
                            ! javascript.0 2018-04-21 06:01:42.295 info script.js.Smartmeter.Verbrauchszähler: RegExp-Funktion ausgelöst
                            ! javascript.0 2018-04-21 06:01:42.294 info script.js.Smartmeter.Verbrauchszähler: -------- Strommesser ---------

                            EDIT:

                            Habe das geändert:

                            var KumulierterWertIstBereitsInKilo = true;

                            und

                            [ 'smartmeter.0.1-0:1_8_0*255.value', 'Verbrauchszähler.Strom', '~~[b]~~kWh', 'kWh' ],

                            mal schauen was passiert.

                            1 Reply Last reply Reply Quote 0
                            • Dutchman
                              Dutchman Developer Most Active Administrators last edited by

                              Und genau das war's auch schon….

                              So habe ich es auch laufen


                              Send from mobile device

                              Das schöne ios hat Auto Korrektur zum k****

                              Wer Schreibfehler findet darf sie behalten oder auf eBay verkaufen, mindest Umsatz 10% für die community

                              1 Reply Last reply Reply Quote 0
                              • M
                                MichaelJaD last edited by

                                Jo das war das Problem. Jetzt habe ich richtige Werte.

                                1 Reply Last reply Reply Quote 0
                                • hg6806
                                  hg6806 Most Active last edited by

                                  Super Skript - danke an den/die Entwickler!

                                  Ich habe ich 2 Smartmeter am Laufen und ein Homematic Leistungsmesser.

                                  Wie kann ich alle erfassen? Muss ich für jeden Zähler ein eigenes Skript haben?

                                  Bei mir wurde ein Ordner "Leistungsmesseraußen" in javascript.0/Verbrauchszaehler angelegt.

                                  Woher kommt der Name "Leistungsmesseraußen"?

                                  1 Reply Last reply Reply Quote 0
                                  • P
                                    pix last edited by eric2905

                                    Hallo,

                                    ich empfehle, diese Weiterentwicklung des Skriptes zu verwenden:

                                    viewtopic.php?f=21&t=12272&hilit=stromverbrauch#p129952

                                    Gruß

                                    Pix

                                    1 Reply Last reply Reply Quote 0
                                    • ?
                                      A Former User last edited by

                                      HI,

                                      eine Frage, wie gebe ich das Ablesedatum ein damit die Zähler ab dem Zeitpunkt von 0 anfangen?

                                      Danke Tobias

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      830
                                      Online

                                      31.9k
                                      Users

                                      80.1k
                                      Topics

                                      1.3m
                                      Posts

                                      42
                                      148
                                      46463
                                      Loading More Posts
                                      • Oldest to Newest
                                      • Newest to Oldest
                                      • Most Votes
                                      Reply
                                      • Reply as topic
                                      Log in to reply
                                      Community
                                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                      The ioBroker Community 2014-2023
                                      logo