Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Script fürTabelle der Batterie Zustände

NEWS

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

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

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

Script fürTabelle der Batterie Zustände

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascriptmonitoringtemplate
1.4k Beiträge 67 Kommentatoren 490.3k Aufrufe 86 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.
  • vauvau07V vauvau07

    @liv-in-sky
    geht alles sehr schnell TOP

    liv-in-skyL Offline
    liv-in-skyL Offline
    liv-in-sky
    schrieb am zuletzt editiert von
    #580

    @vauvau07 solange keine fehler kommen :-)

    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

    1 Antwort Letzte Antwort
    0
    • Bulli BultmannB Bulli Bultmann

      @liv-in-sky

      zigbee.0.00158d0002c0d25b.json

      So ok ? Kannte ich so noch nicht.

      liv-in-skyL Offline
      liv-in-skyL Offline
      liv-in-sky
      schrieb am zuletzt editiert von
      #581

      @Bulli-Bultmann ich wollte eigentlich den xiaomi json haben - der macht doch ärger ? bzw wird bei dir nicht angezeigt - bei mir ist er drin

      nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

      1 Antwort Letzte Antwort
      0
      • liv-in-skyL liv-in-sky

        @vauvau07 sind auch nicht integriert

        schau mal da in dieses script -da sind sie drin - bitte testen bevor ich es uploade - ich habe keine datenpunkte dazu - daher blindflug

        @Bulli-Bultmann du kannst dieses file auch gerne testen für die zigbee

        //@liv-in-sky Januar 2020
        
        //HIER WIRD PFAD UND FILENAME DEFINIERT
        const path = "/htmlakku.html";                   //FIlenamen definieren
        const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
        let   braucheEinFile=false;                          // bei true wird ein file geschrieben
        let   braucheEinVISWidget=true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
        let dpVIS="controll-own.0.TABELLEN.AKKU"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget - zeichenkette(string)
        let dpAlarm="controll-own.0.TABELLEN.AkkuAlarm";  //WICHTIG datenpunkt erstellen vom typ "number" - bei 0 kein alarm und größer 0 die anzahl der schlechten batterien
        let dpAlarmMessage="controll-own.0.TABELLEN.AkkuMeessage";  //WICHTIG datenpunkt erstellen vom typ "string" Inhalt - alle devices mit lowbat-alarmen
        let wantAmessage=false;                                      // dieser message datenpunkt kann hier abgeschalten werden
        let htmlColorDeviceUeberschrift="#00BFFF"
        var battAlarm=30;                                     //alarm batterie wert
        var battAlarmWarning=55;                                     //warnungen batterie wert
        
        // ------------------------    hier einstellen, was man für adapter hat - die nicht gebraucht werden auf false setzen !!!
        var tradfri=true;
        var hue=true;
        var hueExt=true;
        var homematic=true;
        var homematicIp=true;
        var xiaomi=true;                                                // mihome.0
        var fritzDect=true;
        var netatmo=true;
        var homee=true;
        var tado=true;
        var zigbee=true;
        var iogo=true;                                                 // iogo - adapter - hat batterie abfrage
        var fullyBrowser=true;                                         // fullybrowser - adapter - hat batterie abfrage
        var handy1=false;                                              // sind einzelne datenpunkte, 
        var handy2=false;
        
        //f          ür spezialisten bei devices mit über 3 volt batterien
        var bigBattAlarm=3.3; var bigBattWarn=3.6; //WICHTIG bei bigAlarm nicht unter 3.3 gehen !!!!!!!!
        
        var symbolOK="✅";
        var symbolKO="❌";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz
        var symbolWARN="⚠️";
        
        var filterArray=[]; //hier den ganzenpfad von ungewünschten LOW_BAT werten eingeben - diese werden dann gefiltert
                                      // BEISPIEL var filterArray=["hm-rpc.0.LEQ0242145.0.LOWBAT", "hm-rpc.0.LEQ0242152.0.LOWBAT","hm-rpc.1.OEQ0473764.0.LOWBAT"];
        let mySchedule=" */5 * * * * ";                       //jede minute  
        //---------------------------------------
        
        //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
        var htmlFeld1='Device';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
        var htmlFeld2='Wert';        var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
        var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
        //-----------------------------------
        
        
        //------------------------------hier werden die styles für die tabelle definiert
        
        //ÜBERSCHRIFT ÜBER TABELLE
        let   htmlUberschrift=false;                           // mit Überschrift über der tabelle
        let   htmlSignature=true;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
        const htmlFeldUeber='Batterie Zustand Sensoren';              // Überschrift und Signature
        const htmlFarbUber="white";                         // Farbe der Überschrift
        const htmlSchriftWeite="normal";                       // bold, normal - Fettschrift für Überschrift
        const htmlÜberFontGroesse="18px";                       // schriftgröße überschrift
        //MEHRERE TABELLEN NEBENEINANDER
        let   mehrfachTabelle=4;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
        const htmlFarbZweiteTabelle="white";                // Farbe der Überschrift bei jeder 2.ten Tabelle
        const htmlFarbTableColorUber="#BDBDBD";               // Überschrift in der tabelle - der einzelnen Spalten
        //GANZE TABELLE
        let abstandZelle="1";
        let weite="auto";                                     //Weite der Tabelle
        let zentriert=true;                                   //ganze tabelle zentriert
        const backgroundAll="#000000";                        //Hintergrund für die ganze Seite - für direkten aufruf oder iqontrol sichtber - keine auswirkung auf vis-widget
        const htmlSchriftart="Helvetica";
        const htmlSchriftgroesse="14px";
        //FELDER UND RAHMEN
        let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
        const htmlFarbFelderschrift="#BDBDBD";                  // SchriftFarbe der Felder
        const htmlFarbFelderschrift2="#D8D8D8";                 // SchriftFarbe der Felder für jede 2te Tabelle
        const htmlFarbTableColorGradient1="#424242";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
        const htmlFarbTableColorGradient2="#424242";          //  Gradient - Hintergrund der Tabelle - ist dieser Wert gleich Gradient1 gibt es keinen verlauf
        const htmlFarbTableBorderColor="gray";             // Farbe des Rahmen - is tdieser gleich den gradienten, sind die rahmen unsichtbar
        let htmlRahmenLinien="cols";                            // Format für Rahmen: MÖGLICH: "none" oder "all" oder "cols" oder "rows"
        const htmlSpalte1Weite="auto";                   //  Weite der ersten beiden  Spalten oder z.b. 115px
        
        // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        
        let borderHelpBottum;
        let borderHelpRight;
        let htmlcenterHelp;
        let htmlcenterHelp2;
        
        if(htmlRahmenLinien=="rows") {borderHelpBottum=1;borderHelpRight=0;}
        if(htmlRahmenLinien=="cols") {borderHelpBottum=0;borderHelpRight=1;}
        if(htmlRahmenLinien=="none") {borderHelpBottum=0;borderHelpRight=0;}
        if(htmlRahmenLinien=="all")  {borderHelpBottum=1;borderHelpRight=1;}
        zentriert ? htmlcenterHelp="auto" : htmlcenterHelp="left";
        zentriert ? htmlcenterHelp2="center" : htmlcenterHelp2="left";
        
        
        const htmlZentriert='<center>'
        const htmlStart=    "<!DOCTYPE html><html lang=\"de\"><head><title>Vorlage</title><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"+
                         "<style> * {  margin: 0;} body {background-color: "+backgroundAll+"; margin: 0 auto;  }"+
                         " p {padding-top: 10px; padding-bottom: 10px; text-align: "+htmlcenterHelp2+"}"+
                        // " div { margin: 0 auto;  margin-left: auto; margin-right: auto;}"+
                         " td { padding:"+abstandZelle+"px; border:0px solid "+htmlFarbTableBorderColor+";  border-right:"+borderHelpRight+"px solid "+htmlFarbTableBorderColor+";border-bottom:"+borderHelpBottum+"px solid "+htmlFarbTableBorderColor+";}"+ 
                         " table { width: "+weite+";  margin: 0 "+htmlcenterHelp+"; border:1px solid "+htmlFarbTableBorderColor+"; border-spacing=\""+abstandZelle+"0px\" ; }"+   // margin macht center
                         "td:nth-child(1) {width: "+htmlSpalte1Weite+"}"+"td:nth-child(2) {width:"+htmlSpalte1Weite+"}"+
                         " </style></head><body> <div>";
        //const htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-weight: bold\">"+htmlFeldUeber+"</p>";                    
        const htmlTabStyle= "<table bordercolor=\""+htmlFarbTableBorderColor+"\" border=\"2px\" cellspacing=\""+abstandZelle+"\" cellpadding=\""+abstandZelle+"\" width=\""+weite+"\" rules=\""+htmlRahmenLinien+"\" style=\"color:"+htmlFarbFelderschrift+";  font-size:"+htmlSchriftgroesse+
                            "; font-family:"+htmlSchriftart+";background-image: linear-gradient(42deg,"+htmlFarbTableColorGradient2+","+htmlFarbTableColorGradient1+");\">";
        const htmlTabUeber1="<tr style=\"color:"+htmlFarbTableColorUber+"; font-weight: bold\">";
        const htmlTabUeber3="</tr>";
        
        
        //NICHTS ÄNDERN - abhängig von den oben definierten _Spalten - in diesem Beispiel sind es 3
        
         	var htmlTabUeber2="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
        var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                         "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
        //------------------------------------------------------
        
        
        var htmlTabUeber="";
        var htmlOut="";
        var mix;
        var counter;
        var AkkuAlarm=[];
        var alarmMessage=[];
        let AkkuMessageLengthAlt=0;
        var arrDoppelt=[];
        //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
        var val1; var val0; var val2;
        
        function writeHTML(){
         AkkuAlarm=[];
        
        htmlOut="";
        
        counter=-1;
        htmlTabUeber="";
        switch (mehrfachTabelle) { 
         case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber3;  break;
         case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
         case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
         case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
        };   
        if (!UeberschriftSpalten) {htmlTabUeber=""}
        
        
        //--------------------------------------------------------------------------------------------------------------------------------------------------
        //---------hier kommt eure schleife rein counter++, tabelleBind() und tabelleFinish() müssen so integriert bleiben !!!------------------------------
        //---------alle valx werte müssen von euch bestimmt werden - val0,val1,val2 !!!---------------------------------------------------------------------
        //--------------------------------------------------------------------------------------------------------------------------------------------------
        var myColl=[];
        var val1help;
        
          
          if (fritzDect){
        
                     // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                       tabelleAusbessern();
                       tabelleAusbessern();
                       counter=0;
                         val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>FRITZDECT THERMOSTATE</b>"; val1=""; val2="";
                       tabelleBind(); 
                       tabelleAusbessern();
                       counter=-1;
        
        
         $('fritzdect.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
            if (!filterArray.includes(id)){
                var ida = id.split('.');
               
                  counter++; 
                    
                //  val0=ida[2]+"."+ida[3];
                  val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
        
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
             
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            
           }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
        } //ende fritzdect
        
           if (homee){
        
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEE DEVICES</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
        
        
         $('homee.0.*.BatteryLevel*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
            if (!filterArray.includes(id)){
                var ida = id.split('.');
               
                  counter++; 
                    
                //  val0=ida[2]+"."+ida[3];
                  val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                  val1help=parseFloat((getState(id).val));
                 //    var val2_1;
                //   if (parseInt((new Date().getTime())) - val2_2help < 120000) {val2_1=true} else {val2_1=false;}
        
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                //  var val2_2help=Date.parse(getState(id.replace("BatteryStatus","LastUpdate")).val); 
                //  if (val2_1) {val2=symbolOK} else{val2=symbolKO}   
                       
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
             
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            
          } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
        } //ende fritzdect
        
           if (netatmo){
        
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>NETATMO DEVICES</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
        
        
         $('netatmo.*.*.*.BatteryStatus').each(function(id, i) {           // netatmo.0.Hinxxxer.Außenmodul-Carport.BatteryStatus
        
        //  if (!filterArray.includes(id)){
        
              
                var ida = id.split('.');
             
                  counter++; 
                    
                //  val0=ida[2]+"."+ida[3];
                  val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;
                  val1help=parseFloat((getState(id).val));
                  //   var val2_1;
                //   if (parseInt((new Date().getTime())) - val2_2help < 120000) {val2_1=true} else {val2_1=false;}
        
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                //  var val2_2help=Date.parse(getState(id.replace("BatteryStatus","LastUpdate")).val); 
                //  if (val2_1) {val2=symbolOK} else{val2=symbolKO}   
                       
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
             
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            
           /* }*/   }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
        } //ende fritzdect
        
         if (xiaomi){
              // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>XIAOMI DEVICES</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
        
        
        $('mihome.*.devices.*.percent').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
              // log (id)
               if (!filterArray.includes(id)){
                var ida = id.split('.');
               
                
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                //  val0=ida[3];
                  val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;
                 val0=val0.replace(/.battery$/,""); 
                // log(val0+"   "+id);
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                 
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
                
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
         
         }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
         
         } //ende xiaomi
        
        if (hue){
            // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();     
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HUE DEVICES</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
            
        $('hue.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
         
          if (!filterArray.includes(id)){
               var ida = id.split('.');
              
               
                 counter++; 
                  val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;   val0=val0.replace(/.battery$/,""); val0=val0.replace("Philips_hue.",""); val0=val0.replace(/_/g," ");                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
          
            tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
        
        } }); 
        
         }  //ende hue
        if (hueExt){ 
               // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();        
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HUE EXTENDED</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
        
        $('hue-extended.*.*.*.config.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
        
        if (!filterArray.includes(id)){
              var ida = id.split('.');
           
              
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
               
                   val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;   val0=val0.replace("Philips_hue.",""); val0=val0.replace(/_/g," ");                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
        
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
        
               
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
        
         }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
        
          } //ende hue-extended
        
           if (zigbee){ 
        
              // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>ZIGBEE</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
        
        $('zigbee.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
             
              if (!filterArray.includes(id)){
              var ida = id.split('.');
             
              
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
               
               
                 val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                // log(val0+"   "+id);
                val1help=getState(id).val;
                val1help=parseFloat((getState(id).val));
                if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
        
                if (val1help<=battAlarm) AkkuAlarm.push(1);
                if (val1help<=battAlarm)  alarmMessage.push(val0);
         
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
        
        } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
         }
        
        if (tradfri){ 
        
              // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>IKEA TRADFRI</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
        
        $('tradfri.*.*.batteryPercentage').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
             
              if (!filterArray.includes(id)){
              var ida = id.split('.');
             
              
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
               
               
                 val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                // log(val0+"   "+id);
                val1help=getState(id).val;
                val1help=parseFloat((getState(id).val));
                if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
        
                if (val1help<=battAlarm) AkkuAlarm.push(1);
                if (val1help<=battAlarm)  alarmMessage.push(val0);
         
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
        
        } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
         }
        
         if (tado){
            tabelleAusbessern();
            counter=0;
            val0=val0=""; val1=""; val2="";
            tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            tabelleAusbessern();
            counter=0;
            val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>TADO DEVICES</b>"; val1=""; val2="";
            tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            tabelleAusbessern();
            counter=-1
        
        
        $('tado.*.*.*.*.*.*.info.batteryState').each(function(id, i) {           // tado.0.337268.Rooms.11.devices.VA3078030592.info.batteryState
            var ida = id.split('.');
             if (!filterArray.includes(id)){
              counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
            //  log(id)
               val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+"."+ida[4]).common.name                     //getObject(id).common.name ; //ida[2]+"."+ida[3];
                                                                                               //tado.0.337268.Rooms.11
              
               //log(val0+"   "+id);
              val1help=getState(id).val;
              if (val1help=="LOW") {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
              //if (val1help<=battAlarm) {val2="<font color=\"red\"><b>X</b>"} else{val2=symbolOK}
              if (val1help=="LOW") {val2="<font color=\"red\">"+symbolKO} else{val2=symbolOK}   
              //if (val1help) {val2=<font color=\"red\"><b>X</b>} else{val2="✔"}         
              
              if (val1help=="LOW") AkkuAlarm.push(1);
              if (val1help=="LOW")  alarmMessage.push(val0);
        
         tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
             } // ende filterArr
        }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!! 
          }  //ende tado
        
        
        if (homematic){
            tabelleAusbessern();
            counter=0;
            val0=val0=""; val1=""; val2="";
            tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            tabelleAusbessern();
            counter=0;
            val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEMATIC</b>"; val1=""; val2="";
            tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            tabelleAusbessern();
            counter=-1
            arrDoppelt=[];
        $('hm-rpc.*.*.*.BATTERY_STATE').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
         
         if (!filterArray.includes(id)){
            var ida = id.split('.');
        
            var arrFilt=[];
        
                $(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+".*").each(function(id, i) {   // kontrolliere ob OPERATING_VOLTAGE vorhanden
                    var idc = id.split('.');
                 arrFilt.push(idc[4])
                 });
              arrDoppelt.push(ida[0]+"."+ida[1]+"."+ida[2]);
              counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
        
           if (arrFilt.includes("BATTERY_STATE")) {
                       val0=getObject(id).common.name ; 
                       var ida = val0.split('.');
                       val0=ida[0].replace(/:.+/g,"");
                       val1help=getState(id).val;
                       var  val1helper=getState(id.replace("LOW_BAT","BATTERY_STATUS")).val;     
                       //bigBatterien 
                       //log (val1helper.toFixed(1))
                       if (val1helper>3.2){
                              if (val1helper<=bigBattAlarm) {val2=symbolKO} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                 {val2=symbolWARN} else{val2=symbolOK};
                              if (val1helper<=bigBattAlarm) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                 {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+(val1helper.toFixed(1))+" V"};
                              if (val1helper<bigBattAlarm) AkkuAlarm.push(1);
                              if (val1helper<=bigBattAlarm)  alarmMessage.push(val0);
                           }
        
                       else {         
                             if (val1helper<2.2) {val2=symbolKO} else if (val1helper<=2.5 && val1helper>=2.2) 
                                {val2=symbolWARN} else{val2=symbolOK};
                             if (val1helper<2.2) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=2.5 && val1helper>=2.2) 
                                {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+val1helper.toFixed(1)+" V"};
                             if (val1helper<2.2) AkkuAlarm.push(1);
                             if (val1helper<2.2)  alarmMessage.push(val0);}
        
             } else {
                                                          
                      val0=getObject(id).common.name ; 
                      var ida = val0.split('.');
                      val0=ida[0].replace(/:.+/g,"");
                      val1help=getState(id).val;
                      if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                      if (val1help) {val2=symbolKO} else{val2=symbolOK}         
                      if (val1help) AkkuAlarm.push(1);
                      if (val1help)  alarmMessage.push(val0);
        
             }
        
         tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
         }
        });
        //log(arrDoppelt.toString())
        $('hm-rpc.*.*.0.LOWBAT').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
            var ida = id.split('.');
          //  log(id)
            //log(arrDoppelt.toString())
         //    if (!filterArray.includes(id) && !arrDoppelt.includes(ida[0]+"."+ida[1]+"."+ida[2]+".*.BATTERY_STATE") ) {
                     if (!filterArray.includes(id) && !arrDoppelt.includes(ida[0]+"."+ida[1]+"."+ida[2]) ) {                          
              
                 
              counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
            //  log(id)
               val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name                     //getObject(id).common.name ; //ida[2]+"."+ida[3];
               var ida = val0.split('.');
               val0=ida[0].replace(/:.+/g,"");
               //log(val0+"   "+id);
              val1help=getState(id).val;
              if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
              //if (val1help<=battAlarm) {val2="<font color=\"red\"><b>X</b>"} else{val2=symbolOK}
              if (val1help) {val2="<font color=\"red\">"+symbolKO} else{val2=symbolOK}   
              //if (val1help) {val2=<font color=\"red\"><b>X</b>} else{val2="✔"}         
              
              if (val1help) AkkuAlarm.push(1);
              if (val1help)  alarmMessage.push(val0);
        
        
         tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
             } // log(id)// ende filterArr
        }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
        
        
        //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
         
          } //ende hm
        
        if (homematicIp ){ 
               tabelleAusbessern();
               counter=0;
               val0=""; val1=""; val2="";
               tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               tabelleAusbessern();
               counter=0;
               val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEMATIC IP</b>"; val1=""; val2="";
               tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               tabelleAusbessern();
               counter=-1
        
        
        
        $('hm-rpc.*.*.0.LOW_BAT').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
        
         if (!filterArray.includes(id)){
              var ida = id.split('.');
        
              var arrFilt=[];
        
                  $(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+".*").each(function(id, i) {   // kontrolliere ob OPERATING_VOLTAGE vorhanden
                      var idc = id.split('.');
                   arrFilt.push(idc[4])
                   });
              // log(arrFilt.toString());
        
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
        
             if (arrFilt.includes("OPERATING_VOLTAGE")) {
                       //  val0=getObject(id).common.name ; 
                         val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ; 
                         var ida = val0.split('.');
                         val0=ida[0].replace(/:.+/g,"");
                         val1help=getState(id).val;
                         var  val1helper=getState(id.replace("LOW_BAT","OPERATING_VOLTAGE")).val;     
                         //bigBatterien 
                         //log (val1helper.toFixed(1))
                         if (val1helper>3.2){
                                if (val1helper<=bigBattAlarm) {val2=symbolKO} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                   {val2=symbolWARN} else{val2=symbolOK};
                                if (val1helper<=bigBattAlarm) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                   {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+(val1helper.toFixed(1))+" V"};
                                if (val1helper<bigBattAlarm) AkkuAlarm.push(1);
                                if (val1helper<2.2) alarmMessage.push(val0);
                             }
          
                         else {         
                               if (val1helper<2.2) {val2=symbolKO} else if (val1helper<=2.5 && val1helper>=2.2) 
                                  {val2=symbolWARN} else{val2=symbolOK};
                               if (val1helper<2.2) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=2.5 && val1helper>=2.2) 
                                  {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+val1helper.toFixed(1)+" V"};
                               if (val1helper<2.2) {AkkuAlarm.push(1);}
                               if (val1helper<2.2) alarmMessage.push(val0);
                               }
        
               } else {
                                                            
                        val0=getObject(id).common.name ; 
                        var ida = val0.split('.');
                        val0=ida[0].replace(/:.+/g,"");
                        val1help=getState(id).val;
                        if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                        if (val1help) {val2=symbolKO} else{val2=symbolOK}         
                        if (val1help) AkkuAlarm.push(1);
        
               }
        
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
          
        } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
           
         }  //ende hm-ip
        
         if (fullyBrowser){
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>FULLYBROWSER</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
        
        
        $('fullybrowser.*.*.Info.batteryLevel').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
        if (!filterArray.includes(id)){
                var ida = id.split('.');
               
                
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
        
                  val0=getState(id.replace("batteryLevel","deviceName")).val;
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                 
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
         
         }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
         
         } //ende fullybrowser
        
        
         if (iogo){
              tabelleAusbessern();
              counter=0;
              val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HANDY über IOGO</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
        
        
        $('iogo.*.*.battery.level').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
        if (!filterArray.includes(id)){
                var ida = id.split('.');
               
                
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
               //   val0=ida[3];
                  val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                // log(val0+"   "+id);
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                 
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
                
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
         
        } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
         
         } //ende iogo
        
        
          if (handy1){  
                  tabelleAusbessern();
                  counter=0;
                  val0=""; val1=""; val2="";
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                  tabelleAusbessern();
                  counter=0;
                  val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HANDYs</b>"; val1=""; val2="";
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                  tabelleAusbessern();
                  counter=-1
        
               $('controll-own.0.HANDY.*batt*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                if (!filterArray.includes(id)){
              var ida = id.split('.');
              
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                val0=ida[3];
               // log(val0+"   "+id);
                val1help=parseFloat((getState(id).val));
                if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
        
                if (val1help<=battAlarm) AkkuAlarm.push(1);
                if (val1help<=battAlarm)  alarmMessage.push(val0);
           
         
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               
                } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
        
          } //ende handy1
        
        
        
          if (handy2){ 
                   $('controll-own.0.HANDY.*Batt*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                    if (!filterArray.includes(id)){
              var ida = id.split('.');
              
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                val0=ida[3];
               // log(val0+"   "+id);
                val1help=parseFloat((getState(id).val));
                if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()}
                if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
               
        
         
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
          
                    } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
          } //ende handy2
        //-------------------------------------------------------------------------------------------------------------------------------------------------
        //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
        //-------------------------------------------------------------------------------------------------------------------------------------------------
        
            tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
        
            if (AkkuAlarm.length >=1 ) {setState(dpAlarm,AkkuAlarm.length)} else {setState(dpAlarm,AkkuAlarm.length)}
           // log("BATTERIE Alarm     : "+AkkuAlarm.length.toString());
           if (AkkuMessageLengthAlt < AkkuAlarm.length && wantAmessage) {setState(dpAlarmMessage,alarmMessage.toString()); AkkuMessageLengthAlt=AkkuAlarm.length}
           alarmMessage=[];
               
        } // function ende
        
        //MAIN:
        
        schedule(mySchedule,  function () { 
        writeHTML();
        if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
        }); 
        writeHTML();  
        if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}                                 //     <tdalign
        function tabelleBind(){
             switch (mehrfachTabelle) {  
               case 1:                    htmlOut=htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>"; break;
               case 2:  if(counter%2==0)  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                     else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} break;
                                          
               case 3: if(counter%3==0 )  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                     else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                      else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>";}
                                                } break;
        
        
               case 4: if(counter%4==0)  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                         else {if(counter%2==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                      else    {if(counter%2==1 && counter%4==3)  { htmlOut= htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} 
                                                                        else    {htmlOut = htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}}
                                                } break; } //switch ende
        
        }
        
        function tabelleAusbessern() {
        
        switch (mehrfachTabelle) {  
               case 1:    break;
               case 2:    mix=Math.abs(((counter+1)%2)-mehrfachTabelle);  
                          if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                          break;
               case 3:    mix =Math.abs(((counter+1)%3)-mehrfachTabelle);
                          if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                          if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                          break;
               case 4:    mix=Math.abs(((counter+1)%4)-mehrfachTabelle);
                          if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                          if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');    
                          if(mix==3)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                          break; }
        }
        
        function tabelleFinish() {
        
        switch (mehrfachTabelle) {  
               case 1:    break;
               case 2:    mix=Math.abs(((counter+1)%2)-mehrfachTabelle);  
                          if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                          break;
               case 3:    mix =Math.abs(((counter+1)%3)-mehrfachTabelle);
                          if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                          if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                          break;
               case 4:    mix=Math.abs(((counter+1)%4)-mehrfachTabelle);
                          if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                          if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');    
                          if(mix==3)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                          break; }
           
               var htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: "+htmlÜberFontGroesse+"; font-weight:"+htmlSchriftWeite+ "\">"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</p>"; 
             var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 70%; text-align: right;\" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>";
              
              if (!htmlSignature) htmlUnter="";
                //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                 var htmlOutVIS="";
               //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                  if (htmlUberschrift) 
                      { zentriert ? htmlOutVIS=htmlZentriert+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter ;
        
                    } else {
                     zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter;
        
                       }
                       
        
        // log("bin raus aus tabelleBind");
                 if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
                 //console.log dpVIS;
        
        var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 80%;  text-align: center; \" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>"
        var htmlEnd="</table>"+htmlUnter+"</div></body>";
        if (!htmlSignature) htmlUnter="";
        
        //mit oder ohne überschrift - zentriert oder links
        htmlUberschrift ? htmlOut=htmlStart+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd : htmlOut=htmlStart+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd;
        //log(htmlOut);
        
        
        }
        
        
        

        Bulli BultmannB Offline
        Bulli BultmannB Offline
        Bulli Bultmann
        schrieb am zuletzt editiert von
        #582

        @liv-in-sky
        :+1: :innocent: Hat geklappt. Zigbee ist jetzt drin, Gerät wird angezeigt.
        Toll.

        1 Antwort Letzte Antwort
        0
        • liv-in-skyL liv-in-sky

          @vauvau07 sind auch nicht integriert

          schau mal da in dieses script -da sind sie drin - bitte testen bevor ich es uploade - ich habe keine datenpunkte dazu - daher blindflug

          @Bulli-Bultmann du kannst dieses file auch gerne testen für die zigbee

          //@liv-in-sky Januar 2020
          
          //HIER WIRD PFAD UND FILENAME DEFINIERT
          const path = "/htmlakku.html";                   //FIlenamen definieren
          const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
          let   braucheEinFile=false;                          // bei true wird ein file geschrieben
          let   braucheEinVISWidget=true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
          let dpVIS="controll-own.0.TABELLEN.AKKU"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget - zeichenkette(string)
          let dpAlarm="controll-own.0.TABELLEN.AkkuAlarm";  //WICHTIG datenpunkt erstellen vom typ "number" - bei 0 kein alarm und größer 0 die anzahl der schlechten batterien
          let dpAlarmMessage="controll-own.0.TABELLEN.AkkuMeessage";  //WICHTIG datenpunkt erstellen vom typ "string" Inhalt - alle devices mit lowbat-alarmen
          let wantAmessage=false;                                      // dieser message datenpunkt kann hier abgeschalten werden
          let htmlColorDeviceUeberschrift="#00BFFF"
          var battAlarm=30;                                     //alarm batterie wert
          var battAlarmWarning=55;                                     //warnungen batterie wert
          
          // ------------------------    hier einstellen, was man für adapter hat - die nicht gebraucht werden auf false setzen !!!
          var tradfri=true;
          var hue=true;
          var hueExt=true;
          var homematic=true;
          var homematicIp=true;
          var xiaomi=true;                                                // mihome.0
          var fritzDect=true;
          var netatmo=true;
          var homee=true;
          var tado=true;
          var zigbee=true;
          var iogo=true;                                                 // iogo - adapter - hat batterie abfrage
          var fullyBrowser=true;                                         // fullybrowser - adapter - hat batterie abfrage
          var handy1=false;                                              // sind einzelne datenpunkte, 
          var handy2=false;
          
          //f          ür spezialisten bei devices mit über 3 volt batterien
          var bigBattAlarm=3.3; var bigBattWarn=3.6; //WICHTIG bei bigAlarm nicht unter 3.3 gehen !!!!!!!!
          
          var symbolOK="✅";
          var symbolKO="❌";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz
          var symbolWARN="⚠️";
          
          var filterArray=[]; //hier den ganzenpfad von ungewünschten LOW_BAT werten eingeben - diese werden dann gefiltert
                                        // BEISPIEL var filterArray=["hm-rpc.0.LEQ0242145.0.LOWBAT", "hm-rpc.0.LEQ0242152.0.LOWBAT","hm-rpc.1.OEQ0473764.0.LOWBAT"];
          let mySchedule=" */5 * * * * ";                       //jede minute  
          //---------------------------------------
          
          //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
          var htmlFeld1='Device';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
          var htmlFeld2='Wert';        var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
          var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
          //-----------------------------------
          
          
          //------------------------------hier werden die styles für die tabelle definiert
          
          //ÜBERSCHRIFT ÜBER TABELLE
          let   htmlUberschrift=false;                           // mit Überschrift über der tabelle
          let   htmlSignature=true;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
          const htmlFeldUeber='Batterie Zustand Sensoren';              // Überschrift und Signature
          const htmlFarbUber="white";                         // Farbe der Überschrift
          const htmlSchriftWeite="normal";                       // bold, normal - Fettschrift für Überschrift
          const htmlÜberFontGroesse="18px";                       // schriftgröße überschrift
          //MEHRERE TABELLEN NEBENEINANDER
          let   mehrfachTabelle=4;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
          const htmlFarbZweiteTabelle="white";                // Farbe der Überschrift bei jeder 2.ten Tabelle
          const htmlFarbTableColorUber="#BDBDBD";               // Überschrift in der tabelle - der einzelnen Spalten
          //GANZE TABELLE
          let abstandZelle="1";
          let weite="auto";                                     //Weite der Tabelle
          let zentriert=true;                                   //ganze tabelle zentriert
          const backgroundAll="#000000";                        //Hintergrund für die ganze Seite - für direkten aufruf oder iqontrol sichtber - keine auswirkung auf vis-widget
          const htmlSchriftart="Helvetica";
          const htmlSchriftgroesse="14px";
          //FELDER UND RAHMEN
          let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
          const htmlFarbFelderschrift="#BDBDBD";                  // SchriftFarbe der Felder
          const htmlFarbFelderschrift2="#D8D8D8";                 // SchriftFarbe der Felder für jede 2te Tabelle
          const htmlFarbTableColorGradient1="#424242";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
          const htmlFarbTableColorGradient2="#424242";          //  Gradient - Hintergrund der Tabelle - ist dieser Wert gleich Gradient1 gibt es keinen verlauf
          const htmlFarbTableBorderColor="gray";             // Farbe des Rahmen - is tdieser gleich den gradienten, sind die rahmen unsichtbar
          let htmlRahmenLinien="cols";                            // Format für Rahmen: MÖGLICH: "none" oder "all" oder "cols" oder "rows"
          const htmlSpalte1Weite="auto";                   //  Weite der ersten beiden  Spalten oder z.b. 115px
          
          // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          
          let borderHelpBottum;
          let borderHelpRight;
          let htmlcenterHelp;
          let htmlcenterHelp2;
          
          if(htmlRahmenLinien=="rows") {borderHelpBottum=1;borderHelpRight=0;}
          if(htmlRahmenLinien=="cols") {borderHelpBottum=0;borderHelpRight=1;}
          if(htmlRahmenLinien=="none") {borderHelpBottum=0;borderHelpRight=0;}
          if(htmlRahmenLinien=="all")  {borderHelpBottum=1;borderHelpRight=1;}
          zentriert ? htmlcenterHelp="auto" : htmlcenterHelp="left";
          zentriert ? htmlcenterHelp2="center" : htmlcenterHelp2="left";
          
          
          const htmlZentriert='<center>'
          const htmlStart=    "<!DOCTYPE html><html lang=\"de\"><head><title>Vorlage</title><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"+
                           "<style> * {  margin: 0;} body {background-color: "+backgroundAll+"; margin: 0 auto;  }"+
                           " p {padding-top: 10px; padding-bottom: 10px; text-align: "+htmlcenterHelp2+"}"+
                          // " div { margin: 0 auto;  margin-left: auto; margin-right: auto;}"+
                           " td { padding:"+abstandZelle+"px; border:0px solid "+htmlFarbTableBorderColor+";  border-right:"+borderHelpRight+"px solid "+htmlFarbTableBorderColor+";border-bottom:"+borderHelpBottum+"px solid "+htmlFarbTableBorderColor+";}"+ 
                           " table { width: "+weite+";  margin: 0 "+htmlcenterHelp+"; border:1px solid "+htmlFarbTableBorderColor+"; border-spacing=\""+abstandZelle+"0px\" ; }"+   // margin macht center
                           "td:nth-child(1) {width: "+htmlSpalte1Weite+"}"+"td:nth-child(2) {width:"+htmlSpalte1Weite+"}"+
                           " </style></head><body> <div>";
          //const htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-weight: bold\">"+htmlFeldUeber+"</p>";                    
          const htmlTabStyle= "<table bordercolor=\""+htmlFarbTableBorderColor+"\" border=\"2px\" cellspacing=\""+abstandZelle+"\" cellpadding=\""+abstandZelle+"\" width=\""+weite+"\" rules=\""+htmlRahmenLinien+"\" style=\"color:"+htmlFarbFelderschrift+";  font-size:"+htmlSchriftgroesse+
                              "; font-family:"+htmlSchriftart+";background-image: linear-gradient(42deg,"+htmlFarbTableColorGradient2+","+htmlFarbTableColorGradient1+");\">";
          const htmlTabUeber1="<tr style=\"color:"+htmlFarbTableColorUber+"; font-weight: bold\">";
          const htmlTabUeber3="</tr>";
          
          
          //NICHTS ÄNDERN - abhängig von den oben definierten _Spalten - in diesem Beispiel sind es 3
          
           	var htmlTabUeber2="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
          var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                           "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
          //------------------------------------------------------
          
          
          var htmlTabUeber="";
          var htmlOut="";
          var mix;
          var counter;
          var AkkuAlarm=[];
          var alarmMessage=[];
          let AkkuMessageLengthAlt=0;
          var arrDoppelt=[];
          //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
          var val1; var val0; var val2;
          
          function writeHTML(){
           AkkuAlarm=[];
          
          htmlOut="";
          
          counter=-1;
          htmlTabUeber="";
          switch (mehrfachTabelle) { 
           case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber3;  break;
           case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
           case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
           case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
          };   
          if (!UeberschriftSpalten) {htmlTabUeber=""}
          
          
          //--------------------------------------------------------------------------------------------------------------------------------------------------
          //---------hier kommt eure schleife rein counter++, tabelleBind() und tabelleFinish() müssen so integriert bleiben !!!------------------------------
          //---------alle valx werte müssen von euch bestimmt werden - val0,val1,val2 !!!---------------------------------------------------------------------
          //--------------------------------------------------------------------------------------------------------------------------------------------------
          var myColl=[];
          var val1help;
          
            
            if (fritzDect){
          
                       // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                         tabelleAusbessern();
                         tabelleAusbessern();
                         counter=0;
                           val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>FRITZDECT THERMOSTATE</b>"; val1=""; val2="";
                         tabelleBind(); 
                         tabelleAusbessern();
                         counter=-1;
          
          
           $('fritzdect.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
              if (!filterArray.includes(id)){
                  var ida = id.split('.');
                 
                    counter++; 
                      
                  //  val0=ida[2]+"."+ida[3];
                    val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                    val1help=parseFloat((getState(id).val));
                    if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                    if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                    if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                    if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                    if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
          
                    if (val1help<=battAlarm) AkkuAlarm.push(1);
                    if (val1help<=battAlarm)  alarmMessage.push(val0);
               
             
               tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              
             }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
          } //ende fritzdect
          
             if (homee){
          
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEE DEVICES</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
          
          
           $('homee.0.*.BatteryLevel*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
              if (!filterArray.includes(id)){
                  var ida = id.split('.');
                 
                    counter++; 
                      
                  //  val0=ida[2]+"."+ida[3];
                    val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                    val1help=parseFloat((getState(id).val));
                   //    var val2_1;
                  //   if (parseInt((new Date().getTime())) - val2_2help < 120000) {val2_1=true} else {val2_1=false;}
          
                    if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                    if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                    if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                    if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                  //  var val2_2help=Date.parse(getState(id.replace("BatteryStatus","LastUpdate")).val); 
                  //  if (val2_1) {val2=symbolOK} else{val2=symbolKO}   
                         
                    if (val1help<=battAlarm) AkkuAlarm.push(1);
                    if (val1help<=battAlarm)  alarmMessage.push(val0);
               
             
               tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              
            } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
          } //ende fritzdect
          
             if (netatmo){
          
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>NETATMO DEVICES</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
          
          
           $('netatmo.*.*.*.BatteryStatus').each(function(id, i) {           // netatmo.0.Hinxxxer.Außenmodul-Carport.BatteryStatus
          
          //  if (!filterArray.includes(id)){
          
                
                  var ida = id.split('.');
               
                    counter++; 
                      
                  //  val0=ida[2]+"."+ida[3];
                    val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;
                    val1help=parseFloat((getState(id).val));
                    //   var val2_1;
                  //   if (parseInt((new Date().getTime())) - val2_2help < 120000) {val2_1=true} else {val2_1=false;}
          
                    if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                    if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                    if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                    if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                  //  var val2_2help=Date.parse(getState(id.replace("BatteryStatus","LastUpdate")).val); 
                  //  if (val2_1) {val2=symbolOK} else{val2=symbolKO}   
                         
                    if (val1help<=battAlarm) AkkuAlarm.push(1);
                    if (val1help<=battAlarm)  alarmMessage.push(val0);
               
             
               tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              
             /* }*/   }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
          } //ende fritzdect
          
           if (xiaomi){
                // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>XIAOMI DEVICES</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
          
          
          $('mihome.*.devices.*.percent').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                // log (id)
                 if (!filterArray.includes(id)){
                  var ida = id.split('.');
                 
                  
                    counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                  //  val0=ida[3];
                    val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;
                   val0=val0.replace(/.battery$/,""); 
                  // log(val0+"   "+id);
                    val1help=parseFloat((getState(id).val));
                    if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                    if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                    if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                    if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                    if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                   
                    if (val1help<=battAlarm) AkkuAlarm.push(1);
                    if (val1help<=battAlarm)  alarmMessage.push(val0);
                  
             
               tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
           
           }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
           
           } //ende xiaomi
          
          if (hue){
              // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();     
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HUE DEVICES</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
              
          $('hue.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
           
            if (!filterArray.includes(id)){
                 var ida = id.split('.');
                
                 
                   counter++; 
                    val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;   val0=val0.replace(/.battery$/,""); val0=val0.replace("Philips_hue.",""); val0=val0.replace(/_/g," ");                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                    val1help=parseFloat((getState(id).val));
                    if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                    if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                    if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                    if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                    if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                  
                    if (val1help<=battAlarm) AkkuAlarm.push(1);
                    if (val1help<=battAlarm)  alarmMessage.push(val0);
            
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
          
          } }); 
          
           }  //ende hue
          if (hueExt){ 
                 // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();        
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HUE EXTENDED</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
          
          $('hue-extended.*.*.*.config.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
          
          if (!filterArray.includes(id)){
                var ida = id.split('.');
             
                
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                 
                     val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;   val0=val0.replace("Philips_hue.",""); val0=val0.replace(/_/g," ");                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
          
                    val1help=parseFloat((getState(id).val));
                    if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                    if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                    if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                    if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                    if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                    if (val1help<=battAlarm) AkkuAlarm.push(1);
                    if (val1help<=battAlarm)  alarmMessage.push(val0);
          
                 
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
          
           }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
          
            } //ende hue-extended
          
             if (zigbee){ 
          
                // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>ZIGBEE</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
          
          $('zigbee.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
               
                if (!filterArray.includes(id)){
                var ida = id.split('.');
               
                
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                 
                 
                   val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                  // log(val0+"   "+id);
                  val1help=getState(id).val;
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
          
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
          
          } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
           }
          
          if (tradfri){ 
          
                // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>IKEA TRADFRI</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
          
          $('tradfri.*.*.batteryPercentage').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
               
                if (!filterArray.includes(id)){
                var ida = id.split('.');
               
                
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                 
                 
                   val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                  // log(val0+"   "+id);
                  val1help=getState(id).val;
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
          
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
          
          } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
           }
          
           if (tado){
              tabelleAusbessern();
              counter=0;
              val0=val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>TADO DEVICES</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
          
          
          $('tado.*.*.*.*.*.*.info.batteryState').each(function(id, i) {           // tado.0.337268.Rooms.11.devices.VA3078030592.info.batteryState
              var ida = id.split('.');
               if (!filterArray.includes(id)){
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
              //  log(id)
                 val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+"."+ida[4]).common.name                     //getObject(id).common.name ; //ida[2]+"."+ida[3];
                                                                                                 //tado.0.337268.Rooms.11
                
                 //log(val0+"   "+id);
                val1help=getState(id).val;
                if (val1help=="LOW") {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                //if (val1help<=battAlarm) {val2="<font color=\"red\"><b>X</b>"} else{val2=symbolOK}
                if (val1help=="LOW") {val2="<font color=\"red\">"+symbolKO} else{val2=symbolOK}   
                //if (val1help) {val2=<font color=\"red\"><b>X</b>} else{val2="✔"}         
                
                if (val1help=="LOW") AkkuAlarm.push(1);
                if (val1help=="LOW")  alarmMessage.push(val0);
          
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               } // ende filterArr
          }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!! 
            }  //ende tado
          
          
          if (homematic){
              tabelleAusbessern();
              counter=0;
              val0=val0=""; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=0;
              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEMATIC</b>"; val1=""; val2="";
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              tabelleAusbessern();
              counter=-1
              arrDoppelt=[];
          $('hm-rpc.*.*.*.BATTERY_STATE').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
           
           if (!filterArray.includes(id)){
              var ida = id.split('.');
          
              var arrFilt=[];
          
                  $(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+".*").each(function(id, i) {   // kontrolliere ob OPERATING_VOLTAGE vorhanden
                      var idc = id.split('.');
                   arrFilt.push(idc[4])
                   });
                arrDoppelt.push(ida[0]+"."+ida[1]+"."+ida[2]);
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
          
             if (arrFilt.includes("BATTERY_STATE")) {
                         val0=getObject(id).common.name ; 
                         var ida = val0.split('.');
                         val0=ida[0].replace(/:.+/g,"");
                         val1help=getState(id).val;
                         var  val1helper=getState(id.replace("LOW_BAT","BATTERY_STATUS")).val;     
                         //bigBatterien 
                         //log (val1helper.toFixed(1))
                         if (val1helper>3.2){
                                if (val1helper<=bigBattAlarm) {val2=symbolKO} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                   {val2=symbolWARN} else{val2=symbolOK};
                                if (val1helper<=bigBattAlarm) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                   {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+(val1helper.toFixed(1))+" V"};
                                if (val1helper<bigBattAlarm) AkkuAlarm.push(1);
                                if (val1helper<=bigBattAlarm)  alarmMessage.push(val0);
                             }
          
                         else {         
                               if (val1helper<2.2) {val2=symbolKO} else if (val1helper<=2.5 && val1helper>=2.2) 
                                  {val2=symbolWARN} else{val2=symbolOK};
                               if (val1helper<2.2) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=2.5 && val1helper>=2.2) 
                                  {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+val1helper.toFixed(1)+" V"};
                               if (val1helper<2.2) AkkuAlarm.push(1);
                               if (val1helper<2.2)  alarmMessage.push(val0);}
          
               } else {
                                                            
                        val0=getObject(id).common.name ; 
                        var ida = val0.split('.');
                        val0=ida[0].replace(/:.+/g,"");
                        val1help=getState(id).val;
                        if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                        if (val1help) {val2=symbolKO} else{val2=symbolOK}         
                        if (val1help) AkkuAlarm.push(1);
                        if (val1help)  alarmMessage.push(val0);
          
               }
          
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
           }
          });
          //log(arrDoppelt.toString())
          $('hm-rpc.*.*.0.LOWBAT').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
              var ida = id.split('.');
            //  log(id)
              //log(arrDoppelt.toString())
           //    if (!filterArray.includes(id) && !arrDoppelt.includes(ida[0]+"."+ida[1]+"."+ida[2]+".*.BATTERY_STATE") ) {
                       if (!filterArray.includes(id) && !arrDoppelt.includes(ida[0]+"."+ida[1]+"."+ida[2]) ) {                          
                
                   
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
              //  log(id)
                 val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name                     //getObject(id).common.name ; //ida[2]+"."+ida[3];
                 var ida = val0.split('.');
                 val0=ida[0].replace(/:.+/g,"");
                 //log(val0+"   "+id);
                val1help=getState(id).val;
                if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                //if (val1help<=battAlarm) {val2="<font color=\"red\"><b>X</b>"} else{val2=symbolOK}
                if (val1help) {val2="<font color=\"red\">"+symbolKO} else{val2=symbolOK}   
                //if (val1help) {val2=<font color=\"red\"><b>X</b>} else{val2="✔"}         
                
                if (val1help) AkkuAlarm.push(1);
                if (val1help)  alarmMessage.push(val0);
          
          
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               } // log(id)// ende filterArr
          }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
          
          
          //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
           
            } //ende hm
          
          if (homematicIp ){ 
                 tabelleAusbessern();
                 counter=0;
                 val0=""; val1=""; val2="";
                 tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 tabelleAusbessern();
                 counter=0;
                 val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEMATIC IP</b>"; val1=""; val2="";
                 tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 tabelleAusbessern();
                 counter=-1
          
          
          
          $('hm-rpc.*.*.0.LOW_BAT').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
          
           if (!filterArray.includes(id)){
                var ida = id.split('.');
          
                var arrFilt=[];
          
                    $(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+".*").each(function(id, i) {   // kontrolliere ob OPERATING_VOLTAGE vorhanden
                        var idc = id.split('.');
                     arrFilt.push(idc[4])
                     });
                // log(arrFilt.toString());
          
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
          
               if (arrFilt.includes("OPERATING_VOLTAGE")) {
                         //  val0=getObject(id).common.name ; 
                           val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ; 
                           var ida = val0.split('.');
                           val0=ida[0].replace(/:.+/g,"");
                           val1help=getState(id).val;
                           var  val1helper=getState(id.replace("LOW_BAT","OPERATING_VOLTAGE")).val;     
                           //bigBatterien 
                           //log (val1helper.toFixed(1))
                           if (val1helper>3.2){
                                  if (val1helper<=bigBattAlarm) {val2=symbolKO} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                     {val2=symbolWARN} else{val2=symbolOK};
                                  if (val1helper<=bigBattAlarm) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                     {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+(val1helper.toFixed(1))+" V"};
                                  if (val1helper<bigBattAlarm) AkkuAlarm.push(1);
                                  if (val1helper<2.2) alarmMessage.push(val0);
                               }
            
                           else {         
                                 if (val1helper<2.2) {val2=symbolKO} else if (val1helper<=2.5 && val1helper>=2.2) 
                                    {val2=symbolWARN} else{val2=symbolOK};
                                 if (val1helper<2.2) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=2.5 && val1helper>=2.2) 
                                    {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+val1helper.toFixed(1)+" V"};
                                 if (val1helper<2.2) {AkkuAlarm.push(1);}
                                 if (val1helper<2.2) alarmMessage.push(val0);
                                 }
          
                 } else {
                                                              
                          val0=getObject(id).common.name ; 
                          var ida = val0.split('.');
                          val0=ida[0].replace(/:.+/g,"");
                          val1help=getState(id).val;
                          if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                          if (val1help) {val2=symbolKO} else{val2=symbolOK}         
                          if (val1help) AkkuAlarm.push(1);
          
                 }
          
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            
          } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
             
           }  //ende hm-ip
          
           if (fullyBrowser){
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>FULLYBROWSER</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
          
          
          $('fullybrowser.*.*.Info.batteryLevel').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
          if (!filterArray.includes(id)){
                  var ida = id.split('.');
                 
                  
                    counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
          
                    val0=getState(id.replace("batteryLevel","deviceName")).val;
                    val1help=parseFloat((getState(id).val));
                    if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                    if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                    if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                    if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                    if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                   
                    if (val1help<=battAlarm) AkkuAlarm.push(1);
                    if (val1help<=battAlarm)  alarmMessage.push(val0);
             
               tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
           
           }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
           
           } //ende fullybrowser
          
          
           if (iogo){
                tabelleAusbessern();
                counter=0;
                val0=""; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=0;
                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HANDY über IOGO</b>"; val1=""; val2="";
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                tabelleAusbessern();
                counter=-1
          
          
          $('iogo.*.*.battery.level').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
          if (!filterArray.includes(id)){
                  var ida = id.split('.');
                 
                  
                    counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                 //   val0=ida[3];
                    val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                  // log(val0+"   "+id);
                    val1help=parseFloat((getState(id).val));
                    if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                    if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                    if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                    if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                    if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                   
                    if (val1help<=battAlarm) AkkuAlarm.push(1);
                    if (val1help<=battAlarm)  alarmMessage.push(val0);
                  
             
               tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
           
          } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
           
           } //ende iogo
          
          
            if (handy1){  
                    tabelleAusbessern();
                    counter=0;
                    val0=""; val1=""; val2="";
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                    tabelleAusbessern();
                    counter=0;
                    val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HANDYs</b>"; val1=""; val2="";
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                    tabelleAusbessern();
                    counter=-1
          
                 $('controll-own.0.HANDY.*batt*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                  if (!filterArray.includes(id)){
                var ida = id.split('.');
                
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                  val0=ida[3];
                 // log(val0+"   "+id);
                  val1help=parseFloat((getState(id).val));
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
          
                  if (val1help<=battAlarm) AkkuAlarm.push(1);
                  if (val1help<=battAlarm)  alarmMessage.push(val0);
             
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 
                  } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
          
            } //ende handy1
          
          
          
            if (handy2){ 
                     $('controll-own.0.HANDY.*Batt*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                      if (!filterArray.includes(id)){
                var ida = id.split('.');
                
                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                  val0=ida[3];
                 // log(val0+"   "+id);
                  val1help=parseFloat((getState(id).val));
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                  if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                  if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()}
                  if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                  if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                  if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                 
          
           
             tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
            
                      } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
            } //ende handy2
          //-------------------------------------------------------------------------------------------------------------------------------------------------
          //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
          //-------------------------------------------------------------------------------------------------------------------------------------------------
          
              tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
          
              if (AkkuAlarm.length >=1 ) {setState(dpAlarm,AkkuAlarm.length)} else {setState(dpAlarm,AkkuAlarm.length)}
             // log("BATTERIE Alarm     : "+AkkuAlarm.length.toString());
             if (AkkuMessageLengthAlt < AkkuAlarm.length && wantAmessage) {setState(dpAlarmMessage,alarmMessage.toString()); AkkuMessageLengthAlt=AkkuAlarm.length}
             alarmMessage=[];
                 
          } // function ende
          
          //MAIN:
          
          schedule(mySchedule,  function () { 
          writeHTML();
          if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
          }); 
          writeHTML();  
          if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}                                 //     <tdalign
          function tabelleBind(){
               switch (mehrfachTabelle) {  
                 case 1:                    htmlOut=htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>"; break;
                 case 2:  if(counter%2==0)  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                       else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} break;
                                            
                 case 3: if(counter%3==0 )  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                       else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                        else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>";}
                                                  } break;
          
          
                 case 4: if(counter%4==0)  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                           else {if(counter%2==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                        else    {if(counter%2==1 && counter%4==3)  { htmlOut= htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} 
                                                                          else    {htmlOut = htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}}
                                                  } break; } //switch ende
          
          }
          
          function tabelleAusbessern() {
          
          switch (mehrfachTabelle) {  
                 case 1:    break;
                 case 2:    mix=Math.abs(((counter+1)%2)-mehrfachTabelle);  
                            if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                            break;
                 case 3:    mix =Math.abs(((counter+1)%3)-mehrfachTabelle);
                            if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                            if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                            break;
                 case 4:    mix=Math.abs(((counter+1)%4)-mehrfachTabelle);
                            if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                            if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');    
                            if(mix==3)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                            break; }
          }
          
          function tabelleFinish() {
          
          switch (mehrfachTabelle) {  
                 case 1:    break;
                 case 2:    mix=Math.abs(((counter+1)%2)-mehrfachTabelle);  
                            if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                            break;
                 case 3:    mix =Math.abs(((counter+1)%3)-mehrfachTabelle);
                            if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                            if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                            break;
                 case 4:    mix=Math.abs(((counter+1)%4)-mehrfachTabelle);
                            if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                            if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');    
                            if(mix==3)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                            break; }
             
                 var htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: "+htmlÜberFontGroesse+"; font-weight:"+htmlSchriftWeite+ "\">"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</p>"; 
               var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 70%; text-align: right;\" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>";
                
                if (!htmlSignature) htmlUnter="";
                  //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                   var htmlOutVIS="";
                 //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                    if (htmlUberschrift) 
                        { zentriert ? htmlOutVIS=htmlZentriert+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter ;
          
                      } else {
                       zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter;
          
                         }
                         
          
          // log("bin raus aus tabelleBind");
                   if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
                   //console.log dpVIS;
          
          var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 80%;  text-align: center; \" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>"
          var htmlEnd="</table>"+htmlUnter+"</div></body>";
          if (!htmlSignature) htmlUnter="";
          
          //mit oder ohne überschrift - zentriert oder links
          htmlUberschrift ? htmlOut=htmlStart+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd : htmlOut=htmlStart+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd;
          //log(htmlOut);
          
          
          }
          
          
          

          Bulli BultmannB Offline
          Bulli BultmannB Offline
          Bulli Bultmann
          schrieb am zuletzt editiert von
          #583

          @liv-in-sky Einen habe ich noch. :nerd_face:
          HM Fenstersensor mit einer Batterie 1,5 volt.

          Batterie6.JPG

          hm-rpc.2.0000DA499B2068.json

          Gehen die auch ?

          liv-in-skyL 1 Antwort Letzte Antwort
          0
          • NegaleinN Offline
            NegaleinN Offline
            Negalein
            Global Moderator
            schrieb am zuletzt editiert von
            #584

            @liv-in-sky

            Script hab ich angepasst, jedoch bekomm ich jetzt wieder Warn-Meldungen

            18:23:17.185	warn	javascript.0 (592) at tabelleFinish (script.js.common.Akku_Alarm_Tabelle:923:36)
            18:23:17.185	warn	javascript.0 (592) at writeHTML (script.js.common.Akku_Alarm_Tabelle:834:6)
            18:23:17.185	warn	javascript.0 (592) at script.js.common.Akku_Alarm_Tabelle:849:1
            18:23:17.186	warn	javascript.0 (592) at writeHTML (script.js.common.Akku_Alarm_Tabelle:836:76)
            18:23:17.186	warn	javascript.0 (592) at script.js.common.Akku_Alarm_Tabelle:849:1
            

            //@liv-in-sky Januar 2020
             
            //HIER WIRD PFAD UND FILENAME DEFINIERT
            const path = "/htmlakku.html";                   //FIlenamen definieren
            const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
            let   braucheEinFile=false;                          // bei true wird ein file geschrieben
            let   braucheEinVISWidget=true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
            let dpVIS="controll-own.0.TABELLEN.AKKU"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget - zeichenkette(string)
            let dpAlarm="controll-own.0.TABELLEN.AkkuAlarm";  //WICHTIG datenpunkt erstellen vom typ "number" - bei 0 kein alarm und größer 0 die anzahl der schlechten batterien
            let dpAlarmMessage="0_userdata.0.Tabellen.AkkuMessage";  //WICHTIG datenpunkt erstellen vom typ "string" Inhalt - alle devices mit lowbat-alarmen
            let wantAmessage=true;                                      // dieser message datenpunkt kann hier abgeschalten werden
            let htmlColorDeviceUeberschrift="#00BFFF"
            var battAlarm=30;                                     //alarm batterie wert
            var battAlarmWarning=55;                                     //warnungen batterie wert
             
             // ------------------------    hier einstellen, was man für adapter hat - die nicht gebraucht werden auf false setzen !!!
            var tradfri=false;
            var hue=true;
            var hueExt=false;
            var homematic=true;
            var homematicIp=true;
            var xiaomi=true;                                                // mihome.0
            var fritzDect=false;
            var netatmo=false;
            var homee=false;
            var tado=false;
            var zigbee=false;
            var iogo=false;                                                 // iogo - adapter - hat batterie abfrage
            var fullyBrowser=false;                                         // fullybrowser - adapter - hat batterie abfrage
            var handy1=false;                                              // sind einzelne datenpunkte, 
            var handy2=false;
             
            //für spezialisten bei devices mit über 3 volt batterien
            var bigBattAlarm=3.3; var bigBattWarn=3.6; //WICHTIG bei bigAlarm nicht unter 3.3 gehen !!!!!!!!
             
            var symbolOK="✅";
            var symbolKO="❌";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz
            var symbolWARN="⚠️";
             
            var filterArray=["mihome.0.devices.plug_158d0001f24aad.percent","mihome.0.devices.plug_158d00020d98af.percent"]; //hier den ganzenpfad von ungewünschten LOW_BAT werten eingeben - diese werden dann gefiltert
                                           // BEISPIEL var filterArray=["hm-rpc.0.LEQ0242145.0.LOWBAT", "hm-rpc.0.LEQ0242152.0.LOWBAT","hm-rpc.1.OEQ0473764.0.LOWBAT"];
            let mySchedule=" */5 * * * * ";                       //jede minute  
            //---------------------------------------
             
            //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
            var htmlFeld1='Device';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
            var htmlFeld2='V bzw. %';        var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
            var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
            //-----------------------------------
             
             
            //------------------------------hier werden die styles für die tabelle definiert
             
            //ÜBERSCHRIFT ÜBER TABELLE
            let   htmlUberschrift=false;                           // mit Überschrift über der tabelle
            let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
            const htmlFeldUeber='Batterie Zustand Sensoren';              // Überschrift und Signature
            const htmlFarbUber="white";                         // Farbe der Überschrift
            const htmlSchriftWeite="normal";                       // bold, normal - Fettschrift für Überschrift
            const htmlÜberFontGroesse="18px";                       // schriftgröße überschrift
            //MEHRERE TABELLEN NEBENEINANDER
            let   mehrfachTabelle=2;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
            const htmlFarbZweiteTabelle="white";                // Farbe der Überschrift bei jeder 2.ten Tabelle
            const htmlFarbTableColorUber="#BDBDBD";               // Überschrift in der tabelle - der einzelnen Spalten
            //GANZE TABELLE
            let abstandZelle="1";
            let weite="auto";                                     //Weite der Tabelle
            let zentriert=true;                                   //ganze tabelle zentriert
            const backgroundAll="#000000";                        //Hintergrund für die ganze Seite - für direkten aufruf oder iqontrol sichtber - keine auswirkung auf vis-widget
            const htmlSchriftart="Helvetica";
            const htmlSchriftgroesse="14px";
            //FELDER UND RAHMEN
            let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
            const htmlFarbFelderschrift="#BDBDBD";                  // SchriftFarbe der Felder
            const htmlFarbFelderschrift2="#D8D8D8";                 // SchriftFarbe der Felder für jede 2te Tabelle
            const htmlFarbTableColorGradient1="#424242";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
            const htmlFarbTableColorGradient2="#424242";          //  Gradient - Hintergrund der Tabelle - ist dieser Wert gleich Gradient1 gibt es keinen verlauf
            const htmlFarbTableBorderColor="white";             // Farbe des Rahmen - is tdieser gleich den gradienten, sind die rahmen unsichtbar
            let htmlRahmenLinien="cols";                            // Format für Rahmen: MÖGLICH: "none" oder "all" oder "cols" oder "rows"
            const htmlSpalte1Weite="auto";                   //  Weite der ersten beiden  Spalten oder z.b. 115px
             
            // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
             
            let borderHelpBottum;
            let borderHelpRight;
            let htmlcenterHelp;
            let htmlcenterHelp2;
             
            if(htmlRahmenLinien=="rows") {borderHelpBottum=1;borderHelpRight=0;}
            if(htmlRahmenLinien=="cols") {borderHelpBottum=0;borderHelpRight=1;}
            if(htmlRahmenLinien=="none") {borderHelpBottum=0;borderHelpRight=0;}
            if(htmlRahmenLinien=="all")  {borderHelpBottum=1;borderHelpRight=1;}
            zentriert ? htmlcenterHelp="auto" : htmlcenterHelp="left";
            zentriert ? htmlcenterHelp2="center" : htmlcenterHelp2="left";
             
             
            const htmlZentriert='<center>'
            const htmlStart=    "<!DOCTYPE html><html lang=\"de\"><head><title>Vorlage</title><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"+
                              "<style> * {  margin: 0;} body {background-color: "+backgroundAll+"; margin: 0 auto;  }"+
                              " p {padding-top: 10px; padding-bottom: 10px; text-align: "+htmlcenterHelp2+"}"+
                             // " div { margin: 0 auto;  margin-left: auto; margin-right: auto;}"+
                              " td { padding:"+abstandZelle+"px; border:0px solid "+htmlFarbTableBorderColor+";  border-right:"+borderHelpRight+"px solid "+htmlFarbTableBorderColor+";border-bottom:"+borderHelpBottum+"px solid "+htmlFarbTableBorderColor+";}"+ 
                              " table { width: "+weite+";  margin: 0 "+htmlcenterHelp+"; border:1px solid "+htmlFarbTableBorderColor+"; border-spacing=\""+abstandZelle+"0px\" ; }"+   // margin macht center
                              "td:nth-child(1) {width: "+htmlSpalte1Weite+"}"+"td:nth-child(2) {width:"+htmlSpalte1Weite+"}"+
                              " </style></head><body> <div>";
            //const htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-weight: bold\">"+htmlFeldUeber+"</p>";                    
            const htmlTabStyle= "<table bordercolor=\""+htmlFarbTableBorderColor+"\" border=\"2px\" cellspacing=\""+abstandZelle+"\" cellpadding=\""+abstandZelle+"\" width=\""+weite+"\" rules=\""+htmlRahmenLinien+"\" style=\"color:"+htmlFarbFelderschrift+";  font-size:"+htmlSchriftgroesse+
                                 "; font-family:"+htmlSchriftart+";background-image: linear-gradient(42deg,"+htmlFarbTableColorGradient2+","+htmlFarbTableColorGradient1+");\">";
            const htmlTabUeber1="<tr style=\"color:"+htmlFarbTableColorUber+"; font-weight: bold\">";
            const htmlTabUeber3="</tr>";
             
             
            //NICHTS ÄNDERN - abhängig von den oben definierten _Spalten - in diesem Beispiel sind es 3
             
              	var htmlTabUeber2="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
            var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                              "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
            //------------------------------------------------------
             
             
            var htmlTabUeber="";
            var htmlOut="";
            var mix;
            var counter;
            var AkkuAlarm=[];
            var alarmMessage=[];
            let AkkuMessageLengthAlt=0;
             var arrDoppelt=[];
            //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
            var val1; var val0; var val2;
             
            function writeHTML(){
              AkkuAlarm=[];
             
            htmlOut="";
             
            counter=-1;
            htmlTabUeber="";
            switch (mehrfachTabelle) { 
              case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber3;  break;
              case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
              case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
              case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
            };   
            if (!UeberschriftSpalten) {htmlTabUeber=""}
             
             
            //--------------------------------------------------------------------------------------------------------------------------------------------------
            //---------hier kommt eure schleife rein counter++, tabelleBind() und tabelleFinish() müssen so integriert bleiben !!!------------------------------
            //---------alle valx werte müssen von euch bestimmt werden - val0,val1,val2 !!!---------------------------------------------------------------------
            //--------------------------------------------------------------------------------------------------------------------------------------------------
            var myColl=[];
            var val1help;
             
               
               if (fritzDect){
             
                          // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                            tabelleAusbessern();
                            tabelleAusbessern();
                            counter=0;
                              val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>FRITZDECT THERMOSTATE</b>"; val1=""; val2="";
                            tabelleBind(); 
                            tabelleAusbessern();
                            counter=-1;
             
             
              $('fritzdect.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                 if (!filterArray.includes(id)){
                     var ida = id.split('.');
                    
                       counter++; 
                         
                     //  val0=ida[2]+"."+ida[3];
                       val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
             
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                  
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 
                }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
             } //ende fritzdect
             
                if (homee){
             
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEE DEVICES</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
             
             
              $('homee.0.*.BatteryLevel*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                 if (!filterArray.includes(id)){
                     var ida = id.split('.');
                    
                       counter++; 
                         
                     //  val0=ida[2]+"."+ida[3];
                       val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                       val1help=parseFloat((getState(id).val));
                      //    var val2_1;
                     //   if (parseInt((new Date().getTime())) - val2_2help < 120000) {val2_1=true} else {val2_1=false;}
             
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                     //  var val2_2help=Date.parse(getState(id.replace("BatteryStatus","LastUpdate")).val); 
                     //  if (val2_1) {val2=symbolOK} else{val2=symbolKO}   
                            
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                  
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 
               } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
             } //ende fritzdect
             
                if (netatmo){
             
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>NETATMO DEVICES</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
             
             
              $('netatmo.*.*.*.BatteryStatus').each(function(id, i) {           // netatmo.0.Hinxxxer.Außenmodul-Carport.BatteryStatus
             
             //  if (!filterArray.includes(id)){
             
                   
                     var ida = id.split('.');
                  
                       counter++; 
                         
                     //  val0=ida[2]+"."+ida[3];
                       val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;
                       val1help=parseFloat((getState(id).val));
                       //   var val2_1;
                     //   if (parseInt((new Date().getTime())) - val2_2help < 120000) {val2_1=true} else {val2_1=false;}
             
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                     //  var val2_2help=Date.parse(getState(id.replace("BatteryStatus","LastUpdate")).val); 
                     //  if (val2_1) {val2=symbolOK} else{val2=symbolKO}   
                            
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                  
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 
                /* }*/   }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
             } //ende fritzdect
             
              if (xiaomi){
                   // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>XIAOMI DEVICES</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
             
             
            $('mihome.*.devices.*.percent').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                   // log (id)
                    if (!filterArray.includes(id)){
                     var ida = id.split('.');
                    
                     
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                     //  val0=ida[3];
                       val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;
                      val0=val0.replace(/.battery$/,""); 
                     // log(val0+"   "+id);
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                      
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                     
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              
              }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
              
              } //ende xiaomi
             
             if (hue){
                 // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();     
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HUE DEVICES</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
                 
            $('hue.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
              
               if (!filterArray.includes(id)){
                    var ida = id.split('.');
                   
                    
                      counter++; 
                       val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;   val0=val0.replace(/.battery$/,""); val0=val0.replace("Philips_hue.",""); val0=val0.replace(/_/g," ");                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                     
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
               
                 tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
             
             } }); 
             
              }  //ende hue
             if (hueExt){ 
                    // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();        
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HUE EXTENDED</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
             
            $('hue-extended.*.*.*.config.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
             
             if (!filterArray.includes(id)){
                   var ida = id.split('.');
                
                   
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                    
                        val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;   val0=val0.replace("Philips_hue.",""); val0=val0.replace(/_/g," ");                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
             
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
             
                    
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
             
              }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
             
               } //ende hue-extended
             
                if (zigbee){ 
             
                   // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>ZIGBEE</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
             
            $('zigbee.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                  
                   if (!filterArray.includes(id)){
                   var ida = id.split('.');
                  
                   
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                    
                    
                      val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                     // log(val0+"   "+id);
                     val1help=getState(id).val;
                     val1help=parseFloat((getState(id).val));
                     if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                     if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                     if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                     if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                     if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
             
                     if (val1help<=battAlarm) AkkuAlarm.push(1);
                     if (val1help<=battAlarm)  alarmMessage.push(val0);
              
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
             
             } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
              }
             
             if (tradfri){ 
             
                   // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>IKEA TRADFRI</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
             
            $('tradfri.*.*.batteryPercentage').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                  
                   if (!filterArray.includes(id)){
                   var ida = id.split('.');
                  
                   
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                    
                    
                      val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                     // log(val0+"   "+id);
                     val1help=getState(id).val;
                     val1help=parseFloat((getState(id).val));
                     if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                     if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                     if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                     if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                     if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
             
                     if (val1help<=battAlarm) AkkuAlarm.push(1);
                     if (val1help<=battAlarm)  alarmMessage.push(val0);
              
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
             
             } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
              }
             
              if (tado){
                 tabelleAusbessern();
                 counter=0;
                 val0=val0=""; val1=""; val2="";
                 tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 tabelleAusbessern();
                 counter=0;
                 val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>TADO DEVICES</b>"; val1=""; val2="";
                 tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 tabelleAusbessern();
                 counter=-1
             
             
            $('tado.*.*.*.*.*.*.info.batteryState').each(function(id, i) {           // tado.0.337268.Rooms.11.devices.VA3078030592.info.batteryState
                 var ida = id.split('.');
                  if (!filterArray.includes(id)){
                   counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                 //  log(id)
                    val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+"."+ida[4]).common.name                     //getObject(id).common.name ; //ida[2]+"."+ida[3];
                                                                                                    //tado.0.337268.Rooms.11
                   
                    //log(val0+"   "+id);
                   val1help=getState(id).val;
                   if (val1help=="LOW") {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                   //if (val1help<=battAlarm) {val2="<font color=\"red\"><b>X</b>"} else{val2=symbolOK}
                   if (val1help=="LOW") {val2="<font color=\"red\">"+symbolKO} else{val2=symbolOK}   
                   //if (val1help) {val2=<font color=\"red\"><b>X</b>} else{val2="✔"}         
                   
                   if (val1help=="LOW") AkkuAlarm.push(1);
                   if (val1help=="LOW")  alarmMessage.push(val0);
             
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                  } // ende filterArr
            }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!! 
               }  //ende tado
             
             
            if (homematic){
                 tabelleAusbessern();
                 counter=0;
                 val0=val0=""; val1=""; val2="";
                 tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 tabelleAusbessern();
                 counter=0;
                 val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEMATIC</b>"; val1=""; val2="";
                 tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 tabelleAusbessern();
                 counter=-1
                 arrDoppelt=[];
            $('hm-rpc.*.*.*.BATTERY_STATE').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
              
              if (!filterArray.includes(id)){
                 var ida = id.split('.');
             
                 var arrFilt=[];
             
                     $(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+".*").each(function(id, i) {   // kontrolliere ob OPERATING_VOLTAGE vorhanden
                         var idc = id.split('.');
                      arrFilt.push(idc[4])
                      });
                   arrDoppelt.push(ida[0]+"."+ida[1]+"."+ida[2]);
                   counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
             
                if (arrFilt.includes("BATTERY_STATE")) {
                            val0=getObject(id).common.name ; 
                            var ida = val0.split('.');
                            val0=ida[0].replace(/:.+/g,"");
                            val1help=getState(id).val;
                            var  val1helper=getState(id.replace("LOW_BAT","BATTERY_STATUS")).val;     
                            //bigBatterien 
                            //log (val1helper.toFixed(1))
                            if (val1helper>3.2){
                                   if (val1helper<=bigBattAlarm) {val2=symbolKO} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                      {val2=symbolWARN} else{val2=symbolOK};
                                   if (val1helper<=bigBattAlarm) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                      {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+(val1helper.toFixed(1))+" V"};
                                   if (val1helper<bigBattAlarm) AkkuAlarm.push(1);
                                   if (val1helper<=bigBattAlarm)  alarmMessage.push(val0);
                                }
             
                            else {         
                                  if (val1helper<2.2) {val2=symbolKO} else if (val1helper<=2.5 && val1helper>=2.2) 
                                     {val2=symbolWARN} else{val2=symbolOK};
                                  if (val1helper<2.2) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=2.5 && val1helper>=2.2) 
                                     {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+val1helper.toFixed(1)+" V"};
                                  if (val1helper<2.2) AkkuAlarm.push(1);
                                  if (val1helper<2.2)  alarmMessage.push(val0);}
             
                  } else {
                                                               
                           val0=getObject(id).common.name ; 
                           var ida = val0.split('.');
                           val0=ida[0].replace(/:.+/g,"");
                           val1help=getState(id).val;
                           if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                           if (val1help) {val2=symbolKO} else{val2=symbolOK}         
                           if (val1help) AkkuAlarm.push(1);
                           if (val1help)  alarmMessage.push(val0);
             
                  }
             
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              }
            });
            //log(arrDoppelt.toString())
            $('hm-rpc.*.*.0.LOWBAT').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                 var ida = id.split('.');
               //  log(id)
                 //log(arrDoppelt.toString())
              //    if (!filterArray.includes(id) && !arrDoppelt.includes(ida[0]+"."+ida[1]+"."+ida[2]+".*.BATTERY_STATE") ) {
                          if (!filterArray.includes(id) && !arrDoppelt.includes(ida[0]+"."+ida[1]+"."+ida[2]) ) {                          
                   
                      
                   counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                 //  log(id)
                    val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name                     //getObject(id).common.name ; //ida[2]+"."+ida[3];
                    var ida = val0.split('.');
                    val0=ida[0].replace(/:.+/g,"");
                    //log(val0+"   "+id);
                   val1help=getState(id).val;
                   if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                   //if (val1help<=battAlarm) {val2="<font color=\"red\"><b>X</b>"} else{val2=symbolOK}
                   if (val1help) {val2="<font color=\"red\">"+symbolKO} else{val2=symbolOK}   
                   //if (val1help) {val2=<font color=\"red\"><b>X</b>} else{val2="✔"}         
                   
                   if (val1help) AkkuAlarm.push(1);
                   if (val1help)  alarmMessage.push(val0);
             
             
              tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                  } // log(id)// ende filterArr
            }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
             
             
             //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
              
               } //ende hm
             
             if (homematicIp ){ 
                    tabelleAusbessern();
                    counter=0;
                    val0=""; val1=""; val2="";
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                    tabelleAusbessern();
                    counter=0;
                    val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEMATIC IP</b>"; val1=""; val2="";
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                    tabelleAusbessern();
                    counter=-1
             
             
             
            $('hm-rpc.*.*.0.LOW_BAT').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
             
              if (!filterArray.includes(id)){
                   var ida = id.split('.');
             
                   var arrFilt=[];
             
                       $(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+".*").each(function(id, i) {   // kontrolliere ob OPERATING_VOLTAGE vorhanden
                           var idc = id.split('.');
                        arrFilt.push(idc[4])
                        });
                   // log(arrFilt.toString());
             
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
             
                  if (arrFilt.includes("OPERATING_VOLTAGE")) {
                            //  val0=getObject(id).common.name ; 
                              val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ; 
                              var ida = val0.split('.');
                              val0=ida[0].replace(/:.+/g,"");
                              val1help=getState(id).val;
                              var  val1helper=getState(id.replace("LOW_BAT","OPERATING_VOLTAGE")).val;     
                              //bigBatterien 
                              //log (val1helper.toFixed(1))
                              if (val1helper>3.2){
                                     if (val1helper<=bigBattAlarm) {val2=symbolKO} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                        {val2=symbolWARN} else{val2=symbolOK};
                                     if (val1helper<=bigBattAlarm) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                        {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+(val1helper.toFixed(1))+" V"};
                                     if (val1helper<bigBattAlarm) AkkuAlarm.push(1);
                                     if (val1helper<2.2) alarmMessage.push(val0);
                                  }
               
                              else {         
                                    if (val1helper<2.2) {val2=symbolKO} else if (val1helper<=2.5 && val1helper>=2.2) 
                                       {val2=symbolWARN} else{val2=symbolOK};
                                    if (val1helper<2.2) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=2.5 && val1helper>=2.2) 
                                       {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+val1helper.toFixed(1)+" V"};
                                    if (val1helper<2.2) {AkkuAlarm.push(1);}
                                    if (val1helper<2.2) alarmMessage.push(val0);
                                    }
             
                    } else {
                                                                 
                             val0=getObject(id).common.name ; 
                             var ida = val0.split('.');
                             val0=ida[0].replace(/:.+/g,"");
                             val1help=getState(id).val;
                             if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                             if (val1help) {val2=symbolKO} else{val2=symbolOK}         
                             if (val1help) AkkuAlarm.push(1);
             
                    }
             
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               
             } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
                
              }  //ende hm-ip
             
              if (fullyBrowser){
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>FULLYBROWSER</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
             
             
            $('fullybrowser.*.*.Info.batteryLevel').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
             if (!filterArray.includes(id)){
                     var ida = id.split('.');
                    
                     
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
             
                       val0=getState(id.replace("batteryLevel","deviceName")).val;
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                      
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              
              }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
              
              } //ende fullybrowser
             
             
              if (iogo){
                   tabelleAusbessern();
                   counter=0;
                   val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HANDY über IOGO</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
             
             
            $('iogo.*.*.battery.level').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
             if (!filterArray.includes(id)){
                     var ida = id.split('.');
                    
                     
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                    //   val0=ida[3];
                       val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                     // log(val0+"   "+id);
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                      
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                     
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
              
             } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
              
              } //ende iogo
             
             
               if (handy1){  
                       tabelleAusbessern();
                       counter=0;
                       val0=""; val1=""; val2="";
                       tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                       tabelleAusbessern();
                       counter=0;
                       val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HANDYs</b>"; val1=""; val2="";
                       tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                       tabelleAusbessern();
                       counter=-1
             
                    $('controll-own.0.HANDY.*batt*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                     if (!filterArray.includes(id)){
                   var ida = id.split('.');
                   
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                     val0=ida[3];
                    // log(val0+"   "+id);
                     val1help=parseFloat((getState(id).val));
                     if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                     if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                     if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                     if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                     if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
             
                     if (val1help<=battAlarm) AkkuAlarm.push(1);
                     if (val1help<=battAlarm)  alarmMessage.push(val0);
                
              
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                    
                     } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
             
               } //ende handy1
             
             
             
               if (handy2){ 
                        $('controll-own.0.HANDY.*Batt*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                         if (!filterArray.includes(id)){
                   var ida = id.split('.');
                   
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                     val0=ida[3];
                    // log(val0+"   "+id);
                     val1help=parseFloat((getState(id).val));
                     if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                     if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                     if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()}
                     if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                     if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                     if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                    
             
              
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               
                         } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
               } //ende handy2
            //-------------------------------------------------------------------------------------------------------------------------------------------------
            //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------
             
                 tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
             
                 if (AkkuAlarm.length >=1 ) {setState(dpAlarm,AkkuAlarm.length)} else {setState(dpAlarm,AkkuAlarm.length)}
                // log("BATTERIE Alarm     : "+AkkuAlarm.length.toString());
                if (AkkuMessageLengthAlt < AkkuAlarm.length && wantAmessage) {setState(dpAlarmMessage,alarmMessage.toString()); AkkuMessageLengthAlt=AkkuAlarm.length}
                alarmMessage=[];
                    
            } // function ende
             
            //MAIN:
             
            schedule(mySchedule,  function () { 
            writeHTML();
            if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
            }); 
            writeHTML();  
            if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}                                 //     <tdalign
            function tabelleBind(){
                  switch (mehrfachTabelle) {  
                    case 1:                    htmlOut=htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>"; break;
                    case 2:  if(counter%2==0)  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                          else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} break;
                                               
                    case 3: if(counter%3==0 )  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                          else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                           else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>";}
                                                     } break;
             
             
                    case 4: if(counter%4==0)  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                              else {if(counter%2==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                           else    {if(counter%2==1 && counter%4==3)  { htmlOut= htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} 
                                                                             else    {htmlOut = htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}}
                                                     } break; } //switch ende
             
            }
             
            function tabelleAusbessern() {
             
            switch (mehrfachTabelle) {  
                    case 1:    break;
                    case 2:    mix=Math.abs(((counter+1)%2)-mehrfachTabelle);  
                               if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                               break;
                    case 3:    mix =Math.abs(((counter+1)%3)-mehrfachTabelle);
                               if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                               if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                               break;
                    case 4:    mix=Math.abs(((counter+1)%4)-mehrfachTabelle);
                               if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                               if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');    
                               if(mix==3)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                               break; }
            }
             
            function tabelleFinish() {
             
            switch (mehrfachTabelle) {  
                    case 1:    break;
                    case 2:    mix=Math.abs(((counter+1)%2)-mehrfachTabelle);  
                               if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                               break;
                    case 3:    mix =Math.abs(((counter+1)%3)-mehrfachTabelle);
                               if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                               if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                               break;
                    case 4:    mix=Math.abs(((counter+1)%4)-mehrfachTabelle);
                               if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                               if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');    
                               if(mix==3)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                               break; }
                
                    var htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: "+htmlÜberFontGroesse+"; font-weight:"+htmlSchriftWeite+ "\">"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</p>"; 
                  var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 70%; text-align: right;\" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>";
                   
                   if (!htmlSignature) htmlUnter="";
                     //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                      var htmlOutVIS="";
                    //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                       if (htmlUberschrift) 
                           { zentriert ? htmlOutVIS=htmlZentriert+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter ;
             
                         } else {
                          zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter;
             
                            }
                            
             
             // log("bin raus aus tabelleBind");
                      if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
                      //console.log dpVIS;
             
            var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 80%;  text-align: center; \" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>"
            var htmlEnd="</table>"+htmlUnter+"</div></body>";
            if (!htmlSignature) htmlUnter="";
             
            //mit oder ohne überschrift - zentriert oder links
            htmlUberschrift ? htmlOut=htmlStart+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd : htmlOut=htmlStart+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd;
            //log(htmlOut);
             
             
            }
            

            ° Node.js: 20.17.0 NPM: 10.8.2
            ° Proxmox, Ubuntu 22.04.3 LTS
            ° Fixer ---> iob fix

            liv-in-skyL 1 Antwort Letzte Antwort
            0
            • NegaleinN Negalein

              @liv-in-sky

              Script hab ich angepasst, jedoch bekomm ich jetzt wieder Warn-Meldungen

              18:23:17.185	warn	javascript.0 (592) at tabelleFinish (script.js.common.Akku_Alarm_Tabelle:923:36)
              18:23:17.185	warn	javascript.0 (592) at writeHTML (script.js.common.Akku_Alarm_Tabelle:834:6)
              18:23:17.185	warn	javascript.0 (592) at script.js.common.Akku_Alarm_Tabelle:849:1
              18:23:17.186	warn	javascript.0 (592) at writeHTML (script.js.common.Akku_Alarm_Tabelle:836:76)
              18:23:17.186	warn	javascript.0 (592) at script.js.common.Akku_Alarm_Tabelle:849:1
              

              //@liv-in-sky Januar 2020
               
              //HIER WIRD PFAD UND FILENAME DEFINIERT
              const path = "/htmlakku.html";                   //FIlenamen definieren
              const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
              let   braucheEinFile=false;                          // bei true wird ein file geschrieben
              let   braucheEinVISWidget=true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
              let dpVIS="controll-own.0.TABELLEN.AKKU"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget - zeichenkette(string)
              let dpAlarm="controll-own.0.TABELLEN.AkkuAlarm";  //WICHTIG datenpunkt erstellen vom typ "number" - bei 0 kein alarm und größer 0 die anzahl der schlechten batterien
              let dpAlarmMessage="0_userdata.0.Tabellen.AkkuMessage";  //WICHTIG datenpunkt erstellen vom typ "string" Inhalt - alle devices mit lowbat-alarmen
              let wantAmessage=true;                                      // dieser message datenpunkt kann hier abgeschalten werden
              let htmlColorDeviceUeberschrift="#00BFFF"
              var battAlarm=30;                                     //alarm batterie wert
              var battAlarmWarning=55;                                     //warnungen batterie wert
               
               // ------------------------    hier einstellen, was man für adapter hat - die nicht gebraucht werden auf false setzen !!!
              var tradfri=false;
              var hue=true;
              var hueExt=false;
              var homematic=true;
              var homematicIp=true;
              var xiaomi=true;                                                // mihome.0
              var fritzDect=false;
              var netatmo=false;
              var homee=false;
              var tado=false;
              var zigbee=false;
              var iogo=false;                                                 // iogo - adapter - hat batterie abfrage
              var fullyBrowser=false;                                         // fullybrowser - adapter - hat batterie abfrage
              var handy1=false;                                              // sind einzelne datenpunkte, 
              var handy2=false;
               
              //für spezialisten bei devices mit über 3 volt batterien
              var bigBattAlarm=3.3; var bigBattWarn=3.6; //WICHTIG bei bigAlarm nicht unter 3.3 gehen !!!!!!!!
               
              var symbolOK="✅";
              var symbolKO="❌";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz
              var symbolWARN="⚠️";
               
              var filterArray=["mihome.0.devices.plug_158d0001f24aad.percent","mihome.0.devices.plug_158d00020d98af.percent"]; //hier den ganzenpfad von ungewünschten LOW_BAT werten eingeben - diese werden dann gefiltert
                                             // BEISPIEL var filterArray=["hm-rpc.0.LEQ0242145.0.LOWBAT", "hm-rpc.0.LEQ0242152.0.LOWBAT","hm-rpc.1.OEQ0473764.0.LOWBAT"];
              let mySchedule=" */5 * * * * ";                       //jede minute  
              //---------------------------------------
               
              //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
              var htmlFeld1='Device';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
              var htmlFeld2='V bzw. %';        var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
              var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
              //-----------------------------------
               
               
              //------------------------------hier werden die styles für die tabelle definiert
               
              //ÜBERSCHRIFT ÜBER TABELLE
              let   htmlUberschrift=false;                           // mit Überschrift über der tabelle
              let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
              const htmlFeldUeber='Batterie Zustand Sensoren';              // Überschrift und Signature
              const htmlFarbUber="white";                         // Farbe der Überschrift
              const htmlSchriftWeite="normal";                       // bold, normal - Fettschrift für Überschrift
              const htmlÜberFontGroesse="18px";                       // schriftgröße überschrift
              //MEHRERE TABELLEN NEBENEINANDER
              let   mehrfachTabelle=2;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
              const htmlFarbZweiteTabelle="white";                // Farbe der Überschrift bei jeder 2.ten Tabelle
              const htmlFarbTableColorUber="#BDBDBD";               // Überschrift in der tabelle - der einzelnen Spalten
              //GANZE TABELLE
              let abstandZelle="1";
              let weite="auto";                                     //Weite der Tabelle
              let zentriert=true;                                   //ganze tabelle zentriert
              const backgroundAll="#000000";                        //Hintergrund für die ganze Seite - für direkten aufruf oder iqontrol sichtber - keine auswirkung auf vis-widget
              const htmlSchriftart="Helvetica";
              const htmlSchriftgroesse="14px";
              //FELDER UND RAHMEN
              let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
              const htmlFarbFelderschrift="#BDBDBD";                  // SchriftFarbe der Felder
              const htmlFarbFelderschrift2="#D8D8D8";                 // SchriftFarbe der Felder für jede 2te Tabelle
              const htmlFarbTableColorGradient1="#424242";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
              const htmlFarbTableColorGradient2="#424242";          //  Gradient - Hintergrund der Tabelle - ist dieser Wert gleich Gradient1 gibt es keinen verlauf
              const htmlFarbTableBorderColor="white";             // Farbe des Rahmen - is tdieser gleich den gradienten, sind die rahmen unsichtbar
              let htmlRahmenLinien="cols";                            // Format für Rahmen: MÖGLICH: "none" oder "all" oder "cols" oder "rows"
              const htmlSpalte1Weite="auto";                   //  Weite der ersten beiden  Spalten oder z.b. 115px
               
              // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
              // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
              // AB HIER NICHTS  ÄNDERN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
               
              let borderHelpBottum;
              let borderHelpRight;
              let htmlcenterHelp;
              let htmlcenterHelp2;
               
              if(htmlRahmenLinien=="rows") {borderHelpBottum=1;borderHelpRight=0;}
              if(htmlRahmenLinien=="cols") {borderHelpBottum=0;borderHelpRight=1;}
              if(htmlRahmenLinien=="none") {borderHelpBottum=0;borderHelpRight=0;}
              if(htmlRahmenLinien=="all")  {borderHelpBottum=1;borderHelpRight=1;}
              zentriert ? htmlcenterHelp="auto" : htmlcenterHelp="left";
              zentriert ? htmlcenterHelp2="center" : htmlcenterHelp2="left";
               
               
              const htmlZentriert='<center>'
              const htmlStart=    "<!DOCTYPE html><html lang=\"de\"><head><title>Vorlage</title><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"+
                                "<style> * {  margin: 0;} body {background-color: "+backgroundAll+"; margin: 0 auto;  }"+
                                " p {padding-top: 10px; padding-bottom: 10px; text-align: "+htmlcenterHelp2+"}"+
                               // " div { margin: 0 auto;  margin-left: auto; margin-right: auto;}"+
                                " td { padding:"+abstandZelle+"px; border:0px solid "+htmlFarbTableBorderColor+";  border-right:"+borderHelpRight+"px solid "+htmlFarbTableBorderColor+";border-bottom:"+borderHelpBottum+"px solid "+htmlFarbTableBorderColor+";}"+ 
                                " table { width: "+weite+";  margin: 0 "+htmlcenterHelp+"; border:1px solid "+htmlFarbTableBorderColor+"; border-spacing=\""+abstandZelle+"0px\" ; }"+   // margin macht center
                                "td:nth-child(1) {width: "+htmlSpalte1Weite+"}"+"td:nth-child(2) {width:"+htmlSpalte1Weite+"}"+
                                " </style></head><body> <div>";
              //const htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-weight: bold\">"+htmlFeldUeber+"</p>";                    
              const htmlTabStyle= "<table bordercolor=\""+htmlFarbTableBorderColor+"\" border=\"2px\" cellspacing=\""+abstandZelle+"\" cellpadding=\""+abstandZelle+"\" width=\""+weite+"\" rules=\""+htmlRahmenLinien+"\" style=\"color:"+htmlFarbFelderschrift+";  font-size:"+htmlSchriftgroesse+
                                   "; font-family:"+htmlSchriftart+";background-image: linear-gradient(42deg,"+htmlFarbTableColorGradient2+","+htmlFarbTableColorGradient1+");\">";
              const htmlTabUeber1="<tr style=\"color:"+htmlFarbTableColorUber+"; font-weight: bold\">";
              const htmlTabUeber3="</tr>";
               
               
              //NICHTS ÄNDERN - abhängig von den oben definierten _Spalten - in diesem Beispiel sind es 3
               
                	var htmlTabUeber2="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
              var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                                "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
              //------------------------------------------------------
               
               
              var htmlTabUeber="";
              var htmlOut="";
              var mix;
              var counter;
              var AkkuAlarm=[];
              var alarmMessage=[];
              let AkkuMessageLengthAlt=0;
               var arrDoppelt=[];
              //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
              var val1; var val0; var val2;
               
              function writeHTML(){
                AkkuAlarm=[];
               
              htmlOut="";
               
              counter=-1;
              htmlTabUeber="";
              switch (mehrfachTabelle) { 
                case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber3;  break;
                case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
                case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
                case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
              };   
              if (!UeberschriftSpalten) {htmlTabUeber=""}
               
               
              //--------------------------------------------------------------------------------------------------------------------------------------------------
              //---------hier kommt eure schleife rein counter++, tabelleBind() und tabelleFinish() müssen so integriert bleiben !!!------------------------------
              //---------alle valx werte müssen von euch bestimmt werden - val0,val1,val2 !!!---------------------------------------------------------------------
              //--------------------------------------------------------------------------------------------------------------------------------------------------
              var myColl=[];
              var val1help;
               
                 
                 if (fritzDect){
               
                            // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                              tabelleAusbessern();
                              tabelleAusbessern();
                              counter=0;
                                val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>FRITZDECT THERMOSTATE</b>"; val1=""; val2="";
                              tabelleBind(); 
                              tabelleAusbessern();
                              counter=-1;
               
               
                $('fritzdect.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                   if (!filterArray.includes(id)){
                       var ida = id.split('.');
                      
                         counter++; 
                           
                       //  val0=ida[2]+"."+ida[3];
                         val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                         val1help=parseFloat((getState(id).val));
                         if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                         if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                         if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                         if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                         if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
               
                         if (val1help<=battAlarm) AkkuAlarm.push(1);
                         if (val1help<=battAlarm)  alarmMessage.push(val0);
                    
                  
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   
                  }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
               } //ende fritzdect
               
                  if (homee){
               
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEE DEVICES</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
               
               
                $('homee.0.*.BatteryLevel*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                   if (!filterArray.includes(id)){
                       var ida = id.split('.');
                      
                         counter++; 
                           
                       //  val0=ida[2]+"."+ida[3];
                         val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                         val1help=parseFloat((getState(id).val));
                        //    var val2_1;
                       //   if (parseInt((new Date().getTime())) - val2_2help < 120000) {val2_1=true} else {val2_1=false;}
               
                         if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                         if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                         if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                         if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                       //  var val2_2help=Date.parse(getState(id.replace("BatteryStatus","LastUpdate")).val); 
                       //  if (val2_1) {val2=symbolOK} else{val2=symbolKO}   
                              
                         if (val1help<=battAlarm) AkkuAlarm.push(1);
                         if (val1help<=battAlarm)  alarmMessage.push(val0);
                    
                  
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   
                 } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
               } //ende fritzdect
               
                  if (netatmo){
               
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>NETATMO DEVICES</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
               
               
                $('netatmo.*.*.*.BatteryStatus').each(function(id, i) {           // netatmo.0.Hinxxxer.Außenmodul-Carport.BatteryStatus
               
               //  if (!filterArray.includes(id)){
               
                     
                       var ida = id.split('.');
                    
                         counter++; 
                           
                       //  val0=ida[2]+"."+ida[3];
                         val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;
                         val1help=parseFloat((getState(id).val));
                         //   var val2_1;
                       //   if (parseInt((new Date().getTime())) - val2_2help < 120000) {val2_1=true} else {val2_1=false;}
               
                         if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                         if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                         if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                         if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                       //  var val2_2help=Date.parse(getState(id.replace("BatteryStatus","LastUpdate")).val); 
                       //  if (val2_1) {val2=symbolOK} else{val2=symbolKO}   
                              
                         if (val1help<=battAlarm) AkkuAlarm.push(1);
                         if (val1help<=battAlarm)  alarmMessage.push(val0);
                    
                  
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   
                  /* }*/   }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
               } //ende fritzdect
               
                if (xiaomi){
                     // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>XIAOMI DEVICES</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
               
               
              $('mihome.*.devices.*.percent').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                     // log (id)
                      if (!filterArray.includes(id)){
                       var ida = id.split('.');
                      
                       
                         counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                       //  val0=ida[3];
                         val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;
                        val0=val0.replace(/.battery$/,""); 
                       // log(val0+"   "+id);
                         val1help=parseFloat((getState(id).val));
                         if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                         if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                         if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                         if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                         if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                        
                         if (val1help<=battAlarm) AkkuAlarm.push(1);
                         if (val1help<=battAlarm)  alarmMessage.push(val0);
                       
                  
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                
                }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                
                } //ende xiaomi
               
               if (hue){
                   // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();     
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HUE DEVICES</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
                   
              $('hue.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                
                 if (!filterArray.includes(id)){
                      var ida = id.split('.');
                     
                      
                        counter++; 
                         val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;   val0=val0.replace(/.battery$/,""); val0=val0.replace("Philips_hue.",""); val0=val0.replace(/_/g," ");                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                         val1help=parseFloat((getState(id).val));
                         if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                         if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                         if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                         if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                         if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                       
                         if (val1help<=battAlarm) AkkuAlarm.push(1);
                         if (val1help<=battAlarm)  alarmMessage.push(val0);
                 
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               
               } }); 
               
                }  //ende hue
               if (hueExt){ 
                      // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();        
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HUE EXTENDED</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
               
              $('hue-extended.*.*.*.config.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
               
               if (!filterArray.includes(id)){
                     var ida = id.split('.');
                  
                     
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                      
                          val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]).common.name ;   val0=val0.replace("Philips_hue.",""); val0=val0.replace(/_/g," ");                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
               
                         val1help=parseFloat((getState(id).val));
                         if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                         if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                         if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                         if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                         if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                         if (val1help<=battAlarm) AkkuAlarm.push(1);
                         if (val1help<=battAlarm)  alarmMessage.push(val0);
               
                      
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               
                }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
               
                 } //ende hue-extended
               
                  if (zigbee){ 
               
                     // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>ZIGBEE</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
               
              $('zigbee.*.*.battery').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                    
                     if (!filterArray.includes(id)){
                     var ida = id.split('.');
                    
                     
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                      
                      
                        val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                       // log(val0+"   "+id);
                       val1help=getState(id).val;
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
               
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               
               } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                }
               
               if (tradfri){ 
               
                     // UNTERTEILUNG - ÜBERSCHRIFT IN TABELLE
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>IKEA TRADFRI</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
               
              $('tradfri.*.*.batteryPercentage').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                    
                     if (!filterArray.includes(id)){
                     var ida = id.split('.');
                    
                     
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                      
                      
                        val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                       // log(val0+"   "+id);
                       val1help=getState(id).val;
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
               
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
               
               } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                }
               
                if (tado){
                   tabelleAusbessern();
                   counter=0;
                   val0=val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>TADO DEVICES</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
               
               
              $('tado.*.*.*.*.*.*.info.batteryState').each(function(id, i) {           // tado.0.337268.Rooms.11.devices.VA3078030592.info.batteryState
                   var ida = id.split('.');
                    if (!filterArray.includes(id)){
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                   //  log(id)
                      val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+"."+ida[4]).common.name                     //getObject(id).common.name ; //ida[2]+"."+ida[3];
                                                                                                      //tado.0.337268.Rooms.11
                     
                      //log(val0+"   "+id);
                     val1help=getState(id).val;
                     if (val1help=="LOW") {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                     //if (val1help<=battAlarm) {val2="<font color=\"red\"><b>X</b>"} else{val2=symbolOK}
                     if (val1help=="LOW") {val2="<font color=\"red\">"+symbolKO} else{val2=symbolOK}   
                     //if (val1help) {val2=<font color=\"red\"><b>X</b>} else{val2="✔"}         
                     
                     if (val1help=="LOW") AkkuAlarm.push(1);
                     if (val1help=="LOW")  alarmMessage.push(val0);
               
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                    } // ende filterArr
              }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!! 
                 }  //ende tado
               
               
              if (homematic){
                   tabelleAusbessern();
                   counter=0;
                   val0=val0=""; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=0;
                   val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEMATIC</b>"; val1=""; val2="";
                   tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                   tabelleAusbessern();
                   counter=-1
                   arrDoppelt=[];
              $('hm-rpc.*.*.*.BATTERY_STATE').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                
                if (!filterArray.includes(id)){
                   var ida = id.split('.');
               
                   var arrFilt=[];
               
                       $(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+".*").each(function(id, i) {   // kontrolliere ob OPERATING_VOLTAGE vorhanden
                           var idc = id.split('.');
                        arrFilt.push(idc[4])
                        });
                     arrDoppelt.push(ida[0]+"."+ida[1]+"."+ida[2]);
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
               
                  if (arrFilt.includes("BATTERY_STATE")) {
                              val0=getObject(id).common.name ; 
                              var ida = val0.split('.');
                              val0=ida[0].replace(/:.+/g,"");
                              val1help=getState(id).val;
                              var  val1helper=getState(id.replace("LOW_BAT","BATTERY_STATUS")).val;     
                              //bigBatterien 
                              //log (val1helper.toFixed(1))
                              if (val1helper>3.2){
                                     if (val1helper<=bigBattAlarm) {val2=symbolKO} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                        {val2=symbolWARN} else{val2=symbolOK};
                                     if (val1helper<=bigBattAlarm) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                        {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+(val1helper.toFixed(1))+" V"};
                                     if (val1helper<bigBattAlarm) AkkuAlarm.push(1);
                                     if (val1helper<=bigBattAlarm)  alarmMessage.push(val0);
                                  }
               
                              else {         
                                    if (val1helper<2.2) {val2=symbolKO} else if (val1helper<=2.5 && val1helper>=2.2) 
                                       {val2=symbolWARN} else{val2=symbolOK};
                                    if (val1helper<2.2) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=2.5 && val1helper>=2.2) 
                                       {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+val1helper.toFixed(1)+" V"};
                                    if (val1helper<2.2) AkkuAlarm.push(1);
                                    if (val1helper<2.2)  alarmMessage.push(val0);}
               
                    } else {
                                                                 
                             val0=getObject(id).common.name ; 
                             var ida = val0.split('.');
                             val0=ida[0].replace(/:.+/g,"");
                             val1help=getState(id).val;
                             if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                             if (val1help) {val2=symbolKO} else{val2=symbolOK}         
                             if (val1help) AkkuAlarm.push(1);
                             if (val1help)  alarmMessage.push(val0);
               
                    }
               
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                }
              });
              //log(arrDoppelt.toString())
              $('hm-rpc.*.*.0.LOWBAT').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                   var ida = id.split('.');
                 //  log(id)
                   //log(arrDoppelt.toString())
                //    if (!filterArray.includes(id) && !arrDoppelt.includes(ida[0]+"."+ida[1]+"."+ida[2]+".*.BATTERY_STATE") ) {
                            if (!filterArray.includes(id) && !arrDoppelt.includes(ida[0]+"."+ida[1]+"."+ida[2]) ) {                          
                     
                        
                     counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                   //  log(id)
                      val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name                     //getObject(id).common.name ; //ida[2]+"."+ida[3];
                      var ida = val0.split('.');
                      val0=ida[0].replace(/:.+/g,"");
                      //log(val0+"   "+id);
                     val1help=getState(id).val;
                     if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                     //if (val1help<=battAlarm) {val2="<font color=\"red\"><b>X</b>"} else{val2=symbolOK}
                     if (val1help) {val2="<font color=\"red\">"+symbolKO} else{val2=symbolOK}   
                     //if (val1help) {val2=<font color=\"red\"><b>X</b>} else{val2="✔"}         
                     
                     if (val1help) AkkuAlarm.push(1);
                     if (val1help)  alarmMessage.push(val0);
               
               
                tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                    } // log(id)// ende filterArr
              }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
               
               
               //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
                
                 } //ende hm
               
               if (homematicIp ){ 
                      tabelleAusbessern();
                      counter=0;
                      val0=""; val1=""; val2="";
                      tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                      tabelleAusbessern();
                      counter=0;
                      val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HOMEMATIC IP</b>"; val1=""; val2="";
                      tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                      tabelleAusbessern();
                      counter=-1
               
               
               
              $('hm-rpc.*.*.0.LOW_BAT').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
               
                if (!filterArray.includes(id)){
                     var ida = id.split('.');
               
                     var arrFilt=[];
               
                         $(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+".*").each(function(id, i) {   // kontrolliere ob OPERATING_VOLTAGE vorhanden
                             var idc = id.split('.');
                          arrFilt.push(idc[4])
                          });
                     // log(arrFilt.toString());
               
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
               
                    if (arrFilt.includes("OPERATING_VOLTAGE")) {
                              //  val0=getObject(id).common.name ; 
                                val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ; 
                                var ida = val0.split('.');
                                val0=ida[0].replace(/:.+/g,"");
                                val1help=getState(id).val;
                                var  val1helper=getState(id.replace("LOW_BAT","OPERATING_VOLTAGE")).val;     
                                //bigBatterien 
                                //log (val1helper.toFixed(1))
                                if (val1helper>3.2){
                                       if (val1helper<=bigBattAlarm) {val2=symbolKO} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                          {val2=symbolWARN} else{val2=symbolOK};
                                       if (val1helper<=bigBattAlarm) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=bigBattWarn && val1helper>bigBattAlarm) 
                                          {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+(val1helper.toFixed(1))+" V"};
                                       if (val1helper<bigBattAlarm) AkkuAlarm.push(1);
                                       if (val1helper<2.2) alarmMessage.push(val0);
                                    }
                 
                                else {         
                                      if (val1helper<2.2) {val2=symbolKO} else if (val1helper<=2.5 && val1helper>=2.2) 
                                         {val2=symbolWARN} else{val2=symbolOK};
                                      if (val1helper<2.2) {val1=(" <font color=\"red\"> ")+val1helper.toFixed(1)+" V"} else if (val1helper<=2.5 && val1helper>=2.2) 
                                         {val1=(" <font color=\"yellow\"> ")+val1helper.toFixed(1)+" V"} else{val1=(" <font color=\"green\"> ")+val1helper.toFixed(1)+" V"};
                                      if (val1helper<2.2) {AkkuAlarm.push(1);}
                                      if (val1helper<2.2) alarmMessage.push(val0);
                                      }
               
                      } else {
                                                                   
                               val0=getObject(id).common.name ; 
                               var ida = val0.split('.');
                               val0=ida[0].replace(/:.+/g,"");
                               val1help=getState(id).val;
                               if (val1help) {val1=(" <font color=\"red\"> ")+"low bat"} else{val1=(" <font color=\"green\"> ")+"full bat"} 
                               if (val1help) {val2=symbolKO} else{val2=symbolOK}         
                               if (val1help) AkkuAlarm.push(1);
               
                      }
               
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 
               } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
                  
                }  //ende hm-ip
               
                if (fullyBrowser){
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>FULLYBROWSER</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
               
               
              $('fullybrowser.*.*.Info.batteryLevel').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
               if (!filterArray.includes(id)){
                       var ida = id.split('.');
                      
                       
                         counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
               
                         val0=getState(id.replace("batteryLevel","deviceName")).val;
                         val1help=parseFloat((getState(id).val));
                         if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                         if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                         if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                         if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                         if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                        
                         if (val1help<=battAlarm) AkkuAlarm.push(1);
                         if (val1help<=battAlarm)  alarmMessage.push(val0);
                  
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                
                }  }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                
                } //ende fullybrowser
               
               
                if (iogo){
                     tabelleAusbessern();
                     counter=0;
                     val0=""; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=0;
                     val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HANDY über IOGO</b>"; val1=""; val2="";
                     tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                     tabelleAusbessern();
                     counter=-1
               
               
              $('iogo.*.*.battery.level').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
               if (!filterArray.includes(id)){
                       var ida = id.split('.');
                      
                       
                         counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                      //   val0=ida[3];
                         val0=getObject(ida[0]+"."+ida[1]+"."+ida[2]).common.name ;
                       // log(val0+"   "+id);
                         val1help=parseFloat((getState(id).val));
                         if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                         if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                         if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                         if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                         if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                        
                         if (val1help<=battAlarm) AkkuAlarm.push(1);
                         if (val1help<=battAlarm)  alarmMessage.push(val0);
                       
                  
                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                
               } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                
                } //ende iogo
               
               
                 if (handy1){  
                         tabelleAusbessern();
                         counter=0;
                         val0=""; val1=""; val2="";
                         tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                         tabelleAusbessern();
                         counter=0;
                         val0="<font color=\""+htmlColorDeviceUeberschrift+"\"><b>HANDYs</b>"; val1=""; val2="";
                         tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                         tabelleAusbessern();
                         counter=-1
               
                      $('controll-own.0.HANDY.*batt*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                       if (!filterArray.includes(id)){
                     var ida = id.split('.');
                     
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                       val0=ida[3];
                      // log(val0+"   "+id);
                       val1help=parseFloat((getState(id).val));
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
               
                       if (val1help<=battAlarm) AkkuAlarm.push(1);
                       if (val1help<=battAlarm)  alarmMessage.push(val0);
                  
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                      
                       } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
               
                 } //ende handy1
               
               
               
                 if (handy2){ 
                          $('controll-own.0.HANDY.*Batt*').each(function(id, i) {           // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                           if (!filterArray.includes(id)){
                     var ida = id.split('.');
                     
                       counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                       val0=ida[3];
                      // log(val0+"   "+id);
                       val1help=parseFloat((getState(id).val));
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()+" %"}
                       if (val1help<=battAlarm) {val1=(" <font color=\"red\"> ")+val1help.toString()+" %"} else{val1=(" <font color=\"green\"> ")+val1help.toString()+" %"} 
                       if (val1help>battAlarm && val1help<=battAlarmWarning) {val1=(" <font color=\"yellow\"> ")+val1help.toString()}
                       if (getState(id).val==null) {val2="never used"}; //log(id)}; 
                       if (val1help<=battAlarm) {val2=symbolKO} else{val2=symbolOK}         
                       if (val1help>battAlarm && val1help<=battAlarmWarning) val2=symbolWARN;
                      
               
                
                  tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                 
                           } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!  
                 } //ende handy2
              //-------------------------------------------------------------------------------------------------------------------------------------------------
              //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
              //-------------------------------------------------------------------------------------------------------------------------------------------------
               
                   tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
               
                   if (AkkuAlarm.length >=1 ) {setState(dpAlarm,AkkuAlarm.length)} else {setState(dpAlarm,AkkuAlarm.length)}
                  // log("BATTERIE Alarm     : "+AkkuAlarm.length.toString());
                  if (AkkuMessageLengthAlt < AkkuAlarm.length && wantAmessage) {setState(dpAlarmMessage,alarmMessage.toString()); AkkuMessageLengthAlt=AkkuAlarm.length}
                  alarmMessage=[];
                      
              } // function ende
               
              //MAIN:
               
              schedule(mySchedule,  function () { 
              writeHTML();
              if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
              }); 
              writeHTML();  
              if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}                                 //     <tdalign
              function tabelleBind(){
                    switch (mehrfachTabelle) {  
                      case 1:                    htmlOut=htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>"; break;
                      case 2:  if(counter%2==0)  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                            else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} break;
                                                 
                      case 3: if(counter%3==0 )  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                            else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                             else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>";}
                                                       } break;
               
               
                      case 4: if(counter%4==0)  {htmlOut = htmlOut+"<tr><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                                else {if(counter%2==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                             else    {if(counter%2==1 && counter%4==3)  { htmlOut= htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} 
                                                                               else    {htmlOut = htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}}
                                                       } break; } //switch ende
               
              }
               
              function tabelleAusbessern() {
               
              switch (mehrfachTabelle) {  
                      case 1:    break;
                      case 2:    mix=Math.abs(((counter+1)%2)-mehrfachTabelle);  
                                 if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                                 break;
                      case 3:    mix =Math.abs(((counter+1)%3)-mehrfachTabelle);
                                 if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                                 if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                                 break;
                      case 4:    mix=Math.abs(((counter+1)%4)-mehrfachTabelle);
                                 if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                                 if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');    
                                 if(mix==3)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                                 break; }
              }
               
              function tabelleFinish() {
               
              switch (mehrfachTabelle) {  
                      case 1:    break;
                      case 2:    mix=Math.abs(((counter+1)%2)-mehrfachTabelle);  
                                 if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                                 break;
                      case 3:    mix =Math.abs(((counter+1)%3)-mehrfachTabelle);
                                 if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');       
                                 if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                                 break;
                      case 4:    mix=Math.abs(((counter+1)%4)-mehrfachTabelle);
                                 if(mix==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                                 if(mix==2)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');    
                                 if(mix==3)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                                 break; }
                  
                      var htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: "+htmlÜberFontGroesse+"; font-weight:"+htmlSchriftWeite+ "\">"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</p>"; 
                    var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 70%; text-align: right;\" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>";
                     
                     if (!htmlSignature) htmlUnter="";
                       //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                        var htmlOutVIS="";
                      //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                         if (htmlUberschrift) 
                             { zentriert ? htmlOutVIS=htmlZentriert+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter ;
               
                           } else {
                            zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter;
               
                              }
                              
               
               // log("bin raus aus tabelleBind");
                        if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
                        //console.log dpVIS;
               
              var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 80%;  text-align: center; \" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>"
              var htmlEnd="</table>"+htmlUnter+"</div></body>";
              if (!htmlSignature) htmlUnter="";
               
              //mit oder ohne überschrift - zentriert oder links
              htmlUberschrift ? htmlOut=htmlStart+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd : htmlOut=htmlStart+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd;
              //log(htmlOut);
               
               
              }
              

              liv-in-skyL Offline
              liv-in-skyL Offline
              liv-in-sky
              schrieb am zuletzt editiert von
              #585

              @Negalein du hast die datenpunkte von mir noch imscript - da müssen deine rein (controll-own... sind meine)

              nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

              NegaleinN 1 Antwort Letzte Antwort
              0
              • liv-in-skyL liv-in-sky

                @Negalein du hast die datenpunkte von mir noch imscript - da müssen deine rein (controll-own... sind meine)

                NegaleinN Offline
                NegaleinN Offline
                Negalein
                Global Moderator
                schrieb am zuletzt editiert von
                #586

                @liv-in-sky sagte in Script fürTabelle der Batterie Zustände:

                du hast die datenpunkte von mir noch imscript

                Ah, ich Depp
                Hab den neuen geändert, aber die alten komplett übersehen

                Danke, läuft

                ° Node.js: 20.17.0 NPM: 10.8.2
                ° Proxmox, Ubuntu 22.04.3 LTS
                ° Fixer ---> iob fix

                1 Antwort Letzte Antwort
                0
                • tugsiT Offline
                  tugsiT Offline
                  tugsi
                  schrieb am zuletzt editiert von tugsi
                  #587

                  Hey @liv-in-sky ,
                  hab gestern Abend Dein Script schnell mal zum testen eingebaut, klappt soweit.
                  Danke dafür!

                  Könntest Du auch noch ZWave mit einbinden?
                  Bei meinen Fensterkontakten gibt es für die Batterie folgenden Datenpunkt:
                  zwave.0.NODE4.BATTERY.Battery_Level_1
                  Zum Beispiel.
                  Wird ist 0-100% dann.

                  Gruß Thomas

                  Master ioBroker in Proxmox als LXC auf 1. Tiny-Lenovo, Proxmox-VM als Slave auf 2. Tinyi-Lenovo mit Zigbee und Monitor zur Visualisierung, Hauptautomatisierung über S7 auf Beckhoff CX, dazu noch Shelly, Homematic...

                  liv-in-skyL 2 Antworten Letzte Antwort
                  0
                  • tugsiT tugsi

                    Hey @liv-in-sky ,
                    hab gestern Abend Dein Script schnell mal zum testen eingebaut, klappt soweit.
                    Danke dafür!

                    Könntest Du auch noch ZWave mit einbinden?
                    Bei meinen Fensterkontakten gibt es für die Batterie folgenden Datenpunkt:
                    zwave.0.NODE4.BATTERY.Battery_Level_1
                    Zum Beispiel.
                    Wird ist 0-100% dann.

                    Gruß Thomas

                    liv-in-skyL Offline
                    liv-in-skyL Offline
                    liv-in-sky
                    schrieb am zuletzt editiert von
                    #588

                    @tugsi es wäre vorteilhaft, wenn du mir deinen json - export von der zwave instanz geben könntest - möglich auch über mail - dann im chat melden

                    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                    1 Antwort Letzte Antwort
                    0
                    • Bulli BultmannB Bulli Bultmann

                      @liv-in-sky Einen habe ich noch. :nerd_face:
                      HM Fenstersensor mit einer Batterie 1,5 volt.

                      Batterie6.JPG

                      hm-rpc.2.0000DA499B2068.json

                      Gehen die auch ?

                      liv-in-skyL Offline
                      liv-in-skyL Offline
                      liv-in-sky
                      schrieb am zuletzt editiert von
                      #589

                      @Bulli-Bultmann ich versuche heute mal diese 1.5V einzubinden - war noch offenes theam

                      nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                      Bulli BultmannB 1 Antwort Letzte Antwort
                      0
                      • liv-in-skyL liv-in-sky

                        @Bulli-Bultmann ich versuche heute mal diese 1.5V einzubinden - war noch offenes theam

                        Bulli BultmannB Offline
                        Bulli BultmannB Offline
                        Bulli Bultmann
                        schrieb am zuletzt editiert von
                        #590

                        @liv-in-sky said in Script fürTabelle der Batterie Zustände:

                        @Bulli-Bultmann ich versuche heute mal diese 1.5V einzubinden - war noch offenes theam

                        Ok. Melde mich dann Nachmittags wieder. Hab noch Termine. Dann gerne wieder testen.:blush:

                        1 Antwort Letzte Antwort
                        0
                        • liv-in-skyL Offline
                          liv-in-skyL Offline
                          liv-in-sky
                          schrieb am zuletzt editiert von liv-in-sky
                          #591

                          UPDATE

                          neues:

                          • es werden nun 1,5 , 3 und 5 volt batterien unterschieden (homematic) - hier eine auflistung der werte wann sich der zustand ändert - falls da andere werte sinnvoller sind, bitte melden

                          Image 2.png

                          • man kann jetzt der überschrift der marken noch einen style geben - fett, kursiv oder normal (im script beschrieben) - die farbe war ja schon einstellbar

                          daher (neue variable) das ganze script austauschen und - nicht vegessen - die datenpunkte wieder angleichen

                          um die settings nicht wieder alle einzugeben, könnt ihr auch alles bis "AB HIER NICHTS MEHR ÄNDERN" wieder in das neue script kopieren und anschliessend diese zeile

                          let HTMLbrandSetting="i"                              // style der geräte marken:  möglich b fett; i kursiv; span normal
                          

                          einfügen (unter "let htmlColorDeviceUeberschrift=" einfügen - zeile12)

                          nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                          Meister MopperM NegaleinN Bulli BultmannB 3 Antworten Letzte Antwort
                          0
                          • liv-in-skyL liv-in-sky

                            UPDATE

                            neues:

                            • es werden nun 1,5 , 3 und 5 volt batterien unterschieden (homematic) - hier eine auflistung der werte wann sich der zustand ändert - falls da andere werte sinnvoller sind, bitte melden

                            Image 2.png

                            • man kann jetzt der überschrift der marken noch einen style geben - fett, kursiv oder normal (im script beschrieben) - die farbe war ja schon einstellbar

                            daher (neue variable) das ganze script austauschen und - nicht vegessen - die datenpunkte wieder angleichen

                            um die settings nicht wieder alle einzugeben, könnt ihr auch alles bis "AB HIER NICHTS MEHR ÄNDERN" wieder in das neue script kopieren und anschliessend diese zeile

                            let HTMLbrandSetting="i"                              // style der geräte marken:  möglich b fett; i kursiv; span normal
                            

                            einfügen (unter "let htmlColorDeviceUeberschrift=" einfügen - zeile12)

                            Meister MopperM Offline
                            Meister MopperM Offline
                            Meister Mopper
                            schrieb am zuletzt editiert von
                            #592

                            @liv-in-sky Perfekt, jetzt stimmts für mich.

                            Danke!

                            cfecf804-3432-4d5e-97dd-374f5fed5271-grafik.png

                            Proxmox und HA

                            Meister MopperM 1 Antwort Letzte Antwort
                            0
                            • Meister MopperM Meister Mopper

                              @liv-in-sky Perfekt, jetzt stimmts für mich.

                              Danke!

                              cfecf804-3432-4d5e-97dd-374f5fed5271-grafik.png

                              Meister MopperM Offline
                              Meister MopperM Offline
                              Meister Mopper
                              schrieb am zuletzt editiert von
                              #593

                              @Meister-Mopper Wie hast Du die 1,5er von den anderen unterschieden?

                              Proxmox und HA

                              liv-in-skyL 1 Antwort Letzte Antwort
                              0
                              • Meister MopperM Meister Mopper

                                @Meister-Mopper Wie hast Du die 1,5er von den anderen unterschieden?

                                liv-in-skyL Offline
                                liv-in-skyL Offline
                                liv-in-sky
                                schrieb am zuletzt editiert von liv-in-sky
                                #594

                                @Meister-Mopper bist du schnell

                                in der hoffnung das es funktioniert - suche ich einfach nach werten unter 1.5 - das sind dann die 1.5er
                                kleiner als 3 und größer als 1.5 sind die 3er
                                und größer 3 sind die 5er

                                wenn eine 3er unter 1.5 volt fällt wird es brenzlig - dann wird sie wieder grün - ich hoffe halt, dass die 3 er bei 1.5 volt nicht mehr senden

                                nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                                Meister MopperM 1 Antwort Letzte Antwort
                                0
                                • liv-in-skyL liv-in-sky

                                  @Meister-Mopper bist du schnell

                                  in der hoffnung das es funktioniert - suche ich einfach nach werten unter 1.5 - das sind dann die 1.5er
                                  kleiner als 3 und größer als 1.5 sind die 3er
                                  und größer 3 sind die 5er

                                  wenn eine 3er unter 1.5 volt fällt wird es brenzlig - dann wird sie wieder grün - ich hoffe halt, dass die 3 er bei 1.5 volt nicht mehr senden

                                  Meister MopperM Offline
                                  Meister MopperM Offline
                                  Meister Mopper
                                  schrieb am zuletzt editiert von
                                  #595

                                  @liv-in-sky Ich glaube auch, dass sie dann tot sind.

                                  Proxmox und HA

                                  1 Antwort Letzte Antwort
                                  0
                                  • liv-in-skyL liv-in-sky

                                    UPDATE

                                    neues:

                                    • es werden nun 1,5 , 3 und 5 volt batterien unterschieden (homematic) - hier eine auflistung der werte wann sich der zustand ändert - falls da andere werte sinnvoller sind, bitte melden

                                    Image 2.png

                                    • man kann jetzt der überschrift der marken noch einen style geben - fett, kursiv oder normal (im script beschrieben) - die farbe war ja schon einstellbar

                                    daher (neue variable) das ganze script austauschen und - nicht vegessen - die datenpunkte wieder angleichen

                                    um die settings nicht wieder alle einzugeben, könnt ihr auch alles bis "AB HIER NICHTS MEHR ÄNDERN" wieder in das neue script kopieren und anschliessend diese zeile

                                    let HTMLbrandSetting="i"                              // style der geräte marken:  möglich b fett; i kursiv; span normal
                                    

                                    einfügen (unter "let htmlColorDeviceUeberschrift=" einfügen - zeile12)

                                    NegaleinN Offline
                                    NegaleinN Offline
                                    Negalein
                                    Global Moderator
                                    schrieb am zuletzt editiert von
                                    #596

                                    @liv-in-sky sagte in Script fürTabelle der Batterie Zustände:

                                    um die settings nicht wieder alle einzugeben, könnt ihr auch alles bis "AB HIER NICHTS MEHR ÄNDERN" wieder in das neue script kopieren und anschliessend diese zeile
                                    let HTMLbrandSetting="i" // style der geräte marken: möglich b fett; i kursiv; span normal

                                    einfügen (unter "let htmlColorDeviceUeberschrift=" einfügen - zeile12)

                                    Danke, läuft! :)

                                    Und cool, dass du es beschreibst, bis wohin man was austauschen muss.
                                    Erspart etwas Arbeit.

                                    ° Node.js: 20.17.0 NPM: 10.8.2
                                    ° Proxmox, Ubuntu 22.04.3 LTS
                                    ° Fixer ---> iob fix

                                    1 Antwort Letzte Antwort
                                    0
                                    • A Offline
                                      A Offline
                                      Adnim
                                      schrieb am zuletzt editiert von
                                      #597

                                      @liv-in-sky sagte in Script fürTabelle der Batterie Zustände:

                                      n der hoffnung das es funktioniert - suche ich einfach nach werten unter 1.5 - das sind dann die 1.5er
                                      kleiner als 3 und größer als 1.5 sind die 3er
                                      und größer 3 sind die 5er
                                      wenn eine 3er unter 1.5 volt fällt wird es brenzlig - dann wird sie wieder grün - ich hoffe halt, dass die 3 er bei 1.5 volt nicht mehr senden

                                      Hi!
                                      es gibt/gab im Homematic Forum auch so ein Batterie Skript, hier wurden aber die Batterie Typen auch mit hinterlegt damit man gleich sieht was zu tauschen ist und man könnte darüber dann unterscheiden welche Spg anliegen muss.

                                      Nur so ein Gedanken Spiel... evtl findest einen Weg das mit umzusetzten...

                                      tugsiT 1 Antwort Letzte Antwort
                                      0
                                      • A Adnim

                                        @liv-in-sky sagte in Script fürTabelle der Batterie Zustände:

                                        n der hoffnung das es funktioniert - suche ich einfach nach werten unter 1.5 - das sind dann die 1.5er
                                        kleiner als 3 und größer als 1.5 sind die 3er
                                        und größer 3 sind die 5er
                                        wenn eine 3er unter 1.5 volt fällt wird es brenzlig - dann wird sie wieder grün - ich hoffe halt, dass die 3 er bei 1.5 volt nicht mehr senden

                                        Hi!
                                        es gibt/gab im Homematic Forum auch so ein Batterie Skript, hier wurden aber die Batterie Typen auch mit hinterlegt damit man gleich sieht was zu tauschen ist und man könnte darüber dann unterscheiden welche Spg anliegen muss.

                                        Nur so ein Gedanken Spiel... evtl findest einen Weg das mit umzusetzten...

                                        tugsiT Offline
                                        tugsiT Offline
                                        tugsi
                                        schrieb am zuletzt editiert von tugsi
                                        #598

                                        @Adnim
                                        Hast Du ein Link zu dem Script?
                                        Der Batterietyp ist ja nicht unter den Objects zu finden, also kann ich mir nur vorstellen, das man dies "händisch" zugeordnet hat.
                                        Eventuell mit einer Abfrage, bei Gerät des Types X braucht man Batterie Y etc.
                                        Dazu müsstest aber ja quasi alle möglichen Batterien und alle Geräte als Variable mit aufnehmen und wissen, welches Gerät welche Batterie braucht.
                                        Ich zB hab einiges in Zigbee, da gibt es CR2032 o.ä.
                                        Ich denke der Aufwand wäre zu groß, alle möglichen Geräte (Homematic, Zigbee, Tradfri...) aufzunehmen und Batterienarten zuzuweisen.
                                        Allerdings weiß ich auch nicht, wie das im Homematic-Forum gemacht wurde.

                                        Master ioBroker in Proxmox als LXC auf 1. Tiny-Lenovo, Proxmox-VM als Slave auf 2. Tinyi-Lenovo mit Zigbee und Monitor zur Visualisierung, Hauptautomatisierung über S7 auf Beckhoff CX, dazu noch Shelly, Homematic...

                                        dslraserD 1 Antwort Letzte Antwort
                                        0
                                        • tugsiT tugsi

                                          @Adnim
                                          Hast Du ein Link zu dem Script?
                                          Der Batterietyp ist ja nicht unter den Objects zu finden, also kann ich mir nur vorstellen, das man dies "händisch" zugeordnet hat.
                                          Eventuell mit einer Abfrage, bei Gerät des Types X braucht man Batterie Y etc.
                                          Dazu müsstest aber ja quasi alle möglichen Batterien und alle Geräte als Variable mit aufnehmen und wissen, welches Gerät welche Batterie braucht.
                                          Ich zB hab einiges in Zigbee, da gibt es CR2032 o.ä.
                                          Ich denke der Aufwand wäre zu groß, alle möglichen Geräte (Homematic, Zigbee, Tradfri...) aufzunehmen und Batterienarten zuzuweisen.
                                          Allerdings weiß ich auch nicht, wie das im Homematic-Forum gemacht wurde.

                                          dslraserD Offline
                                          dslraserD Offline
                                          dslraser
                                          Forum Testing Most Active
                                          schrieb am zuletzt editiert von dslraser
                                          #599

                                          @tugsi sagte in Script fürTabelle der Batterie Zustände:

                                          Hast Du ein Link zu dem Script?

                                          ich glaube hier sind auch Batterie Typen drinn.

                                          https://forum.iobroker.net/post/19436

                                          https://github.com/Baenker/Servicemeldungen-Homematic/blob/master/Servicemeldungen.js

                                          A 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

                                          404

                                          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