Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. LOWBAT Medungen Scipt Fehler

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    LOWBAT Medungen Scipt Fehler

    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      coffee-junk last edited by

      Hallo,

      nachdem ich mich heute mal mit dem Thema "leere Batterien" befasst habe ist mir aufgefallen, dass das Script, welches auf der Website angeboten wird, zwei Fehler enthält, weiss nicht, wer das Script "wartet"….

      http://www.iobroker.net/?page_id=2936&lang=de

      In Zeile 5 werden Geräte doppelt gezählt:

      var cacheSelectorLOWBAT  = $('channel[state.id=*.LOWBAT]');
      

      musste ich abändern auf

      var cacheSelectorLOWBAT  = $('channel[state.id=*0.LOWBAT]');
      

      In Zeile 26 wird die Anzahl der Geräte mit Lowbat hochgezählt, da dies aber nicht in der "If-Schleife" stattfindet, wird in dieser Variable immer die Anzahl ALLER Geräte mit LowBat Status gezählt, richtig wäre:

      cacheSelectorLOWBAT.each(function (id, i) {                         // Schleife für jedes gefundenen Element *.LOWBAT
            var status = getState(id).val;                                  // Zustand *.LOWBAT abfragen (jedes Element)
            var obj    = getObject(id);
            if (status === true) {                                          // wenn Zustand = true, dann wird die Anzahl der Geräte hochgezählt
               textLOWBAT.push(obj.common.name);                           // Zu Array hinzufügen
               ++anzahlLOWBAT;                                                 // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
            }                
            log("Geräte Nr. " + i + ": " + getObject(id).common.name + ": " + status);
            // HIER WEG ++anzahlLOWBAT;                                                 // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
         }); 
      

      Vielleicht kann das emand anpassen, der darauf Zugriff hat.

      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        Das Original Script stammt von http://forum.iobroker.net/viewtopic.php?f=21&t=869&p=10992#p6535.

        Zeile 10 kann entfallen, da die Anzahl aus der Array-Länge ermittelt werden kann.

        Zeile 26 sollte geändert werden in:

              ++moeglicheLOWBAT;                                                 // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
        
        

        Dann muss auch Zeile 31 geändert werden:

           log("Anzahl Geräte: " + moeglicheLOWBAT + " # davon LOWBAT erkannt: " +  textLOWBAT.length);
        

        Um auch noch abzufangen, dass der State zu Datenpunkten, die noch nie etwas empfangen haben, nicht existiert, sollte Zeile 20 ergänzt werden

              if(getState(id)) { 
                  var status = getState(id).val;                                  // Zustand *.LOWBAT abfragen (jedes Element)
              }
        
        

        Hier das korrigierte Skript:

        createState('zählenLowbat.möglicheLOWBAT', 0);   // wenn benötigt: Anzahl der Geräte mit Batterie
        createState('zählenLowbat.anzahlLOWBAT', 0);     // wenn benötigt: Anzahl der vorhandenen LOWBAT
        createState('zählenLowbat.textLOWBAT', " ");     // Namen LOWBAT, die an sind als Variable unter Javascript.0 anlegen
        
        var cacheSelectorLOWBAT  = $('channel[state.id=*0.LOWBAT]');
        
        function countLowbat(obj) {
           // Setzt die Zähler vor dem Durchlauf aller Elemente *.LOWBAT auf 0
           var moeglicheLOWBAT = 0;
           var textLOWBAT      = [];
        
           if (obj) {
              log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val);  // Info im Log, welcher Zustand sich geändert hat
           } else {
              log('Ausgelöst bei Timer');
           }
        
           cacheSelectorLOWBAT.each(function (id, i) {                         // Schleife für jedes gefundenen Element *0.LOWBAT
              var status = false;
              if(getState(id)) {
                 status = getState(id).val;                                  // Zustand *0.LOWBAT abfragen (jedes Element)
              }   
              var obj    = getObject(id);
              if (status === true) {                                          // wenn Zustand = true, wird das Array erweitert
                 textLOWBAT.push(obj.common.name);                           // Zu Array hinzufügen
              }               
              log("Geräte Nr. " + i + ": " + getObject(id).common.name + ": " + status);
              ++moeglicheLOWBAT;                                                 // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status
           });
        
           // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon LOWBAT zutreffend) ausgegeben
           log("Text: " + textLOWBAT);
           log("Anzahl Geräte: " + moeglicheLOWBAT + " # davon LOWBAT erkannt: " +  textLOWBAT.length);
        
           // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
           setState("zählenLowbat.textLOWBAT",     textLOWBAT.join(',
        ')); // Schreibt die Namen der Geräte mit LOWBAT Meldung
           setState("zählenLowbat.anzahlLOWBAT",   textLOWBAT.length);        // Schreibt die aktuelle Anzahl der LOWBAT-Meldungen
           setState("zählenLowbat.möglicheLOWBAT", moeglicheLOWBAT);          // Schreibt die Anzahl der vorhandenen Batterie-Geräte
        }
        
        cacheSelectorLOWBAT.on(function(obj) {    // bei Zustandänderung *. LOWBAT in allen Gewerken
           countLowbat(obj);
        });
        schedule("*/60 * * * *", function () {                                  //oder!! soll entweder ausgelöst werden alle 10 Minuten
           log("===>Will be triggered every 60 minutes!");
           countLowbat();
        });
        
        1 Reply Last reply Reply Quote 0
        • First post
          Last post

        Support us

        ioBroker
        Community Adapters
        Donate

        738
        Online

        31.7k
        Users

        79.8k
        Topics

        1.3m
        Posts

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