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. [Vorlage] Stromverbrauch protokollieren (Tag, Woche, Monat, Quartal, Jahr)

NEWS

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

  • 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

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

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
148 Beiträge 42 Kommentatoren 50.1k Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • ruhr70R Offline
    ruhr70R Offline
    ruhr70
    schrieb am zuletzt editiert von
    #4

    @pix:

    Bis auf den Tageswert sollten auch noch alle Werte gleich sein. Ist ja noch keine Woche/Monat/Quartal/Jahr um. `

    Hi Pix,

    bei mir werden die Tageswerte auch einfach immer weiter addiert. Ich schau mir das auch noch an, woran das liegen könnte. Keine Eile :-)

    Sehr schönes Script! Gefällt mir an vielen Stellen vom Aufbau her.

    VG

    Michael

    Adapter: Fritzbox, Unify Circuit
    Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

    1 Antwort Letzte Antwort
    0
    • P Offline
      P Offline
      pix
      schrieb am zuletzt editiert von
      #5

      Hallo,

      ich habe heute / gestern vor Mitternacht das Skript umgestellt auf Produktivbetrieb. Es läuft jetzt bei mir in der Instanz javascript.0 (Im Code oben ist es eine andere Instanz). Es gab beim Umzug ein paar Fehler mit den Leerzeichen eines Gerätenamens. Ich habe deshalb eine Zeile eingefügt, die Leerzeichen aus Gerätenamen ersatzlos löscht.

      Die Werte sind alle korrekt (bis gestern liefen meinen alten Skripte zum Vergleich noch mit).

      Gruß

      Pix

      ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

      1 Antwort Letzte Antwort
      0
      • Jey CeeJ Online
        Jey CeeJ Online
        Jey Cee
        Developer
        schrieb am zuletzt editiert von
        #6

        Hallo pix,

        danke für dieses tolle skript.

        Leider hatte ich etwas Start Schwierigkeiten damit, mir wurden Ständig Fehlermeldungen ausgeworfen wegen der Leerzeichen Ersetzung, weil es keine gab.

        Und die Blacklist hat ebenfalls Probleme gemacht. Daher habe ich das ganze etwas angepasst.

        1. Es wird versucht die Leerzeichen zu ersetzen, wenn keine da sind wird einfach weiter gemacht. Außerdem werden sie jetzt durch Unterstriche ersetzt.

        2. Wenn die Blacklist leer ist (var blacklist= [];) wird sie einfach ignoriert.

        3. Neu dazu gekommen ist die Ersetzung von Punkten durch Unterstriche.

        Hier die geänderten Stellen im Quellcode:

         // Gerätenamen erstellen
            var geraetename = entferneDatenpunkt(obj.common.name);
            if (logging) log('Gerätename: ' + geraetename); 
        
        function entferneDatenpunkt(geraet) {
            var rueckgabe;
        
            if (geraet.indexOf("ENERGY_COUNTER") != -1) {
                rueckgabe = geraet.substring(0, geraet.indexOf("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
            if ((blacklist.length) !== 0) {
                rueckgabe = checkBlacklist(rueckgabe);
            }
        
            try {rueckgabe = rueckgabe.replace(/\./g, "_");}        // per Regexp punkte ersetzen
                catch(e) {}
            try {rueckgabe = rueckgabe.replace(/\s/g, "_");}        // per Regexp Leerzeichen ersetzen
                    catch(e) {}
            try {rueckgabe = rueckgabe.replace(/_$/g, "");}         // per Regexp _ am Ende entfernen
                  catch(e) {}
        
            return rueckgabe;
        }
        

        Gruß Jey Cee

        Persönlicher Support
        Spenden -> paypal.me/J3YC33

        1 Antwort Letzte Antwort
        0
        • P Offline
          P Offline
          pix
          schrieb am zuletzt editiert von
          #7

          Hallo Jey Cee,

          vielen Dank für die Verbesserungen. Freut mich sehr!

          Gruß

          Pix

          ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

          1 Antwort Letzte Antwort
          0
          • Jey CeeJ Online
            Jey CeeJ Online
            Jey Cee
            Developer
            schrieb am zuletzt editiert von
            #8

            @ruhr70:

            @pix:

            Bis auf den Tageswert sollten auch noch alle Werte gleich sein. Ist ja noch keine Woche/Monat/Quartal/Jahr um. `

            Hi Pix,

            bei mir werden die Tageswerte auch einfach immer weiter addiert. Ich schau mir das auch noch an, woran das liegen könnte. Keine Eile :-)

            Sehr schönes Script! Gefällt mir an vielen Stellen vom Aufbau her.

            VG

            Michael `

            Hab dieses Problem auch und die Lösung dazu. Die Formatierung des Zeitstempels klappt nicht.

            Alt:

            jetzt = new Date(formatDate(time,"JJJJ.MM.TT SS:mm:ss"));
            

            Neu:

            jetzt = new Date(formatDate(time, "YYYY.MM.DD SS:mm:ss"));
            

            Ich denke das die Formatierung von den Einstellungen des Hosts abhängig ist. Es wäre gut wenn das jemand gegenprüfen kann.

            Persönlicher Support
            Spenden -> paypal.me/J3YC33

            1 Antwort Letzte Antwort
            0
            • R Offline
              R Offline
              riconr1
              schrieb am zuletzt editiert von
              #9

              Hallo und vielen Dank für das Skript,

              könntest Du mir kurz erläutern, ob das Skript auch mit Zählersensor Strom/ Gas HM-ES-TX-WM funktioniert?

              Und vielleicht auch, wo ich welche Werte anpassen muss, damit meine Daten gezählt werden?

              Also vielleicht im Skript noch zusätzlich angeben, wo ich welche Daten einfügen muss.

              Tut mir leid, dass ich das nicht allein hin bekomme. Ich verstehe leider nix vom Skripten.

              MfG Enrico

              1 Antwort Letzte Antwort
              0
              • M Online
                M Online
                michihorn
                schrieb am zuletzt editiert von
                #10

                Hallo Pix

                kannst Du nochmal beschreiben wo genau ich meine indiviuellen Angaben im Code vornehmen muss. Offenbar passen in Deiner Beschreibung der Zeilen Nummern nicht mit dem Code zusammen. Grüße Michael

                1 Antwort Letzte Antwort
                0
                • M Online
                  M Online
                  michihorn
                  schrieb am zuletzt editiert von
                  #11

                  Hallo, ich möchte diesen Code von Pix zur Stromverbrauchsmessung nutzen. Ich habe einen HM-ES-TX-WM am Hauszähler und 2x HM-ES-PM Sw1-PI, der eine soll den Stromverbrauch der Waschmaschine protokollieren und der zweite den der Heizung. Ich bekomme die Fehlermeldung im Anhang.
                  326_3.png
                  Gruß Michael

                  `/* 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.2';  instanz = instanz + '.';
                  var pfad =     'Strom.';                                                   // Pfad innerhalb der Instanz
                  var blacklist= [' Strommessung', ' Küche'];                                     // 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.2495, {
                      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 = entferneDatenpunkt(obj.common.name);
                      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);
                      }    
                      // 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
                      if ( (zeit(obj.oldState.ts).Monat === 3 && zeit(obj.newState.ts).Monat === 4)  || 
                           (zeit(obj.oldState.ts).Monat === 6 && zeit(obj.newState.ts).Monat === 7)  || 
                           (zeit(obj.oldState.ts).Monat === 9 && zeit(obj.newState.ts).Monat === 10)  || 
                           (zeit(obj.oldState.ts).Monat === 12 && zeit(obj.newState.ts).Monat === 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, (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',     (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3));           // Verbrauch an diesem Tag in kWh
                      setState(instanz + pfad + geraet + '.Kosten.Tag',       ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val) * preis).toFixed(3));  // Kosten an diesem Tag in €
                      // Woche    
                      setState(instanz + pfad + geraet + '.Verbrauch.Woche',   (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val).toFixed(3));
                      setState(instanz + pfad + geraet + '.Kosten.Woche',     ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val) * preis).toFixed(3));
                      // Monat    
                      setState(instanz + pfad + geraet + '.Verbrauch.Monat',   (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val).toFixed(3));
                      setState(instanz + pfad + geraet + '.Kosten.Monat',     ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val) * preis).toFixed(3));
                      // Quartal    
                      setState(instanz + pfad + geraet + '.Verbrauch.Quartal', (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val).toFixed(3));
                      setState(instanz + pfad + geraet + '.Kosten.Quartal',   ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val) * preis).toFixed(3));
                      // Jahr    
                      setState(instanz + pfad + geraet + '.Verbrauch.Jahr',    (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val).toFixed(3));
                      setState(instanz + pfad + geraet + '.Kosten.Jahr',      ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val) * preis).toFixed(3));  
                      if (logging) log('Stromverbrauch und -kosten (' + geraet + ') aktualisiert', 'info');
                  }
                  
                  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: 'number', unit:'kWh'});
                      createState(pfad + geraet + '.Zaehlerstand.Woche',   0, {name: 'Zählerstand Wochenbeginn ('      + geraet + ')', type: 'number', unit:'kWh'});
                      createState(pfad + geraet + '.Zaehlerstand.Monat',   0, {name: 'Zählerstand Monatsbeginn ('      + geraet + ')', type: 'number', unit:'kWh'});
                      createState(pfad + geraet + '.Zaehlerstand.Quartal', 0, {name: 'Zählerstand Quartalsbeginn ('    + geraet + ')', type: 'number', unit:'kWh'});
                      createState(pfad + geraet + '.Zaehlerstand.Jahr',    0, {name: 'Zählerstand Jahresbeginn ('      + geraet + ')', type: 'number', 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(".Power") != -1) {
                          rueckgabe = geraet.substring(0, geraet.indexOf(".Power"));
                      }
                      // 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;
                  }`[/i][/i]
                  
                  1 Antwort Letzte Antwort
                  0
                  • P Offline
                    P Offline
                    pix
                    schrieb am zuletzt editiert von
                    #12

                    Hallo Michael,

                    kannst du mir noch sagen, wie du die Geräte in Homematic benannt hast?

                    Sowas wie Küche Waschmaschine?

                    Werden die die Daten auch im iobroker Objektreiter angezeigt? Kannst du dazu mal in das Feld links oben im Objektreiter von Admin "ENERGY_COUNTER" eingeben?

                    Sieht dann etwa so aus:
                    261_bildschirmfoto_2016-06-09_um_21.02.53.jpg

                    Es sieht mir so aus, als ob das Skript deine Geräte nicht findet.

                    Gruß

                    Pix

                    PS: Sorry, habe in der PN vorher von POWER und METER gesprochen, aber das war falsch. Aber du musst ja am Skript eigentlich eh nix ändern.

                    ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                    1 Antwort Letzte Antwort
                    0
                    • M Online
                      M Online
                      michihorn
                      schrieb am zuletzt editiert von
                      #13

                      Hallo, anbei ein Screenshot meiner Messgeräte 326_4.png
                      Michael

                      1 Antwort Letzte Antwort
                      0
                      • P Offline
                        P Offline
                        pix
                        schrieb am zuletzt editiert von
                        #14

                        In welcher Instanz des JavaScript Adapters läuft das Skript bei dir?

                        Gesendet mit Tapatalk

                        ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                        1 Antwort Letzte Antwort
                        0
                        • M Online
                          M Online
                          michihorn
                          schrieb am zuletzt editiert von
                          #15

                          Hallo Pix

                          ich weiß nicht genau was Du meinst, reicht die Info im Anhang? 326_5.png
                          Gruß Michael

                          1 Antwort Letzte Antwort
                          0
                          • P Offline
                            P Offline
                            pix
                            schrieb am zuletzt editiert von
                            #16

                            Ja, das reicht.

                            Ändere mal in dieser Zeile die 2 in 0

                            var instanz = 'javascript.2'; 
                            

                            Ich habe dreimal den JavaScript Adapter installiert 0,1 und 2. das Skript läuft bei mir in der dritten Instanz. Die ersten beiden sind reserviert für "lebenswichtige " Aufgaben. Die dritte zum testen.

                            Pix

                            Gesendet mit Tapatalk

                            ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                            1 Antwort Letzte Antwort
                            0
                            • P Offline
                              P Offline
                              pix
                              schrieb am zuletzt editiert von
                              #17

                              Oder verwende die Zeile

                              var instanz = 'javascript.' + instance; 
                              

                              Dann läuft es in allen Instanzen. :)

                              Gesendet mit Tapatalk

                              ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                              1 Antwort Letzte Antwort
                              0
                              • M Online
                                M Online
                                michihorn
                                schrieb am zuletzt editiert von
                                #18

                                Hall

                                ich habe jetzt keine Fehlermeldung mehr, wo finde ich den jetzt die Ergebnisse?

                                Michael

                                1 Antwort Letzte Antwort
                                0
                                • P Offline
                                  P Offline
                                  pix
                                  schrieb am zuletzt editiert von
                                  #19

                                  Schön, dass das klappt.

                                  Gib mal im Objektreiter im Suchfeld "Strom" ein, dort findest du im Javascript.0.Strom die Werte. Natürlich muss man jetzt einmal Mitternacht abwarten, bis der Tageswert gespeichert wird. Für die Woche auf Montag 0Uhr usw.

                                  Du kannst im Skript die Zeile

                                  var logging = false;
                                  ````in````
                                  var logging = true;
                                  ````ändern, dann kommen mehr Ausgaben.
                                  
                                  Beachte: Das Skript, das du nutzt, ist eine der ersten Versionen. Ich sehe, darin ist noch die Funktion meldung_push enthalten. Die sendet bei mir evtl. Mitteilungen über Pushover. Sie ist auf meinem System global und deshalb nicht in diesem Skript definiert. Bei dir wird das einen Fehler ausgeben.
                                  
                                  Evtl. stürzt bei diesem Fehler das Skript ab und startet auch die Instanz neu. Daher empfehle ich dir dringend, den javascript Adapter ein zweites mal zu installieren. Das wird dann Instanz 1, bisher 0\. Im Skript Editor kannst du dann das Skript mit dem kleinen Pulldown Knopf neben dem Namen auf Instanz 1 stellen (vorher im Code auch auf javascript.1 stellen) und speichern. Wenn nun das Skript Probleme macht, stürzt nur diese Instanz ab und startet neu. Die erste Instanz (0) bleibt unberührt und läuft weiter. Natürlich macht das ganze nur Sinn, wenn du noch andere, definitiv lauffähige Skripte in javascript.0 hast.
                                  
                                  Gruß
                                  
                                  Pix

                                  ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                                  1 Antwort Letzte Antwort
                                  0
                                  • M Online
                                    M Online
                                    michihorn
                                    schrieb am zuletzt editiert von
                                    #20

                                    Super, die Daten kommen im LOG an. Es kommt noch eine Fehlermeldung, ist das die von der Du im letzten Post berichtet hast?

                                    Die Daten sehe ich erst morgen unter Objekte?

                                    Gibt es eine möglichkeit diese Daten evtl. nach Excel zu exportieren?

                                    Gruß Michael
                                    326_1.png

                                    1 Antwort Letzte Antwort
                                    0
                                    • P Offline
                                      P Offline
                                      pix
                                      schrieb am zuletzt editiert von
                                      #21

                                      Nein, das ist eine andere Fehlermeldung.

                                      Kommentiere mal die drittletzte Zeile aus, wie es im Skript steht. Als einfach zwei // vor die Zeile schreiben.

                                      Die beiden undefined Fehler sind bekannt, steht auch schon im Code:

                                      log('Gewerk:       ' + obj.role);   // undefined
                                      log('Beschreibung: ' + obj.desc);   // undefined
                                      

                                      Es gibt in einer neueren Version des Skriptes ein Exportfunktion. Sie speichert die Daten nicht nur im ioBroker Log, sondern auch kommasepariert in einer Datei auf dem Server.

                                      Ich würde dir aber raten:

                                      • Warte ab, wie das Skript bei dir läuft.

                                      • Versuche, es zu verstehen.

                                      • Nutze den History Adapter (oder SQL-Adapter) für die Aufzeichnung der Werte

                                      • Mache ein Offline Backup vom lauffähigen Skript mit aktuellen Datum im Dateinamen (Copy&Paste) bevor du was änderst

                                      Wenn alles klappt, dann können wir uns um das Log auf dem Server kümmern. Dein Server ist sehr ungewöhnlich und es muss auf dem Server ein Pfad benannt werden, wo die externe Logdatei gespeichert werden soll. Da kenne ich mich nicht aus :?

                                      Gruß

                                      Pix

                                      ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                                      1 Antwort Letzte Antwort
                                      0
                                      • D Offline
                                        D Offline
                                        DiJaexxl
                                        schrieb am zuletzt editiert von
                                        #22

                                        Hallo zusammen,

                                        auch ich habe das Script versucht anzunehmen.

                                        ! /* Strom Zaehlerstaende, Verbrauch und Kosten
                                        ! ioBroker Forum:
                                        ! http://forum.iobroker.net/viewtopic.php?f=21&t=2262
                                        ! 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/viewtop … er#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.1'; instanz = instanz + '.';
                                        ! var pfad = 'Strom.'; // Pfad innerhalb der Instanz
                                        ! var blacklist= [' Strommessung', ' Küche']; // 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.2495, {
                                        ! 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 = entferneDatenpunkt(obj.common.name);
                                        ! 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);
                                        ! }
                                        ! // 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
                                        ! if ( (zeit(obj.oldState.ts).Monat === 3 && zeit(obj.newState.ts).Monat === 4) ||
                                        ! (zeit(obj.oldState.ts).Monat === 6 && zeit(obj.newState.ts).Monat === 7) ||
                                        ! (zeit(obj.oldState.ts).Monat === 9 && zeit(obj.newState.ts).Monat === 10) ||
                                        ! (zeit(obj.oldState.ts).Monat === 12 && zeit(obj.newState.ts).Monat === 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, (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', (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3)); // Verbrauch an diesem Tag in kWh
                                        ! setState(instanz + pfad + geraet + '.Kosten.Tag', ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val) * preis).toFixed(3)); // Kosten an diesem Tag in €
                                        ! // Woche
                                        ! setState(instanz + pfad + geraet + '.Verbrauch.Woche', (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val).toFixed(3));
                                        ! setState(instanz + pfad + geraet + '.Kosten.Woche', ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val) * preis).toFixed(3));
                                        ! // Monat
                                        ! setState(instanz + pfad + geraet + '.Verbrauch.Monat', (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val).toFixed(3));
                                        ! setState(instanz + pfad + geraet + '.Kosten.Monat', ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val) * preis).toFixed(3));
                                        ! // Quartal
                                        ! setState(instanz + pfad + geraet + '.Verbrauch.Quartal', (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val).toFixed(3));
                                        ! setState(instanz + pfad + geraet + '.Kosten.Quartal', ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val) * preis).toFixed(3));
                                        ! // Jahr
                                        ! setState(instanz + pfad + geraet + '.Verbrauch.Jahr', (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val).toFixed(3));
                                        ! setState(instanz + pfad + geraet + '.Kosten.Jahr', ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val) * preis).toFixed(3));
                                        ! if (logging) log('Stromverbrauch und -kosten (' + geraet + ') aktualisiert', 'info');
                                        ! }
                                        ! 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: 'number', unit:'kWh'});
                                        ! createState(pfad + geraet + '.Zaehlerstand.Woche', 0, {name: 'Zählerstand Wochenbeginn (' + geraet + ')', type: 'number', unit:'kWh'});
                                        ! createState(pfad + geraet + '.Zaehlerstand.Monat', 0, {name: 'Zählerstand Monatsbeginn (' + geraet + ')', type: 'number', unit:'kWh'});
                                        ! createState(pfad + geraet + '.Zaehlerstand.Quartal', 0, {name: 'Zählerstand Quartalsbeginn (' + geraet + ')', type: 'number', unit:'kWh'});
                                        ! createState(pfad + geraet + '.Zaehlerstand.Jahr', 0, {name: 'Zählerstand Jahresbeginn (' + geraet + ')', type: 'number', 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__) != -1) { // wenn vorhanden (nicht nicht vorhanden)
                                        ! return( name.substring(0, name.indexOf(blacklist__)) ); // 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;
                                        ! }____ __Ich betreibe es in der Instanz 1 (also die 2) und habe die Zeile

                                        var instanz = 'javascript.1';  instanz = instanz + '.';
                                        ````angepasst auf die Angezeigte 1
                                        
                                        Ich habe die Zwischenstecker mit Leistungsmessung, sowie den Stromzähler.
                                        
                                        Bei der Suche nach Energy_Counter wird mir dieses angezeigt
                                        
                                        >! ENERGY_COUNTER state Küche Kühlschrank:2.ENERGY_COUNTER
                                        >! ENERGY_COUNTER state Waschküche Steckdose:2.ENERGY_COUNTER
                                        >! ENERGY_COUNTER state Küche Kaffee:2.ENERGY_COUNTER
                                        >! ENERGY_COUNTER state Stromzähler:1.ENERGY_COUNTER
                                        >! ENERGY_COUNTER state Garage Steckdose:2.ENERGY_COUNTER
                                        
                                        Im Log wird mir nun folgendes angezeigt
                                        
                                        >! javascript.1 2016-06-11 09:41:59.393 error TypeError: Cannot read property 'replace' of undefined at Object. (script.js.Test.Langzeit_Strommessung:79:30) at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascrip
                                        >! javascript.1 2016-06-11 09:41:59.390 error message hm-rpc.0.MEQ0273558.2.ENERGY_COUNTER [object Object] Cannot read property 'replace' of undefined
                                        >! javascript.1 2016-06-11 09:41:31.225 error TypeError: Cannot read property 'replace' of undefined at Object. (script.js.Test.Langzeit_Strommessung:79:30) at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascrip
                                        >! javascript.1 2016-06-11 09:41:31.223 error message hm-rpc.0.MEQ0272352.2.ENERGY_COUNTER [object Object] Cannot read property 'replace' of undefined
                                        >! TypeError: 2016-06-11 09:41:24.295 error at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)
                                        >! TypeError: 2016-06-11 09:41:24.295 error at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:2036:80)
                                        >! TypeError: 2016-06-11 09:41:24.295 error at Object.utils.adapter.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:215:17)
                                        >! TypeError: 2016-06-11 09:41:24.295 error at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:537:17)
                                        >! TypeError: 2016-06-11 09:41:24.295 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2644:28)
                                        >! TypeError: 2016-06-11 09:41:24.295 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2644:28)
                                        >! TypeError: 2016-06-11 09:41:24.295 error at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:2625:17)
                                        >! TypeError: 2016-06-11 09:41:24.295 error at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:541:48
                                        >! TypeError: 2016-06-11 09:41:24.295 error at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1207:48)
                                        >! TypeError: 2016-06-11 09:41:24.295 error at Object. (script.js.Test.Langzeit_Strommessung:79:30)
                                        >! TypeError: 2016-06-11 09:41:24.295 error Cannot read property 'replace' of undefined
                                        >! message 2016-06-11 09:41:24.279 error hm-rpc.0.MEQ0272365.2.ENERGY_COUNTER [object Object] Cannot read property 'replace' of undefined
                                        >! javascript-1 2016-06-11 09:40:30.955 info script.js.Test.Langzeit_Strommessung: registered 1 subscription and 0 schedules
                                        
                                        Was läuft schief?__

                                        Gruss aus Bensberg

                                        Dirk

                                        1 Antwort Letzte Antwort
                                        0
                                        • P Offline
                                          P Offline
                                          pix
                                          schrieb am zuletzt editiert von
                                          #23

                                          Hallo Dirk,

                                          kannst du bitte mal die Zeile

                                          rueckgabe = checkBlacklist(rueckgabe);
                                          
                                          

                                          auskommentieren zu

                                          // rueckgabe = checkBlacklist(rueckgabe);
                                          

                                          Ausserdem hast du einen Stromzähler, der ENERGY.COUNTER auf Kanal 1 hat. Ich habe so ein Gerät nicht. Eigentlich dürfte das kein Problem sein. Aber ist halt nicht getestet.

                                          Und stelle bitte logging auf true für mehr Details

                                          Wie es aussieht, läuft das Skript nicht bei allen sauber durch. IIch habe es damals für mich mit der genauen Abfrage der von mir verwendeten Stromzähler gebaut. Dann sollte es universell laufen, ohne weitere Eingaben. Und das habe ich hier dann mal veröffentlicht. Ich werde mich noch einmal dran setzen.

                                          Könnte auch gut einen Adapter ergeben. Dazu ist aber das dynamische Anlegen der States notwendig (ich weiß ja nicht, wieviele Geräte der Nutzer hat) und das habe ich bisher noch nicht gemacht. Ich habe beim Entwickler https://github.com/Pmant/ioBroker.harmony/blob/master/harmony.js aber schon gesehen. Mal sehen, ob ich das schaffe.

                                          Gruß

                                          Pix

                                          ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                                          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

                                          873

                                          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