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

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. HTML Tabelle Linux-Control Adapter

NEWS

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

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

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

HTML Tabelle Linux-Control Adapter

Geplant Angeheftet Gesperrt Verschoben JavaScript
templatejavascript
201 Beiträge 7 Kommentatoren 28.1k Aufrufe 13 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.
  • liv-in-skyL Offline
    liv-in-skyL Offline
    liv-in-sky
    schrieb am zuletzt editiert von liv-in-sky
    #1

    nachdem @Scrounger mal wieder einen coolen adapter "rausgelassen" hat , habe ich mal versucht, das ganze etwas vis-freundlicher zu gestallten

    edit: leider habe ich festgestellt, dass die html tabelle für mehrere server (bei mir 8 stück) eigentlich sehr unpraktisch ist (wird zu lang) - daher liegt der vorteil bei dem Material Design List Widget - siehe 2ten post

    • grundlage des scriptes ist: https://forum.iobroker.net/topic/28021/html-table-für-vis-oder-iqontrol-js-und-blockly

    • adapter thread:https://forum.iobroker.net/topic/35870/test-adapter-linux-control-v0-x-x/2

    • für übersicht in der vis (tabelle wird über html-widget mit binding angezeigt) oder in iqontrol

    • Material Design List Widget - siehe 2ten post !

    • wie üblich müssen datenpunkte selbst angelegt werden und im script eingegeben werden (z.b. let dpVIS="0_userdata.0.Tabellen.Linux-Control" oder dpMaterialWidget)

    • im setting bereich des scriptes können die html settings auf wunsch geändert werden (darstellung farbe, ...)
      die tabelle refresht jede minute

    • die bilder müssen unbedingt in der const=apName verewigt werden und natürlich auch in dr vis upgeloaded werden

    • Restart und Shutdown funktionieren in der html tabelle (sind schalter) !! - kann im setting deaktiviert werden

    • für mehrere server (proxmox) kann auch eine mehrfach-tabellen-anzeige genutzt werden

    • es gibt aber noch mehr settings, die im adapter selbst eingestellt werden müssen

    tab DATENPUNKTE setting
    datenpunkte unter control: alle MUSS
    datenpunkte unter distribution: alle optional
    datenpunkte unter updates: alle optional
    datenpunkte unter services: running optional
    datenpunkte unter info MUSS: alle
    tab BEFEHLE name des befehls MUSS befehle
    ------ ------ ------
    es müssen genau die namen des befehls eingegeben werden name des befehls
    MUSS-befehl für jeden server !!! cpu-temp die temp des servers (bei proxmox lxc,vm ausnahme)
    MUSS-befehl für jeden server !!! root das rootverzeichnis um die plattenkapazität zu prüfen

    befehle, die bei mir funktionieren
    cpu-temp (wird angepasst werden müssen):

    bei Debian: sensors | grep Package -m 1 | awk '{print $4}' | awk '{print substr($1, length($0)-6,2)}'
    bei raspi: vcgencmd measure_temp | awk '{print substr($1, length($0)-5,4)}'
    

    root-verzeichnis - prozent genutzt

    df / | grep / | awk '{ print $5}' | sed 's/%//g'
    

    ip adresse: (nicht mehr nötig - ist im adapter plaziert worden)

    hostname -I | cut -d' ' -f1
    
    tab BEFEHLE name des befehls optional
    alles was gewünscht kurz halten! die befehle müssen vor dem befehlnamen ein "befehle." stehen haben - siehe: https://forum.iobroker.net/post/475154
    Speicher mem ```free -m awk ' NR == 2 {print $2";"$3";"$4}'```
    Swap swap ```free -m awk ' NR == 3 {print $2";"$3";"$4}'```
    Top-Process top-process ```ps auxh --sort=-c awk 'NR<=1 {print $3";"$11}'```
    tab ORDNER name des ordners
    ------ ------ ------
    alles was gewünscht kurz halten! optional
    tab SERVICE service name
    service es sollte mindestens ein service ausgewählt werden (z.b. ssh) ansonsten werden alle angezeigt, was die tabelle "sprengt"
    alles was gewünscht ist vorgegeben! werden ausgewählt die namen werden gekürzt wenn zu lang, einstellbar im script

    bisher sieht die tabelle so aus:

    Image 4.png Image 1.png
    die temperatur sieht man hier nicht, da ich proxmox nutze und nur der die temp hat


    Image 9.png

    mehrfach:


    Image 3.png

    wer gerne testen möchte:

    //@liv-in-sky 2020  23.8.-17:42
    
    
    //HIER WIRD PFAD UND FILENAME DEFINIERT
    const path = "/htmlexample.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   braucheMaterialDesignWidget=false;             // bei true wird ein json in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
    let dpMaterialWidget="0_userdata.0.Tabellen.Linux-Controll-List-Widget";            // WICHTIG wenn braucheMaterialDesignWidget auf true MATERIALDESIGN List Widget - datenpunkt anlegen : zeichenkette 
    let dpVIS="0_userdata.0.Tabellen.Linux-Control"         //WICHTIG wenn "braucheEinVISWidget" auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget
    let dpMaterialWidgetExtra="0_userdata.0.Tabellen.Linux-Control-MDList-Extra"   // WICHTIG wenn braucheMaterialDesignWidget auf true MATERIALDESIGN List Widget - datenpunkt anlegen : zeichenkette 
    let mySchedule=" * * * * * ";                       //jede minute  
    
    let leerzeile=true;                   // leerzeile vor neuem server
    let farbeUeber="#A0C2A0"              //"#4da6ff" (blau)             // farbe der servernamen
    let styleUeber="span"                 // style der server namen:  möglich b fett; i kursiv; span normal
    var mylum=0.0                         //farbveränderung im bezug zum servernamen von HD uns IP
    var mylumFolder=0.0                   //farbveränderung im bezug zur Standarsschriftfarbe von Folder Anzeige
    var mylumService=0.0                 //farbveränderung im bezug zur Standarsschriftfarbe von Serviceanzeige 
    var mylumButtons=0.0                  //farbveränderung im bezug zur Standarsschriftfarbe von Buttonsanzeige 
    var mylumBefehle=0.0                   //farbveränderung im bezug zur Standarsschriftfarbe von Befehleanzeige 
    let mysonderFarbeHDundTEMP="#33ff33"   // farbe in MD List Widget von Temp und root-festplatte
    
    var serviceTrue="🟢"                 //"🔵"       //⚪      //emoji für dienste die laufen
    var serviceFalse="✖️"                //"🔴"  
    var mitShutdownBotton=true;           // zeigt shutdown und restart button an
    var symbolLinkRestart="☢️"
    var symbolLinkShutdown="☢️"
    var symbolLinkCommands="🔘" //"⚠️"
    var farbeOffline="#466d46"            //farbe für server , die offline sind
    var farbeMDbackgroundOffline= "#484837"          //farbe der kachel in MaterialDesign wenn offline
    var farbeMDschriftOffline="#33ff33"//            //farbe der schrift in MaterialDesign wenn offline
    
    var debug=false;                                  // für script debuggen
    // zweites MD List Widget
    var wantExtra=["Proxmox","IOBroker"]             //  server NAme für extra angezeigte Server - eigenes MD List Widget (dpMaterialWidgetExtra) // leer ist []
    var removeOthers=true;                           // wenn true wird die wantExtra Server aus dem Haupt MD List Widget gelöscht
    var thresholHD=80;
    var thresholTemp=75;
    var thresholPakete=0;
    
    var braucheShellInaBox=false;          // SHELL IN A BOX einstellungen
    var shellBox="🥟"
    
    var laengeServiceNamen=11;            // dient zum kürzen von langen service namen
    
    var bildergröße=17
    const apName = { "FileServer"      : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247720123-fileserver.png"},
                     "IOBroker"        : { aname: "https://upload.wikimedia.org/wikipedia/commons/8/82/IoBroker_Logo.png"},  
                     "MotionEye"       : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247718354-motioneye.png"},
                     "Pi-Hole"         : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247720225-pi-hole.png"},
                     "PlexServer"      : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247718413-plexserver.png"},
                     "Proxmox"         : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247718381-proxmox.png"},
                     "SQLTulla"        : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247720017-sqltulla.png"},
                      "AX--HD-60"        : { aname: "https://forum.iobroker.net/assets/uploads/files/1597941596015-ax-hd60.png"},
                      "GalaxyTab2"        : { aname: "https://forum.iobroker.net/assets/uploads/files/1598105726154-samsung.png"},
                     "Raspi"           : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247719882-raspi.png"}}    // oder lokal gespeichert: vis.0/armin/img//server/IOBroker.png
    
    //---------------------------------------
    
    //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 4
    var htmlFeld1='Server';       var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
    var htmlFeld2='';             var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
    var htmlFeld3='';             var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
    var htmlFeld4='';             var Feld4lAlign="right";                    // überschrift Tabellen Spalte4 und  Ausrichtung left,right or center
    //-----------------------------------
    
    
    
    //ÜBERSCHRIFT ÜBER TABELLE
    let   htmlUberschrift=false;                           // mit Überschrift über der tabelle
    let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
    const htmlFeldUeber='Linux Server';              // Ü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=1;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
    const trennungsLinie="2";                             //extra trennungslinie bei mehrfachtabellen - evtl auf 0 stellen, wnn htmlRahmenLinien auf none sind
    const farbetrennungsLinie="white";
    const htmlFarbZweiteTabelle="#BDBDBD";                // Farbe der Überschrift bei jeder 2.ten Tabelle
    const htmlFarbTableColorUber="#BDBDBD";               // Überschrift in der tabelle - der einzelnen Spalten
    //ÜBERSCHRIFT SPALTEN
    const UeberSchriftHöhe="35";                          //Überschrift bekommt mehr Raum - darunter und darüber - Zellenhöhe
    const LinieUnterUeberschrift="3";                   // Linie nur unter Spaltenüberschrift - 
    const farbeLinieUnterUeberschrift="white";
    const groesseUeberschrift=16;
    const UeberschriftStyle="normal"                     // möglich "bold"
    //GANZE TABELLE
    let abstandZelle="2";
    let farbeUngeradeZeilen="#000000";                     //Farbe für ungerade Zeilenanzahl - Hintergrund der Spaltenüberschrift bleibt bei htmlFarbTableColorGradient1/2
    let farbeGeradeZeilen="#151515";                        //Farbe für gerade Zeilenanzahl - Hintergrund der Spaltenüberschrift bleibt bei htmlFarbTableColorGradient1/2
    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="Ubuntu-Regular";
    const htmlSchriftgroesse="16px";
    //FELDER UND RAHMEN
    let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
    const htmlFarbFelderschrift="#BDBDBD";                  // SchriftFarbe der Felder
    const htmlFarbFelderschrift2="#BDBDBD";                 // 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="grey";             // Farbe des Rahmen - is tdieser gleich den gradienten, sind die rahmen unsichtbar
    let htmlRahmenLinien="all";                            // 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
    
    // 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 height=\""+UeberSchriftHöhe+"\" style=\"color:"+htmlFarbTableColorUber+"; font-size: "+groesseUeberschrift+"px; font-weight: "+UeberschriftStyle+" ;  border-bottom: "+LinieUnterUeberschrift+"px solid "+farbeLinieUnterUeberschrift+" \">";
    const htmlTabUeber3="</tr>";
    
    
    
    
    //NICHTS ÄNDERN - abhängig von den oben definierten _Spalten - in diesem Beispiel sind es 4
    //htmlFeld2="last Update"
    //htmlFeld4=formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")
    
    
    const buttonScript =   '<script> function setOnDblClickCustom1( myvalue ) {var Self = this; objID = myvalue;  console.log(myvalue); Self.servConn.setState(objID, true); console.log(objID)} '+
                          '</script>'
    //------------------------------------------------------
    
    function dlog(message) {
      if(debug)
          console.log(message);
    }
    var htmlOut="";
    var mix;
    var counter;
    var val1; var val2; var val0; var val3;
    var htmlTabUeber="";
    let myArr=[];
    let myArrFolder=[];
    let myArrService=[];
    let myArrButtons=[];
    let myArrBefehle=[];
    let myArrRefresh=[];
    let obj1=[]
     let obj2=[]
    let   countMYWerte;
    let idOld="";
    let helpRestart; let helpShutdown;let helpVersion;let upgrade;let up_date;let up_pack;let helpBild;let helpMem;let helpSwap;let helpTopProcess;let helpLastRefresh;
    let is_running=false
    var myJsonWidget2=[];
    
    
    function writeHTML(){
       is_running=true
    let  htmlFeld4help=formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")
    
    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><td align="+Feld4lAlign+">&ensp;"+htmlFeld4help+"&ensp;</td>";
    var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align=="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+""+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                       "&ensp;</td><td  align=="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld4+
                       "&ensp;</td>";
    
    
    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+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,val3 !!!---------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------
    myArr=[]; myArrFolder=[]; myArrService=[]; myArrButtons=[]; myArrBefehle=[]; myArrRefresh=[];
    $('linux-control.0.*.info.is_online').each(function(id, i) {         //YXJtaW4uc2xpdmluc2t5QGdtYWlsLm  // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
           
          var ida = id.split('.');
                //  linux-control.0.Pi-Hole.control.shutdown
                  //linux-control.0.Pi-Hole.info.is_online
           
                    val0= ida[2]
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".root") ? val1=getState(ida[0]+"."+ida[1]+"."+ida[2]+".root").val : val1="missing"
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".info.ip") ? val2=getState(ida[0]+"."+ida[1]+"."+ida[2]+".info.ip").val : val2="missing"
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".cpu-temp") ? val3=getState(ida[0]+"."+ida[1]+"."+ida[2]+".cpu-temp").val :val3=""
                    //helpRestart;  
                  //  if ( existsState(id.replace("info.is_online","control.restart")))  {mitShutdownBotton ?  helpRestart=id.replace("info.is_online","control.restart") : helpRestart=""} else{helpRestart=""}
                    mitShutdownBotton ?  helpRestart=id.replace("info.is_online","control.restart") : helpRestart=""
                    //helpShutdown; 
                  //  log(id)
                   // log ( existsState(id.replace("info.is_online","control.shutdown")).toString())
                  //  if ( existsState(id.replace("info.is_online","control.shutdown"))) {mitShutdownBotton ? helpShutdown=id.replace("info.is_online","control.shutdown") : helpShutdown="";} else{helpShutdown=""}
                    mitShutdownBotton ? helpShutdown=id.replace("info.is_online","control.shutdown") : helpShutdown="" 
                 //  log(helpShutdown)
                    //helpVersion
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".distribution.fullname") ? helpVersion=getState(ida[0]+"."+ida[1]+"."+ida[2]+".distribution.fullname").val.replace(/.+ (.+ )\((.+)\)/,"$2 ($1)") : helpVersion=" unknown "
                    //upgrade
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.upgradable") ? upgrade=(getState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.upgradable").val) : up_pack="missing"
                    upgrade ? upgrade="Ja" : upgrade="Nein"
                    //up_date                                                                  
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.lastUpdate") ? up_date=formatDate(getDateObject(((new Date(getState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.lastUpdate").val).getTime()))), "TT.MM.YY") : up_date="missing"
                    //up_pack;
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.newPackages") ? up_pack=(getState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.newPackages").val) : up_pack="missing"
                    //helpMem
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".mem") ? helpMem=getState(ida[0]+"."+ida[1]+"."+ida[2]+".mem").val :helpMem=""
                    
                    //helpSwap
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".swap") ? helpSwap=getState(ida[0]+"."+ida[1]+"."+ida[2]+".swap").val :helpSwap=""
                    //helpTopProcess
                    existsState(ida[0]+"."+ida[1]+"."+ida[2]+".top-process") ? helpTopProcess=getState(ida[0]+"."+ida[1]+"."+ida[2]+".top-process").val :helpTopProcess=""
                    //helpLastRefresh
                    if ( existsState(id.replace("info.is_online","info.lastRefresh")))  {helpLastRefresh=getState(id.replace("info.is_online","info.lastRefresh")).val } else{helpLastRefresh=""}
    
                    //helpBild;
                    helpBild="<img src=https://upload.wikimedia.org/wikipedia/commons/8/82/IoBroker_Logo.png height=\""+bildergröße+"\" width=\""+bildergröße+"\">"
                  for(let device_name in apName) { 
                         if (val0==device_name) {helpBild="<img src="+apName[device_name].aname+" height=\""+bildergröße+"\" width=\""+bildergröße+"\">"; }}
               
                  let helpOnline=getState(ida[0]+"."+ida[1]+"."+ida[2]+".info.is_online").val
                 
                  let myhelp=[val0,val1,val2,val3,helpRestart,helpShutdown,helpVersion,helpBild,helpOnline,upgrade,up_date,up_pack,helpMem,helpSwap,helpTopProcess,helpLastRefresh]        ; 
                  dlog(myhelp.toString())
                  myArr.push(myhelp)
    //--------------------------Folder               
                  let mySelektor="linux-control.0."+ida[2]+".folders.*.size"
                //  let mymycount=0
                  $(mySelektor).each(function(id2, i) { 
                       var ids = id2.split('.');
                        myArrFolder.push([ids[2],ids[4],getState(ids[0]+"."+ids[1]+"."+ids[2]+"."+ids[3]+"."+ids[4]+"."+ids[5]).val,i,getObject(ids[0]+"."+ids[1]+"."+ids[2]+"."+ids[3]+"."+ids[4]+"."+ids[5]).common.unit,id] )
                         }); 
    //--------------------------Services                      
                  mySelektor="linux-control.0."+ida[2]+".services.*.running"      
                  $(mySelektor).each(function(id3, i) { 
                       var idx = id3.split('.');
                    //   log(idx[4].replace(/(.+)server.+/g,"$1"))
                      //  myArrService.push([idx[2],idx[4].substring(0,laengeServiceNamen),getState(id3).val,i,id3] )
                        idx[4]=idx[4].replace(/(.+)service/g,"$1")
                        idx[4]=idx[4].replace(/(.+)server\*+/g,"$1")
                        idx[4]=idx[4].substring(0,laengeServiceNamen)
    
                        myArrService.push([idx[2],idx[4],getState(id3).val,i,id3] )
                         });  
    //--------------------------Buttons            
                  let mycounty=-1
                  mySelektor="state[id=linux-control.0."+ida[2]+".*][role=button]"
                        $(mySelektor).each( function( id4, i){  
                          var idy = id4.split('.'); if  (idy.length==4)  mycounty++
                          if  (idy.length==4)  {myArrButtons.push([idy[2],idy[3],mycounty,id4] ); myArrRefresh.push(id4)}
                         });   
         /////-----------für refresh
                    mycounty=-1
                  mySelektor="state[id=linux-control.0."+ida[2]+".*][role=value]"
                        $(mySelektor).each( function( id4, i){  
                          var idy = id4.split('.'); if  (idy.length==4)  mycounty++
                          if  (idy.length==4)  {/*myArrButtons.push([idy[2],idy[3],mycounty,id4] );*/ myArrRefresh.push(id4)}
                         });        
    //--------------------------Befehle            
                  let mycounty2=-1
                  mySelektor="linux-control.0."+ida[2]+".befehle.*"     
                        $(mySelektor).each( function( id5, i){  mycounty2++
                          var idz = id5.split('.');  // log(id);mycounty2++
                            myArrBefehle.push([idz[2],idz[4],mycounty2,getState(id5).val] ) ; myArrRefresh.push(id5)
                         });                                 
                  
          // counter++; tabelleBind()
       }); 
      dlog("Länge Server: "+myArr.length.toString())         // ;log(myArr.toString())
      dlog("Länge Folder: "+myArrFolder.length.toString())    //dlog(myArrFolder.toString())
      dlog("Länge Service: "+myArrService.length.toString())   //dlog(myArrService.toString())
      dlog("Länge Buttons: "+myArrButtons.length.toString())   //dlog(myArrButtons.toString())
      dlog("Länge Buttons: "+myArrRefresh.length.toString())   //;log(myArrRefresh.toString())
      dlog("Länge Buttons: "+myArrBefehle.length.toString())   //;log(myArrBefehle.toString())
      
    
      
      
      countMYWerte=0;
       
    
                       for(var i=0;i<myArr.length;i++) {
                        dlog(myArr[i][0] +" und "+idOld)
                   //  if(myArr[i][0]!=idOld){ dlog("erster Ablauf Durchlauf")
                          countMYWerte++
                          tabelleMachSchoen()
                          counter=-1
                          if(leerzeile){
                                        if(countMYWerte>1) for(var a=0;a<mehrfachTabelle;a++ ) { //leerzeile
                                              val0=""; val1=""; val2="";val3="";counter++;tabelleBind();
                                         } }
    
              if (myArr[i][8])     {  
    // ----------------------------erste zeile Zeile                                   
                 for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                      if  (ic==0) { val0=myArr[i][7]+"&ensp; <span style=\"font-size:130%\"><font color=\""+farbeUeber +"\"><"+styleUeber+">"+myArr[i][0]+"<span>";
                                    if(braucheShellInaBox) {val0=val0+" <a style=\" font-size:70% \" href=\"https:\/\/"+ myArr[i][2] + ":4200\" target=\"_blank\" onclick=\"window.open(this.href,this.target,\'width=760,height=640\'); return false;\">"+shellBox+"</a>"}
                        // val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][1];
                          myArr[i][1]!="" ? val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">HD: "+myArr[i][1]+" %" : val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][1];
                          myArr[i][2]!="" ? val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][2] : val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][2];
                          myArr[i][3]!="" ? val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][3]+" °C" : val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][3];
                          //Threshold
                         if( myArr[i][1]!="" && myArr[i][1]>thresholHD ) val1="<font color=\""+"red" +"\">HD: <b>"+myArr[i][1]+" %</b>";
                         if( myArr[i][3]!="" && myArr[i][1]>thresholTemp) val3="<font color=\""+"red" +"\"><b>"+myArr[i][3]+" °C</b>" ;
                         
                          } else {val0=""
                                  val1="";
                                  val2="";
                                  val3=""} 
                counter++;
                tabelleBind();}
    // ----------------------------zweite Zeile
    for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                 if(myArr[i][12]!="")  { let myMemTab=myArr[i][12].split(";");
                    if  (ic==0) { val0="<font color=\""+ColorLuminance(farbeUeber,mylumFolder) +"\">"+"Memory(MB)"; 
                          if (i==0 && ic==0 )  dlog("Verarbeite zweite Zeile");
                 
                         val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Total: "+myMemTab[0]
                         val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Used: "+myMemTab[1]
                         val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Free :"+myMemTab[2]
                        
                           } else {val0=""
                                   val1="";
                                   val2="";
                                   val3=""} 
                counter++;
                tabelleBind();}}
    // ----------------------------zweite Zeile
    for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                 if(myArr[i][13]!="")  { let myMemTab=myArr[i][13].split(";");
                    if  (ic==0) { val0="<font color=\""+ColorLuminance(farbeUeber,mylumFolder) +"\">"+"Swap(MB)"; 
                          if (i==0 && ic==0 )  dlog("Verarbeite zweite Zeile");
                 
                         val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Total: "+myMemTab[0]
                         val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Used: "+myMemTab[1]
                         val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Free :"+myMemTab[2]
                        
                           } else {val0=""
                                   val1="";
                                   val2="";
                                   val3=""} 
                counter++;
                tabelleBind();}       }      
    // ----------------------------zweite Zeile
    for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                    if  (ic==0) { val0="<font color=\""+ColorLuminance(farbeUeber,mylumFolder) +"\">"+"Updates"; 
                          if (i==0 && ic==0 )  dlog("Verarbeite zweite Zeile");
                 
                         val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][9]
                         val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][11]+" Paket(e)"
                         val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+" zuletzt: "+myArr[i][10]
                        
                           } else {val0=""
                                   val1="";
                                   val2="";
                                   val3=""} 
                counter++;
                tabelleBind();
                 }            
    // ----------------------------dritte Zeile
    for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                    if  (ic==0) { val0=""; if (i==0 && ic==0 )  dlog("Verarbeite dritte Zeile");
                 
                          myArr[i][6]!="" ? val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][6]+"" : val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][6];
                          let valButton=myArr[i][4]; 
                          myArr[i][4]!="" ? val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+ "Restart!&emsp;"+"<button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'"+valButton+"\')\">"+symbolLinkRestart  + "</button>" : val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">-" ;
                          valButton=myArr[i][5]
                          myArr[i][5]!="" ? val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+"Shutdown!&emsp;"+"<button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'"+valButton+"\')\">"+symbolLinkShutdown + "</button>" : val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">-";
                        
                           } else {val0=""
                                   val1="";
                                   val2="";
                                   val3=""} 
                counter++;
                tabelleBind();
              }
              
                   } else{
                for(var ic=0;ic<mehrfachTabelle;ic++ ) {    
                       if  (ic==0) { val0=myArr[i][7]+"&ensp; <span style=\"font-size:130%\"><font color=\""+farbeMDschriftOffline +"\"><"+styleUeber+"><i>"+myArr[i][0]+"</i><span>";
                        
                           myArr[i][1]!="" ? val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>HD: "+myArr[i][1]+" %</i>" : val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+myArr[i][1];
                           myArr[i][2]!="" ? val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][2]+"</i>" : val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+myArr[i][2];
                           myArr[i][3]!="" ? val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][3]+" °C</i>" : val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+myArr[i][3];
                          
                           } else {val0=""
                                   val1="";
                                   val2="";
                                   val3=""} 
                 counter++;
                 tabelleBind();}
    for(var ic=0;ic<mehrfachTabelle;ic++ ) {  
                  if  (ic==0) { val0="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+"Updates"+"</i>" ; 
                          if (i==0 && ic==0 )  dlog("Verarbeite zweite Zeile");
                 
                         val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][9]+"</i>" 
                         val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][11]+"</i>" 
                         val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][10]+"</i>" 
                        
                           } else {val0=""
                                   val1="";
                                   val2="";
                                   val3=""} 
                counter++;
                tabelleBind();}
                
         for(var ic=0;ic<mehrfachTabelle;ic++ ) {        
                 if  (ic==0) { val0="";
                           myArr[i][6]!="" ? val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][6]+"</i>" : val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+myArr[i][6];
                           let valButton=myArr[i][4]; 
                           myArr[i][4]!="" ? val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+ "<i>Restart!&emsp;</i> " : val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">-" ;
                           valButton=myArr[i][5]
                           myArr[i][5]!="" ? val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+"<i>Shutdown!&emsp;</i> ": val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">-";
                         
                            } else {val0=""
                                    val1="";
                                    val2="";
                                    val3=""} 
                 counter++;
                 tabelleBind(); }
    
                   }      
                   
                tabelleMachSchoen()
                          counter=-1
    
                       
          
    //  --------------------------------------------(Folder)                      
             for(var ib=0;ib<myArrFolder.length;ib++) {  if (i==0 && ib==0) dlog("Verarbeite Folder");
                                  
             if (myArrFolder[ib][0]==myArr[i][0]){  
                          
                    if (myArr[i][8])     {  
                            myArrFolder[ib][3]==0? val0="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumFolder) +"\">"+"Folder"  :val0="";
                            val1="";
                            val2="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumFolder) +"\">"+myArrFolder[ib][1]
                            val3="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumFolder) +"\">"+myArrFolder[ib][2] +" "+myArrFolder[ib][4]
                            counter++; tabelleBind();
                            } else{
                       /*     myArrFolder[ib][3]==0? val0="<font color=\""+ColorLuminance(farbeOffline,mylumFolder) +"\"><i>"+"Folder</i>"  :val0="";
                            val1="";
                            val2="<font color=\""+ColorLuminance(farbeOffline,mylumFolder) +"\"><i>"+myArrFolder[ib][1]+"</i>"
                            val3="<font color=\""+ColorLuminance(farbeOffline,mylumFolder) +"\"><i>"+myArrFolder[ib][2] +" "+myArrFolder[ib][4]+"</i>"   
                            counter++; tabelleBind();*/
                            }
                             }   }
    //  --------------------------------------------(Service)                          
           tabelleMachSchoen()
           counter=-1
                         
             for(var ia=0;ia<myArrService.length;ia++) {  if (i==0&& ia==0) dlog("Verarbeite Service");
             if (myArrService[ia][0]==myArr[i][0]){  
                   if (myArr[i][8])     {  
                            myArrService[ia][3]==0? val0="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumService) +"\">"+"Service"  :val0="";
                            val1="";
                            val2="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumService) +"\">"+myArrService[ia][1]
                            myArrService[ia][2] ? val3=serviceTrue :val3=serviceFalse 
                            counter++; tabelleBind();
                          } else {
                       /*     myArrService[ia][3]==0? val0="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\"><i>"+"Service</i>"  :val0="";
                            val1="";
                            val2="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\"><i>"+myArrService[ia][1]+"</i>"
                            val3=serviceFalse   
                            counter++; tabelleBind();   */
                          }    
                             } }
    //  --------------------------------------------Buttons)
          tabelleMachSchoen()
          counter=-1
                         
              for(var ix=0;ix<myArrButtons.length;ix++) {  if (i==0 && ix==0) dlog("Verarbeite Buttons");
              if (myArrButtons[ix][0]==myArr[i][0]){ 
                    if (myArr[i][8])     {  
                            myArrButtons[ix][2]==0? val0="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumButtons) +"\">" +"Buttons"  :val0="";
                            val1="";
                            val2="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumButtons) +"\">" +myArrButtons[ix][1]
                            let valButton=myArrButtons[ix][3];
                          val3="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumButtons) +"\">" +"(press) <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:right\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'"+valButton+"\')\">"+symbolLinkCommands; //  myArrButtons[ia][2] ? val3=serviceTrue :val3=serviceFalse 
                          counter++; tabelleBind();
                          } else {
                  /*    myArrButtons[ix][3]==0? val0="<font color=\""+ColorLuminance(farbeOffline,mylumFolder) +"\"><i>"+"Buttons</i>"  :val0="";
                            val1="";
                            val2="<font color=\""+ColorLuminance(farbeOffline,mylumButtons) +"\"><i>"+myArrButtons[ix][1]+"</i>"
                            val3=serviceFalse  
                            counter++; tabelleBind(); */
                          }    
                             }    } 
    // --------------------------------------------ENDE Buttons
    
    
     //  --------------------------------------------Befehle)
          tabelleMachSchoen()
          counter=-1
                         
              for(var ix=0;ix<myArrBefehle.length;ix++) {  if (i==0 && ix==0) dlog("Verarbeite Befehle");
              if (myArrBefehle[ix][0]==myArr[i][0]){ 
                    if (myArr[i][8])     {  
                            myArrBefehle[ix][2]==0? val0="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumBefehle) +"\">"+"Sonstiges"  :val0="";
                            val1="";
                            val2="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumBefehle) +"\">"+myArrBefehle[ix][1]
                            val3="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumBefehle) +"\">"+myArrBefehle[ix][3]
                            counter++; tabelleBind();
                          } else {
                    /*        myArrBefehle[ix][2]==0? val0="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\"><i>"+"Sonstiges</i>"  :val0="";
                            val1="";
                            val2="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\"><i>"+myArrBefehle[ix][1]+"</i>"
                            val3="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\">"+" - " 
                            counter++; tabelleBind();     */
                          }    
                             }    } 
    // --------------------------------------------ENDE Befehle
    
                 
                //  idOld=""//myArr[i][0];
    
         //  }
        }
    
    
    
    //-------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
    //-------------------------------------------------------------------------------------------------------------------------------------------------
    
          tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
        let  timeout22 = setTimeout(function () {
            is_running=false
    }, 5000);
          
    } // function ende
    
    //MAIN:
    
     
    schedule(mySchedule,  function () {
     writeHTML();
     if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
    }); 
    writeHTML();
    
    
    function tabelleBind(){
         //HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT - hat man oben 4 Felder definiert, braucht man hier 4 Werte 
       
           switch (mehrfachTabelle) {  
            case 1:  if(counter%2==0){  htmlOut=htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td></tr>"; break;} else
                                     {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td></tr>"; break;}
            case 2: if(counter%4==0){ 
                     if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                        ";\"align="+Feld4lAlign+">&ensp;"+val3+"&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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td></tr>";} break;
                        }else{
                     if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                        ";\" align="+Feld4lAlign+">&ensp;"+val3+"&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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td></tr>";} break;}                  
            case 3:  if(counter%2==0)   {
                      if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                            ";\" align="+Feld4lAlign+">&ensp;"+val3+"&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><td  align="+Feld4lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                            ";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td>";} 
                                                   else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td></tr>";}
                                             } break;}else{
                      if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                            ";\" align="+Feld4lAlign+">&ensp;"+val3+"&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><td  align="+Feld4lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                            ";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td>";} 
                                                   else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td></tr>";}
                                             } break;}
    
            case 4:  if(counter%8==0)   {
                     if(counter%4==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+ ";\" align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td>"; } 
                                      else {if(counter%4==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><td  align="+Feld4lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td>";} 
                                                   else    {if(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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td><td  align="+Feld4lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+ "color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td></tr>";} 
                                                                     else    {htmlOut  = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td>";}}
                                             } break;}else{
                     if(counter%4==0)   {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+ ";\" align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td>"; } 
                                      else {if(counter%4==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><td  align="+Feld4lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+ ";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td>";} 
                                                   else    {if(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><td  align="+Feld4lAlign+"  color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td></tr>";} 
                                                                     else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td>";}}
                                             } break;     }                   
    
         } //switch ende
    
    }
    
    
    function tabelleFinish() {
         dlog("verbeite tableFinish")
         // tabelle fertigstellen
    
    
           switch (mehrfachTabelle) {  
           case 1:    break;
    
           case 2:    
                      if(counter%2==0)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                    
                      break;
    
           case 3:   if(counter%3==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");
                     if(counter%3==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                     if(counter%3==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                   
                      break;
           case 4:   if(counter%4==3) {  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");}
                     if(counter%4==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                     if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");    
                     if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&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+ buttonScript : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+ buttonScript ;
    
                  } else {
                   zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+ buttonScript :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+ buttonScript;
    
                     }
    
      // log("bin raus aus tabelleBind");
               if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
    
     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>"
    
     if (!htmlSignature) htmlUnter="";
     var htmlEnd="</table>"+htmlUnter+"</div></body>";
     //mit oder ohne überschrift - zentriert oder links
    htmlUberschrift ? htmlOut=htmlStart+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd : htmlOut=htmlStart+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd;
     //log(htmlOut);
    
    if (braucheMaterialDesignWidget) {
         
         makeJsonWidget(myArr,myArrFolder,myArrService,myArrButtons,myArrBefehle)
         if(wantExtra)    getProxmox()
         removeOthers  ?  setState(dpMaterialWidget,JSON.stringify(obj2)) : setState(dpMaterialWidget,JSON.stringify(myJsonWidget2));  ; 
          
     
           myJsonWidget2=[];
    }
    
    }
    
    
    function tabelleMachSchoen(){
    
    switch (mehrfachTabelle) {  
           case 1:    break;
    
           case 2:    
                      if(counter%2==0)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                    
                      break;
    
           case 3:   if(counter%3==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");
                     if(counter%3==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                     if(counter%3==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                   
                      break;
           case 4:   if(counter%4==3) {  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");}
                     if(counter%4==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                     if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");    
                     if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");      
                     break; } 
    
    }
    
    
    function ColorLuminance(hex, lum) {
    
       // validate hex string
       hex = String(hex).replace(/[^0-9a-f]/gi, '');
       if (hex.length < 6) {
       	hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
       }
       lum = lum || 0;
    
       // convert to decimal and change luminosity
       var rgb = "#", c, i;
       for (i = 0; i < 3; i++) {
       	c = parseInt(hex.substr(i*2,2), 16);
       	c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
       	rgb += ("00"+c).substr(c.length);
       }
    
       return rgb;
    }
    
    function makeJsonWidget(vax1,vax2,vax3,vax4,vax5) {
    
    
    //	log(myJsonWidget)
    if (braucheMaterialDesignWidget) {
      //  log(vax1.toString())
        //log(vax2.toString())
        //log(vax3.toString())
        
        for (var iii=0;iii<vax1.length;iii++){      
    let  mystatuscolorbar=""; 
       //  vax1[iii][8] ? mystatuscolorbar=farbeUeber : mystatuscolorbar=farbeOffline
    let  myimage=""; 
    let myschriftgroesse=(parseInt(htmlSchriftgroesse.replace("px",""))+10)+"px"
    let mytext
    let mybkgd;
    //myshellIp= `<a href="https://${vax1[iii][2]}:4200"> target="_blank" onclick="window.open(this.href,this.target,width=760,height=640)> </a> ${shellBox} `
    let   myshellIp= ""
     if(braucheShellInaBox) myshellIp= " <a href=\"https:\/\/"+ vax1[iii][2] + ":4200\" target=\"_blank\" onclick=\"window.open(this.href,this.target,\'width=800,height=640\'); return false;\">"+shellBox+"</a>"
      vax1[iii][8] ? mytext=`<span style="color:  ${farbeUeber}; font-size: ${(myschriftgroesse)}"> ${vax1[iii][0]}  </span>${myshellIp}<span style="color:  ${farbeUeber}; font-size: ${(htmlSchriftgroesse)}">${vax1[iii][6]}`  :
                     mytext=`<span style="color:  ${farbeMDschriftOffline}; font-size: ${(htmlSchriftgroesse)}"> ${vax1[iii][0]}  </span><span style="color:  ${farbeMDschriftOffline}; font-size: ${(myschriftgroesse)}">OFFLINE` ;
    
     vax1[iii][8] ? mybkgd="" : mybkgd=farbeMDbackgroundOffline
    
        myimage="https://upload.wikimedia.org/wikipedia/commons/8/82/IoBroker_Logo.png"
    for(let device_name in apName) { //log(device_name)                           //Abfrage welches bild
                        for (var i=0;i<vax1.length;i++){
                         if (vax1[iii][0].trim()==device_name.trim()) myimage=apName[device_name].aname; }}//" height=\""+bildergröße+"\" width=\""+bildergröße+"\">"; } } // log(myimage)
    
     //ColorLuminance(farbeUeber,0.6); log(mysonderFarbe)
    let mysubText
    //let mytemp; vax1[iii][3]!="" ? mytemp="CPU Temp: "+vax1[iii][3] + "°C"  :  mytemp="";
    let mysonderFarbeHDundTEMP2;
    let mysonderFarbeHDundTEMP3;
    let blinkklasse=""
    let blinkklasse2=""
    let arrMem;let arrSwap;let arrTProc; let myMem="";let mySwap="";let myTProc=""; let myMemTable="";let myProcess="";let mySwapRow;let myMemRow
    if(vax1[iii][12]!=""){arrMem=vax1[iii][12].split(";");myMemRow="MEM"} else{arrMem=["","",""];myMemRow=""}
    if(vax1[iii][13]!=""){arrSwap=vax1[iii][13].split(";");mySwapRow="SWAP"} else{arrSwap=["","",""];mySwapRow=""}
    if(vax1[iii][14]!=""){arrTProc=vax1[iii][14].split(";")} else{arrTProc=["","",""]}
    //if(vax1[iii][12]!="") log(arrMem[0]+"  " +arrSwap[0] +"  " +arrTProc[0])
    if(arrMem[0]!="" || arrSwap[0]!="") {myMemTable=`</br>
                     <table  rules="cols" align="center" > <tr><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">(in MB)</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Total</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Used</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Free</td></tr>
                    <tr><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">${myMemRow}</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrMem[0]} </td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrMem[1]} </td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrMem[2]}</td></tr>
                    <tr><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">${mySwapRow}</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrSwap[0]} </td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrSwap[1]}  </td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse}; align="center">${arrSwap[2]}</td></tr></table>`} else{myMemTable=""}
    if( arrTProc[0]!="") {myProcess=`<div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"> Top-Proc: <span style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP};" >${arrTProc[0]}%</span> ${arrTProc[1].substring(0,15)} </div>`} else {myProcess=""}
    
    if(vax1[iii][3]>thresholTemp) { mysonderFarbeHDundTEMP2="yellow"; blinkklasse="blinkklasse" } else {mysonderFarbeHDundTEMP2=mysonderFarbeHDundTEMP;blinkklasse="nix"}
    let mytemp; vax1[iii][3]!="" ? mytemp="CPU Temp: "+`<span class=${blinkklasse} style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP2};" >${vax1[iii][3]} </span>` + `<span lass=${blinkklasse} style="color: ${mysonderFarbeHDundTEMP2};">°C</span> ` :  mytemp="";   
    if(vax1[iii][1]>thresholHD) {mysonderFarbeHDundTEMP2="yellow"; blinkklasse="blinkklasse"} else {mysonderFarbeHDundTEMP2=mysonderFarbeHDundTEMP; blinkklasse="nix"}
    if(vax1[iii][11]>thresholPakete) {mysonderFarbeHDundTEMP3="yellow";blinkklasse2="blinkklasse"} else {mysonderFarbeHDundTEMP3=mysonderFarbeHDundTEMP;blinkklasse2="nix"}
    vax1[iii][8] ?  mysubText =    
                    ` <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"> ${vax1[iii][2]}</div>
                    <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"> ${mytemp}</div>
                    <div  style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Festplatte: <span  class=${blinkklasse} style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP2};" >${vax1[iii][1]}</span><span style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP2};" > %</span></div>
                    ${myProcess}
                     <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Update:  ${vax1[iii][9]} <span class=${blinkklasse2} style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP3};" >${vax1[iii][11]}</span> Paket(e)</div>
                    ${myMemTable}
                    `  :
                     mysubText =   ` </br>
    
                     <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"> ${vax1[iii][2]}</div>
                     <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Festplatte:  ${vax1[iii][1]}%</div>
                     <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Update:  ${vax1[iii][9]} ${vax1[iii][11]} Paket(e)</div> 
                     `
    
    if (vax1[iii][8]) {
                  mysubText=mysubText.concat(`</br>
                                              <table align="center" ><tr><td valign="top"> <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Folder:</div>
                                               `)
                  mysubText=mysubText.concat(`<span display: flex; flex-direction: row;> <table align="center" >`)
    for (var i=0;i<vax2.length;i++){
                 if (vax2[i][0]==vax1[iii][0]) {
                   mysubText=mysubText.concat(`<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">${vax2[i][1]}</td><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax2[i][2]} ${vax2[i][4]}</td></tr>` ) 
                    }  }
                    mysubText=mysubText.concat(`</table></span></td>`) 
    
                    
                    mysubText=mysubText.concat(`<td valign="top"><div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Service:</div>
                                               `)
                    mysubText=mysubText.concat(`<span display: flex; flex-direction: row;> <table align="center" >`)
    for (var i=0;i<vax3.length;i++){
                 if (vax3[i][0]==vax1[iii][0]) {
                    let helpextra; vax3[i][2] ? helpextra=serviceTrue :helpextra=serviceFalse  
                   mysubText=mysubText.concat( `<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"  align=\"left\">&ensp;${vax3[i][1]}</td><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">${helpextra}</td></tr>`)
                    }  }   
                    mysubText=mysubText.concat("</table></span></td></tr></table>"  )   
    
    //---------------------BUTTONS                 
    let arrcounter=0
    for (var i=0;i<vax4.length;i++){
                 if (vax4[i][0]==vax1[iii][0]) {arrcounter++;
                 }} //log(vax1[iii][0]+ "   "+ arrcounter.toString())                 
    
    if (arrcounter>0) {mysubText=mysubText.concat(`</br>
                                                 <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Buttons:</div>
                                               `)
                    mysubText=mysubText.concat(`<span display: flex; flex-direction: row;> <table align="center"  >`)
    
    arrcounter=arrcounter-1;
    //
    let mynewi=-1
    for (var i=0;i<vax4.length;i++){
            
                 if (vax4[i][0]==vax1[iii][0]) { 
                     mynewi++
       			//  log(mynewi+"  "+ arrcounter)
       			 if (arrcounter>=1){
       			    if(mynewi%2==1 && mynewi<=arrcounter) mysubText=mysubText.concat( `<tr ><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"  align=\"left\">&ensp;${vax4[i-1][1]}</td><td  align=\"left\">&ensp; <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:${htmlSchriftgroesse}\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${vax4[i-1][3]}')\">${symbolLinkCommands} </td><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax4[i][1]}</td><td  align=\"left\">&ensp; <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:${htmlSchriftgroesse}\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${vax4[i][3]}')\">${symbolLinkCommands} </td></tr>`)
       				if(mynewi%2==0 && mynewi==arrcounter) mysubText=mysubText.concat( `<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax4[i][1]}</td><td align=\"left\">&ensp; <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:${htmlSchriftgroesse}\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${vax4[i][3]}')\">${symbolLinkCommands} </td><td></td><td></td></tr>`)
       			 
       			 } else {
       			 mysubText=mysubText.concat( `<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax4[i][1]}</td><td align=\"left\">&ensp; <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:${htmlSchriftgroesse}\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${vax4[i][3]}')\">${symbolLinkCommands} </td></tr>`)
       			 }
       			 
       			 
                 //  mysubText=mysubText.concat( `<tr><td align=\"left\">&ensp;${vax4[i][1]}</td><td align=\"left\">&ensp;(press) <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${helpextra}')\">${symbolLinkCommands} </td></tr>`)
                    }  // wenn servername stimmt 
                    }  // durch button array
                    mysubText=mysubText.concat("</table></span>")  
    //				 
        } //buttons größer 0	
    
    //---------------------Ssonstiges                 
    
    arrcounter=0
    for (var i=0;i<vax5.length;i++){
                 if (vax5[i][0]==vax1[iii][0]) {arrcounter++;
                 }} //log(vax1[iii][0]+ "   "+ arrcounter.toString())                 
    
    if (arrcounter>0) {
    mysubText=mysubText.concat(`</br>
                                              <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Sonstige:</div>
                                               `)
                  mysubText=mysubText.concat(`<span display: flex; flex-direction: row;> <table align="center" >`)
    for (var i=0;i<vax5.length;i++){
                 if (vax5[i][0]==vax1[iii][0]) { let mybool = vax5[i][3] ;  if(mybool=="true") mybool= serviceTrue  ;
                   mysubText=mysubText.concat(`<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">${vax5[i][1]}</td><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax5[i][3]} </td></tr>` ) 
                    }  }
                    mysubText=mysubText.concat(`</table></span>`) 
    }
    
     }  //ist online - alle arrays
    //  log(vax1[iii][15])                  //+formatDate(getDateObject(((new Date(vax1[iii][15]).getTime()))), "SS:mm:ss")
      vax1[iii][8] ?  mysubText = mysubText+    
                    ` <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">last refresh: ${formatDate(getDateObject(((new Date(vax1[iii][15]).getTime()))), "SS:mm:ss")}</div>
                   
                    `  :
                     mysubText = mysubText + ` </br>
    
                     <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">last refresh: ${formatDate(getDateObject(((new Date(vax1[iii][15]).getTime()))), "SS:mm:ss")}</div>
                     <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">         am:     ${formatDate(getDateObject(((new Date(vax1[iii][15]).getTime()))), "TT.MM.JJJJ")}</div>
                     `
    //log(mytext)
    
       //    if(vax3<=1)   vax5=farbeNurEinTag               
        
         myJsonWidget2.push({
                   text: mytext,
                   subText: mysubText,
                   statusBarColor: mystatuscolorbar,
                   image: myimage,
                   background: mybkgd,
                   imageColor: "",
                   listType: "text",
                   showValueLabel: false,
                   name: "",
                   status: "",
                   Wert : "",
                   Hersteller : ""
               });
    }
     }}
    
    // struktur der array
    // server:     servername,   Hd  ,   ip  , temp,     restart-pfad,     shutdown-pfad.,  version    ,bild mit style,   isOnline,     upgrade,   last update,   anzahl update, mem,  swap , top-process
    // folder:     servername,ordnername,ordnergröße,lauf. zähler ordner,einheit,id
    // service:    servername,servicename,lauf. anzahl service, id
    // buttons:    servername,buttonname,lauf. anzahl button,id
    // befehle:    servername,befehlnname,lauf. anzahl befehl, Wert vin id
    
    
    
    function getProxmox () {
    let merker=0;
    let mynewObj
     let mynewObj2
     obj1=[]
      obj2=[]
    for(var index in myJsonWidget2 ) {
          merker=0;
       for(var me in wantExtra){
         
       if(myJsonWidget2[index].text.replace(/.+px\"\> (.+) \<\/span\>.+/g,"$1").trim()== wantExtra[me]) { //log(me)
              mynewObj=JSON.parse(JSON.stringify(myJsonWidget2[index]));
              obj1.push(mynewObj)
              merker=1
              } //proxarr
           /*   else { log("jetzt  "+ myJsonWidget2[index].text.replace(/.+px\"\> (.+) \<\/span\>.+/g,"$1")+ "  "+ wantExtra[me] )
               if(parseInt(me)==0){    mynewObj2=JSON.parse(JSON.stringify(myJsonWidget2[index]));
                   obj2.push(mynewObj2)}
              } */
       
      
       }
        if(merker==0) {mynewObj2=JSON.parse(JSON.stringify(myJsonWidget2[index])); 
                      obj2.push(mynewObj2) ;
                      merker=0;}
    
    
    } setState(dpMaterialWidgetExtra,JSON.stringify(obj1)) ;}
    
    
    
        on({id: myArrRefresh ,  change: "ne"}, function (obj) { 
      
      let timeout = setTimeout(function () {
     dlog("BIN DRIN in Refresh")
        if (!is_running) writeHTML();
        if (braucheEinFile && !is_running) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
    }, 5000);
         
       });
    
    
    
    
    
    
    
    
    
    

    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

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

      nachdem @Scrounger mal wieder einen coolen adapter "rausgelassen" hat , habe ich mal versucht, das ganze etwas vis-freundlicher zu gestallten

      edit: leider habe ich festgestellt, dass die html tabelle für mehrere server (bei mir 8 stück) eigentlich sehr unpraktisch ist (wird zu lang) - daher liegt der vorteil bei dem Material Design List Widget - siehe 2ten post

      • grundlage des scriptes ist: https://forum.iobroker.net/topic/28021/html-table-für-vis-oder-iqontrol-js-und-blockly

      • adapter thread:https://forum.iobroker.net/topic/35870/test-adapter-linux-control-v0-x-x/2

      • für übersicht in der vis (tabelle wird über html-widget mit binding angezeigt) oder in iqontrol

      • Material Design List Widget - siehe 2ten post !

      • wie üblich müssen datenpunkte selbst angelegt werden und im script eingegeben werden (z.b. let dpVIS="0_userdata.0.Tabellen.Linux-Control" oder dpMaterialWidget)

      • im setting bereich des scriptes können die html settings auf wunsch geändert werden (darstellung farbe, ...)
        die tabelle refresht jede minute

      • die bilder müssen unbedingt in der const=apName verewigt werden und natürlich auch in dr vis upgeloaded werden

      • Restart und Shutdown funktionieren in der html tabelle (sind schalter) !! - kann im setting deaktiviert werden

      • für mehrere server (proxmox) kann auch eine mehrfach-tabellen-anzeige genutzt werden

      • es gibt aber noch mehr settings, die im adapter selbst eingestellt werden müssen

      tab DATENPUNKTE setting
      datenpunkte unter control: alle MUSS
      datenpunkte unter distribution: alle optional
      datenpunkte unter updates: alle optional
      datenpunkte unter services: running optional
      datenpunkte unter info MUSS: alle
      tab BEFEHLE name des befehls MUSS befehle
      ------ ------ ------
      es müssen genau die namen des befehls eingegeben werden name des befehls
      MUSS-befehl für jeden server !!! cpu-temp die temp des servers (bei proxmox lxc,vm ausnahme)
      MUSS-befehl für jeden server !!! root das rootverzeichnis um die plattenkapazität zu prüfen

      befehle, die bei mir funktionieren
      cpu-temp (wird angepasst werden müssen):

      bei Debian: sensors | grep Package -m 1 | awk '{print $4}' | awk '{print substr($1, length($0)-6,2)}'
      bei raspi: vcgencmd measure_temp | awk '{print substr($1, length($0)-5,4)}'
      

      root-verzeichnis - prozent genutzt

      df / | grep / | awk '{ print $5}' | sed 's/%//g'
      

      ip adresse: (nicht mehr nötig - ist im adapter plaziert worden)

      hostname -I | cut -d' ' -f1
      
      tab BEFEHLE name des befehls optional
      alles was gewünscht kurz halten! die befehle müssen vor dem befehlnamen ein "befehle." stehen haben - siehe: https://forum.iobroker.net/post/475154
      Speicher mem ```free -m awk ' NR == 2 {print $2";"$3";"$4}'```
      Swap swap ```free -m awk ' NR == 3 {print $2";"$3";"$4}'```
      Top-Process top-process ```ps auxh --sort=-c awk 'NR<=1 {print $3";"$11}'```
      tab ORDNER name des ordners
      ------ ------ ------
      alles was gewünscht kurz halten! optional
      tab SERVICE service name
      service es sollte mindestens ein service ausgewählt werden (z.b. ssh) ansonsten werden alle angezeigt, was die tabelle "sprengt"
      alles was gewünscht ist vorgegeben! werden ausgewählt die namen werden gekürzt wenn zu lang, einstellbar im script

      bisher sieht die tabelle so aus:

      Image 4.png Image 1.png
      die temperatur sieht man hier nicht, da ich proxmox nutze und nur der die temp hat


      Image 9.png

      mehrfach:


      Image 3.png

      wer gerne testen möchte:

      //@liv-in-sky 2020  23.8.-17:42
      
      
      //HIER WIRD PFAD UND FILENAME DEFINIERT
      const path = "/htmlexample.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   braucheMaterialDesignWidget=false;             // bei true wird ein json in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
      let dpMaterialWidget="0_userdata.0.Tabellen.Linux-Controll-List-Widget";            // WICHTIG wenn braucheMaterialDesignWidget auf true MATERIALDESIGN List Widget - datenpunkt anlegen : zeichenkette 
      let dpVIS="0_userdata.0.Tabellen.Linux-Control"         //WICHTIG wenn "braucheEinVISWidget" auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget
      let dpMaterialWidgetExtra="0_userdata.0.Tabellen.Linux-Control-MDList-Extra"   // WICHTIG wenn braucheMaterialDesignWidget auf true MATERIALDESIGN List Widget - datenpunkt anlegen : zeichenkette 
      let mySchedule=" * * * * * ";                       //jede minute  
      
      let leerzeile=true;                   // leerzeile vor neuem server
      let farbeUeber="#A0C2A0"              //"#4da6ff" (blau)             // farbe der servernamen
      let styleUeber="span"                 // style der server namen:  möglich b fett; i kursiv; span normal
      var mylum=0.0                         //farbveränderung im bezug zum servernamen von HD uns IP
      var mylumFolder=0.0                   //farbveränderung im bezug zur Standarsschriftfarbe von Folder Anzeige
      var mylumService=0.0                 //farbveränderung im bezug zur Standarsschriftfarbe von Serviceanzeige 
      var mylumButtons=0.0                  //farbveränderung im bezug zur Standarsschriftfarbe von Buttonsanzeige 
      var mylumBefehle=0.0                   //farbveränderung im bezug zur Standarsschriftfarbe von Befehleanzeige 
      let mysonderFarbeHDundTEMP="#33ff33"   // farbe in MD List Widget von Temp und root-festplatte
      
      var serviceTrue="🟢"                 //"🔵"       //⚪      //emoji für dienste die laufen
      var serviceFalse="✖️"                //"🔴"  
      var mitShutdownBotton=true;           // zeigt shutdown und restart button an
      var symbolLinkRestart="☢️"
      var symbolLinkShutdown="☢️"
      var symbolLinkCommands="🔘" //"⚠️"
      var farbeOffline="#466d46"            //farbe für server , die offline sind
      var farbeMDbackgroundOffline= "#484837"          //farbe der kachel in MaterialDesign wenn offline
      var farbeMDschriftOffline="#33ff33"//            //farbe der schrift in MaterialDesign wenn offline
      
      var debug=false;                                  // für script debuggen
      // zweites MD List Widget
      var wantExtra=["Proxmox","IOBroker"]             //  server NAme für extra angezeigte Server - eigenes MD List Widget (dpMaterialWidgetExtra) // leer ist []
      var removeOthers=true;                           // wenn true wird die wantExtra Server aus dem Haupt MD List Widget gelöscht
      var thresholHD=80;
      var thresholTemp=75;
      var thresholPakete=0;
      
      var braucheShellInaBox=false;          // SHELL IN A BOX einstellungen
      var shellBox="🥟"
      
      var laengeServiceNamen=11;            // dient zum kürzen von langen service namen
      
      var bildergröße=17
      const apName = { "FileServer"      : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247720123-fileserver.png"},
                       "IOBroker"        : { aname: "https://upload.wikimedia.org/wikipedia/commons/8/82/IoBroker_Logo.png"},  
                       "MotionEye"       : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247718354-motioneye.png"},
                       "Pi-Hole"         : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247720225-pi-hole.png"},
                       "PlexServer"      : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247718413-plexserver.png"},
                       "Proxmox"         : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247718381-proxmox.png"},
                       "SQLTulla"        : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247720017-sqltulla.png"},
                        "AX--HD-60"        : { aname: "https://forum.iobroker.net/assets/uploads/files/1597941596015-ax-hd60.png"},
                        "GalaxyTab2"        : { aname: "https://forum.iobroker.net/assets/uploads/files/1598105726154-samsung.png"},
                       "Raspi"           : { aname: "https://forum.iobroker.net/assets/uploads/files/1597247719882-raspi.png"}}    // oder lokal gespeichert: vis.0/armin/img//server/IOBroker.png
      
      //---------------------------------------
      
      //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 4
      var htmlFeld1='Server';       var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
      var htmlFeld2='';             var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
      var htmlFeld3='';             var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
      var htmlFeld4='';             var Feld4lAlign="right";                    // überschrift Tabellen Spalte4 und  Ausrichtung left,right or center
      //-----------------------------------
      
      
      
      //ÜBERSCHRIFT ÜBER TABELLE
      let   htmlUberschrift=false;                           // mit Überschrift über der tabelle
      let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
      const htmlFeldUeber='Linux Server';              // Ü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=1;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
      const trennungsLinie="2";                             //extra trennungslinie bei mehrfachtabellen - evtl auf 0 stellen, wnn htmlRahmenLinien auf none sind
      const farbetrennungsLinie="white";
      const htmlFarbZweiteTabelle="#BDBDBD";                // Farbe der Überschrift bei jeder 2.ten Tabelle
      const htmlFarbTableColorUber="#BDBDBD";               // Überschrift in der tabelle - der einzelnen Spalten
      //ÜBERSCHRIFT SPALTEN
      const UeberSchriftHöhe="35";                          //Überschrift bekommt mehr Raum - darunter und darüber - Zellenhöhe
      const LinieUnterUeberschrift="3";                   // Linie nur unter Spaltenüberschrift - 
      const farbeLinieUnterUeberschrift="white";
      const groesseUeberschrift=16;
      const UeberschriftStyle="normal"                     // möglich "bold"
      //GANZE TABELLE
      let abstandZelle="2";
      let farbeUngeradeZeilen="#000000";                     //Farbe für ungerade Zeilenanzahl - Hintergrund der Spaltenüberschrift bleibt bei htmlFarbTableColorGradient1/2
      let farbeGeradeZeilen="#151515";                        //Farbe für gerade Zeilenanzahl - Hintergrund der Spaltenüberschrift bleibt bei htmlFarbTableColorGradient1/2
      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="Ubuntu-Regular";
      const htmlSchriftgroesse="16px";
      //FELDER UND RAHMEN
      let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
      const htmlFarbFelderschrift="#BDBDBD";                  // SchriftFarbe der Felder
      const htmlFarbFelderschrift2="#BDBDBD";                 // 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="grey";             // Farbe des Rahmen - is tdieser gleich den gradienten, sind die rahmen unsichtbar
      let htmlRahmenLinien="all";                            // 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
      
      // 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 height=\""+UeberSchriftHöhe+"\" style=\"color:"+htmlFarbTableColorUber+"; font-size: "+groesseUeberschrift+"px; font-weight: "+UeberschriftStyle+" ;  border-bottom: "+LinieUnterUeberschrift+"px solid "+farbeLinieUnterUeberschrift+" \">";
      const htmlTabUeber3="</tr>";
      
      
      
      
      //NICHTS ÄNDERN - abhängig von den oben definierten _Spalten - in diesem Beispiel sind es 4
      //htmlFeld2="last Update"
      //htmlFeld4=formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")
      
      
      const buttonScript =   '<script> function setOnDblClickCustom1( myvalue ) {var Self = this; objID = myvalue;  console.log(myvalue); Self.servConn.setState(objID, true); console.log(objID)} '+
                            '</script>'
      //------------------------------------------------------
      
      function dlog(message) {
        if(debug)
            console.log(message);
      }
      var htmlOut="";
      var mix;
      var counter;
      var val1; var val2; var val0; var val3;
      var htmlTabUeber="";
      let myArr=[];
      let myArrFolder=[];
      let myArrService=[];
      let myArrButtons=[];
      let myArrBefehle=[];
      let myArrRefresh=[];
      let obj1=[]
       let obj2=[]
      let   countMYWerte;
      let idOld="";
      let helpRestart; let helpShutdown;let helpVersion;let upgrade;let up_date;let up_pack;let helpBild;let helpMem;let helpSwap;let helpTopProcess;let helpLastRefresh;
      let is_running=false
      var myJsonWidget2=[];
      
      
      function writeHTML(){
         is_running=true
      let  htmlFeld4help=formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")
      
      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><td align="+Feld4lAlign+">&ensp;"+htmlFeld4help+"&ensp;</td>";
      var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align=="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+""+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                         "&ensp;</td><td  align=="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld4+
                         "&ensp;</td>";
      
      
      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+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,val3 !!!---------------------------------------------------------------------
      //--------------------------------------------------------------------------------------------------------------------------------------------------
      myArr=[]; myArrFolder=[]; myArrService=[]; myArrButtons=[]; myArrBefehle=[]; myArrRefresh=[];
      $('linux-control.0.*.info.is_online').each(function(id, i) {         //YXJtaW4uc2xpdmluc2t5QGdtYWlsLm  // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
             
            var ida = id.split('.');
                  //  linux-control.0.Pi-Hole.control.shutdown
                    //linux-control.0.Pi-Hole.info.is_online
             
                      val0= ida[2]
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".root") ? val1=getState(ida[0]+"."+ida[1]+"."+ida[2]+".root").val : val1="missing"
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".info.ip") ? val2=getState(ida[0]+"."+ida[1]+"."+ida[2]+".info.ip").val : val2="missing"
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".cpu-temp") ? val3=getState(ida[0]+"."+ida[1]+"."+ida[2]+".cpu-temp").val :val3=""
                      //helpRestart;  
                    //  if ( existsState(id.replace("info.is_online","control.restart")))  {mitShutdownBotton ?  helpRestart=id.replace("info.is_online","control.restart") : helpRestart=""} else{helpRestart=""}
                      mitShutdownBotton ?  helpRestart=id.replace("info.is_online","control.restart") : helpRestart=""
                      //helpShutdown; 
                    //  log(id)
                     // log ( existsState(id.replace("info.is_online","control.shutdown")).toString())
                    //  if ( existsState(id.replace("info.is_online","control.shutdown"))) {mitShutdownBotton ? helpShutdown=id.replace("info.is_online","control.shutdown") : helpShutdown="";} else{helpShutdown=""}
                      mitShutdownBotton ? helpShutdown=id.replace("info.is_online","control.shutdown") : helpShutdown="" 
                   //  log(helpShutdown)
                      //helpVersion
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".distribution.fullname") ? helpVersion=getState(ida[0]+"."+ida[1]+"."+ida[2]+".distribution.fullname").val.replace(/.+ (.+ )\((.+)\)/,"$2 ($1)") : helpVersion=" unknown "
                      //upgrade
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.upgradable") ? upgrade=(getState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.upgradable").val) : up_pack="missing"
                      upgrade ? upgrade="Ja" : upgrade="Nein"
                      //up_date                                                                  
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.lastUpdate") ? up_date=formatDate(getDateObject(((new Date(getState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.lastUpdate").val).getTime()))), "TT.MM.YY") : up_date="missing"
                      //up_pack;
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.newPackages") ? up_pack=(getState(ida[0]+"."+ida[1]+"."+ida[2]+".updates.newPackages").val) : up_pack="missing"
                      //helpMem
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".mem") ? helpMem=getState(ida[0]+"."+ida[1]+"."+ida[2]+".mem").val :helpMem=""
                      
                      //helpSwap
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".swap") ? helpSwap=getState(ida[0]+"."+ida[1]+"."+ida[2]+".swap").val :helpSwap=""
                      //helpTopProcess
                      existsState(ida[0]+"."+ida[1]+"."+ida[2]+".top-process") ? helpTopProcess=getState(ida[0]+"."+ida[1]+"."+ida[2]+".top-process").val :helpTopProcess=""
                      //helpLastRefresh
                      if ( existsState(id.replace("info.is_online","info.lastRefresh")))  {helpLastRefresh=getState(id.replace("info.is_online","info.lastRefresh")).val } else{helpLastRefresh=""}
      
                      //helpBild;
                      helpBild="<img src=https://upload.wikimedia.org/wikipedia/commons/8/82/IoBroker_Logo.png height=\""+bildergröße+"\" width=\""+bildergröße+"\">"
                    for(let device_name in apName) { 
                           if (val0==device_name) {helpBild="<img src="+apName[device_name].aname+" height=\""+bildergröße+"\" width=\""+bildergröße+"\">"; }}
                 
                    let helpOnline=getState(ida[0]+"."+ida[1]+"."+ida[2]+".info.is_online").val
                   
                    let myhelp=[val0,val1,val2,val3,helpRestart,helpShutdown,helpVersion,helpBild,helpOnline,upgrade,up_date,up_pack,helpMem,helpSwap,helpTopProcess,helpLastRefresh]        ; 
                    dlog(myhelp.toString())
                    myArr.push(myhelp)
      //--------------------------Folder               
                    let mySelektor="linux-control.0."+ida[2]+".folders.*.size"
                  //  let mymycount=0
                    $(mySelektor).each(function(id2, i) { 
                         var ids = id2.split('.');
                          myArrFolder.push([ids[2],ids[4],getState(ids[0]+"."+ids[1]+"."+ids[2]+"."+ids[3]+"."+ids[4]+"."+ids[5]).val,i,getObject(ids[0]+"."+ids[1]+"."+ids[2]+"."+ids[3]+"."+ids[4]+"."+ids[5]).common.unit,id] )
                           }); 
      //--------------------------Services                      
                    mySelektor="linux-control.0."+ida[2]+".services.*.running"      
                    $(mySelektor).each(function(id3, i) { 
                         var idx = id3.split('.');
                      //   log(idx[4].replace(/(.+)server.+/g,"$1"))
                        //  myArrService.push([idx[2],idx[4].substring(0,laengeServiceNamen),getState(id3).val,i,id3] )
                          idx[4]=idx[4].replace(/(.+)service/g,"$1")
                          idx[4]=idx[4].replace(/(.+)server\*+/g,"$1")
                          idx[4]=idx[4].substring(0,laengeServiceNamen)
      
                          myArrService.push([idx[2],idx[4],getState(id3).val,i,id3] )
                           });  
      //--------------------------Buttons            
                    let mycounty=-1
                    mySelektor="state[id=linux-control.0."+ida[2]+".*][role=button]"
                          $(mySelektor).each( function( id4, i){  
                            var idy = id4.split('.'); if  (idy.length==4)  mycounty++
                            if  (idy.length==4)  {myArrButtons.push([idy[2],idy[3],mycounty,id4] ); myArrRefresh.push(id4)}
                           });   
           /////-----------für refresh
                      mycounty=-1
                    mySelektor="state[id=linux-control.0."+ida[2]+".*][role=value]"
                          $(mySelektor).each( function( id4, i){  
                            var idy = id4.split('.'); if  (idy.length==4)  mycounty++
                            if  (idy.length==4)  {/*myArrButtons.push([idy[2],idy[3],mycounty,id4] );*/ myArrRefresh.push(id4)}
                           });        
      //--------------------------Befehle            
                    let mycounty2=-1
                    mySelektor="linux-control.0."+ida[2]+".befehle.*"     
                          $(mySelektor).each( function( id5, i){  mycounty2++
                            var idz = id5.split('.');  // log(id);mycounty2++
                              myArrBefehle.push([idz[2],idz[4],mycounty2,getState(id5).val] ) ; myArrRefresh.push(id5)
                           });                                 
                    
            // counter++; tabelleBind()
         }); 
        dlog("Länge Server: "+myArr.length.toString())         // ;log(myArr.toString())
        dlog("Länge Folder: "+myArrFolder.length.toString())    //dlog(myArrFolder.toString())
        dlog("Länge Service: "+myArrService.length.toString())   //dlog(myArrService.toString())
        dlog("Länge Buttons: "+myArrButtons.length.toString())   //dlog(myArrButtons.toString())
        dlog("Länge Buttons: "+myArrRefresh.length.toString())   //;log(myArrRefresh.toString())
        dlog("Länge Buttons: "+myArrBefehle.length.toString())   //;log(myArrBefehle.toString())
        
      
        
        
        countMYWerte=0;
         
      
                         for(var i=0;i<myArr.length;i++) {
                          dlog(myArr[i][0] +" und "+idOld)
                     //  if(myArr[i][0]!=idOld){ dlog("erster Ablauf Durchlauf")
                            countMYWerte++
                            tabelleMachSchoen()
                            counter=-1
                            if(leerzeile){
                                          if(countMYWerte>1) for(var a=0;a<mehrfachTabelle;a++ ) { //leerzeile
                                                val0=""; val1=""; val2="";val3="";counter++;tabelleBind();
                                           } }
      
                if (myArr[i][8])     {  
      // ----------------------------erste zeile Zeile                                   
                   for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                        if  (ic==0) { val0=myArr[i][7]+"&ensp; <span style=\"font-size:130%\"><font color=\""+farbeUeber +"\"><"+styleUeber+">"+myArr[i][0]+"<span>";
                                      if(braucheShellInaBox) {val0=val0+" <a style=\" font-size:70% \" href=\"https:\/\/"+ myArr[i][2] + ":4200\" target=\"_blank\" onclick=\"window.open(this.href,this.target,\'width=760,height=640\'); return false;\">"+shellBox+"</a>"}
                          // val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][1];
                            myArr[i][1]!="" ? val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">HD: "+myArr[i][1]+" %" : val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][1];
                            myArr[i][2]!="" ? val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][2] : val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][2];
                            myArr[i][3]!="" ? val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][3]+" °C" : val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][3];
                            //Threshold
                           if( myArr[i][1]!="" && myArr[i][1]>thresholHD ) val1="<font color=\""+"red" +"\">HD: <b>"+myArr[i][1]+" %</b>";
                           if( myArr[i][3]!="" && myArr[i][1]>thresholTemp) val3="<font color=\""+"red" +"\"><b>"+myArr[i][3]+" °C</b>" ;
                           
                            } else {val0=""
                                    val1="";
                                    val2="";
                                    val3=""} 
                  counter++;
                  tabelleBind();}
      // ----------------------------zweite Zeile
      for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                   if(myArr[i][12]!="")  { let myMemTab=myArr[i][12].split(";");
                      if  (ic==0) { val0="<font color=\""+ColorLuminance(farbeUeber,mylumFolder) +"\">"+"Memory(MB)"; 
                            if (i==0 && ic==0 )  dlog("Verarbeite zweite Zeile");
                   
                           val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Total: "+myMemTab[0]
                           val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Used: "+myMemTab[1]
                           val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Free :"+myMemTab[2]
                          
                             } else {val0=""
                                     val1="";
                                     val2="";
                                     val3=""} 
                  counter++;
                  tabelleBind();}}
      // ----------------------------zweite Zeile
      for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                   if(myArr[i][13]!="")  { let myMemTab=myArr[i][13].split(";");
                      if  (ic==0) { val0="<font color=\""+ColorLuminance(farbeUeber,mylumFolder) +"\">"+"Swap(MB)"; 
                            if (i==0 && ic==0 )  dlog("Verarbeite zweite Zeile");
                   
                           val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Total: "+myMemTab[0]
                           val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Used: "+myMemTab[1]
                           val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">Free :"+myMemTab[2]
                          
                             } else {val0=""
                                     val1="";
                                     val2="";
                                     val3=""} 
                  counter++;
                  tabelleBind();}       }      
      // ----------------------------zweite Zeile
      for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                      if  (ic==0) { val0="<font color=\""+ColorLuminance(farbeUeber,mylumFolder) +"\">"+"Updates"; 
                            if (i==0 && ic==0 )  dlog("Verarbeite zweite Zeile");
                   
                           val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][9]
                           val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][11]+" Paket(e)"
                           val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+" zuletzt: "+myArr[i][10]
                          
                             } else {val0=""
                                     val1="";
                                     val2="";
                                     val3=""} 
                  counter++;
                  tabelleBind();
                   }            
      // ----------------------------dritte Zeile
      for(var ic=0;ic<mehrfachTabelle;ic++ ) { if (i==0 && ic==0)  dlog("Verarbeite erste Zeile");
                      if  (ic==0) { val0=""; if (i==0 && ic==0 )  dlog("Verarbeite dritte Zeile");
                   
                            myArr[i][6]!="" ? val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][6]+"" : val1="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+myArr[i][6];
                            let valButton=myArr[i][4]; 
                            myArr[i][4]!="" ? val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+ "Restart!&emsp;"+"<button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'"+valButton+"\')\">"+symbolLinkRestart  + "</button>" : val2="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">-" ;
                            valButton=myArr[i][5]
                            myArr[i][5]!="" ? val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">"+"Shutdown!&emsp;"+"<button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'"+valButton+"\')\">"+symbolLinkShutdown + "</button>" : val3="<font color=\""+ColorLuminance(farbeUeber,mylum) +"\">-";
                          
                             } else {val0=""
                                     val1="";
                                     val2="";
                                     val3=""} 
                  counter++;
                  tabelleBind();
                }
                
                     } else{
                  for(var ic=0;ic<mehrfachTabelle;ic++ ) {    
                         if  (ic==0) { val0=myArr[i][7]+"&ensp; <span style=\"font-size:130%\"><font color=\""+farbeMDschriftOffline +"\"><"+styleUeber+"><i>"+myArr[i][0]+"</i><span>";
                          
                             myArr[i][1]!="" ? val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>HD: "+myArr[i][1]+" %</i>" : val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+myArr[i][1];
                             myArr[i][2]!="" ? val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][2]+"</i>" : val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+myArr[i][2];
                             myArr[i][3]!="" ? val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][3]+" °C</i>" : val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+myArr[i][3];
                            
                             } else {val0=""
                                     val1="";
                                     val2="";
                                     val3=""} 
                   counter++;
                   tabelleBind();}
      for(var ic=0;ic<mehrfachTabelle;ic++ ) {  
                    if  (ic==0) { val0="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+"Updates"+"</i>" ; 
                            if (i==0 && ic==0 )  dlog("Verarbeite zweite Zeile");
                   
                           val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][9]+"</i>" 
                           val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][11]+"</i>" 
                           val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][10]+"</i>" 
                          
                             } else {val0=""
                                     val1="";
                                     val2="";
                                     val3=""} 
                  counter++;
                  tabelleBind();}
                  
           for(var ic=0;ic<mehrfachTabelle;ic++ ) {        
                   if  (ic==0) { val0="";
                             myArr[i][6]!="" ? val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\"><i>"+myArr[i][6]+"</i>" : val1="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+myArr[i][6];
                             let valButton=myArr[i][4]; 
                             myArr[i][4]!="" ? val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+ "<i>Restart!&emsp;</i> " : val2="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">-" ;
                             valButton=myArr[i][5]
                             myArr[i][5]!="" ? val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">"+"<i>Shutdown!&emsp;</i> ": val3="<font color=\""+ColorLuminance(farbeOffline,mylum) +"\">-";
                           
                              } else {val0=""
                                      val1="";
                                      val2="";
                                      val3=""} 
                   counter++;
                   tabelleBind(); }
      
                     }      
                     
                  tabelleMachSchoen()
                            counter=-1
      
                         
            
      //  --------------------------------------------(Folder)                      
               for(var ib=0;ib<myArrFolder.length;ib++) {  if (i==0 && ib==0) dlog("Verarbeite Folder");
                                    
               if (myArrFolder[ib][0]==myArr[i][0]){  
                            
                      if (myArr[i][8])     {  
                              myArrFolder[ib][3]==0? val0="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumFolder) +"\">"+"Folder"  :val0="";
                              val1="";
                              val2="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumFolder) +"\">"+myArrFolder[ib][1]
                              val3="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumFolder) +"\">"+myArrFolder[ib][2] +" "+myArrFolder[ib][4]
                              counter++; tabelleBind();
                              } else{
                         /*     myArrFolder[ib][3]==0? val0="<font color=\""+ColorLuminance(farbeOffline,mylumFolder) +"\"><i>"+"Folder</i>"  :val0="";
                              val1="";
                              val2="<font color=\""+ColorLuminance(farbeOffline,mylumFolder) +"\"><i>"+myArrFolder[ib][1]+"</i>"
                              val3="<font color=\""+ColorLuminance(farbeOffline,mylumFolder) +"\"><i>"+myArrFolder[ib][2] +" "+myArrFolder[ib][4]+"</i>"   
                              counter++; tabelleBind();*/
                              }
                               }   }
      //  --------------------------------------------(Service)                          
             tabelleMachSchoen()
             counter=-1
                           
               for(var ia=0;ia<myArrService.length;ia++) {  if (i==0&& ia==0) dlog("Verarbeite Service");
               if (myArrService[ia][0]==myArr[i][0]){  
                     if (myArr[i][8])     {  
                              myArrService[ia][3]==0? val0="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumService) +"\">"+"Service"  :val0="";
                              val1="";
                              val2="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumService) +"\">"+myArrService[ia][1]
                              myArrService[ia][2] ? val3=serviceTrue :val3=serviceFalse 
                              counter++; tabelleBind();
                            } else {
                         /*     myArrService[ia][3]==0? val0="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\"><i>"+"Service</i>"  :val0="";
                              val1="";
                              val2="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\"><i>"+myArrService[ia][1]+"</i>"
                              val3=serviceFalse   
                              counter++; tabelleBind();   */
                            }    
                               } }
      //  --------------------------------------------Buttons)
            tabelleMachSchoen()
            counter=-1
                           
                for(var ix=0;ix<myArrButtons.length;ix++) {  if (i==0 && ix==0) dlog("Verarbeite Buttons");
                if (myArrButtons[ix][0]==myArr[i][0]){ 
                      if (myArr[i][8])     {  
                              myArrButtons[ix][2]==0? val0="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumButtons) +"\">" +"Buttons"  :val0="";
                              val1="";
                              val2="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumButtons) +"\">" +myArrButtons[ix][1]
                              let valButton=myArrButtons[ix][3];
                            val3="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumButtons) +"\">" +"(press) <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:right\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'"+valButton+"\')\">"+symbolLinkCommands; //  myArrButtons[ia][2] ? val3=serviceTrue :val3=serviceFalse 
                            counter++; tabelleBind();
                            } else {
                    /*    myArrButtons[ix][3]==0? val0="<font color=\""+ColorLuminance(farbeOffline,mylumFolder) +"\"><i>"+"Buttons</i>"  :val0="";
                              val1="";
                              val2="<font color=\""+ColorLuminance(farbeOffline,mylumButtons) +"\"><i>"+myArrButtons[ix][1]+"</i>"
                              val3=serviceFalse  
                              counter++; tabelleBind(); */
                            }    
                               }    } 
      // --------------------------------------------ENDE Buttons
      
      
       //  --------------------------------------------Befehle)
            tabelleMachSchoen()
            counter=-1
                           
                for(var ix=0;ix<myArrBefehle.length;ix++) {  if (i==0 && ix==0) dlog("Verarbeite Befehle");
                if (myArrBefehle[ix][0]==myArr[i][0]){ 
                      if (myArr[i][8])     {  
                              myArrBefehle[ix][2]==0? val0="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumBefehle) +"\">"+"Sonstiges"  :val0="";
                              val1="";
                              val2="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumBefehle) +"\">"+myArrBefehle[ix][1]
                              val3="<font color=\""+ColorLuminance(htmlFarbFelderschrift,mylumBefehle) +"\">"+myArrBefehle[ix][3]
                              counter++; tabelleBind();
                            } else {
                      /*        myArrBefehle[ix][2]==0? val0="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\"><i>"+"Sonstiges</i>"  :val0="";
                              val1="";
                              val2="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\"><i>"+myArrBefehle[ix][1]+"</i>"
                              val3="<font color=\""+ColorLuminance(farbeOffline,mylumService) +"\">"+" - " 
                              counter++; tabelleBind();     */
                            }    
                               }    } 
      // --------------------------------------------ENDE Befehle
      
                   
                  //  idOld=""//myArr[i][0];
      
           //  }
          }
      
      
      
      //-------------------------------------------------------------------------------------------------------------------------------------------------
      //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
      //-------------------------------------------------------------------------------------------------------------------------------------------------
      
            tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
          let  timeout22 = setTimeout(function () {
              is_running=false
      }, 5000);
            
      } // function ende
      
      //MAIN:
      
       
      schedule(mySchedule,  function () {
       writeHTML();
       if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
      }); 
      writeHTML();
      
      
      function tabelleBind(){
           //HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT - hat man oben 4 Felder definiert, braucht man hier 4 Werte 
         
             switch (mehrfachTabelle) {  
              case 1:  if(counter%2==0){  htmlOut=htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td></tr>"; break;} else
                                       {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td></tr>"; break;}
              case 2: if(counter%4==0){ 
                       if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                          ";\"align="+Feld4lAlign+">&ensp;"+val3+"&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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td></tr>";} break;
                          }else{
                       if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                          ";\" align="+Feld4lAlign+">&ensp;"+val3+"&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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td></tr>";} break;}                  
              case 3:  if(counter%2==0)   {
                        if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\" align="+Feld4lAlign+">&ensp;"+val3+"&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><td  align="+Feld4lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td>";} 
                                                     else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td></tr>";}
                                               } break;}else{
                        if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\" align="+Feld4lAlign+">&ensp;"+val3+"&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><td  align="+Feld4lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td>";} 
                                                     else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td></tr>";}
                                               } break;}
      
              case 4:  if(counter%8==0)   {
                       if(counter%4==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+ ";\" align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td>"; } 
                                        else {if(counter%4==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><td  align="+Feld4lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td>";} 
                                                     else    {if(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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td><td  align="+Feld4lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+ "color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td></tr>";} 
                                                                       else    {htmlOut  = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td>";}}
                                               } break;}else{
                       if(counter%4==0)   {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+ ";\" align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td>"; } 
                                        else {if(counter%4==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><td  align="+Feld4lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+ ";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td>";} 
                                                     else    {if(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><td  align="+Feld4lAlign+"  color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td></tr>";} 
                                                                       else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td><td  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td>";}}
                                               } break;     }                   
      
           } //switch ende
      
      }
      
      
      function tabelleFinish() {
           dlog("verbeite tableFinish")
           // tabelle fertigstellen
      
      
             switch (mehrfachTabelle) {  
             case 1:    break;
      
             case 2:    
                        if(counter%2==0)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                      
                        break;
      
             case 3:   if(counter%3==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");
                       if(counter%3==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                       if(counter%3==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                     
                        break;
             case 4:   if(counter%4==3) {  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");}
                       if(counter%4==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                       if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");    
                       if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&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+ buttonScript : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+ buttonScript ;
      
                    } else {
                     zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+ buttonScript :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+ buttonScript;
      
                       }
      
        // log("bin raus aus tabelleBind");
                 if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
      
       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>"
      
       if (!htmlSignature) htmlUnter="";
       var htmlEnd="</table>"+htmlUnter+"</div></body>";
       //mit oder ohne überschrift - zentriert oder links
      htmlUberschrift ? htmlOut=htmlStart+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd : htmlOut=htmlStart+htmlTabStyle+htmlTabUeber+htmlOut+htmlEnd;
       //log(htmlOut);
      
      if (braucheMaterialDesignWidget) {
           
           makeJsonWidget(myArr,myArrFolder,myArrService,myArrButtons,myArrBefehle)
           if(wantExtra)    getProxmox()
           removeOthers  ?  setState(dpMaterialWidget,JSON.stringify(obj2)) : setState(dpMaterialWidget,JSON.stringify(myJsonWidget2));  ; 
            
       
             myJsonWidget2=[];
      }
      
      }
      
      
      function tabelleMachSchoen(){
      
      switch (mehrfachTabelle) {  
             case 1:    break;
      
             case 2:    
                        if(counter%2==0)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');   
                      
                        break;
      
             case 3:   if(counter%3==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");
                       if(counter%3==1)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');      
                       if(counter%3==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                     
                        break;
             case 4:   if(counter%4==3) {  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");}
                       if(counter%4==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                       if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");    
                       if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");      
                       break; } 
      
      }
      
      
      function ColorLuminance(hex, lum) {
      
         // validate hex string
         hex = String(hex).replace(/[^0-9a-f]/gi, '');
         if (hex.length < 6) {
         	hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
         }
         lum = lum || 0;
      
         // convert to decimal and change luminosity
         var rgb = "#", c, i;
         for (i = 0; i < 3; i++) {
         	c = parseInt(hex.substr(i*2,2), 16);
         	c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
         	rgb += ("00"+c).substr(c.length);
         }
      
         return rgb;
      }
      
      function makeJsonWidget(vax1,vax2,vax3,vax4,vax5) {
      
      
      //	log(myJsonWidget)
      if (braucheMaterialDesignWidget) {
        //  log(vax1.toString())
          //log(vax2.toString())
          //log(vax3.toString())
          
          for (var iii=0;iii<vax1.length;iii++){      
      let  mystatuscolorbar=""; 
         //  vax1[iii][8] ? mystatuscolorbar=farbeUeber : mystatuscolorbar=farbeOffline
      let  myimage=""; 
      let myschriftgroesse=(parseInt(htmlSchriftgroesse.replace("px",""))+10)+"px"
      let mytext
      let mybkgd;
      //myshellIp= `<a href="https://${vax1[iii][2]}:4200"> target="_blank" onclick="window.open(this.href,this.target,width=760,height=640)> </a> ${shellBox} `
      let   myshellIp= ""
       if(braucheShellInaBox) myshellIp= " <a href=\"https:\/\/"+ vax1[iii][2] + ":4200\" target=\"_blank\" onclick=\"window.open(this.href,this.target,\'width=800,height=640\'); return false;\">"+shellBox+"</a>"
        vax1[iii][8] ? mytext=`<span style="color:  ${farbeUeber}; font-size: ${(myschriftgroesse)}"> ${vax1[iii][0]}  </span>${myshellIp}<span style="color:  ${farbeUeber}; font-size: ${(htmlSchriftgroesse)}">${vax1[iii][6]}`  :
                       mytext=`<span style="color:  ${farbeMDschriftOffline}; font-size: ${(htmlSchriftgroesse)}"> ${vax1[iii][0]}  </span><span style="color:  ${farbeMDschriftOffline}; font-size: ${(myschriftgroesse)}">OFFLINE` ;
      
       vax1[iii][8] ? mybkgd="" : mybkgd=farbeMDbackgroundOffline
      
          myimage="https://upload.wikimedia.org/wikipedia/commons/8/82/IoBroker_Logo.png"
      for(let device_name in apName) { //log(device_name)                           //Abfrage welches bild
                          for (var i=0;i<vax1.length;i++){
                           if (vax1[iii][0].trim()==device_name.trim()) myimage=apName[device_name].aname; }}//" height=\""+bildergröße+"\" width=\""+bildergröße+"\">"; } } // log(myimage)
      
       //ColorLuminance(farbeUeber,0.6); log(mysonderFarbe)
      let mysubText
      //let mytemp; vax1[iii][3]!="" ? mytemp="CPU Temp: "+vax1[iii][3] + "°C"  :  mytemp="";
      let mysonderFarbeHDundTEMP2;
      let mysonderFarbeHDundTEMP3;
      let blinkklasse=""
      let blinkklasse2=""
      let arrMem;let arrSwap;let arrTProc; let myMem="";let mySwap="";let myTProc=""; let myMemTable="";let myProcess="";let mySwapRow;let myMemRow
      if(vax1[iii][12]!=""){arrMem=vax1[iii][12].split(";");myMemRow="MEM"} else{arrMem=["","",""];myMemRow=""}
      if(vax1[iii][13]!=""){arrSwap=vax1[iii][13].split(";");mySwapRow="SWAP"} else{arrSwap=["","",""];mySwapRow=""}
      if(vax1[iii][14]!=""){arrTProc=vax1[iii][14].split(";")} else{arrTProc=["","",""]}
      //if(vax1[iii][12]!="") log(arrMem[0]+"  " +arrSwap[0] +"  " +arrTProc[0])
      if(arrMem[0]!="" || arrSwap[0]!="") {myMemTable=`</br>
                       <table  rules="cols" align="center" > <tr><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">(in MB)</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Total</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Used</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Free</td></tr>
                      <tr><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">${myMemRow}</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrMem[0]} </td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrMem[1]} </td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrMem[2]}</td></tr>
                      <tr><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">${mySwapRow}</td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrSwap[0]} </td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align="center"> ${arrSwap[1]}  </td><td style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse}; align="center">${arrSwap[2]}</td></tr></table>`} else{myMemTable=""}
      if( arrTProc[0]!="") {myProcess=`<div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"> Top-Proc: <span style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP};" >${arrTProc[0]}%</span> ${arrTProc[1].substring(0,15)} </div>`} else {myProcess=""}
      
      if(vax1[iii][3]>thresholTemp) { mysonderFarbeHDundTEMP2="yellow"; blinkklasse="blinkklasse" } else {mysonderFarbeHDundTEMP2=mysonderFarbeHDundTEMP;blinkklasse="nix"}
      let mytemp; vax1[iii][3]!="" ? mytemp="CPU Temp: "+`<span class=${blinkklasse} style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP2};" >${vax1[iii][3]} </span>` + `<span lass=${blinkklasse} style="color: ${mysonderFarbeHDundTEMP2};">°C</span> ` :  mytemp="";   
      if(vax1[iii][1]>thresholHD) {mysonderFarbeHDundTEMP2="yellow"; blinkklasse="blinkklasse"} else {mysonderFarbeHDundTEMP2=mysonderFarbeHDundTEMP; blinkklasse="nix"}
      if(vax1[iii][11]>thresholPakete) {mysonderFarbeHDundTEMP3="yellow";blinkklasse2="blinkklasse"} else {mysonderFarbeHDundTEMP3=mysonderFarbeHDundTEMP;blinkklasse2="nix"}
      vax1[iii][8] ?  mysubText =    
                      ` <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"> ${vax1[iii][2]}</div>
                      <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"> ${mytemp}</div>
                      <div  style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Festplatte: <span  class=${blinkklasse} style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP2};" >${vax1[iii][1]}</span><span style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP2};" > %</span></div>
                      ${myProcess}
                       <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Update:  ${vax1[iii][9]} <span class=${blinkklasse2} style="font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse+2}; color: ${mysonderFarbeHDundTEMP3};" >${vax1[iii][11]}</span> Paket(e)</div>
                      ${myMemTable}
                      `  :
                       mysubText =   ` </br>
      
                       <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"> ${vax1[iii][2]}</div>
                       <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Festplatte:  ${vax1[iii][1]}%</div>
                       <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Update:  ${vax1[iii][9]} ${vax1[iii][11]} Paket(e)</div> 
                       `
      
      if (vax1[iii][8]) {
                    mysubText=mysubText.concat(`</br>
                                                <table align="center" ><tr><td valign="top"> <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Folder:</div>
                                                 `)
                    mysubText=mysubText.concat(`<span display: flex; flex-direction: row;> <table align="center" >`)
      for (var i=0;i<vax2.length;i++){
                   if (vax2[i][0]==vax1[iii][0]) {
                     mysubText=mysubText.concat(`<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">${vax2[i][1]}</td><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax2[i][2]} ${vax2[i][4]}</td></tr>` ) 
                      }  }
                      mysubText=mysubText.concat(`</table></span></td>`) 
      
                      
                      mysubText=mysubText.concat(`<td valign="top"><div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Service:</div>
                                                 `)
                      mysubText=mysubText.concat(`<span display: flex; flex-direction: row;> <table align="center" >`)
      for (var i=0;i<vax3.length;i++){
                   if (vax3[i][0]==vax1[iii][0]) {
                      let helpextra; vax3[i][2] ? helpextra=serviceTrue :helpextra=serviceFalse  
                     mysubText=mysubText.concat( `<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"  align=\"left\">&ensp;${vax3[i][1]}</td><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">${helpextra}</td></tr>`)
                      }  }   
                      mysubText=mysubText.concat("</table></span></td></tr></table>"  )   
      
      //---------------------BUTTONS                 
      let arrcounter=0
      for (var i=0;i<vax4.length;i++){
                   if (vax4[i][0]==vax1[iii][0]) {arrcounter++;
                   }} //log(vax1[iii][0]+ "   "+ arrcounter.toString())                 
      
      if (arrcounter>0) {mysubText=mysubText.concat(`</br>
                                                   <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Buttons:</div>
                                                 `)
                      mysubText=mysubText.concat(`<span display: flex; flex-direction: row;> <table align="center"  >`)
      
      arrcounter=arrcounter-1;
      //
      let mynewi=-1
      for (var i=0;i<vax4.length;i++){
              
                   if (vax4[i][0]==vax1[iii][0]) { 
                       mynewi++
         			//  log(mynewi+"  "+ arrcounter)
         			 if (arrcounter>=1){
         			    if(mynewi%2==1 && mynewi<=arrcounter) mysubText=mysubText.concat( `<tr ><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};"  align=\"left\">&ensp;${vax4[i-1][1]}</td><td  align=\"left\">&ensp; <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:${htmlSchriftgroesse}\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${vax4[i-1][3]}')\">${symbolLinkCommands} </td><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax4[i][1]}</td><td  align=\"left\">&ensp; <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:${htmlSchriftgroesse}\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${vax4[i][3]}')\">${symbolLinkCommands} </td></tr>`)
         				if(mynewi%2==0 && mynewi==arrcounter) mysubText=mysubText.concat( `<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax4[i][1]}</td><td align=\"left\">&ensp; <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:${htmlSchriftgroesse}\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${vax4[i][3]}')\">${symbolLinkCommands} </td><td></td><td></td></tr>`)
         			 
         			 } else {
         			 mysubText=mysubText.concat( `<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax4[i][1]}</td><td align=\"left\">&ensp; <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:${htmlSchriftgroesse}\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${vax4[i][3]}')\">${symbolLinkCommands} </td></tr>`)
         			 }
         			 
         			 
                   //  mysubText=mysubText.concat( `<tr><td align=\"left\">&ensp;${vax4[i][1]}</td><td align=\"left\">&ensp;(press) <button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnDblClickCustom1\(\'${helpextra}')\">${symbolLinkCommands} </td></tr>`)
                      }  // wenn servername stimmt 
                      }  // durch button array
                      mysubText=mysubText.concat("</table></span>")  
      //				 
          } //buttons größer 0	
      
      //---------------------Ssonstiges                 
      
      arrcounter=0
      for (var i=0;i<vax5.length;i++){
                   if (vax5[i][0]==vax1[iii][0]) {arrcounter++;
                   }} //log(vax1[iii][0]+ "   "+ arrcounter.toString())                 
      
      if (arrcounter>0) {
      mysubText=mysubText.concat(`</br>
                                                <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">Sonstige:</div>
                                                 `)
                    mysubText=mysubText.concat(`<span display: flex; flex-direction: row;> <table align="center" >`)
      for (var i=0;i<vax5.length;i++){
                   if (vax5[i][0]==vax1[iii][0]) { let mybool = vax5[i][3] ;  if(mybool=="true") mybool= serviceTrue  ;
                     mysubText=mysubText.concat(`<tr><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">${vax5[i][1]}</td><td style="color: ${htmlFarbFelderschrift}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};" align=\"left\">&ensp;${vax5[i][3]} </td></tr>` ) 
                      }  }
                      mysubText=mysubText.concat(`</table></span>`) 
      }
      
       }  //ist online - alle arrays
      //  log(vax1[iii][15])                  //+formatDate(getDateObject(((new Date(vax1[iii][15]).getTime()))), "SS:mm:ss")
        vax1[iii][8] ?  mysubText = mysubText+    
                      ` <div style="color: ${farbeUeber}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">last refresh: ${formatDate(getDateObject(((new Date(vax1[iii][15]).getTime()))), "SS:mm:ss")}</div>
                     
                      `  :
                       mysubText = mysubText + ` </br>
      
                       <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">last refresh: ${formatDate(getDateObject(((new Date(vax1[iii][15]).getTime()))), "SS:mm:ss")}</div>
                       <div style="color: ${farbeMDschriftOffline}; font-family: ${htmlSchriftart}; font-size: ${htmlSchriftgroesse};">         am:     ${formatDate(getDateObject(((new Date(vax1[iii][15]).getTime()))), "TT.MM.JJJJ")}</div>
                       `
      //log(mytext)
      
         //    if(vax3<=1)   vax5=farbeNurEinTag               
          
           myJsonWidget2.push({
                     text: mytext,
                     subText: mysubText,
                     statusBarColor: mystatuscolorbar,
                     image: myimage,
                     background: mybkgd,
                     imageColor: "",
                     listType: "text",
                     showValueLabel: false,
                     name: "",
                     status: "",
                     Wert : "",
                     Hersteller : ""
                 });
      }
       }}
      
      // struktur der array
      // server:     servername,   Hd  ,   ip  , temp,     restart-pfad,     shutdown-pfad.,  version    ,bild mit style,   isOnline,     upgrade,   last update,   anzahl update, mem,  swap , top-process
      // folder:     servername,ordnername,ordnergröße,lauf. zähler ordner,einheit,id
      // service:    servername,servicename,lauf. anzahl service, id
      // buttons:    servername,buttonname,lauf. anzahl button,id
      // befehle:    servername,befehlnname,lauf. anzahl befehl, Wert vin id
      
      
      
      function getProxmox () {
      let merker=0;
      let mynewObj
       let mynewObj2
       obj1=[]
        obj2=[]
      for(var index in myJsonWidget2 ) {
            merker=0;
         for(var me in wantExtra){
           
         if(myJsonWidget2[index].text.replace(/.+px\"\> (.+) \<\/span\>.+/g,"$1").trim()== wantExtra[me]) { //log(me)
                mynewObj=JSON.parse(JSON.stringify(myJsonWidget2[index]));
                obj1.push(mynewObj)
                merker=1
                } //proxarr
             /*   else { log("jetzt  "+ myJsonWidget2[index].text.replace(/.+px\"\> (.+) \<\/span\>.+/g,"$1")+ "  "+ wantExtra[me] )
                 if(parseInt(me)==0){    mynewObj2=JSON.parse(JSON.stringify(myJsonWidget2[index]));
                     obj2.push(mynewObj2)}
                } */
         
        
         }
          if(merker==0) {mynewObj2=JSON.parse(JSON.stringify(myJsonWidget2[index])); 
                        obj2.push(mynewObj2) ;
                        merker=0;}
      
      
      } setState(dpMaterialWidgetExtra,JSON.stringify(obj1)) ;}
      
      
      
          on({id: myArrRefresh ,  change: "ne"}, function (obj) { 
        
        let timeout = setTimeout(function () {
       dlog("BIN DRIN in Refresh")
          if (!is_running) writeHTML();
          if (braucheEinFile && !is_running) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
      }, 5000);
           
         });
      
      
      
      
      
      
      
      
      
      

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

      meine versuche mit dem Material Widget List sieht so aus - evtl kommt auch noch MD table Widget zum einsatz

      bisher:

      Image 3.png

      Image 6.png

      dieses widget hat die möglichkeit, das ganze in 2 widgets aufzuteilen - ich habe festgestellt, das z.b der proxmox viel mehr daten zum anzeigen hat und dadurch das widget stark dominiert - im setting des scriptes kann dies eingestellt werden - es muss dafür auch ein datenpunkt angelegt sein - die server, die ein eigenes widget bekommen, können im hauptwidget bleiben oder eintfernt werden. somit ist es auch möglich die server auf verschiedene views aufzuteilen

      widget zum import

      [{"tpl":"tplVis-materialdesign-Icon-List","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","wrapItems":true,"listItemDataMethod":"jsonStringObject","countListItems":"1","vibrateOnMobilDevices":"50","listLayout":"cardOutlined","itemLayout":"vertical","listType1":"text","showValueLabel1":"true","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"json_string_oid":"0_userdata.0.Tabellen.Linux-Controll-List-Widget","maxItemsperRow":"4","iconItemMinWidth":"200","iconHeight":"35","buttonHeight":"","labelFontSize":"20","subLabelFontSize":"18","subLabelFontColor":"#e8e3e3","labelFontFamily":"Ubuntu-Regular","subLabelFontFamily":"Ubuntu-Regular","horizontalIconContainerWidth":"50","verticalIconContainerHeight":"50","buttonLayout":"round","titleLayout":"headline3","itemBackgroundColor":"#313126","labelFontColor":"#ffffff","valueFontSize":"18","g_rows_§0":false,"listType0":"text","showValueLabel0":"true","g_lock":false,"autoLockAfter":"10","lockIconTop":"5","lockIconLeft":"5","lockFilterGrayscale":"30","lockApplyOnlyOnImage":"true"},"style":{"left":"24px","top":"42px","width":"75.28%","height":"94.26%","overflow-x":"","overflow-y":"auto","z-index":"1"},"widgetSet":"materialdesign"}]
      

      bilder für server:


      Pi-Hole.png FileServer.png SQLTulla.png raspi.png PlexServer.png Proxmox.png MotionEye.png ax-hd60.png Samsung.png

      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 Offline
        liv-in-skyL Offline
        liv-in-sky
        schrieb am zuletzt editiert von liv-in-sky
        #3

        so sehen die datenpunkte aus, die durch den befehl-tab im setting des adapter vorkommen müssen !!!
        root und ip müssen vorkommen - cpu temp wird wird abgefragt, ob da, weil bei proxmox nur der proxmox server die temp hat und nicht die container oder vm's

        Image 12.png

        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

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

          so sehen die datenpunkte aus, die durch den befehl-tab im setting des adapter vorkommen müssen !!!
          root und ip müssen vorkommen - cpu temp wird wird abgefragt, ob da, weil bei proxmox nur der proxmox server die temp hat und nicht die container oder vm's

          Image 12.png

          HomoranH Nicht stören
          HomoranH Nicht stören
          Homoran
          Global Moderator Administrators
          schrieb am zuletzt editiert von Homoran
          #4

          @liv-in-sky Ich hab es mal wieder nicht lassen können und dein Liste "installiert"

          Leider muss ich sagen, nachdem ich lange nichts mehr gemacht hatte fiel es mir sehr schwer das Skript ans laufen zu bekommen.
          Jemand noch unbedarfteres könnte da noch mehr Probleme bekommen.
          Aber wie ich dich kenne wirst du die ersten Posts regelmäßig updaten und alle Unstimmigkeiten beheben :+1:

          Das größte Problem saß mal wieder vor der Tastatur. Den Adapter von Scrounger hatte ich natürlich nicht installiert.
          Das ging ganz fix - aber es kommt immer noch nichts sinnvolles.

          Liv_in_sky_testview.png
          Was habe ich vergessen?

          Der Adapter läuft, ist mit einem RasPi4 verbunden und liefert auch Daten in die Objekte

          Ich habe nur die HTML-Tabelle erzeugt und die sieht so aus:

          <center><table bordercolor="grey" border="2px" cellspacing="2" cellpadding="2" width="auto" rules="all" style="color:#BDBDBD;  font-size:16px; font-family:Ubuntu-Regular;background-image: linear-gradient(42deg,#424242,#424242);"><tr height="35" style="color:#BDBDBD; font-size: 16px; font-weight: normal ;  border-bottom: 3px solid white "><td width=auto align=left>&ensp;Server&ensp;</td><td width=auto align=center>&ensp;&ensp;</td><td  align=center>&ensp;&ensp;</td><td align=right>&ensp;&ensp;</td></tr></table><script> function setOnDblClickCustom1( myvalue ) {var Self = this; objID = myvalue;  console.log(myvalue); Self.servConn.setState(objID, true); console.log(objID)} </script>
          

          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

          liv-in-skyL 1 Antwort Letzte Antwort
          0
          • HomoranH Homoran

            @liv-in-sky Ich hab es mal wieder nicht lassen können und dein Liste "installiert"

            Leider muss ich sagen, nachdem ich lange nichts mehr gemacht hatte fiel es mir sehr schwer das Skript ans laufen zu bekommen.
            Jemand noch unbedarfteres könnte da noch mehr Probleme bekommen.
            Aber wie ich dich kenne wirst du die ersten Posts regelmäßig updaten und alle Unstimmigkeiten beheben :+1:

            Das größte Problem saß mal wieder vor der Tastatur. Den Adapter von Scrounger hatte ich natürlich nicht installiert.
            Das ging ganz fix - aber es kommt immer noch nichts sinnvolles.

            Liv_in_sky_testview.png
            Was habe ich vergessen?

            Der Adapter läuft, ist mit einem RasPi4 verbunden und liefert auch Daten in die Objekte

            Ich habe nur die HTML-Tabelle erzeugt und die sieht so aus:

            <center><table bordercolor="grey" border="2px" cellspacing="2" cellpadding="2" width="auto" rules="all" style="color:#BDBDBD;  font-size:16px; font-family:Ubuntu-Regular;background-image: linear-gradient(42deg,#424242,#424242);"><tr height="35" style="color:#BDBDBD; font-size: 16px; font-weight: normal ;  border-bottom: 3px solid white "><td width=auto align=left>&ensp;Server&ensp;</td><td width=auto align=center>&ensp;&ensp;</td><td  align=center>&ensp;&ensp;</td><td align=right>&ensp;&ensp;</td></tr></table><script> function setOnDblClickCustom1( myvalue ) {var Self = this; objID = myvalue;  console.log(myvalue); Self.servConn.setState(objID, true); console.log(objID)} </script>
            
            liv-in-skyL Offline
            liv-in-skyL Offline
            liv-in-sky
            schrieb am zuletzt editiert von
            #5

            @Homoran sagte in HTML Tabelle Linux-Control Adapter:

            <center><table bordercolor="grey" border="2px" cellspacing="2" cellpadding="2" width="auto" rules="all" style="color:#BDBDBD; font-size:16px; font-family:Ubuntu-Regular;background-image: linear-gradient(42deg,#424242,#424242);"><tr height="35" style="color:#BDBDBD; font-size: 16px; font-weight: normal ; border-bottom: 3px solid white "><td width=auto align=left> Server </td><td width=auto align=center>  </td><td align=center>  </td><td align=right>  </td></tr></table><script> function setOnDblClickCustom1( myvalue ) {var Self = this; objID = myvalue; console.log(myvalue); Self.servConn.setState(objID, true); console.log(objID)} </script>

            in diesem fall wäre es besser, wenn du mir ein bild der datenpunkte machst mit offenen ordnern für einen server

            hast du im log fehler oder warnungen?

            ich weiß - die ganzen settings sind erstmal aufwendig -werden wir schon hinbekommen

            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

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

              @Homoran sagte in HTML Tabelle Linux-Control Adapter:

              <center><table bordercolor="grey" border="2px" cellspacing="2" cellpadding="2" width="auto" rules="all" style="color:#BDBDBD; font-size:16px; font-family:Ubuntu-Regular;background-image: linear-gradient(42deg,#424242,#424242);"><tr height="35" style="color:#BDBDBD; font-size: 16px; font-weight: normal ; border-bottom: 3px solid white "><td width=auto align=left> Server </td><td width=auto align=center>  </td><td align=center>  </td><td align=right>  </td></tr></table><script> function setOnDblClickCustom1( myvalue ) {var Self = this; objID = myvalue; console.log(myvalue); Self.servConn.setState(objID, true); console.log(objID)} </script>

              in diesem fall wäre es besser, wenn du mir ein bild der datenpunkte machst mit offenen ordnern für einen server

              hast du im log fehler oder warnungen?

              ich weiß - die ganzen settings sind erstmal aufwendig -werden wir schon hinbekommen

              HomoranH Nicht stören
              HomoranH Nicht stören
              Homoran
              Global Moderator Administrators
              schrieb am zuletzt editiert von
              #6

              @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

              werden wir schon hinbekommen

              da habe ich überhaupt keine Bedenken!
              soll ja auch für andere von Nutzen sein

              @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

              hast du im log fehler oder warnungen?

              hatte ich nicht gesehen, die log.xxx hatte ich aber deaktiviert
              Sind zwar viele Fehler, die kommen aber von anderen Skripten auf meinem Testsystem

              @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

              ein bild der datenpunkte machst mit offenen ordnern für einen server

              linux_control_001.png

              kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

              der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

              liv-in-skyL 1 Antwort Letzte Antwort
              0
              • HomoranH Homoran

                @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                werden wir schon hinbekommen

                da habe ich überhaupt keine Bedenken!
                soll ja auch für andere von Nutzen sein

                @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                hast du im log fehler oder warnungen?

                hatte ich nicht gesehen, die log.xxx hatte ich aber deaktiviert
                Sind zwar viele Fehler, die kommen aber von anderen Skripten auf meinem Testsystem

                @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                ein bild der datenpunkte machst mit offenen ordnern für einen server

                linux_control_001.png

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

                @Homoran habe gerade bemerkt, dass was im adapter geändert worden ist - es gibt nun einenordner command - den habe ich nicht - scrounger ist wieder fleißig - wir haben auf github über threahold werte gesprochen, damit man auch alarme bekommen kann, wenn werte überschritten worden sind - vielleicht macht er da was .ich mache ein update und werde das script anpassen - ich bin etwas früh dran mit dem script, aber ich find den adapter einfach gut

                ich meld mich, wenn ich dsas script angepaßt habe

                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

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

                  @Homoran habe gerade bemerkt, dass was im adapter geändert worden ist - es gibt nun einenordner command - den habe ich nicht - scrounger ist wieder fleißig - wir haben auf github über threahold werte gesprochen, damit man auch alarme bekommen kann, wenn werte überschritten worden sind - vielleicht macht er da was .ich mache ein update und werde das script anpassen - ich bin etwas früh dran mit dem script, aber ich find den adapter einfach gut

                  ich meld mich, wenn ich dsas script angepaßt habe

                  HomoranH Nicht stören
                  HomoranH Nicht stören
                  Homoran
                  Global Moderator Administrators
                  schrieb am zuletzt editiert von
                  #8

                  @liv-in-sky DANKE!

                  kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                  Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                  der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                  liv-in-skyL 1 Antwort Letzte Antwort
                  0
                  • HomoranH Homoran

                    @liv-in-sky DANKE!

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

                    @Homoran

                    ich habe mich verschaut - bei deinem bild fehlen die befehle - hast du die im setting definiert und angeklickt ?

                    schaut das bei dir ungefähr so aus ? hier ein beispiel für den proxmox server - beim raspi ist cpu-temp anders defininiert

                    Image 14.png

                    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

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

                      @Homoran

                      ich habe mich verschaut - bei deinem bild fehlen die befehle - hast du die im setting definiert und angeklickt ?

                      schaut das bei dir ungefähr so aus ? hier ein beispiel für den proxmox server - beim raspi ist cpu-temp anders defininiert

                      Image 14.png

                      HomoranH Nicht stören
                      HomoranH Nicht stören
                      Homoran
                      Global Moderator Administrators
                      schrieb am zuletzt editiert von
                      #10

                      @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                      hast du die im setting definiert und angeklickt ?

                      nein - ich dachte die Standardbefehle kommen von selber

                      kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                      der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                      liv-in-skyL 1 Antwort Letzte Antwort
                      0
                      • HomoranH Homoran

                        @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                        hast du die im setting definiert und angeklickt ?

                        nein - ich dachte die Standardbefehle kommen von selber

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

                        @Homoran ne leider nicht - um flexibilität zu gewährleisten, wird das wohl über befehle gemacht - aber mal abwarten was noch kommt - scrounger hat nicht so viel zeit, daher bin ich froh um das, was wir jetzt haben

                        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

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

                          @Homoran ne leider nicht - um flexibilität zu gewährleisten, wird das wohl über befehle gemacht - aber mal abwarten was noch kommt - scrounger hat nicht so viel zeit, daher bin ich froh um das, was wir jetzt haben

                          HomoranH Nicht stören
                          HomoranH Nicht stören
                          Homoran
                          Global Moderator Administrators
                          schrieb am zuletzt editiert von
                          #12

                          @liv-in-sky
                          OK!
                          Habe jetzt die Temp beim Raspi abgefragt, die ist jetzt in den Objekten auch da:
                          linux_control_002.png

                          aber an der Tabelle ändert sich nichts

                          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                          liv-in-skyL 1 Antwort Letzte Antwort
                          0
                          • HomoranH Homoran

                            @liv-in-sky
                            OK!
                            Habe jetzt die Temp beim Raspi abgefragt, die ist jetzt in den Objekten auch da:
                            linux_control_002.png

                            aber an der Tabelle ändert sich nichts

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

                            @Homoran es müssen die exaten namen sein - so wie in meinem bild drüber
                            die namen der befehle (mit den grünen pfeilen):
                            cpu-temp
                            ip
                            root

                            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

                            HomoranH 2 Antworten Letzte Antwort
                            0
                            • liv-in-skyL liv-in-sky

                              @Homoran es müssen die exaten namen sein - so wie in meinem bild drüber
                              die namen der befehle (mit den grünen pfeilen):
                              cpu-temp
                              ip
                              root

                              HomoranH Nicht stören
                              HomoranH Nicht stören
                              Homoran
                              Global Moderator Administrators
                              schrieb am zuletzt editiert von
                              #14

                              @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                              es müssen die exaten namen sein

                              ok teste ich mal

                              Eben kam ganz kurz eine fragmentarische Tabelle, die beim nächsten refresh wieder verschwand.
                              mit einigen undefined und null drin

                              kurz vorher hatte ich im Adapter noch den reboot und shutdown freigegeben, der war dann auch drin

                              kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                              der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

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

                                @Homoran es müssen die exaten namen sein - so wie in meinem bild drüber
                                die namen der befehle (mit den grünen pfeilen):
                                cpu-temp
                                ip
                                root

                                HomoranH Nicht stören
                                HomoranH Nicht stören
                                Homoran
                                Global Moderator Administrators
                                schrieb am zuletzt editiert von
                                #15

                                @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                                die namen der befehle (mit den grünen pfeilen):
                                cpu-temp

                                Cool - jetzt sind beide da :joy:
                                linux_control_003.png

                                Habe Temperatur gelöscht

                                Hat aber auch nix gebracht

                                kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                                Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                liv-in-skyL 1 Antwort Letzte Antwort
                                0
                                • HomoranH Homoran

                                  @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                                  die namen der befehle (mit den grünen pfeilen):
                                  cpu-temp

                                  Cool - jetzt sind beide da :joy:
                                  linux_control_003.png

                                  Habe Temperatur gelöscht

                                  Hat aber auch nix gebracht

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

                                  @Homoran ist nicht so wild - das script stört das nicht

                                  es fehlen nochdie datenpunkte : ip und root

                                  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

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

                                    @Homoran ist nicht so wild - das script stört das nicht

                                    es fehlen nochdie datenpunkte : ip und root

                                    HomoranH Nicht stören
                                    HomoranH Nicht stören
                                    Homoran
                                    Global Moderator Administrators
                                    schrieb am zuletzt editiert von
                                    #17

                                    @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                                    es fehlen nochdie datenpunkte : ip und root

                                    müssen die drin sein?
                                    also nicht optional?

                                    OK mache ich heute abend - muss jetzt weg

                                    kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                    der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                    liv-in-skyL 2 Antworten Letzte Antwort
                                    0
                                    • HomoranH Homoran

                                      @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                                      es fehlen nochdie datenpunkte : ip und root

                                      müssen die drin sein?
                                      also nicht optional?

                                      OK mache ich heute abend - muss jetzt weg

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

                                      @Homoran

                                      scrounger hat evtl vor diese datenpunkte evtl auch automatisch zu holen - danke für die ersten tests - man lernt nie aus :-)

                                      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
                                      • HomoranH Homoran

                                        @liv-in-sky sagte in HTML Tabelle Linux-Control Adapter:

                                        es fehlen nochdie datenpunkte : ip und root

                                        müssen die drin sein?
                                        also nicht optional?

                                        OK mache ich heute abend - muss jetzt weg

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

                                        @Homoran sagte in HTML Tabelle Linux-Control Adapter:

                                        müssen die drin sein?
                                        also nicht optional?

                                        sollten schon drin sein

                                        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

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

                                          @Homoran sagte in HTML Tabelle Linux-Control Adapter:

                                          müssen die drin sein?
                                          also nicht optional?

                                          sollten schon drin sein

                                          HomoranH Nicht stören
                                          HomoranH Nicht stören
                                          Homoran
                                          Global Moderator Administrators
                                          schrieb am zuletzt editiert von
                                          #20

                                          @liv-in-sky habe jetzt alle Daten eingegeben - nix

                                          Skript neu gestartet:
                                          linux_control_004.png

                                          beim nächsten refresh ist wieder alles weg

                                          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                          liv-in-skyL 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

                                          807

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          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