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] Betriebsstundenzähler & Verbrauchsrechner

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    23
    1
    1.3k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.5k

[Vorlage] Betriebsstundenzähler & Verbrauchsrechner

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
333 Beiträge 51 Kommentatoren 92.9k Aufrufe 26 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.
  • L Offline
    L Offline
    looxer01
    schrieb am zuletzt editiert von
    #2

    Hi,

    ich habe die Version 0.2 eingestellt mit folgenden Änderungen

    • Erhöhung der Zuverlässigkeit für den Fall, dass z.B. ioBroker down war

    bisher wurde dann ggf einfach von der letzten Schaltzeit berechnet was zu erhöhten Einschaltzeiten führte

    • jetzt sind LEVEL Geraete aber auch alle Objekte die ein True/false haben messbar

    • Fehlerbeseitigung

    vG Looxer

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

      Hi Looxer,

      sehr gute Idee!

      Ich finde aber, du machst dir zuviel Arbeit und limitierst die Zahl der Geräte dadurch, dass du die Variablen schon alle vorher festlegst.

      Ich meine das:

      // Einstellung teilnehmende Homematic Geräte - Eingabe der Homematic ID
      var     IDGruppe10 = "hm-rpc.0.JEQ003xxxx.1.STATE";  // Licht Wohnzimmer Esstisch Stehlampe
      var     IDGruppe11 = "hm-rpc.0.JEQ019xxxx.1.LEVEL";  // Licht Wohnzimmer Esstisch Deckenlampe
      var     IDGruppe12 = "hm-rpc.0.IEQ037xxxx.1.STATE";  // Licht Terrassentuere
      var     IDGruppe13 = "hm-rpc.0.JEQ003xxxx.1.STATE";  // Licht Kinderbad
      var     IDGruppe14 = "hm-rpc.0.JEQ003xxxx.1.STATE";  // Licht Hobbyraum
      var     IDGruppe15 = " "; 
      var     IDGruppe16 = " "; 
      var     IDGruppe17 = " "; 
      var     IDGruppe18 = " ";
      var     IDGruppe19 = " ";
      var     IDGruppe20 = " "; 
      var     IDGruppe21 = " "; 
      var     IDGruppe22 = " "; 
      var     IDGruppe23 = " "; 
      var     IDGruppe24 = " "; 
      var     IDGruppe25 = " "; 
      var     IDGruppe26 = " "; 
      var     IDGruppe27 = " "; 
      var     IDGruppe28 = " "; 
      var     IDGruppe29 = " "; 
      var     IDGruppe30 = " "; 
      

      Es können 21 Geräte verwendet werden (ist wirklich genug für diesen Zweck, aber wer weiß…). Der Aufwand beim Entwickeln ist schon sehr hoch, du musst ja jeden Befehl 21 mal schreiben.

      Warum nutzt du kein Array?

      var Gruppen = [];
      // Homematic ID, Name, Beschreibung
      Gruppen[0]  = ['hm-rpc.0.JEQ003xxxx.1.STATE', 'Licht_WZ_EsstischStehlampe', 'Licht Wohnzimmer Esstisch Stehlampe'];
      Gruppen[1]  = ['hm-rpc.0.JEQ019xxxx.1.LEVEL', 'Licht_WZ_EsstischDecke',     'Licht Wohnzimmer Esstisch Deckenlampe'];
      Gruppen[2]  = ['hm-rpc.0.IEQ037xxxx.1.STATE', 'Licht_WZ_Terrassentuere',    'Licht Terrassentuere];
      Gruppen[3]  = ['hm-rpc.0.JEQ003xxxx.1.STATE', 'Licht_UN_Kinderbad',         'Licht Kinderbad'];
      Gruppen[4]  = ['hm-rpc.0.JEQ00xxxxx.1.STATE', 'Licht_UN_Hobbyraum',         'Licht Hobbyraum'];
      
      function variablen_erstellen () {
          for (var zaehler = 0,
                   zaehler_array = Gruppen.length;
                   zaehler < zaehler_array;
                   zaehler++) {
              createState('Grp' + zaehler+ 10 + 'Count', 0); // Durch das +10 bleiben die Nummern deiner Variablen erhalten
              // Spacecheck nicht nötig, da ja eh nur die Einträge aus dem Array verwendet werden
              if (Gruppen[zaehler][0].match('LEVEL'))  { initialState = 0 } else { initialState = false }    
              createState('Grp' + zaehler + 10 + 'LStat', initialState);    
              createState('Grp' + zaehler + 10 + 'MSec',  0);
              createState('Grp' + zaehler + 10 + 'Kum',   0);
      
          } // Ende FOR
      }
      
      

      Du kannst ja jedes Feld des Arrays bequem ansprechen und beschreiben.

      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
      • L Offline
        L Offline
        looxer01
        schrieb am zuletzt editiert von
        #4

        Hi Pix,

        ja, da sieht gut aus. Werde ich mal ransetzen.

        Aber vielleicht auch mal zur Motivation des Programmes.

        Es sind ja häufig dieselben Vorgänge, wenn es darum geht die Zeit zu messen.

        Die Idee war einen generischen Rahmen zu haben. z.B. könnte ich ja für bestimmte Geraete taeglich um Mitternacht auf Null setzen.

        Somit hat man schon einen Tageszaehler. Oder man kann zwei Zaehler für ein Geraet definieren. Damit gibt es z.B. einen Tageszaehler und einen gesamten Zaehler.

        Danke dir nochmal.

        vG Looxer

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

          Hallo Looxer,

          ich habe ganz ähnliche Skripte.

          Das eine zählt die Anzahl der Startvorgänge der Küchengeräte (wie oft wurden Waschmaschine, Spülmaschine, Dampfgarer gestartet?). Es gibt für jedes Gerät eine Variable Tag, Woche, Monat, Quartal und Jahr. Jeweils zu Beginn dieser Termine wird der Zähler genullt. Ausserdem lässt er sich noch manuell über VIS korrigieren. Allerdings nutze ich für jedes Gerät ein separates Skript, damit es nicht zu kompliziert wird. Die Einbindung eines neuen Gerätes kommt nicht so oft vor, da kann ich einfach ein bestehendes Skript kopieren und kleine Änderungen vornehmen.

          /* Küche Dampfgarer Zaehler
          Skript zum Überwachen des Status des Dampfgarers (Variable in Status_Geraete.js)
          Skript zählt das Umschalten des Status auf "in Betrieb" und damit die Anzahl der Kochvorgänge
          Variable Anpassung an verschiedene Geräte (für jedes Gerät ein eigenes Skript verwenden)
          01.01.2016 erstellt von Pix für Dampfgarer
          02.01.2016 manuelle Addieren/Subtrahieren hinzugefügt
          03.01.2016 Optin Push Priorität
          25.01.2016 Variable Instanz eingeführt
          01.02.2016 Zähler in neuer Ordnerstruktur
                     Logging in Datei eingebaut
                     Delay bei Pushmeldung eingebaut, damit gleichzeitige Meldungen den push-Adapter nicht zum Absturz bringen
          */
          var logging = true; // Zählerstände bei Reset mitloggen?
          var loggingToFile = true;   // in externe Datei loggen?
          var logPath = '/Users/pix/Documents/iobroker/iobroker-data/zaehlerLog.csv';    // Pfad und Dateiname des externen Logs -> UNBEDINGT ANPASSEN
          var pushdelay = 2;          // Verzögerung der Benachrichtigung per Push-Adapter in Sekunden. Sollte in jedem Skript unterschiedlich sein.
          var instanz = 'javascript.0',
              name_geraet = 'Dampfgarer', // zB Waschmaschine,
              beschreibung = 'Startvorgänge'; // zB Waschvorgänge oder Spülvorgänge oder Einschaltvorgänge
          // Manuell anpassen (wegen der flüssigen Sprache :] )
          createState('Optin.Kueche.Dampfgarer.Zaehler.Push', true, {
              name: 'Optin Anzahl der Startvorgänge des Dampfgarers melden',
              desc: 'Soll gemeldet werden, wie oft der Dampfgarer gestartet wurde?',
              type: 'boolean', 
              read: true,
              write: true
          });
          createState('Optin.Kueche.Dampfgarer.Zaehler.Push.Prioritaet', 0, {
              name: 'Priorität der Pushmeldung',
              desc: 'Mit welcher Priorität soll die Nachricht gesendet werden?',
              type: 'number', 
              read: true,
              write: true
          });
          createState('Optin.Kueche.Dampfgarer.Zaehler.Push.Tag', true, {
              name: 'Optin Anzahl der Startvorgänge des Dampfgarers täglich melden',
              desc: 'Soll täglich gemeldet werden, wie oft der Dampfgarer gestartet wurde?',
              type: 'boolean', 
              read: true,
              write: true
          });
          createState('Optin.Kueche.Dampfgarer.Zaehler.Push.Woche', true, {
              name: 'Optin Anzahl der Startvorgänge des Dampfgarers wöchentlich melden',
              desc: 'Soll wöchentlich gemeldet werden, wie oft der Dampfgarer gestartet wurde?',
              type: 'boolean', 
              read: true,
              write: true
          });
          createState('Optin.Kueche.Dampfgarer.Zaehler.Push.Monat', true, {
              name: 'Optin Anzahl der Startvorgänge des Dampfgarers monatlich melden',
              desc: 'Soll monatlich gemeldet werden, wie oft der Dampfgarer gestartet wurde?',
              type: 'boolean', 
              read: true,
              write: true
          });
          createState('Optin.Kueche.Dampfgarer.Zaehler.Push.Quartal', true, {
              name: 'Optin Anzahl der Startvorgänge des Dampfgarers im Quartal melden',
              desc: 'Soll jedes Quartal gemeldet werden, wie oft der Dampfgarer gestartet wurde?',
              type: 'boolean', 
              read: true,
              write: true
          });
          createState('Optin.Kueche.Dampfgarer.Zaehler.Push.Jahr', true, {
              name: 'Optin Anzahl der Startvorgänge des Dampfgarers jährlich melden',
              desc: 'Soll jährlich gemeldet werden, wie oft der Dampfgarer gestartet wurde?',
              type: 'boolean', 
              read: true,
              write: true
          });
          var idOptinPushTag =     instanz + '.Optin.Kueche.Dampfgarer.Zaehler.Push.Tag',
              idOptinPushWoche =   instanz + '.Optin.Kueche.Dampfgarer.Zaehler.Push.Woche',
              idOptinPushMonat =   instanz + '.Optin.Kueche.Dampfgarer.Zaehler.Push.Monat',
              idOptinPushQuartal = instanz + '.Optin.Kueche.Dampfgarer.Zaehler.Push.Quartal',
              idOptinPushJahr =    instanz + '.Optin.Kueche.Dampfgarer.Zaehler.Push.Jahr',
              idOptinPushPrio =    instanz + '.Optin.Kueche.Dampfgarer.Zaehler.Push.Prioritaet';
          
          var beschreibung_log =   'Anzahl Dampfgarer Startvorgänge',
              optin_beschreibung = 'Anzahl Startvorgänge des Dampfgarers',
              idOptinPush =        instanz + '.Optin.Kueche.Dampfgarer.Zaehler.Push';
          // Diese Variable wird überwacht auf Änderung nach true
          var idStatus =           instanz + '.Status.Dampfgarer'; // aus Status_Geraete.js
          // +++++ Ab hier keine Änderungen vornehmen +++++
          //Variablen anlegen
              createState('Zaehler.' + name_geraet + '.Tag', 0, {
                  read: true,
                  write: true,
                  type: 'number',
                  name: name_geraet + ' - Anzahl ' + beschreibung + ' heute'
              });
              createState('Zaehler.' + name_geraet + '.Woche', 0, {
                  read: true,
                  write: true,
                  type: 'number',
                  name: name_geraet + ' - Anzahl ' + beschreibung + ' diese Woche'
              });
              createState('Zaehler.' + name_geraet + '.Monat', 0, {
                  read: true,
                  write: true,
                  type: 'number',
                  name: name_geraet + ' - Anzahl ' + beschreibung + ' diesen Monat'
              });
              createState('Zaehler.' + name_geraet + '.Quartal', 0, {
                  read: true,
                  write: true,
                  type: 'number',
                  name: name_geraet + ' - Anzahl ' + beschreibung + ' dieses Quartal'
              });
              createState('Zaehler.' + name_geraet + '.Jahr', 0, {
                  read: true,
                  write: true,
                  type: 'number',
                  name: name_geraet + ' - Anzahl ' + beschreibung + ' dieses Jahr'
              }); 
          
              createState('Zaehler.' + name_geraet + '.addieren', false, {
                  read: true,
                  write: true,
                  type: 'booelan',
                  name: name_geraet + ' - Zähler um eins erhöhen'
              });
              createState('Zaehler.' + name_geraet + '.subtrahieren', false, {
                  read: true,
                  write: true,
                  type: 'boolean',
                  name: name_geraet + ' - Zähler um eins vermindern'
              });
          var idZaehler_addieren =     instanz + '.Zaehler.' + name_geraet + '.addieren',
              idZaehler_subtrahieren = instanz + '.Zaehler.' + name_geraet + '.subtrahieren';
          var idZaehlerTag =     instanz + '.Zaehler.' + name_geraet + '.Tag',
              idZaehlerWoche =   instanz + '.Zaehler.' + name_geraet + '.Woche',
              idZaehlerMonat =   instanz + '.Zaehler.' + name_geraet + '.Monat',
              idZaehlerQuartal = instanz + '.Zaehler.' + name_geraet + '.Quartal',
              idZaehlerJahr =    instanz + '.Zaehler.' + name_geraet + '.Jahr';
          // Statusvariable überwachen und Ausgabe veranlassen
          on({
              id: idStatus,
              change: 'ne'
          }, function (obj) {
              if (obj.newState.val === true || obj.newState.val === 1) { // eingeschaltet
                  // hochzählen
                  hochzaehlen();
              }
          });
          // Manuelles hochzaehlen
          on(idZaehler_addieren, function (obj) {
              if (!obj.newState.ack && obj.newState.val) {
                  hochzaehlen();
                  schreibeDatei(); // in Datei protokollieren
                  setStateDelayed(idZaehler_addieren, false, 500);
              }
          });
          // Manuelles runterzaehlen
          on(idZaehler_subtrahieren, function (obj) {
              if (!obj.newState.ack && obj.newState.val) {
                  runterzaehlen();
                  schreibeDatei(); // in Datei protokollieren
                  setStateDelayed(idZaehler_subtrahieren, false, 500);
              }
          });
          // Aktionen
          function hochzaehlen() {
              setState(idZaehlerTag,     ++getState(idZaehlerTag).val);
              setState(idZaehlerWoche,   ++getState(idZaehlerWoche).val);
              setState(idZaehlerMonat,   ++getState(idZaehlerMonat).val);
              setState(idZaehlerQuartal, ++getState(idZaehlerQuartal).val);
              setState(idZaehlerJahr,    ++getState(idZaehlerJahr).val);
          }
          function runterzaehlen() {
              setState(idZaehlerTag,     --getState(idZaehlerTag).val);
              setState(idZaehlerWoche,   --getState(idZaehlerWoche).val);
              setState(idZaehlerMonat,   --getState(idZaehlerMonat).val);
              setState(idZaehlerQuartal, --getState(idZaehlerQuartal).val);
              setState(idZaehlerJahr,    --getState(idZaehlerJahr).val);
          }
          function zaehlerstand_reset(zeitraum) {
              var betreff = 'ioBroker Meldung',
                  prio = getState(idOptinPushPrio).val;
                  var delay;
              switch(zeitraum) {
                  case 'Tag':
                      var optin_tag = getState(idOptinPushTag).val;
                      var tag_meldung = beschreibung_log + ' gestern: ' + getState(idZaehlerTag).val;
                      delay = 1;
                      if (logging) log(tag_meldung);
                      schreibeDatei(); // in Datei schreiben (nur täglich)
                      if (optin_tag) meldung_push(tag_meldung, betreff, prio, delay);
                      setState(idZaehlerTag, 0);
                      log(beschreibung_log + ' aktueller Tag zurückgesetzt');
                      break;
          
                  case 'Woche':
                      var optin_woche = getState(idOptinPushWoche).val;
                      var woche_meldung = beschreibung_log + ' vergangene Woche: ' + getState(idZaehlerWoche).val;
                      delay = 2;
                      if (logging) log(woche_meldung);
                      if (optin_woche) meldung_push(woche_meldung, betreff, prio, delay);
                      setState(idZaehlerWoche, 0);
                      log(beschreibung_log + ' aktuelle Woche zurückgesetzt');
                      break;
          
                  case 'Monat':
                      var optin_monat = getState(idOptinPushMonat).val;
                      var monat_meldung = beschreibung_log + ' verganener Monat: ' + getState(idZaehlerMonat).val;
                      delay = 3;
                      if (logging) log(monat_meldung);
                      if (optin_monat) meldung_push(monat_meldung, betreff, prio, delay);
                      setState(idZaehlerMonat, 0);
                      log(beschreibung_log + ' aktueller Monat zurückgesetzt');
                      break;
          
                  case 'Quartal':
                      var optin_quartal = getState(idOptinPushQuartal).val;
                      var quartal_meldung = beschreibung_log + ' vergangenes Quartal: ' + getState(idZaehlerQuartal).val;
                      delay = 4;
                      if (logging) log(quartal_meldung);
                      if (optin_quartal) meldung_push(quartal_meldung, betreff, prio, delay);
                      setState(idZaehlerQuartal, 0);
                      log(beschreibung_log + ' aktuelles Quartal zurückgesetzt');
                      break;
          
                  case 'Jahr':
                      var optin_jahr = getState(idOptinPushJahr).val;
                      var jahr_meldung = beschreibung_log + ' vergangenes Jahr: ' + getState(idZaehlerJahr).val;
                      delay = 5;
                      if (logging) log(jahr_meldung);
                      if (optin_jahr) meldung_push(jahr_meldung, betreff, prio, delay);
                      setState(idZaehlerJahr, 0);
                      log(beschreibung_log + ' aktuelles Jahr zurückgesetzt');
                      break;
          
                  default:
                      log('Fehler/Error beim Reset der Datenpunkte!');
              }
          } 
          function schreibeDatei() { // wird täglich um Mitternacht aufgerufen und bei Änderung
              if (loggingToFile) {
                  var fs = require('fs');                     // enable write fuer externes log
                  var string = name_geraet + ";" + getState(idZaehlerTag).val +";" + getState(idZaehlerWoche).val + " ; " + getState(idZaehlerMonat).val + " ; " + getState(idZaehlerQuartal).val +" ; " + getState(idZaehlerJahr).val;
          
               // Zerlege Datum und Zeit in Variable
                  var jetzt   = new Date(); // store current date and time
                  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 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();
                  var logdate = tag + '.' + monat + '.' + jahr;
                  var logtime = stunde + ':' + minute + ':' + sekunde;
                  if (fs.existsSync(logPath)) {
                      log('Log in externe Datei geschrieben');
                      fs.appendFileSync(logPath, logdate+" ;"+logtime+" ;"+string + "\n");       // Füge Satz in Datei ein (akt. Zeit + String)
                  } else {     
                      log("Logfile nicht gefunden - wird angelegt", "info");
                      var headerLine= "Datum;Uhrzeit;Gerät;Tag;Woche;Monat;Quartal;Jahr";     
                      fs.appendFileSync(logPath, headerLine + "\n");       // Füge Satz in Datei ein
                      fs.appendFileSync(logPath, logdate+" ;"+logtime+" ;"+string + "\n");       // Füge Satz in Datei ein
                  }  // endif Filecheck
              }  // Ende loggingToFile
          }
          //schreibeDatei();
          // RESETS DER WERTE #################################
          // Täglich um 0 Uhr ausführen
          //schedule({hour: 0, minute: 21}, function() {
          schedule("0 0 * * *", function() {
              zaehlerstand_reset('Tag');
          });
          // Montags um 0 Uhr ausführen
          schedule("0 0 * * 1", function() {
              zaehlerstand_reset('Woche');
          });
          // Monatsersten um 0 Uhr ausführen
          schedule("0 0 1 * *", function() {
              zaehlerstand_reset('Monat');
          });
          // Quartalsersten (Jan,Apr,Jul,Okt) um 0 Uhr ausführen
          schedule("1 0 1 1,4,7,10 *", function() {
              zaehlerstand_reset('Quartal');
          });
          // Neujahr um 0 Uhr ausführen
          schedule("2 0 1 1 *", function() {
              zaehlerstand_reset('Jahr');
          });
          // Pushmeldung
          function meldung_push (text, titel, prio, pushdelay) {
              var optin_push = getState(idOptinPush).val;
              if (optin_push) { // wenn Optin
                      setTimeout(function () {
                          sendTo("pushover", {
                          message: text,
                          title: titel,
                          priority: prio
                      });
                  }, delay * pushdelay * 1000);
          
              } // Ende Optin
          }
          // Opt In setzen - Logging
          on( { 
              id: idOptinPush,
              change: 'ne'
          }, function (obj) {
              log('Opt in Variable <' + optin_beschreibung + ' Push> auf <' + obj.newState.val + '> gesetzt ', 'info');
          });
          on( { 
              id: idOptinPushPrio,
              change: 'ne'
          }, function (obj) {
              log('Opt in Push Priorität für <' + optin_beschreibung + ' Push> auf <' + obj.newState.val + '> gesetzt ', 'info');
          });
          

          EDIT (01.02.2016): Habe Looxers Protokollierung in externe Datei mit eingebaut (Pfad unbedingt anpassen)

          Im Skript ist noch meine etwas komplizierte Optin-Geschichte untergebracht.

          Damit kann ich in VIS einstellen (nicht jedesmal im Skript), ob, wann und mit welcher Priorität Pushover mich über die Zahlen informiert. <size size="85">Die tägliche Benachrichtigung sollte bei mehreren Geräten (mehrere Skripte) durch eine Verzögerung nacheinander passieren, sonst schmiert pushover ab.</size> -> Erledigt mit Variable pushdelay

          261_bildschirmfoto_2016-01-30_um_15.34.26.jpg
          261_bildschirmfoto_2016-01-30_um_15.37.32.jpg
          Ganz ähnlich funktioniert auch das Skript für das Zählen des Stromverbrauchs.

          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
          • L Offline
            L Offline
            looxer01
            schrieb am zuletzt editiert von
            #6

            H Pix,

            genau daran hatte ich als Erweiterung auch gedacht. Die Tages,Wochen und Monatswerte (vielleicht sogar Jahr)

            Ich versuche es aber generisch zu halten. Es wollen sich ja nicht alle mit jS beschäftigen.

            Wie immer sind deine VIS-Widgets super.

            vG Looxer

            1 Antwort Letzte Antwort
            0
            • L Offline
              L Offline
              looxer01
              schrieb am zuletzt editiert von
              #7

              Version 0.21 ist jetzt eingestellt.

              Die Variable LSTAT wird nicht mehr benötigt, was das Script kleiner macht

              Funktional gibts keinen Unterschied.

              vG Looxer

              1 Antwort Letzte Antwort
              0
              • L Offline
                L Offline
                looxer01
                schrieb am zuletzt editiert von
                #8

                Hi,

                das script ist jetzt umgebaut. Version 0.25

                Falls es jemand schon ausprobiert hat; dann sind ein paar Anpassungen notwendig im Bereich der Einstellungen - siehe script

                Auch sollten die variablen "Betriebsstundenzaehler.System." gelöscht werden. Dafür werden dann automatisch neue angelegt.

                Folgende Änderungen gibt es:

                • Die Erweiterung des scripts auf mehr Objekte ist sehr einfach möglich

                • Vorbereitungen für die Anzeige von Tages/Wochen/Moants/Jahres-Betriebszeit sind eingebaut (noch nicht funktional)

                vG Looxer

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

                  Hallo Looxer,

                  hab es installiert. Das Log in die externe Datei klappt so nicht bei mir (OS X):

                  2016-01-31 14:48:31.936  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Logfile nicht gefunden - wird angelegt
                  2016-01-31 14:48:31.937  - error: message hm-rpc.0.LEQ0268726.1.LEVEL [object Object] ENOENT: no such file or directory, open '/opt/iobroker/iobroker-data/BSZLog.csv'
                  2016-01-31 14:48:31.939  - error: Error: ENOENT: no such file or directory, open '/opt/iobroker/iobroker-data/BSZLog.csv'
                    at Error (native)
                    at Object.fs.openSync (fs.js:549:18)
                    at Object.fs.writeFileSync (fs.js:1156:15)
                    at Object.fs.appendFileSync (fs.js:1204:6)
                    at writelog (script.js.AATest_Betriebstundenzaehler:439:13)
                    at GeraetUpdate (script.js.AATest_Betriebstundenzaehler:370:3)
                    at Object. <anonymous>(script.js.AATest_Betriebstundenzaehler:301:81)
                    at Object.subs.callback (/Users/pix/Documents/iobroker/node_modules/iobroker.javascript/javascript.js:1111:48)
                    at /Users/pix/Documents/iobroker/node_modules/iobroker.javascript/javascript.js:454:48
                    at getObjectEnums (/Users/pix/Documents/iobroker/node_modules/iobroker.javascript/javascript.js:2304:17)
                    at getObjectEnums (/Users/pix/Documents/iobroker/node_modules/iobroker.javascript/javascript.js:2323:28)
                    at getObjectEnums (/Users/pix/Documents/iobroker/node_modules/iobroker.javascript/javascript.js:2323:28)
                    at checkPatterns (/Users/pix/Documents/iobroker/node_modules/iobroker.javascript/javascript.js:450:17)
                    at Object.utils.adapter.stateChange (/Users/pix/Documents/iobroker/node_modules/iobroker.javascript/javascript.js:190:17)
                    at Object.that.states.States.change (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1942:80)
                    at Socket. <anonymous>(/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)
                    at Socket.Emitter.emit (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
                    at Socket.onevent (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:254:10)
                    at Socket.onpacket (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:212:12)
                    at Manager. <anonymous>(/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
                    at Manager.Emitter.emit (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
                    at Manager.ondecoded (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/manager.js:301:8)
                    at Decoder. <anonymous>(/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
                    at Decoder.Emitter.emit (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
                    at Decoder.add (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/socket.io-parser/index.js:247:12)
                    at Manager.ondata (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/manager.js:291:16)
                    at Socket. <anonymous>(/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
                    at Socket.Emitter.emit (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
                    at Socket.onPacket (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/lib/socket.js:430:14)
                    at WS. <anonymous>(/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/lib/socket.js:248:10)
                    at WS.Emitter.emit (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
                    at WS.Transport.onPacket (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/lib/transport.js:147:8)
                    at WS.Transport.onData (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/lib/transport.js:139:8)
                    at WebSocket.ws.onmessage (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/lib/transports/websocket.js:112:10)
                    at WebSocket.onMessage (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/WebSocket.js:418:14)
                    at emitTwo (events.js:87:13)
                    at WebSocket.emit (events.js:172:7)
                    at Receiver.ontext (/Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/WebSocket.js:816:10)
                    at /Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/Receiver.js:477:18
                    at /Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/Receiver.js:361:7
                    at /Users/pix/Documents/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/node_modules/engine.io-client/node_modules/ws/lib/PerMessageDeflate.js:221:5
                    at afterWrite (_stream_writable.js:346:3)
                    at onwrite (_stream_writable.js:337:7)
                    at WritableState.onwrite (_stream_writable.js:89:5)
                    at afterTransform (_stream_transform.js:79:5)
                    at TransformState.afterTransform (_stream_transform.js:54:12)
                    at Zlib.callback (zlib.js:614:5)</anonymous></anonymous></anonymous></anonymous></anonymous></anonymous> 
                  

                  Ausserdem muss man diesen Bereich des Skriptes noch mal überdenken:

                  on({id: Gruppen[0][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[0][0], GrpSystem[0][0], GrpSystem[0][1], GrpSystem[0][2] ); }   });    // ende on id
                  on({id: Gruppen[1][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[1][0], GrpSystem[1][0], GrpSystem[1][1], GrpSystem[1][2] ); }   });    // ende on id
                  on({id: Gruppen[2][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[2][0], GrpSystem[2][0], GrpSystem[2][1], GrpSystem[2][2] ); }   });    // ende on id
                  on({id: Gruppen[3][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[3][0], GrpSystem[3][0], GrpSystem[3][1], GrpSystem[3][2] ); }   });    // ende on id
                  on({id: Gruppen[4][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[4][0], GrpSystem[4][0], GrpSystem[4][1], GrpSystem[4][2] ); }   });    // ende on id
                  on({id: Gruppen[5][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[5][0], GrpSystem[5][0], GrpSystem[5][1], GrpSystem[5][2] ); }   });    // ende on id
                  on({id: Gruppen[6][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[6][0], GrpSystem[6][0], GrpSystem[6][1], GrpSystem[6][2] ); }   });    // ende on id
                  on({id: Gruppen[7][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[7][0], GrpSystem[7][0], GrpSystem[7][1], GrpSystem[7][2] ); }   });    // ende on id
                  on({id: Gruppen[8][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[8][0], GrpSystem[8][0], GrpSystem[8][1], GrpSystem[8][2] ); }   });    // ende on id
                  on({id: Gruppen[9][0], valNe: 1000 }, function(obj)    {  if (obj.state.ack)  { GeraetUpdate( Gruppen[9][0], GrpSystem[9][0], GrpSystem[8][1], GrpSystem[9][2] ); }   });    // ende on id
                  on({id: Gruppen[10][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[10][0], GrpSystem[10][0], GrpSystem[10][1], GrpSystem[10][2] ); }   });    // ende on id
                  on({id: Gruppen[11][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[11][0], GrpSystem[11][0], GrpSystem[11][1], GrpSystem[11][2] ); }   });    // ende on id
                  on({id: Gruppen[12][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[12][0], GrpSystem[12][0], GrpSystem[12][1], GrpSystem[12][2] ); }   });    // ende on id
                  on({id: Gruppen[13][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[13][0], GrpSystem[13][0], GrpSystem[13][1], GrpSystem[13][2] ); }   });    // ende on id
                  on({id: Gruppen[14][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[14][0], GrpSystem[14][0], GrpSystem[14][1], GrpSystem[14][2] ); }   });    // ende on id
                  on({id: Gruppen[15][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[15][0], GrpSystem[15][0], GrpSystem[15][1], GrpSystem[15][2] ); }   });    // ende on id
                  on({id: Gruppen[16][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[16][0], GrpSystem[16][0], GrpSystem[16][1], GrpSystem[16][2] ); }   });    // ende on id
                  on({id: Gruppen[17][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[17][0], GrpSystem[17][0], GrpSystem[17][1], GrpSystem[17][2] ); }   });    // ende on id
                  on({id: Gruppen[18][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[18][0], GrpSystem[18][0], GrpSystem[18][1], GrpSystem[18][2] ); }   });    // ende on id
                  on({id: Gruppen[19][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[19][0], GrpSystem[19][0], GrpSystem[19][1], GrpSystem[19][2] ); }   });    // ende on id
                  on({id: Gruppen[20][0], valNe: 1000 }, function(obj)   {  if (obj.state.ack)  { GeraetUpdate( Gruppen[20][0], GrpSystem[20][0], GrpSystem[20][1], GrpSystem[20][2] ); }   });    // ende on id
                  
                  

                  Denn während es zu Beginn des Skriptes für den User leicht möglich ist, weitere Geräte durch Eintragung ins Array hinzuzufügen, muss er ja (bei über 20 Geräten) diesen Code auch erweitern. Es muss doch irgendwie möglich sein, alle Gruppen mit einem Subscribe zu überwachen.

                  Ich habe schon überlegt, ob es vielleicht Sinn macht, die Geräte über das Gewerk abzufragen. Füge jedes zu überwachende Gerät einfach zum Gewerk "Betriebstunden" und dann wird das Gewerk überwacht (so, wie hier im http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564)

                  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
                  • P Offline
                    P Offline
                    pix
                    schrieb am zuletzt editiert von Negalein
                    #10

                    Hab das Skript mal getestet:

                    Ohne das Log in eine externe Datei läuft es, ohne Fehler zu produzieren. Zuerst dachte ich, die Zeiten passen ja gar nicht. Aber die letztenbeiden Stellen sind wohl Minuten, oder? . Ich habe zwei Dimmer überwacht (Level). Die Lampen waren mehrere Minuten an. Hier das Log

                    2016-01-31 14:50:20.628  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: registered 21 subscriptions and 0 schedules
                    2016-01-31 14:50:50.038  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:50:52.467  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:52:06.935  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:52:09.520  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:52:58.320  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:53:01.934  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:54:49.528  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:54:52.624  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:55:27.089  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:55:30.258  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:56:09.219  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:56:11.542  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:56:42.431  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:56:45.251  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:57:10.900  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:57:11.633  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;95.5 ; 000:00:00:00 ; 0 ; 000:00:00:00 ; 0
                    2016-01-31 14:57:14.948  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;0 ; 000:00:00:03 ; 3315 ; 000:00:00:03 ; 3315
                    2016-01-31 14:57:42.912  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;0.5 ; 000:00:00:03 ; 3315 ; 000:00:00:03 ; 3315
                    2016-01-31 14:57:45.412  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:03 ; 3315 ; 000:00:00:03 ; 3315
                    2016-01-31 14:57:50.398  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:03 ; 3315 ; 000:00:00:03 ; 3315
                    2016-01-31 14:57:53.278  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:03 ; 3315 ; 000:00:00:03 ; 3315
                    2016-01-31 14:58:05.126  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;99.5 ; 000:00:00:03 ; 3315 ; 000:00:00:03 ; 3315
                    2016-01-31 14:58:08.122  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;0 ; 000:00:00:02 ; 2995 ; 000:00:00:06 ; 6310
                    2016-01-31 14:58:18.810  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;0.5 ; 000:00:00:02 ; 2995 ; 000:00:00:06 ; 6310
                    2016-01-31 14:58:21.999  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:02 ; 2995 ; 000:00:00:06 ; 6310
                    2016-01-31 14:58:34.688  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:02 ; 2995 ; 000:00:00:06 ; 6310
                    2016-01-31 14:58:38.181  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:02 ; 2995 ; 000:00:00:06 ; 6310
                    2016-01-31 14:59:04.390  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:02 ; 2995 ; 000:00:00:06 ; 6310
                    2016-01-31 14:59:07.881  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:02 ; 2995 ; 000:00:00:06 ; 6310
                    2016-01-31 14:59:18.594  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;99.5 ; 000:00:00:02 ; 2995 ; 000:00:00:06 ; 6310
                    2016-01-31 14:59:21.071  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;0 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 14:59:49.378  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Lampe Flur Regal.LEVEL;Betriebsstundenzaehler.System.Grp01MSec;0.5 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 14:59:51.852  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;33.5 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 14:59:54.903  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 15:00:09.731  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Lampe Flur Regal.LEVEL;Betriebsstundenzaehler.System.Grp01MSec;99.5 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 15:00:11.272  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Lampe Flur Regal.LEVEL;Betriebsstundenzaehler.System.Grp01MSec;92.5 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 15:00:11.557  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Lampe Flur Regal.LEVEL;Betriebsstundenzaehler.System.Grp01MSec;99 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 15:00:14.432  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Lampe Flur Regal.LEVEL;Betriebsstundenzaehler.System.Grp01MSec;100 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 15:00:28.665  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 15:00:32.046  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Licht Büro Computer.LEVEL;Betriebsstundenzaehler.System.Grp00MSec;100 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 15:00:44.936  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Lampe Flur Regal.LEVEL;Betriebsstundenzaehler.System.Grp01MSec;99.5 ; 000:00:00:02 ; 2476 ; 000:00:00:08 ; 8786
                    2016-01-31 15:00:48.099  - info: javascript.2 script.js.AATest_Betriebstundenzaehler: Lampe Flur Regal.LEVEL;Betriebsstundenzaehler.System.Grp01MSec;0 ; 000:00:00:03 ; 3162 ; 000:00:00:03 ; 3162
                    

                    261_bildschirmfoto_2016-01-31_um_15.04.06.jpg

                    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
                    • L Offline
                      L Offline
                      looxer01
                      schrieb am zuletzt editiert von
                      #11

                      Hi Pix,

                      Danke für's testen.

                      @pix:

                      Ausserdem muss man diesen Bereich des Skriptes noch mal überdenken: `
                      das habe ich getan, soweit ich es eben vermag und es mit einem Loop probiert. Das geht natürlich nicht.

                      Andererseits ist die Erweiterung super simple aber es wäre natürlich schöner, wenn das automatisiert wäre.

                      Zum Thema Log und OSX. Das heisst, dein IObroker läuft auf OSX?

                      Funktioniert der Pfad nicht ? oder ist es der Befehl append, der Probleme macht ?

                      @pix:

                      ber die letztenbeiden Stellen sind wohl Minuten, oder? `
                      Die letzten Stellen sind Sekunden. Das Format ist: DDD:HH:MM:SS

                      ABER

                      Es kann sein, dass zum Zeitpunkt des Programmstarts der Verbraucher bereits eingeschaltet war.

                      Beim Ausschalten würde dann nicht gemessen, da ja die Einschaltzeit nicht bekannt ist.

                      Also muss immer erst mal eingeschaltet werden, die Zeit abgespeichert und dann ausgeschaltet. Dann wird gemessen.

                      Hintergrund: Wenn ioBroker mal abstürzt oder etwas anderes passiert, das dazu führt, dass die Einschaltzeit nicht bekannt ist,

                      dann darf nicht gemessen werden.

                      Morgen werde ich wahrscheinlich die Zeitabschnittsmessung einstellen. Dann ist es möglich Tages/Wochen/Monats/Jahresbetriebszeiten darzustellen

                      vG Looxer

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

                        Das macht Sinn, Messung Start nur bei Licht Einschalten.

                        Check mal Zeile 245. Log('Logfile blabla'), 'info'; Das Info gehört in die Klammern, ist aber eigentlich nicht nötig, weil default. Übrigens ist an dieser Stelle der Hinweis des Editors "too many Errors..". Ich schätze, das hat was mit dem Umgang mit der externen Datei zu tun.

                        Ja ich lasse ioBroker auf OS X laufen. Die externe Datei ist nicht so wichtig für mich. Das kann ich später testen.

                        Gruß

                        Pix

                        EDIT: Du hast auch ne Menge Funktionen zur Zeitumrechnung. Auch diese Zeile habe ich gesehen:

                        FormTimeKum  = TimeCalc(FormTimeKum,newkumtime);
                        

                        Hast du dir mal den ioBroker Javascript Befehl https://github.com/iobroker/ioBroker.javascript#example angesehen? Der ist super für sowas.

                        Und die Funktionen addZero2 und 3 kannst du zusammenfassen:

                        //-----------------------------------------------------------------------------------------------------
                        // Funktion zur Erzeugung von 2 oder 3 führenden Nullen für das Datum Format
                        //-----------------------------------------------------------------------------------------------------
                        function addZero(i) {
                            if (i < 10) {
                                j = "00" + i;
                                i = "0" + i;
                            } 
                            if (i > 9 && i < 100) {
                                j = "0" + i;
                            }
                            return {
                                'zero2' : i,
                                'zero3' : j
                            }
                        } // Ende Funktion
                        

                        Gibt ein Objekt zurück.

                        Also kannst du den Aufruf hier (und auch die anderen) so umbauen

                        //-----------------------------------------------------------------------------------------------------
                        // Funktion zur Zeitdifferenzrechnung mit Format DDD:HH:MM:SS
                        //-----------------------------------------------------------------------------------------------------
                        function TimeCalc(time,diff) {
                        // Millisekunden umrechnen in Tag Stunden Minuten Sekunden
                        
                        var tag = addZero(Math.floor(diff / (1000*60*60*24))).zero3;
                        diff = diff % (1000*60*60*24);
                        var std = addZero(Math.floor(diff / (1000*60*60))).zero2;
                        diff = diff % (1000*60*60);
                        var min =  addZero(Math.floor(diff / (1000*60))).zero2;
                        diff = diff % (1000*60);
                        var sec = addZero(Math.floor(diff / 1000)).zero2;
                        time =  tag + ":" + std + ":" + min + ":" + sec; // jetzt ddd:hh:mm:ss zusammensetzen
                        return time;
                        }
                        

                        Die Funktion liefert beides (2 und 3 führende Nullen). Mit zero2 oder zero3 wählst du einfach den gewünschten "Datenpunkt"

                        Macht es kürzer. :-D

                        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
                        • paul53P Offline
                          paul53P Offline
                          paul53
                          schrieb am zuletzt editiert von Negalein
                          #13

                          Anmerkung zur ungenutzten Funktion BackTimeCalc: Woher kommt die Variable str ? Müsste es nicht time sein ?

                          function BackTimeCalc(time) {
                          // Tage Stunden Minuten Sekunden umrechnen in ms
                          	var n = time.length;
                          	var Sek = time.substr(n-2, 2);
                          	var Min = time.substr(n-5, 2);
                          	var Std = time.substr(n-8, 2);
                          	var Tge = time.substr(n,n-8-1);
                          	var MSec = (Sek+(Min*60)+(Std*3600)+(Tge*24*3600)) * 1000;
                          	return MSec;
                          }
                          

                          Rückgabewerte deklariert man üblicherweise innerhalb der Funktion und nicht als Übergabewert an die Funktion (MSec).
                          3435_screenshot__39_.png
                          3435_screenshot__40_.png

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

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

                            Ha, Paul war wieder schneller. Nach der ungenutzten Funktion wollte ich auch noch fragen (siehe Edit oben) :lol:
                            3435_screenshot__41_.png

                            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
                            • paul53P Offline
                              paul53P Offline
                              paul53
                              schrieb am zuletzt editiert von
                              #15

                              @pix:

                              Hast du dir mal den ioBroker Javascript Befehl formatDate angesehen? Der ist super für sowas. `
                              Daran hatte ich auch gedacht. Allerdings funktioniert formatDate nur für absolute Zeiten richtig, da es die Zeitzone berücksichtigt. Für die Verwendung auf Zeitdifferenzen muss man z.B. bei MEZ 3.600.000 ms von der Differenzzeit abziehen, damit das Ergebnis stimmt.

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

                              1 Antwort Letzte Antwort
                              0
                              • L Offline
                                L Offline
                                looxer01
                                schrieb am zuletzt editiert von
                                #16

                                Danke an euch.

                                und das habe ich draus gemacht.

                                • addzero angepasst (spart mir ja auch eine Funktion :)

                                • die nicht verwendeten Funktionen entfernt. (die kamen noch aus den Tagen wo ich nicht sicher war ob ich Millisekunden abspeichern sollte)

                                • mit formatDate konnte ich nicht soviel anfangen, da ich ja kein Datum sondern eine Laufzeit berechne/darstelle

                                • log(….,"info") korrigiert

                                mittlerweile habe ich auch tages/wochen/monats/Jahressummen implementiert. Kann man je Gerät unterscheiden was man haben will.

                                Heute war ja ein guter Tag zum Testen: Monatsanfang, Wochenanfang, und Tagesanfang ja sowieso :)

                                (aber leider gibt es ja so massive probleme mit der cron schedule Funktion)

                                Ich muss nur noch das externe Log erweitern und die Zeitabschnittsverbräuche dort fortschreiben (auf Wunsch)

                                @Pix: es wäre super, wenn du mal schauen kannst ob mit der Anpassung des Pfades das externe Log geschrieben wird.

                                vG Looxer

                                EDIT: so sieht es dann in denn Objekten aus inklusiver der Zeitabschnitte wo sie definiert wurden
                                305_bsz1.jpg

                                1 Antwort Letzte Antwort
                                0
                                • L Offline
                                  L Offline
                                  looxer01
                                  schrieb am zuletzt editiert von
                                  #17

                                  Version 0.5 ist jetzt eingestellt mit der zusätzlichen Funktionalitaet:

                                  • Zeitabschnitt-Logging - Betriebszaehler je ID einstellbar fuer Tag, Woche, Monat, Jahr

                                  für den Refresh ist ein Cron Schedule vorhanden, der aber aufgrund eines Fehlers im scheduler nicht funktioniert.

                                  Die Funktion ist getestet aber der scheduler eben nicht. (steht im Moment auf alle 24 Stunden )

                                  Was noch fehlt ist das logging fuer die Zeitabschnitte.

                                  vG Looxer

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

                                    Hallo Looxer,

                                    Kleinigkeit für die Funktion createStates

                                    Du hast ja oben im Array auf Position [2] eine Bezeichnung der Geräte gespeichert. Die Bezeichnung kannst du gut als Beschreibung oder besser Name in den Befehl createState übernehmen.

                                    if (Gruppen[zaehler][4] === true) {                                                  // soll eine WEEK kumulations Variable angelegt werden ?
                                                        createState(sysLocation + '.Grp' + zaehler2 + 'Kum.WEEK',   0);
                                                        createState(countLocation + "." +  Gruppen[zaehler][1] + ".WEEK",   "000:00:00:00", { name: 'Betriebstunden ' + Gruppen[zaehler][2] } );
                                                    }                
                                    
                                    

                                    Das ist neu:

                                    , { name: 'Betriebstunden ' + Gruppen[zaehler][2] }

                                    Dann wird die Übersicht im Reiter Objekte auch besser.

                                    Gruß

                                    Pix

                                    Edit: 'Betriebstunden ' + zugefügt

                                    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
                                      #19

                                      Hi,

                                      Thema externes Log:

                                      Es funktioniert, wenn ich unter OS X den ganzen Pfad eingebe:

                                      var LogPath         = "/Users/pix/Documents/iobroker/iobroker-data/BSZLog.csv";             // Pfad und Dateiname des externen Logs
                                      var TimeLogPath     = "/Users/pix/Documents/iobroker/iobroker-data/BSZTimeLog.csv";     // Pfad und Dateiname des externen Logs für die Zeitabschnitte täglich, wöchentlich monatlich jährlich
                                      
                                      ````Das musst du also auch noch etwas personalisieren.
                                      
                                      /Users/pix/Documents/iobroker/iobroker-data/BSZLog.csv
                                      
                                      OS X spezifisch Rest überall gleich
                                      
                                      wobei das System nicht zwangsläufig im Ordner iobroker installiert sein muss. Der ordner kann auch anders heißen.
                                      
                                      Was steht dann im Log um Mitternacht? Die gesamtzeit des Tages?
                                      
                                      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
                                      • L Offline
                                        L Offline
                                        looxer01
                                        schrieb am zuletzt editiert von
                                        #20

                                        Hi Pix,

                                        habs gerade mal getestet und es funktioniert.

                                        Allerdings verwirrt es mich eher. Besser waere es, wenn es als zusätzliche Beschreibung dienen könnte, z.B. beim Maus drüberfahren.

                                        Aber das geht wohl nicht ?

                                        vG Looxer
                                        5087_unbenannt.jpg

                                        1 Antwort Letzte Antwort
                                        0
                                        • L Offline
                                          L Offline
                                          looxer01
                                          schrieb am zuletzt editiert von
                                          #21

                                          @pix:

                                          Was steht dann im Log um Mitternacht? Die gesamtzeit des Tages? `
                                          Ja, so ist es gedacht. Um Mitternacht soll der Wert dann gesichert werden und dann genullt.

                                          vG Looxer

                                          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

                                          494

                                          Online

                                          32.5k

                                          Benutzer

                                          81.7k

                                          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