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. IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol

NEWS

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

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

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

IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascripttemplate
493 Beiträge 26 Kommentatoren 98.0k Aufrufe 41 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 liv-in-sky

    @msauer

    ohne jeder gewähr - bin in eile:

    ersetze mal die sortierung damit

    if (!sortiereClient){ 
                myObj.sort(function (alpha, beta) {
                 //   if (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")) > parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))
                  if ((parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                        return -1;
                    if ((parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                        return 1;
                 return 0;
                });  
                }
    

    Image 3.png

    M Offline
    M Offline
    msauer
    schrieb am zuletzt editiert von
    #136

    @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

    @msauer

    ohne jeder gewähr - bin in eile:

    ersetze mal die sortierung damit

    Prima, danke.....IP Sortierung ist jetzt korrekt, nun werden auch x.x.1.x IPs richtig sortiert.

    Proxmox 3 Node HA-Cluster TRIGKEY Mini-PC N100 mit 32 GB RAM und 3x1TB shared SSDs. VM- iobroker ,Raspberrymatic. LXC - Adguard, , Traccar, iSpy, Fileserver (emby, MiniDLNA)...usw

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

      und noch eine tabelle - es werden alle geräte des netzwerkes gesucht und angezeigt - script wurde zusammen mit @homoran entwickelt - nur für einen netzwerkbereich nutzbar

      NEUE VERSION auf GITHUB: https://github.com/liv-in-sky/nmap-ip-iobroker-script

      • netzwerk wird mit externen befehl gescannt - dazu muss das tool nmap installiert werden - in linux,windows

      • das tool nmap wird unter linux auf der console mit "apt-get install nmap" installiert - für windows das tool downloaden und im standardverzeichnis installieren https://nmap.org/download.html

      • in linux muss in der iobroker datei /etc/sudoers.d/iobroker ein eintrag geschrieben werden https://forum.iobroker.net/post/375519 - der befhel nmap muss mit root ausgeführt werden !!!

      • im setting der javascript instanz das exec. anklicken https://forum.iobroker.net/post/409294

      • in windows habe ich dem user, der iobroker installiert hat, volle rechte auf das standardverzeichnis der nmap installation gegeben wichtig: es muss der befehl "nmap --iflist" ausgeführt werden - dmit bekommt man die aktuelle ethernetschnittstelle heraus ( "up") - diese wird unter const onlyWinEthernetIF eingetragen

      • damit man eine anzeige bekommt, muss ein datenpunkt (zeichenkette, string) angelgt werden, der anschliessend auch im script eingetragen werden muss (dpVis) - im settingbereich des scriptes
        die anderen settings müssen im script auch angeglichen werden z.b. dns server, domainname und der ipbereich

      • die aliasnamen in myDeviceNames: android, amazon-geräte werden bei fritzbox-dnsserver-nutzung mit dem eigennamen des gerätes angezeigt - ist ein fritzbox problem seit fritzos 7

      • es ist möglich eine datei zu erzeugen um die tabelle in iqontrol zu nutzen oder in der vis mit einem iframe einzubinden - standardmäßig nutzt man das standard-html-widget in der vis mit einem binding auf dpVis https://forum.iobroker.net/post/375754

      • symbole, farben tabellensettings sind alle individuell einstellbar!

      • docker bzw. synology-user: https://forum.iobroker.net/post/376631 ihr müßt im ersten exec befehl das "sudo -u root nmap " mit nur "nmap" ersetzen - siehe auch https://forum.iobroker.net/post/376920

      • die javascript adapter version sollte 4.3.x sein oder höher !!!

      AApossis (18).gif


      1581282746893-nmap_finetuning.png

      Anleitung für mehrere links pro server ist hier: https://forum.iobroker.net/post/597255

      in den ersten 20 zeilen sind die wichtigen settings - bitte alle durchgehen !!!

      //@liv-in-sky Januar 2021 13.3-19:00
      
      
      //HIER WIRD PFAD UND FILENAME DEFINIERT
      // @ts-ignore
      const path = "/htmlip.html";                   //FIlenamen definieren
      const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
      let   braucheHostDaten=false;
      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 html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
      let   braucheMaterialDesignWidgetList=false;        // bei true wird ein html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
      let dpHost="0_userdata.0.Tabellen.IPDevices_HostDaten"         //WICHTIG wenn braucheHostDaten auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
      let dpSort="0_userdata.0.Tabellen.IPDevicesSort";           //WICHTIG - Sortierung
      let dpVIS="0_userdata.0.Tabellen.IPDevices"         //WICHTIG wenn braucheMaterialDesignWidgetList auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
      let dpMaterialTabelWidget="0_userdata.0.Tabellen.IPDevices_MD_Table"         //WICHTIG wenn braucheMaterialDesignWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
      let dpMaterialListWidget="0_userdata.0.Tabellen.IPDevices_MD_List"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
      let pfadBilderMaterialWidget="/vis.0/armin/img/"                       // PFAD zu den bildern, die in die vis geladen wurden/
      let mySchedule=" */15 * * * * ";                       //jede minute  -  nicht unter eine minute gehen -besser 3 oder 5 minuten nutzen !!!
      const domainName="fritz.box";                  // domainname in der fritzbox definiert
      const ipbereich="192.168.178.0/24";           //  gilt nicht für windows
      const dnsServer="192.168.178.1"               // gilt nicht für windows
      let mysortiereClient=1;                     //1 nach client 2 nach ip 
      const waitTime=500;                        // falls längere zeit keine daten kommen - diesen wert erhöhn um 5000 (ms)
      const lastZellColorSetting="lightgreen"      // farbe der zusammenfassung in der letzten zelle der tabelle 
      const oerationSystemchange=false;              // false ist linux, true ist windows
      const onlyWinEthernetIF="eth0"                // nur windows über befehl "nmap --iflist" herausfinden
      const farbeNichtErreichbar="#819FF7" //"#FFBF00";         // farbe für devices, die gerade nicht online sind
      const styleNichtErreichbar="i";             // möglich i=schräg, b ist fett und span ist normal - nur eines  davon !!!
      const kuerzungNamen=23;                      // länge der namen kürzen
      const materialD_IP_erreichbar="#D8D8D8";        // material design farbe der ip adresse bei erreichbaren klient
      const materialD_IP_nichtErreichbar="#F7819F";    // material design farbe der ip adresse bei nicht erreichbaren klient
      const htmlGragient=[150,30,70];                          // einstellung des gradienten
      
      //hier eintragen für die übersetzung der standardnamen - aliase - rechte seite wird statt linker  angezeigt - die beispiele kann man raus löschen
      // BITTE AUF DIE KOMMAs ACHTEN
      const myDeviceNames={ "192.168.178.24"  :"HF Küche Licht",     // ein leeres array wird so erzeugt: const myDeviceNames=[];
                           "192.168.178.118" :"Echo Beige",
                           "192.168.178.100" :"Echo Plus",
                           "192.168.178.50"  :"Echo Dot Zimmer",
                           "192.168.178.68"  :"HF Desk Haupt"
      
      }
      
      const myDeviceNamesNew= [{"ip" : "192.168.178.10", "name" : "Proxmox", "link" : "https://192.168.178.10:8006/", "kat":"server", "linkFirstName":"WEB"},
                              {"ip" : "192.168.178.157", "name" : "sqltulla", "link" : "http://192.168.178.157:8181/settings", "kat":"server", "linkFirstName":"TAUTULLA" },
                              {"ip" : "192.168.178.145", "name" : "pi-hole", "link" : "http://192.168.178.145/admin", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.59", "name" : "iobroker", "link" : "http://192.168.178.59:8081/#tab-objects", "kat":"server","linkFirstName":"OBJ", "morelinks":[{"TAB":"http://192.168.178.59:8081/#tab-logs"},{"INS":"http://192.168.178.59:8081/#tab-instances"}] },
                              {"ip" : "192.168.178.199", "name" : "NAS-FILE-Server", "link" : "", "kat":"server" },
                              {"ip" : "192.168.178.72", "name" : "AXHD60", "link" : "http://192.168.178.72", "kat":"server" },
                              {"ip" : "192.168.178.173", "name" : "ESP-KAMERA1", "link" : "http://192.168.178.173", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.117", "name" : "ESP-SWITCH-CAM1", "link" : "http://192.168.178.117", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.174", "name" : "ESP-KAMERA2", "link" : "http://192.168.178.174", "kat":"server", "linkFirstName":"WEB" },
                               {"ip" : "192.168.178.172", "name" : "ESP-SWITCH-CAM2", "link" : "http://192.168.178.172", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.175", "name" : "ESP-KAMERA3", "link" : "http://192.168.178.175", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.171", "name" : "ESP-SWITCH-CAM3", "link" : "http://192.168.178.171", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.191", "name" : "ESP-KAMERA4", "link" : "http://192.168.178.191", "kat":"server", "linkFirstName":"WEB" },
                               {"ip" : "192.168.178.135", "name" : "ESP-SWITCH-CAM4", "link" : "http://192.168.178.135", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.192", "name" : "ESP-KAMERA5", "link" : "http://192.168.178.192", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.83", "name" : "ESP-SWITCH-CAM5", "link" : "http://192.168.178.83", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.73", "name" : "MediaPadT5", "link" : "", "kat":"tablet" },
                              {"ip" : "192.168.178.148", "name" : "Echo Dot 3", "link" : "", "kat":"echo_dot3" },
                              {"ip" : "192.168.178.29", "name" : "TrekStor13", "link" : "", "kat":"tablet" },
                              {"ip" : "192.168.178.151", "name" : "FireTab7", "link" : "", "kat":"tablet" },
                              {"ip" : "192.168.178.201", "name" : "VPN Netzwerk", "link" : "", "kat":"vpn" },
                              {"ip" : "192.168.178.56", "name" : "FireHDStick", "link" : "", "kat":"firetvstick" },
                              {"ip" : "192.168.178.41", "name" : "FireTVStick", "link" : "", "kat":"firetvstick" },
                              {"ip" : "192.168.178.37", "name" : "FireTVStick1", "link" : "", "kat":"firetvstick" },
                              {"ip" : "192.168.178.33", "name" : "SonoffS26Alexa", "link" : "", "kat":"sonoff26" },
                              {"ip" : "192.168.178.124", "name" : "Galaxy-S9", "link" : "", "kat":"handygal" },
                              {"ip" : "192.168.178.28", "name" : "Google-Home-Mini", "link" : "", "kat":"googlemini" },
                              {"ip" : "192.168.178.81", "name" : "GalaxyTabA16", "link" : "", "kat":"tablet" },
                              {"ip" : "192.168.178.21", "name" : "GoSund 2 Matrix", "link" : "", "kat":"gosund111" },
                              {"ip" : "192.168.178.155", "name" : "GoSund 3 Freezer", "link" : "", "kat":"gosund111" },
                              {"ip" : "192.168.178.126", "name" : "Matrix Büro", "link" : "", "kat":"matrix" },
                              {"ip" : "192.168.178.168", "name" : "Matrix Küche", "link" : "", "kat":"matrix" },
                              {"ip" : "192.168.178.147", "name" : "MatrixTV", "link" : "", "kat":"matrix" },
                              {"ip" : "192.168.178.80", "name" : "MatrixCPU", "link" : "", "kat":"matrix" },
                              {"ip" : "192.168.178.150", "name" : "Gosund 1", "link" : "", "kat":"gosund111" },
                              {"ip" : "192.168.178.77", "name" : "SteckdoseAlexa", "link" : "", "kat":"fragezeichen" },
                              {"ip" : "192.168.178.235", "name" : "MotionEye", "link" : "http://192.168.178.235:8765/", "kat":"server", "linkFirstName":"EYE"  },
                              {"ip" : "192.168.178.142", "name" : "AdGuard", "link" : "http://192.168.178.142/", "kat":"server" },
                              {"ip" : "192.168.178.1", "name" : "DragonRoot", "link" : "http://192.168.178.1", "kat":"fritzbox", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.129", "name" : "WLEDRund", "link" : "http://192.168.178.129/", "kat":"server", "linkFirstName":"WEB"},
                              {"ip" : "192.168.178.132", "name" : "WLEDLang", "link" : "http://192.168.178.132/", "kat":"server", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.88", "name" : "DragonRoot-Dect", "link" : "http://192.168.178.88", "kat":"fritzbox" },
                              {"ip" : "192.168.178.74", "name" : "LGwebOSTV", "link" : "", "kat":"LG_TV_2" },
                              {"ip" : "192.168.178.139", "name" : "MCU Thermometer", "link" : "http://192.168.178.139", "kat":"sonoff" },
                               {"ip" : "192.168.178.140", "name" : "EASY1", "link" : "http://192.168.178.140", "kat":"sonoff", "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.163", "name" : "EASY2", "link" : "http://192.168.178.163", "kat":"sonoff" , "linkFirstName":"WEB"},
                              {"ip" : "192.168.178.141", "name" : "BridgeSensateTemp", "link" : "", "kat":"" },
                              {"ip" : "192.168.178.101", "name" : "DashPlayboy", "link" : "", "kat":"" },
                              {"ip" : "192.168.178.86", "name" : "DashSakrotan", "link" : "", "kat":"" },
                              {"ip" : "192.168.178.95", "name" : "Sonoff2-Distance", "link" : "http://192.168.178.95", "kat":"sonoff" }, 
                              {"ip" : "192.168.178.14", "name" : "Plex", "link" : "http://192.168.178.14:32400/web/index.html", "kat":"server" , "linkFirstName":"WEB" },
                              {"ip" : "192.168.178.156", "name" : "EchoShow5", "link" : "", "kat":"Echo-Show-5" }
                              ]
      
      var symbolOK="✔️";     // auch möglich: ="✅"   🟩   ✔️  🌎
      var symbolKO="🔵" //"🔔";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz  oder : ="❌"  ⚪   🟢 ⚫ ⭕  🔴 🔵  🚫 ⏱ 💀 👍 👎 📑 💲 👀 😡 🟥 ⬜ 🧊 💬 🗑️ 🔔
      var symbolWARN="ℹ️";    // ="⚠️" oder info: "ℹ️"
      var symbolKO_MD="🟥"    //symbol für "nicht erreichbar" im MaterialDesign Widget
      var symbolLink="🌎";
      var externalOhneInfo=false;  //noch nicht integriert
      //---------------------------------------
      
      //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
      var htmlFeld1='Name';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
      var htmlFeld2='IP';        var Feld2lAlign="left";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
      var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
      //-----------------------------------
      
      
      //ÜBERSCHRIFT ÜBER TABELLE
      let   htmlUberschrift=true;                           // mit Überschrift über der tabelle
      let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
      const htmlFeldUeber='IP Devices List';              // Ü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=3;                              // 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="white";                // Farbe der Überschrift bei jeder 2.ten Tabelle
      const htmlFarbTableColorUber="#BDBDBD";               // Überschrift in der tabelle - der einzelnen Spalten
      //ÜBERSCHRIFT SPALTEN
      const UeberSchriftHoehe="35";                          //Überschrift bekommt mehr Raum - darunter und darüber - Zellenhöhe
      const LinieUnterUeberschrift="2";                   // Linie nur unter Spaltenüberschrift - 
      const farbeLinieUnterUeberschrift="lightblue";
      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="1200";                                     //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"   ///"Helvetica";
      const htmlSchriftgroesse="14px";
      //FELDER UND RAHMEN
      let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
      const htmlFarbFelderschrift="#D8D8D8";                  // SchriftFarbe der Felder  #D8D8D8
      const htmlFarbFelderschrift2="#D8D8D8";                 // SchriftFarbe der Felder für jede 2te Tabelle
      const htmlFarbTableColorGradient1="#424242";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
      const htmlFarbTableColorGradient2="#424242";          //  Gradient - Hintergrund der Tabelle - ist dieser Wert gleich Gradient1 gibt es keinen verlauf
      const htmlFarbTableBorderColor="grey";             // Farbe des Rahmen - is tdieser gleich den gradienten, sind die rahmen unsichtbar
      let htmlRahmenLinien="none";                            // Format für Rahmen: MÖGLICH: "none" oder "all" oder "cols" oder "rows"
      const htmlSpalte1Weite="cols";                   //  Weite der ersten beiden  Spalten oder z.b. 115px
      
      // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
      // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
      // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
      
      
      
      const dpPrefix = "javascript."+ instance +".";
      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";
      
      let searchMe="<div><input class=\"myinputclassnmap\" type=\"search\" id=\"searchnmap\" placeholder=\"Filter by Item\"></div>";
      const htmlZentriert="<style>  .myinputclassnmap {border: 1px solid; border-color: "+htmlFarbTableColorGradient2+"; margin-bottom: 20px; color: "+htmlFarbTableColorUber+"; height: 30px;background-image: linear-gradient("+htmlGragient[0]+"deg,"+htmlFarbTableColorGradient2+" "+htmlGragient[1]+"%,"+htmlFarbTableColorGradient1+" "+htmlGragient[2]+"%); font-family:"+htmlSchriftart+"\ }"+
                          "</style><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:0px 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=\"1px\" 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=\""+UeberSchriftHoehe+"\" 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 3
      
      var htmlTabUeber2=  "<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
      var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                         "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
      
      const buttonScript =  '<script> function setOnOtherValue22(myval) {	var Self = this;	vis.setValue(\"0_userdata.0.Tabellen.IPDevicesSort\",myval); console.log("nmap: "+myval) }'
                           +'$( "button.myButt" ).click(function() {  $(".myButt" ).slideUp(); setTimeout(function() { $( ".mySpan" ).text(\"wait ...\")}, 1000);  });'    //$this.prop("border", "10px");
                           + `var allRows = $("[class*='nmapspecial']");  $("input#searchnmap").on("keydown keyup", function() {  allRows.hide();  $("tr:contains('" + $(this).val() + "')").show();});`
                           +'</script>' 
      //------------------------------------------------------
      var rootcount=true;
      var myObjOld=[];
      var myJsonWidget=[]; 
      var myJsonWidget2=[];
      var htmlTabUeber="";
      var htmlOut="";
      var mix;
      var valButton=1;
      var myObj;
      var counter;
      //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
      var val1; var val0; var val2;
      var json1; var json2; var json3; var json4; var json5; var json6;
      let myObjExtra=[];
      let laeuftSchon=false;
      var hostDaten="";
      
      async function  writeHTML(){
         laeuftSchon=true;
         mysortiereClient=getState(dpSort).val;
      let htmlTabUeber2_2= "<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+"<span class=\"mySpan\"></span>"+"<button class=\"myButt\" style\=\" border-radius: 4px; border:1px solid; background-color\: "+"transparent"+"\; color: "+htmlFarbTableColorUber+"; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnOtherValue22\(\'"+"1"+"\')\">"+htmlFeld1+"</button>"+"&ensp;</td>"+
                          "<td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+"<span class=\"mySpan\"></span>"+"<button class=\"myButt\" style\=\" border-radius: 4px; border:1px solid; background-color\: "+"transparent"+"\; color: "+htmlFarbTableColorUber+"; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnOtherValue22\(\'"+"2"+"\')\">"+htmlFeld2+"</button>"+"&ensp;</td>"+
                          "<td  align="+Feld3lAlign+">&ensp;"+"<span class=\"mySpan\"></span>"+"<button class=\"myButt\" style\=\" border-radius: 4px; border:1px solid; background-color\: "+"transparent"+"\; color: "+htmlFarbTableColorUber+"; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnOtherValue22\(\'"+"1"+"\')\">"+htmlFeld3+"</button>"+"&ensp;</td>";
      
      htmlOut="";
      
      counter=-1;
      htmlTabUeber="";
      switch (mehrfachTabelle) { 
         case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2_2+htmlTabUeber3;  break;
         case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2_2+htmlTabUeber2_1+htmlTabUeber3; break;
         case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2_2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
         case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2_2+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 !!!---------------------------------------------------------------------
      //--------------------------------------------------------------------------------------------------------------------------------------------------
      hostDaten="";
      var myData="xxxxx"; 
      let myArr=[];
      myObjExtra=[];
      
      async function holeData() {
           return new Promise((resolve) => {
      if(oerationSystemchange == false){
      exec("sudo -u root nmap -sPR --dns-servers "+dnsServer+" "+ipbereich  , async function (error, result, stderr) {
         myData=result
       //  setState("0_userdata.0.Tabellen.IPDeviceERROR", result)
         // console.log(result);
          resolve()
      });} else {
      
      exec((['"C:\\\\Program Files (x86)\\\\Nmap\\\\nmap" ','-sPR  -e ',onlyWinEthernetIF,' --dns-servers ',dnsServer,' ',ipbereich].join('')), function (error, result, stderr) {
         myData=result
          resolve()
      });}
      });
      }
      
      await holeData().then( async function () {  //})
      //let timeout = setTimeout(function () {
      // myData=getState("0_userdata.0.Tabellen.DeviceIPFake").val       //   FÜR TEST
      ////////////////////////////////log(myData)
      
       if (!myData.includes("xxxx")) {
      
      
      
      var myTimeScanArr=myData.match(/(scanned in) (\d+\.\d+ seconds)/g); //log(myTimeScan)
      
      // myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+.\d+.\d+.\d+)\)|(fritz.\w+)\s+\((\d+.\d+.\d+.\d+)\)|(\d+.\d+.\d+.\d+)$/g)
      
      myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+\.\d+\.\d+\.\d+)\)|(fritz\.\w+)\s+\((\d+\.\d+\.\d+\.\d+)\)|(\d+\.\d+\.\d+\.\d+)$/gm)
       //log(myArr.toString())
      //myArr.push("10.0.1.200")
      //myArr.push("for iobroker (10.0.1.200)")
      //myArr.push("10.0.1.201")
      //myArr.push("fritz.repeater (10.0.1.200)")
      /////////////////////////////////////log(myArr.toString())
      if(myArr!=null) {
      let var1; let var2; let var3; let varOhneName=[];
       myObj=[]
      for(var i=0;i<myArr.length;i++) {
          var1="na"; var2="na";
          var1=myArr[i].replace(/(for .+) \(\d+\.\d+\.\d+\.\d+\)/,"$1") 
          var1=var1.replace(/(.+)\(.+\)/," $1")
          var2=myArr[i].replace(/for .+ \((\d+\.\d+\.\d+\.\d+)\)/,"$1");//log(var2)
          var2=var2.replace(/.+\((.+)\)/,"$1")
          
          varOhneName=myArr[i].match(/^(\d+\.\d+\.\d+\.\d+)$/) 
          if (varOhneName!=null) {var1=varOhneName[0];var2=varOhneName[0]}
          var3="true";
         /* var2=var2.replace(/[(,)]/g,"")
          for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                    //log(index)
                                     if ((var2.trim()).match(index)) {var1="for "+myDeviceNames[index];
                                    // log(val0+" - "+index)
                                       }
      
          }  */
      
      
        let help=[var1.trim(),var2.trim(),var3]
        if (!(var1=="na" || var2=="na")) myObj.push(help)
        if (true) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                        myObjOld.push(help);    
                        }
      }
      //log("vor await")
      await needDP(myObjOld)
      
                       await Sleep(1500); 
                       myObjOld=await getData(dpPrefix+"Tabellen.IPDevices.Device_Collection")
                      // log("nach await")
        if (false) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                       // myObjOld.push(help);
                      //  createState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld,  { name: 'Device_Collection', desc: 'Device_Collection', type: 'array',read: true, write: true });
                       await needDP(myObjOld).then(myObjOld=await getData(dpPrefix+"Tabellen.IPDevices.Device_Collection"))
                       await Sleep(3000); log("")
                      //  myObjOld=await getData(dpPrefix+"Tabellen.IPDevices.Device_Collection") //getState(dpPrefix+"Tabellen.IPDevices.Device_Collection").val; 
                       // log(myObjOld.toString())
                        }
                        else{
                        myObjOld=getState(dpPrefix+"Tabellen.IPDevices.Device_Collection").val;    
                        // log("-----"+myObjOld.toString()) ; 
                        }
      
      //log("++++++++++++++++++ "+myObj.toString())
      
      //setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())
         
         let varhelp1; let varhelp2; let varhelp3="true";    //neue erkannt geräte zu datenbank hinzufügen
        for (var i=0;i<myObj.length;i++){ 
             //  log("kommen vom myObject: "+myObjOld[i][1]+" mit: "+myObjOld[i][0])
                 if (!myObjOld.toString().includes(myObj[i][1]))  {  varhelp1=myObj[i][0].trim() ; varhelp2=myObj[i][1]; varhelp3="true"; 
                                                          let help=[varhelp1,varhelp2,varhelp3]; /*log("+++++++!!!+++++++++help "+help.toString())*/
                                                         if (!(varhelp1.indexOf("scanned")>-1)) myObjOld.push(help)               
                                           }                       }
      
        for (var i=0;i<myObjOld.length;i++){                // ist gerät noch da ???
           //  if (i>0 && i<10)  log("-----"+myObjOld[i][0]+" alles: ") ;     if (i>0 && i<2) log(myObj.toString())
                 if (!myObj.toString().includes(myObjOld[i][1]))  {  varhelp1=myObjOld[i][0].trim() ; varhelp2=myObjOld[i][1]; varhelp3="false"; 
                                                          let help=[varhelp1,varhelp2,varhelp3]; /*if (i>=0 && i<80)  log("+++++++???+++++++++help "+help.toString())*/
                                                          myObj.push(help)               
                                           }                      }
       
         // log("------------------------------------------------"+myObjOld[1].toString())
      //log(mysortiereClient.toString())
          if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) mysortiereClient=1
      
       /*    if (mysortiereClient==1){ 
      
              myObj.sort(function (alpha, beta) {
                  if (alpha[0].toUpperCase().trim() > beta[0].toUpperCase().trim())
                     return 1;
                  if (beta[0].toUpperCase().trim() > alpha[0].toUpperCase().trim())
                     return -1;
                  return 0;
                 });} else {  */
      if (mysortiereClient==2){ 
                 myObj.sort(function (alpha, beta) {
                  //   if (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")) > parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))
                   if ((parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                         return -1;
                     if ((parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                         return 1;
                  return 0;
                 });  
                 }
          var1="scanned in" //nur scanned seconds
         var3="true"
         var2=myTimeScanArr[0].replace(/.+ (\d+\.\d+.+$)/,"$1");//log(var2)
         let help=[var1,var2,var3]
      
        if (mysortiereClient==1) help=["xxxx"+var1,var2,var3]
        myObj.push(help)
      /*if (!rootcount)*/  setState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld)
      ///////////////////////////log("myObject ------- "+myObj.length.toString()+"---- ")
       // setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())   // zur fehlersuche
              for(var i=0;i<myObj.length;i++) {            // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
      
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
              //  log(myObj[i][0].toString())
                val0=myObj[i][0].replace("for","").trim()
                val0=val0.replace("."+domainName,"")
                val0=val0.replace(/[(,)]/g,"")
                val1=myObj[i][1]
                val1=val1.replace(/[(,)]/g,"")
      
            //  log(val0+" --- "myDeviceNamesNew[].ip)
      
      for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                    //log(index)
                                     if ((val1.trim()).match(index.trim()) && val1.trim().length == index.trim().length) {val0=myDeviceNames[index];
                                                                                                                          
                                     //log(val0+" - "+index)
                                       } } 
      let helperIP=""
      let helperlink=""
      for (var index in myDeviceNamesNew) {                   //ersetze mit aliasnamen
                                    //log(index)
                                     if ((val1.trim()).match(myDeviceNamesNew[index].ip) && val1.trim().length == (myDeviceNamesNew[index].ip).length) {
                                         
                                                                                                                       val0=myDeviceNamesNew[index].name; 
      
                                                                                                                     //   if (val0.length>=(kuerzungNamen)+2)  val0=val0.substring(0,kuerzungNamen)+" ...";
                                                                                                                       // helperIP=val0 ;  //log(val0)
                                                                                                                        if (myDeviceNamesNew[index].link!="") {helperlink=myDeviceNamesNew[index].link; 
                                                                            myDeviceNamesNew[index].hasOwnProperty("linkFirstName") ? helperIP=helperIP+` <a href="${helperlink}" target="_blank"><button style="font-size: 75%; background: ${farbeNichtErreichbar}; color:${htmlFarbFelderschrift}">${myDeviceNamesNew[index].linkFirstName}</button></a>` 
                                                                                                                                    : helperIP =helperIP+` <a style="text-decoration:none;" href="${helperlink}" target="_blank"> ${symbolLink}</a>` 
                                                                              
                                                                            if(myDeviceNamesNew[index].hasOwnProperty("morelinks")) {//log(JSON.stringify(myDeviceNamesNew[index].morelinks))
                                                                          
                                                                            for(let o=0;o<myDeviceNamesNew[index].morelinks.length;o++) {
                                                                                                                                         let test=JSON.parse(JSON.stringify(myDeviceNamesNew[index].morelinks))
                                                                                                                                         let key1=Object.keys(test[o])[0]
                                                                                                                                         //log(    Object.keys(test[o])[0]    );
                                                                                                                                       //  log(   test[o][key1]  );
                                                                                                                                         helperIP=helperIP+ ` <a href="${test[o][key1]}" target="_blank"><button style="font-size: 75%; background: ${farbeNichtErreichbar}; color:${htmlFarbFelderschrift}">${Object.keys(test[o])[0]}</button> </a>`         //`<button onclick="window.location.href =${test[o][key1]};">${Object.keys(test[o])[0]}</button>`                        //` ${Object.keys(test[o])[0]}<a style="text-decoration:none;" href="${test[o][key1]}" target="_blank"> ${symbolLink}</a>`
                                                                                                                                            }  
                                                                            }
                                                                          //  val0=helperIP;    
                                                                           }
                                                                      
                                     //log(val0+" - "+index)
                                       } }                                   
      
                  if (val0.length>=(kuerzungNamen)+2)  val0=val0.substring(0,kuerzungNamen)+" ..." 
                       val0=val0+helperIP;          
      
                  
                
                var val2help=myObj[i][2]
            if (mysortiereClient==2){ 
      
             if(val0=="scanned in") {val2=symbolWARN;val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter+"</i>"; 
             let valer=val1.replace(/.* (um.*)/,"$1");
                                    val1=val1.replace(/(.*) um.*/,"$1");
                                    
                                    val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>"}
            
      
                if (val2help=="false") {val2=symbolKO;
      
                                        val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                        val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{val2=symbolOK}        
      
                
      
           
       
      
      
           tabelleBind(); }//HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
           else {let help=[val0.trim(),val1,val2help];myObjExtra.push(help);}
         //}
      }; //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
          var valLink=""; var valKat="";  
          if (mysortiereClient==1){ 
             counter=-1;
              myObjExtra.sort(function (alpha, beta) {
                  if ((alpha[0].toUpperCase()).trim() > (beta[0].toUpperCase()).trim())
                     return 1;
                  if ((beta[0].toUpperCase()).trim() > (alpha[0].toUpperCase()).trim())
                     return -1;
                  return 0;
                 });} 
                 var valLink=""; var valKat="";     
              
               for(var i=0;i<myObjExtra.length;i++) {
      
                     json4="standard"
                     json6="";
                      let val0helping="";
                     counter++
                     val0=myObjExtra[i][0]//.replace(/(^.*?) <a.*/,"$1")
                     json1=myObjExtra[i][0] ;// if(i>20 && i<30) log(val0)
                     json2=val1=myObjExtra[i][1] ;
                      val2help=myObjExtra[i][2] ;
                          for (var index in myDeviceNamesNew) { 
                              //   log("bin hier bei "+myDeviceNamesNew[index].ip+" mit ...")
                                if ((myObjExtra[i][1].match(myDeviceNamesNew[index].ip)) && myObjExtra[i][1].length == myDeviceNamesNew[index].ip.length) {
                                   //  log("bin hier bei "+myDeviceNamesNew[index].name+" mit "+  myObjExtra[i][0]+" und kat: " + myDeviceNamesNew[index].kat)
                               
                                   /*  if (myDeviceNamesNew[index].link!="") {json6=myDeviceNamesNew[index].link; 
                                                                            myDeviceNamesNew[index].hasOwnProperty("linkFirstName") ? json6=` <a href="${json6}" target="_blank"><button style="font-size: 75%; background: ${farbeNichtErreichbar}; color:${htmlFarbFelderschrift}">${myDeviceNamesNew[index].linkFirstName}</button></a>` 
                                                                                                                                    : json6 =` <a style="text-decoration:none;" href="${json6}" target="_blank"> ${symbolLink}</a>` 
                                                                              
                                                                            if(myDeviceNamesNew[index].hasOwnProperty("morelinks")) {//log(JSON.stringify(myDeviceNamesNew[index].morelinks))
                                                                          
                                                                            for(let o=0;o<myDeviceNamesNew[index].morelinks.length;o++) {
                                                                                                                                         let test=JSON.parse(JSON.stringify(myDeviceNamesNew[index].morelinks))
                                                                                                                                         let key1=Object.keys(test[o])[0]
                                                                                                                                         //log(    Object.keys(test[o])[0]    );
                                                                                                                                       //  log(   test[o][key1]  );
                                                                                                                                         json6=json6+ ` <a href="${test[o][key1]}" target="_blank"><button style="font-size: 75%; background: ${farbeNichtErreichbar}; color:${htmlFarbFelderschrift}">${Object.keys(test[o])[0]}</button> </a>`         //`<button onclick="window.location.href =${test[o][key1]};">${Object.keys(test[o])[0]}</button>`                        //` ${Object.keys(test[o])[0]}<a style="text-decoration:none;" href="${test[o][key1]}" target="_blank"> ${symbolLink}</a>`
                                                                                                                                            }  
                                                                            }
                                                                            val0helping=json6;    
                                                                           }*/
                                     if (myDeviceNamesNew[index].kat!="")  json4=myDeviceNamesNew[index].kat;}  }
                                 if (val2help=="false") {json3=val2=symbolKO; json5="red";
                                        val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                        val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{json3=val2=symbolOK;   json5="green";} 
                     if(val0=="xxxxscanned in") {json3=val2=symbolWARN;   json5="blue"; json1="Anzahl: "+counter; json4="info";
                                                  val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter; 
                                                  val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>" //" um "+formatDate(getDateObject((new Date().getTime())), "SS:mm:ss")+
                                                  json2=myObjExtra[i][1]+", "+formatDate(getDateObject(((new Date().getTime()))), "SS:mm:ss")}
      
                                                 if (val2help) val0=val0+val0helping ; // link
                       tabelleBind();
                    
                     if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) {
                        if (val2help=="false") {json3=val2=symbolKO_MD; }
                       makeJsonWidget(json1,json2,json3,json4,json5,json6);}
                 }
                
      //-------------------------------------------------------------------------------------------------------------------------------------------------
      //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
      //-------------------------------------------------------------------------------------------------------------------------------------------------
      
            // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
            let timeout = setTimeout(function () {
                                                   tabelleFinish();
                                                   if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                                                   if (braucheHostDaten) {for(var i=0;i<myObjExtra.length;i++) {  if (myObjExtra[i][0]!="xxxxscanned"){
                                                                                                                  hostDaten=hostDaten+myObjExtra[i][1]+"\t"+myObjExtra[i][0]+"\n" }}}
                                                    setState(dpHost,hostDaten); //log(hostDaten)
                                                 }, 2000); 
         
             }  else {log("no Array","warn")} //Ende Array falsch
             } else {log("no Data","warn")} // ende daten falsch
           //  rootcount=false;
      //}, waitTime);
       laeuftSchon=false;
       })
      //laeuftSchon=false;
      } // function ende
      
      //MAIN:
       
      schedule(mySchedule,  function () { 
       if ( !laeuftSchon) writeHTML();
      // if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
      }); 
      if ( !laeuftSchon) writeHTML();                                   
      
       function tabelleBind(){
         //  counter=counter+mehrfachTabelle;
             switch (mehrfachTabelle) { 
      
               case 1: if(counter%2==0)         {  htmlOut=htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}else    
                                                {  htmlOut=htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}
               case 2: if(counter%4==0){
                          if(counter%2==0)  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\" align="+Feld3lAlign+">"+val2+"</td>"; } 
                                     else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;
                            }else{
                                      if(counter%2==0)  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\" align="+Feld3lAlign+">"+val2+"</td>"; } 
                                     else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;}
                                          
               case 3:if(counter%2==0)   {
                          if(counter%3==0 )  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeGeradeZeilen+"\"><td align=\""+Feld1lAlign+"\">"+val0+"</td><td align=\""+Feld2lAlign+"\">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\" align=\""+Feld3lAlign+"\">"+val2+"</td>"; } 
                                     else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align=\""+Feld1lAlign+"\" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align=\""+Feld2lAlign+"\" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align=\""+Feld3lAlign+"\" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                      else    {htmlOut = htmlOut+"<td align=\""+Feld1lAlign+"\">"+val0+"</td><td align=\""+Feld2lAlign+"\">"+val1+"</td><td align=\""+Feld3lAlign+"\">"+val2+"</td></tr>";}
                                                } break;}else{
                          if(counter%3==0 )  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeUngeradeZeilen+"\"><td align=\""+Feld1lAlign+"\">"+val0+"</td><td align=\""+Feld2lAlign+"\">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\" align=\""+Feld3lAlign+"\">"+val2+"</td>"; } 
                                     else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align=\""+Feld1lAlign+"\" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align=\""+Feld2lAlign+"\" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align=\""+Feld3lAlign+"\" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                      else     {htmlOut = htmlOut+"<td align=\""+Feld1lAlign+"\">"+val0+"</td><td align=\""+Feld2lAlign+"\">"+val1+"</td><td align=\""+Feld3lAlign+"\">"+val2+"</td></tr>";}
                                                } break;}                                
      
      
               case 4:  // counter=counter+8;
                         if(counter%8==0)   {
                         if(counter%4==0)  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td  style=\" border-right: "+trennungsLinie+"px solid "+ farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } // teil1
                                         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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} //teil 2
                                                      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></tr>";} //teil 4
                                                                        else    {htmlOut =htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"  align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                } break;}else{
                         if(counter%4==0)  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } //teil 1
                                         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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} // teil 2
                                                      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></tr>";} // teil 4
                                                                        else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                } break;}                                    
              } //switch ende
      
      }
      
      function tabelleFinish() {
      
      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></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></tr>");        
                       if(counter%3==0)      htmlOut = htmlOut.replace(/<\/td>$/, "</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></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></tr>");
                       if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</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></tr>");    
                       if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&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></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((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((new Date().getTime())), "SS:mm:ss")+"</div>";
              htmlUeber=htmlUeber+searchMe
              if (!htmlSignature) htmlUnter="";
      
            //  log(" ist htmlUnter - signature "+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+"</center>"+ buttonScript : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+"</center>"+ buttonScript ;
      
                    } else {
                     zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+"</center>"+ buttonScript :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+"</center>"+ 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(((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 (braucheMaterialDesignWidgetList) {
           
             setState(dpMaterialListWidget,JSON.stringify(myJsonWidget2)); 
             myJsonWidget2=[];
      }
      if (braucheMaterialDesignWidget) {
        
        setState(dpMaterialTabelWidget,JSON.stringify(myJsonWidget)); 
           myJsonWidget=[];
      }
      
      }
      
       function makeJsonWidget(vax1,vax2,vax3,vax4,vax5,vax6) {
      //log(vax3+vax6+htmlFeld1)
      vax4=pfadBilderMaterialWidget+vax4+".png" ;
         if ( braucheMaterialDesignWidgetList) {
         myJsonWidget.push({
             Device : vax4,
             IP : vax1,
             Status : vax2,
             Kategorie : vax3+" "+vax6
         }
      
         );}
      
      //	log(myJsonWidget)
      if (braucheMaterialDesignWidget) {
          let colorIP= materialD_IP_erreichbar   //"lightgreen";
        //  log(vax3)
          if (vax3==symbolKO_MD) colorIP=materialD_IP_nichtErreichbar     //"lightcoral";
        //  vax4=pfadBilderMaterialWidget+vax4+".png" ; 
      let mysubText = `<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
                                    <div style="flex: 1;font-size: 16px; color: ${colorIP};">${vax2}</div>
                                    <div style="color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic; text-align: right;">${vax3}${vax6}</div>
                                </div>`
           let ip=vax2                     
        
           myJsonWidget2.push({
                     text: vax1,
                     subText: mysubText,
                     statusBarColor: vax5,
                     image: vax4,
                     imageColor: "",
                     listType: "text",
                     showValueLabel: true,
                     ip: ip, //vax2,
                     status: vax3,
                     link:vax6
                     
                 });
      }
       }
      
       
      
         on({id: "0_userdata.0.Tabellen.IPDevicesSort", ack: false, change: "any"}, function (obj) { 
           //  log(obj.id);log(String(mehrfachTabelle))
           mysortiereClient=obj.state.val
         log(mysortiereClient.toString())
         
         //  log(String(mehrfachTabelle))
        setTimeout(function () { // log('file written')
           if ( !laeuftSchon)  writeHTML();
             if (braucheEinFile && !laeuftSchon) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
      }, 350);
          
      
           
         })
      
      
          function extraTablefinish() {   
      } //extraTablefinish
      
      async function needDP(myData){
          if (!(await existsStateAsync("Tabellen.IPDevices.Device_Collection"))) {
             await createStateAsync("Tabellen.IPDevices.Device_Collection", myData,{type: "array", name: "Device_Collection", desc: 'Device_Collection', role: "value", read: true, write: true, } ); }
         //await Sleep(3000); 
      }
      
      async function getData(myData){
          
         return getState(myData).val; 
      }
      //createState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld,  { name: 'Device_Collection', desc: 'Device_Collection', type: 'array',read: true, write: true });
      
      function Sleep(milliseconds) {
      return new Promise(resolve => setTimeout(resolve, milliseconds));
      }
      
      
      
      
      
      
      

      sigi234S Online
      sigi234S Online
      sigi234
      Forum Testing Most Active
      schrieb am zuletzt editiert von sigi234
      #137

      @liv-in-sky

      Hallo, Fehler?

      javascript.0	2020-03-05 22:15:28.932	warn	(23684) script.js.Listen.Fritz_IP9: no Array
      

      Ach, hatten wir ja schon.

      Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
      Immer Daten sichern!

      liv-in-skyL 1 Antwort Letzte Antwort
      0
      • sigi234S sigi234

        @liv-in-sky

        Hallo, Fehler?

        javascript.0	2020-03-05 22:15:28.932	warn	(23684) script.js.Listen.Fritz_IP9: no Array
        

        Ach, hatten wir ja schon.

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

        @sigi234

        das ist ein scriptwarning, wenn keine daten kommen - kommt ab und zu vor - ist kein eigentlicher script error, sondern wird vom script geloggt - also keine panic

        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

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

          @sigi234

          das ist ein scriptwarning, wenn keine daten kommen - kommt ab und zu vor - ist kein eigentlicher script error, sondern wird vom script geloggt - also keine panic

          sigi234S Online
          sigi234S Online
          sigi234
          Forum Testing Most Active
          schrieb am zuletzt editiert von
          #139

          @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

          @sigi234

          das ist ein scriptwarning, wenn keine daten kommen - kommt ab und zu vor - ist kein eigentlicher script error, sondern wird vom script geloggt - also keine panic

          Ok, aber jetzt panic

          javascript.0	2020-03-05 22:27:15.316	error	(23540) at Timer.processTimers (timers.js:223:10)
          javascript.0	2020-03-05 22:27:15.315	error	(23540) at listOnTimeout (timers.js:263:5)
          javascript.0	2020-03-05 22:27:15.315	error	(23540) at tryOnTimeout (timers.js:300:5)
          javascript.0	2020-03-05 22:27:15.315	error	(23540) at ontimeout (timers.js:438:13)
          javascript.0	2020-03-05 22:27:15.315	error	(23540) at Timeout._onTimeout (C:\Program Files\iobroker\Test\node_modules\iobroker.javascript\lib\sandbox.js:2077:34)
          javascript.0	2020-03-05 22:27:15.315	error	(23540) at Object.<anonymous> (script.js.Listen.Fritz_IP9:243:26)
          javascript.0	2020-03-05 22:27:15.315	error	(23540) Error in callback: TypeError: Cannot read property 'toString' of null
          

          Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
          Immer Daten sichern!

          liv-in-skyL 1 Antwort Letzte Antwort
          0
          • sigi234S sigi234

            @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

            @sigi234

            das ist ein scriptwarning, wenn keine daten kommen - kommt ab und zu vor - ist kein eigentlicher script error, sondern wird vom script geloggt - also keine panic

            Ok, aber jetzt panic

            javascript.0	2020-03-05 22:27:15.316	error	(23540) at Timer.processTimers (timers.js:223:10)
            javascript.0	2020-03-05 22:27:15.315	error	(23540) at listOnTimeout (timers.js:263:5)
            javascript.0	2020-03-05 22:27:15.315	error	(23540) at tryOnTimeout (timers.js:300:5)
            javascript.0	2020-03-05 22:27:15.315	error	(23540) at ontimeout (timers.js:438:13)
            javascript.0	2020-03-05 22:27:15.315	error	(23540) at Timeout._onTimeout (C:\Program Files\iobroker\Test\node_modules\iobroker.javascript\lib\sandbox.js:2077:34)
            javascript.0	2020-03-05 22:27:15.315	error	(23540) at Object.<anonymous> (script.js.Listen.Fritz_IP9:243:26)
            javascript.0	2020-03-05 22:27:15.315	error	(23540) Error in callback: TypeError: Cannot read property 'toString' of null
            
            liv-in-skyL Offline
            liv-in-skyL Offline
            liv-in-sky
            schrieb am zuletzt editiert von
            #140

            @sigi234 was hast du gemacht ?

            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

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

              @sigi234 was hast du gemacht ?

              sigi234S Online
              sigi234S Online
              sigi234
              Forum Testing Most Active
              schrieb am zuletzt editiert von
              #141

              @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

              @sigi234 was hast du gemacht ?

              Skript neu erstellt

              Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
              Immer Daten sichern!

              liv-in-skyL 1 Antwort Letzte Antwort
              0
              • sigi234S sigi234

                @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                @sigi234 was hast du gemacht ?

                Skript neu erstellt

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

                @sigi234 dann hast du was verkehrt gemacht ?

                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

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

                  @sigi234 dann hast du was verkehrt gemacht ?

                  sigi234S Online
                  sigi234S Online
                  sigi234
                  Forum Testing Most Active
                  schrieb am zuletzt editiert von sigi234
                  #143

                  @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                  @sigi234 dann hast du was verkehrt gemacht ?

                   //@liv-in-sky Januar 2020 11.2-18:15
                   
                   
                  //HIER WIRD PFAD UND FILENAME DEFINIERT
                  const path = "/fritzip.html";                   //FIlenamen definieren
                  const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                  let   braucheEinFile=true;                          // bei true wird ein file geschrieben
                  let   braucheEinVISWidget=true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
                  let dpVIS="javascript.0.Eigene_Datenpunkte.TABELLEN.fritzip"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget
                  let mySchedule=" */3 * * * *";                       //jede minute  -  nicht unter eine minute gehen -besser 3 oder 5 minuten nutzen !!!
                  const domainName="fritz.box";                  // domainname in der fritzbox definiert
                  const ipbereich="192.168.178.0/24";           //  gilt nicht für windows
                  const dnsServer="192.168.178.1"               // gilt nicht für windows
                  let sortiereClient=true;                     //true nach client false nach ip
                  const waitTime=15000;                        // falls längere zeit keine daten kommen - diesen wert erhöhn um 5000 (ms)
                  const lastZellColorSetting="lightgreen"      // farbe der zusammenfassung in der letzten zelle der tabelle 
                  const oerationSystemchange=true;              // false ist linux, true ist windows
                  const onlyWinEthernetIF="eth0"                // nur windows über befehl "nmap --iflist" herausfinden
                  const farbeNichtErreichbar="#FFBF00";         // farbe für devices, die gerade nicht online sind
                  const styleNichtErreichbar="i";             // möglich i=schräg, b ist fett und span ist normal - nur eines  davon !!!
                  const kuerzungNamen=23;                      // länge der namen kürzen
                   
                  //hier eintragen für die übersetzung der standardnamen - aliase - rechte seite wird statt linker  angezeigt - die beispiele kann man raus löschen
                  // BITTE AUF DIE KOMMAs ACHTEN
                                     
                  
                  }
                  

                  Screenshot (1919).png

                  Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                  Immer Daten sichern!

                  liv-in-skyL 1 Antwort Letzte Antwort
                  0
                  • sigi234S sigi234

                    @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                    @sigi234 dann hast du was verkehrt gemacht ?

                     //@liv-in-sky Januar 2020 11.2-18:15
                     
                     
                    //HIER WIRD PFAD UND FILENAME DEFINIERT
                    const path = "/fritzip.html";                   //FIlenamen definieren
                    const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                    let   braucheEinFile=true;                          // bei true wird ein file geschrieben
                    let   braucheEinVISWidget=true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
                    let dpVIS="javascript.0.Eigene_Datenpunkte.TABELLEN.fritzip"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget
                    let mySchedule=" */3 * * * *";                       //jede minute  -  nicht unter eine minute gehen -besser 3 oder 5 minuten nutzen !!!
                    const domainName="fritz.box";                  // domainname in der fritzbox definiert
                    const ipbereich="192.168.178.0/24";           //  gilt nicht für windows
                    const dnsServer="192.168.178.1"               // gilt nicht für windows
                    let sortiereClient=true;                     //true nach client false nach ip
                    const waitTime=15000;                        // falls längere zeit keine daten kommen - diesen wert erhöhn um 5000 (ms)
                    const lastZellColorSetting="lightgreen"      // farbe der zusammenfassung in der letzten zelle der tabelle 
                    const oerationSystemchange=true;              // false ist linux, true ist windows
                    const onlyWinEthernetIF="eth0"                // nur windows über befehl "nmap --iflist" herausfinden
                    const farbeNichtErreichbar="#FFBF00";         // farbe für devices, die gerade nicht online sind
                    const styleNichtErreichbar="i";             // möglich i=schräg, b ist fett und span ist normal - nur eines  davon !!!
                    const kuerzungNamen=23;                      // länge der namen kürzen
                     
                    //hier eintragen für die übersetzung der standardnamen - aliase - rechte seite wird statt linker  angezeigt - die beispiele kann man raus löschen
                    // BITTE AUF DIE KOMMAs ACHTEN
                                       
                    
                    }
                    

                    Screenshot (1919).png

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

                    @sigi234

                    probier mal

                    script stop
                    javascript.0.Tabellen.IPDevices.Device_Collection - datenpunkt löschen
                    script start

                    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

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

                      @sigi234

                      probier mal

                      script stop
                      javascript.0.Tabellen.IPDevices.Device_Collection - datenpunkt löschen
                      script start

                      sigi234S Online
                      sigi234S Online
                      sigi234
                      Forum Testing Most Active
                      schrieb am zuletzt editiert von
                      #145

                      @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                      @sigi234

                      probier mal

                      script stop
                      javascript.0.Tabellen.IPDevices.Device_Collection - datenpunkt löschen
                      script start

                      Schaut gut aus.

                      Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                      Immer Daten sichern!

                      liv-in-skyL 1 Antwort Letzte Antwort
                      0
                      • sigi234S sigi234

                        @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                        @sigi234

                        probier mal

                        script stop
                        javascript.0.Tabellen.IPDevices.Device_Collection - datenpunkt löschen
                        script start

                        Schaut gut aus.

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

                        zum test - material design - falls interesse ( @sigi234 ?)

                        Image 4.png Image 5.png

                        • neue datenpunkte erstellen und eintragen
                        • deine aliase wieder zurückkopieren
                        • die anderen einstellungen wieder überprüfen - kannst du alle kopieren und nachträglich die settings von zeile 0 bis 9 drüberkopieren (also neu sind zeile 9 bis 14 ohne 11 - und zeile 57)
                        • bilder für einzelne kategorien ( server, pc, schalter, sensor, ..) sind nicht realisiert
                          bild:

                        fixed-ipaddress_icon.png

                        [{"tpl":"tplVis-materialdesign-Table","data":{"oid":"0_userdata.0.Tabellen.IPDevices_MD_Table","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","countCols":"3","tableLayout":"standard","showHeader":"true","headerTextSize":"headline6","showColumn0":"true","colType0":"image","textAlign0":"left","showColumn1":"true","colType1":"text","textAlign1":"left","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,"showColumn2":"true","colType2":"text","textAlign2":"left","showColumn3":"true","colType3":"text","textAlign3":"center","dataJson":"","colTextSize0":"headline4","label1":"Name","label0":" ","label2":"IP","sortKey0":"name","fontFamily0":"RobotoCondensed-Regular","padding_left0":"10","colTextColor0":"#beb7b7","colorBackground":"#ffffff","colorHeaderRowBackground":"#424242","colorHeaderRowText":"#b6b9b7","borderColor":"#000000","fontFamily1":"RobotoCondensed-Regular","colTextColor1":"","rowHeight":"19","label3":" Status","imageSize3":"20","padding_right3":"-5","imageSize0":"25","colTextSize3":"12px","colTextColor2":"#beb7b7","fontFamily2":"RobotoCondensed-Regular","dividers":"grey"},"style":{"left":"1143px","top":"138px","z-index":"1","width":"586px","height":"786px","overflow-y":"scroll"},"widgetSet":"materialdesign"}]
                        

                        [{"tpl":"tplVis-materialdesign-Icon-List","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":true,"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":"card","itemLayout":"horizontal","listType0":"text","showValueLabel0":"true","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,"maxItemsperRow":"4","json_string_oid":"0_userdata.0.Tabellen.IPDevices_MD_List","labelFontSize":"18","subLabelFontSize":"5","labelFontFamily":"RobotoCondensed-Regular","horizontalIconContainerWidth":"70","buttonHeight":"70","iconHeight":"35","iconItemMinWidth":"300","labelFontColor":"#f3f1f1","valueFontFamily":"RobotoCondensed-Regular","itemBackgroundColor":"#423d3d","valueFontColor":"#f3f1f1","subLabelFontColor":"#f3f1f1","subLabelFontFamily":"RobotoCondensed-Regular","valueFontSize":"12","itemGaps":"5","valueAppendix1":"","label1":"IP"},"style":{"left":"117px","top":"67px","width":"54.88%","height":"87.8%","overflow-y":"auto","background":"#423d3d"},"widgetSet":"materialdesign"}]
                        

                        //@liv-in-sky Januar 2020 7.3-13:15
                        
                        
                        //HIER WIRD PFAD UND FILENAME DEFINIERT
                        const path = "/htmlip.html";                   //FIlenamen definieren
                        const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                        let   braucheEinFile=true;                          // 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=true;             // bei true wird ein html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
                        let   braucheMaterialDesignWidgetList=true;        // bei true wird ein html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
                        let dpVIS="0_userdata.0.Tabellen.IPDevices"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                        let dpMaterialTabelWidget="0_userdata.0.Tabellen.IPDevices_MD_Table"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                        let dpMaterialListWidget="0_userdata.0.Tabellen.IPDevices_MD_List"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                        let pfadBilderMaterialWidget="/vis.0/armin/img/"                       // PFAD zu den bildern, die in die vis geladen wurden/
                        let mySchedule=" */3 * * * * ";                       //jede minute  -  nicht unter eine minute gehen -besser 3 oder 5 minuten nutzen !!!
                        const domainName="fritz.box";                  // domainname in der fritzbox definiert
                        const ipbereich="192.168.178.0/24";           //  gilt nicht für windows
                        const dnsServer="192.168.178.1"               // gilt nicht für windows
                        let sortiereClient=false;                     //true nach client false nach ip
                        const waitTime=20000;                        // falls längere zeit keine daten kommen - diesen wert erhöhn um 5000 (ms)
                        const lastZellColorSetting="lightgreen"      // farbe der zusammenfassung in der letzten zelle der tabelle 
                        const oerationSystemchange=false;              // false ist linux, true ist windows
                        const onlyWinEthernetIF="eth0"                // nur windows über befehl "nmap --iflist" herausfinden
                        const farbeNichtErreichbar="#FFBF00";         // farbe für devices, die gerade nicht online sind
                        const styleNichtErreichbar="i";             // möglich i=schräg, b ist fett und span ist normal - nur eines  davon !!!
                        const kuerzungNamen=23;                      // länge der namen kürzen
                        
                        //hier eintragen für die übersetzung der standardnamen - aliase - rechte seite wird statt linker  angezeigt - die beispiele kann man raus löschen
                        // BITTE AUF DIE KOMMAs ACHTEN
                        const myDeviceNames={ "192.168.178.24"  :"HF Küche Licht",     // ein leeres array wird so erzeugt: const myDeviceNames=[];
                                             "192.168.178.29"  :"TrekStor13",
                                             "192.168.178.10"  :"Proxmox",
                                             "192.168.178.156" :"EchoShow5",
                                             "192.168.178.73"  :"MediaPadT5",
                                             "192.168.178.151" :"FireTab7",
                                             "192.168.178.201" :"VPN Netzwerk",
                                             "192.168.178.126" :"Matrix Büro",
                                             "192.168.178.20"  :"Matrix Küche",
                                             "192.168.178.21"  :"GoSund 2 Matrix",
                                             "192.168.178.155" :"GoSund 3 Freezer",
                                             "192.168.178.150" :"Gosund 1",
                                             "192.168.178.33"  :"SonoffS26",
                                             "192.168.178.77"  :"WerBinIch",
                                             "192.168.178.81"  :"GalaxyTabA16",
                                             "192.168.178.56"  :"FireHDStick",
                                             "192.168.178.148" :"Echo Dot 3",
                                             "192.168.178.118" :"Echo Beige",
                                             "192.168.178.100" :"Echo Plus",
                                             "192.168.178.50"  :"Echo Dot Zimmer",
                                             "192.168.178.68"  :"HF Desk Haupt"
                        
                        }
                        
                        var symbolOK="✔️";     // auch möglich: ="✅"   🟩   ✔️  🌎
                        var symbolKO="🔔";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz  oder : ="❌"  ⚪   🟢 ⚫ ⭕  🔴 🔵  🚫 ⏱ 💀 👍 👎 📑 💲 👀 😡 🟥 ⬜ 🧊 💬 🗑️ 🔔
                        var symbolWARN="ℹ️";    // ="⚠️" oder info: "ℹ️"
                        var symbolKO_MD="🟥"    //symbol für "nicht erreichbar" im MaterialDesign Widget
                        var externalOhneInfo=false;  //noch nicht integriert
                        //---------------------------------------
                        
                        //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
                        var htmlFeld1='Name';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
                        var htmlFeld2='IP';        var Feld2lAlign="left";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
                        var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
                        //-----------------------------------
                        
                        
                        //ÜBERSCHRIFT ÜBER TABELLE
                        let   htmlUberschrift=true;                           // mit Überschrift über der tabelle
                        let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
                        const htmlFeldUeber='IP Devices List';              // Ü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=3;                              // 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="white";                // 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="2";                   // Linie nur unter Spaltenüberschrift - 
                        const farbeLinieUnterUeberschrift="lightblue";
                        const groesseUeberschrift=16;
                        const UeberschriftStyle="normal"                     // möglich "bold"
                        //GANZE TABELLE
                        let abstandZelle="1";
                        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="1200";                                     //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"   ///"Helvetica";
                        const htmlSchriftgroesse="14px";
                        //FELDER UND RAHMEN
                        let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
                        const htmlFarbFelderschrift="#D8D8D8";                  // 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="none";                            // 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 ---------------------SETTING ENDE ----------------------------------------
                        // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                        // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                        
                        
                        
                        const dpPrefix = "javascript."+ instance +".";
                        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:0px 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=\"1px\" 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 3
                        
                        var htmlTabUeber2=  "<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
                        var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                                           "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
                        //------------------------------------------------------
                        var rootcount=true;
                        var myObjOld=[];
                        var myJsonWidget=[]; 
                        var myJsonWidget2=[];
                        var htmlTabUeber="";
                        var htmlOut="";
                        var mix;
                        var counter;
                        //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
                        var val1; var val0; var val2;
                        var json1; var json2; var json3; var json4; var json5;
                        
                        function writeHTML(){
                        
                        
                        htmlOut="";
                        
                        counter=-1;
                        htmlTabUeber="";
                        switch (mehrfachTabelle) { 
                           case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber3;  break;
                           case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
                           case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
                           case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
                        };   
                        if (!UeberschriftSpalten) {htmlTabUeber=""}
                        
                        
                        //--------------------------------------------------------------------------------------------------------------------------------------------------
                        //---------hier kommt eure schleife rein counter++, tabelleBind() und tabelleFinish() müssen so integriert bleiben !!!------------------------------
                        //---------alle valx werte müssen von euch bestimmt werden - val0,val1,val2 !!!---------------------------------------------------------------------
                        //--------------------------------------------------------------------------------------------------------------------------------------------------
                        var myData="xxxxx"; 
                        let myArr=[];
                        let myObjExtra=[];
                        if(oerationSystemchange ==false){
                        exec("sudo -u root nmap -sPR --dns-servers "+dnsServer+" "+ipbereich  , function (error, result, stderr) {
                           myData=result
                          // setState("0_userdata.0.Tabellen.IPDeviceERROR", result)
                           // console.log(result);
                        });} else {
                        
                        exec((['"C:\\\\Program Files (x86)\\\\Nmap\\\\nmap" ','-sPR  -e ',onlyWinEthernetIF,' --dns-servers ',dnsServer,' ',ipbereich].join('')), function (error, result, stderr) {
                           myData=result
                        });}
                        
                        let timeout = setTimeout(function () {
                        // myData=getState("0_userdata.0.Tabellen.DeviceIPFake").val       //   FÜR TEST
                        ////////////////////////////////log(myData)
                         if (!myData.includes("xxxx")) {
                        
                        var myTimeScanArr=myData.match(/(scanned in) (\d+\.\d+ seconds)/g); //log(myTimeScan)
                        
                        // myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+.\d+.\d+.\d+)\)|(fritz.\w+)\s+\((\d+.\d+.\d+.\d+)\)|(\d+.\d+.\d+.\d+)$/g)
                        
                        myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+\.\d+\.\d+\.\d+)\)|(fritz\.\w+)\s+\((\d+\.\d+\.\d+\.\d+)\)|(\d+\.\d+\.\d+\.\d+)$/gm)
                        // log(myArr.toString())
                        //myArr.push("10.0.1.200")
                        //myArr.push("for iobroker (10.0.1.200)")
                        //myArr.push("10.0.1.201")
                        //myArr.push("fritz.repeater (10.0.1.200)")
                        /////////////////////////////////////log(myArr.toString())
                        if(myArr!=null) {
                        let var1; let var2; let var3; let varOhneName=[];
                        var myObj=[]
                        for(var i=0;i<myArr.length;i++) {
                            var1="na"; var2="na";
                            var1=myArr[i].replace(/(for .+) \(\d+\.\d+\.\d+\.\d+\)/,"$1") 
                            var1=var1.replace(/(.+)\(.+\)/," $1")
                            var2=myArr[i].replace(/for .+ \((\d+\.\d+\.\d+\.\d+)\)/,"$1");//log(var2)
                            var2=var2.replace(/.+\((.+)\)/,"$1")
                            
                            varOhneName=myArr[i].match(/^(\d+\.\d+\.\d+\.\d+)$/) 
                            if (varOhneName!=null) {var1=varOhneName[0];var2=varOhneName[0]}
                            var3="true";
                           /* var2=var2.replace(/[(,)]/g,"")
                            for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                                      //log(index)
                                                       if ((var2.trim()).match(index)) {var1="for "+myDeviceNames[index];
                                                      // log(val0+" - "+index)
                                                         }
                        
                            }  */
                        
                        
                          let help=[var1.trim(),var2.trim(),var3]
                          if (!(var1=="na" || var2=="na")) myObj.push(help)
                          if (rootcount) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                                          myObjOld.push(help);    
                                          }
                        }
                          if (rootcount) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                                         // myObjOld.push(help);
                                          createState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld,  { name: 'Device_Collection', desc: 'Device_Collection', type: 'array',read: true, write: true });
                                           
                                          }
                                          else{
                                          myObjOld=getState(dpPrefix+"Tabellen.IPDevices.Device_Collection").val;    
                                          }
                        
                        //log("++++++++++++++++++ "+myObj.toString())
                        
                        //setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())
                           
                           let varhelp1; let varhelp2; let varhelp3="true";    //neue erkannt geräte zu datenbank hinzufügen
                          for (var i=0;i<myObj.length;i++){ 
                               //  log(myObj[i][0]+"-----"+myObjOld[i][0])
                                   if (!myObjOld.toString().includes(myObj[i][1]))  {  varhelp1=myObj[i][0].trim() ; varhelp2=myObj[i][1]; varhelp3="true"; 
                                                                            let help=[varhelp1,varhelp2,varhelp3]
                                                                           if (!(varhelp1.indexOf("scanned")>-1)) myObjOld.push(help)               
                                                             }                       }
                        
                          for (var i=0;i<myObjOld.length;i++){                // ist gerät noch da ???
                               //  log(myObj[i][0]+"-----"+myObjOld[i][0])
                                   if (!myObj.toString().includes(myObjOld[i][1]))  {  varhelp1=myObjOld[i][0].trim() ; varhelp2=myObjOld[i][1]; varhelp3="false"; 
                                                                            let help=[varhelp1,varhelp2,varhelp3]
                                                                            myObj.push(help)               
                                                             }                      }
                         
                           // log("------------------------------------------------"+myObjOld[1].toString())
                        
                            if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) sortiereClient=true
                        
                         /*    if (sortiereClient){ 
                        
                                myObj.sort(function (alpha, beta) {
                                    if (alpha[0].toUpperCase().trim() > beta[0].toUpperCase().trim())
                                       return 1;
                                    if (beta[0].toUpperCase().trim() > alpha[0].toUpperCase().trim())
                                       return -1;
                                    return 0;
                                   });} else {  */
                        if (!sortiereClient){ 
                                   myObj.sort(function (alpha, beta) {
                                    //   if (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")) > parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))
                                     if ((parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                                           return -1;
                                       if ((parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                                           return 1;
                                    return 0;
                                   });  
                                   }
                            var1="scanned in" //nur scanned seconds
                           var3="true"
                           var2=myTimeScanArr[0].replace(/.+ (\d+\.\d+.+$)/,"$1");//log(var2)
                           let help=[var1,var2,var3]
                          if (sortiereClient) help=["xxxx"+var1,var2,var3]
                          myObj.push(help)
                        if (!rootcount)  setState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld)
                        ///////////////////////////log("myObject ------- "+myObj.length.toString()+"---- ")
                         // setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())   // zur fehlersuche
                        for(var i=0;i<myObj.length;i++) {            // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                        
                                  counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                                //  log(myObj[i][0].toString())
                                  val0=myObj[i][0].replace("for","").trim()
                                  val0=val0.replace("."+domainName,"")
                                  val0=val0.replace(/[(,)]/g,"")
                                  val1=myObj[i][1]
                                  val1=val1.replace(/[(,)]/g,"")
                                  
                        for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                                      //log(index)
                                                       if ((val1.trim()).match(index.trim()) && val1.trim().length == index.trim().length) {val0=myDeviceNames[index];
                                                       //log(val0+" - "+index)
                                                         }
                        
                        } 
                        
                                    if (val0.length>=(kuerzungNamen)+2)  val0=val0.substring(0,kuerzungNamen)+" ..." 
                                  
                                  var val2help=myObj[i][2]
                              if (!sortiereClient){ 
                                  if (val2help=="false") {val2=symbolKO;
                        
                                                          val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                                          val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{val2=symbolOK}        
                        
                                  
                        
                             
                             if(val0=="scanned in") {val2=symbolWARN;val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter+"</i>"; val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>"}
                             tabelleBind(); }//HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                             else {let help=[val0.trim(),val1,val2help];myObjExtra.push(help);}
                           //}
                        }; //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                        
                            if (sortiereClient){ 
                               counter=-1;
                                myObjExtra.sort(function (alpha, beta) {
                                    if ((alpha[0].toUpperCase()).trim() > (beta[0].toUpperCase()).trim())
                                       return 1;
                                    if ((beta[0].toUpperCase()).trim() > (alpha[0].toUpperCase()).trim())
                                       return -1;
                                    return 0;
                                   });} 
                        
                                   for(var i=0;i<myObjExtra.length;i++) {
                                       counter++
                                       json1=val0=myObjExtra[i][0] ;
                                       json2=val1=myObjExtra[i][1] ;
                                       val2help=myObjExtra[i][2] ;
                                        if (val2help=="false") {json3=val2=symbolKO; json5="red";
                                                          val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                                          val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{json3=val2=symbolOK;   json5="green";} 
                                       if(val0=="xxxxscanned in") {json3=val2=symbolWARN;   json5="blue"; json1="Anzahl: "+counter;
                                                                    val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter+" um: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")+"</i>"; 
                                                                    val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>"}
                                         tabelleBind();
                                      json4=pfadBilderMaterialWidget+"fixed-ipaddress_icon.png"
                                       if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) {
                                          if (val2help=="false") {json3=val2=symbolKO_MD; }
                                         makeJsonWidget(json1,json2,json3,json4,json5);}
                                   }
                                  
                        //-------------------------------------------------------------------------------------------------------------------------------------------------
                        //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
                        //-------------------------------------------------------------------------------------------------------------------------------------------------
                        
                              // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
                              let timeout = setTimeout(function () {
                                                                     tabelleFinish();
                                                                     if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                                                                   }, 2000); 
                        
                               }  else {log("no Array","warn")} //Ende Array falsch
                               } else {log("no Data","warn")} // ende daten falsch
                               rootcount=false;
                        }, waitTime); 
                        
                        } // function ende
                        
                        //MAIN:
                         
                        schedule(mySchedule,  function () { 
                         if (!rootcount) writeHTML();
                        // if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                        }); 
                        writeHTML();                                   
                        
                         function tabelleBind(){
                           //  counter=counter+mehrfachTabelle;
                               switch (mehrfachTabelle) { 
                        
                                 case 1: if(counter%2==0)         {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}else    
                                                                  {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}
                                 case 2: if(counter%4==0){
                                            if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                ";\" align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                       else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;
                                              }else{
                                                        if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                       else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;}
                                                            
                                 case 3:if(counter%2==0)   {
                                            if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                       else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                                        else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>";}
                                                                  } break;}else{
                                            if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                       else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                                        else     {htmlOut = htmlOut+"<td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>";}
                                                                  } break;}                                     
                        
                        
                                 case 4:  // counter=counter+8;
                                           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  style=\" border-right: "+trennungsLinie+"px solid "+ farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } // teil1
                                                           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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} //teil 2
                                                                        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></tr>";} //teil 4
                                                                                          else    {htmlOut =htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"  align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                                  } 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  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } //teil 1
                                                           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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} // teil 2
                                                                        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></tr>";} // teil 4
                                                                                          else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                                  } break;}                                    
                                } //switch ende
                        
                        }
                        
                        function tabelleFinish() {
                        
                        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></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></tr>");        
                                         if(counter%3==0)      htmlOut = htmlOut.replace(/<\/td>$/, "</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></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></tr>");
                                         if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</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></tr>");    
                                         if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&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></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="";
                        
                              //  log(" ist htmlUnter - signature "+htmlUnter)
                                  //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                                   var htmlOutVIS="";
                                 //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                                    if (htmlUberschrift) 
                                        { zentriert ? htmlOutVIS=htmlZentriert+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter ;
                        
                                      } else {
                                       zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter;
                        
                                         }
                                         
                        
                          // log("bin raus aus tabelleBind");
                                   if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
                                   
                        
                         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 (braucheMaterialDesignWidgetList) {
                             
                               setState(dpMaterialListWidget,JSON.stringify(myJsonWidget2)); 
                               myJsonWidget2=[];
                        }
                        if (braucheMaterialDesignWidget) {
                          
                          setState(dpMaterialTabelWidget,JSON.stringify(myJsonWidget)); 
                             myJsonWidget=[];
                        }
                        
                        }
                        
                         function makeJsonWidget(vax1,vax2,vax3,vax4,vax5) {
                        //log(vax3+vax6+htmlFeld1)
                           if ( braucheMaterialDesignWidgetList) {
                           myJsonWidget.push({
                               Device : vax4,
                               IP : vax1,
                               Status : vax2,
                               Kategorie : vax3
                           }
                        
                           );}
                        
                        //	log(myJsonWidget)
                        if (braucheMaterialDesignWidget) {
                            let colorIP="lightgreen";
                          //  log(vax3)
                            if (vax3==symbolKO_MD) colorIP="lightcoral";
                            
                        let mysubText = `<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
                                                      <div style="flex: 1;font-size: 16px; color: ${colorIP};">${vax2}</div>
                                                      <div style="color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic; text-align: right;">${vax3}</div>
                                                  </div>`
                             let ip=vax2                     
                          
                             myJsonWidget2.push({
                                       text: vax1,
                                       subText: mysubText,
                                       statusBarColor: vax5,
                                       image: vax4,
                                       imageColor: "",
                                       listType: "text",
                                       showValueLabel: true,
                                       ip: ip, //vax2,
                                       status: vax3
                                   });
                        }
                         }
                        
                        
                        

                        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

                        sigi234S GlasfaserG 2 Antworten Letzte Antwort
                        1
                        • liv-in-skyL liv-in-sky

                          zum test - material design - falls interesse ( @sigi234 ?)

                          Image 4.png Image 5.png

                          • neue datenpunkte erstellen und eintragen
                          • deine aliase wieder zurückkopieren
                          • die anderen einstellungen wieder überprüfen - kannst du alle kopieren und nachträglich die settings von zeile 0 bis 9 drüberkopieren (also neu sind zeile 9 bis 14 ohne 11 - und zeile 57)
                          • bilder für einzelne kategorien ( server, pc, schalter, sensor, ..) sind nicht realisiert
                            bild:

                          fixed-ipaddress_icon.png

                          [{"tpl":"tplVis-materialdesign-Table","data":{"oid":"0_userdata.0.Tabellen.IPDevices_MD_Table","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","countCols":"3","tableLayout":"standard","showHeader":"true","headerTextSize":"headline6","showColumn0":"true","colType0":"image","textAlign0":"left","showColumn1":"true","colType1":"text","textAlign1":"left","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,"showColumn2":"true","colType2":"text","textAlign2":"left","showColumn3":"true","colType3":"text","textAlign3":"center","dataJson":"","colTextSize0":"headline4","label1":"Name","label0":" ","label2":"IP","sortKey0":"name","fontFamily0":"RobotoCondensed-Regular","padding_left0":"10","colTextColor0":"#beb7b7","colorBackground":"#ffffff","colorHeaderRowBackground":"#424242","colorHeaderRowText":"#b6b9b7","borderColor":"#000000","fontFamily1":"RobotoCondensed-Regular","colTextColor1":"","rowHeight":"19","label3":" Status","imageSize3":"20","padding_right3":"-5","imageSize0":"25","colTextSize3":"12px","colTextColor2":"#beb7b7","fontFamily2":"RobotoCondensed-Regular","dividers":"grey"},"style":{"left":"1143px","top":"138px","z-index":"1","width":"586px","height":"786px","overflow-y":"scroll"},"widgetSet":"materialdesign"}]
                          

                          [{"tpl":"tplVis-materialdesign-Icon-List","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":true,"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":"card","itemLayout":"horizontal","listType0":"text","showValueLabel0":"true","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,"maxItemsperRow":"4","json_string_oid":"0_userdata.0.Tabellen.IPDevices_MD_List","labelFontSize":"18","subLabelFontSize":"5","labelFontFamily":"RobotoCondensed-Regular","horizontalIconContainerWidth":"70","buttonHeight":"70","iconHeight":"35","iconItemMinWidth":"300","labelFontColor":"#f3f1f1","valueFontFamily":"RobotoCondensed-Regular","itemBackgroundColor":"#423d3d","valueFontColor":"#f3f1f1","subLabelFontColor":"#f3f1f1","subLabelFontFamily":"RobotoCondensed-Regular","valueFontSize":"12","itemGaps":"5","valueAppendix1":"","label1":"IP"},"style":{"left":"117px","top":"67px","width":"54.88%","height":"87.8%","overflow-y":"auto","background":"#423d3d"},"widgetSet":"materialdesign"}]
                          

                          //@liv-in-sky Januar 2020 7.3-13:15
                          
                          
                          //HIER WIRD PFAD UND FILENAME DEFINIERT
                          const path = "/htmlip.html";                   //FIlenamen definieren
                          const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                          let   braucheEinFile=true;                          // 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=true;             // bei true wird ein html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
                          let   braucheMaterialDesignWidgetList=true;        // bei true wird ein html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
                          let dpVIS="0_userdata.0.Tabellen.IPDevices"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                          let dpMaterialTabelWidget="0_userdata.0.Tabellen.IPDevices_MD_Table"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                          let dpMaterialListWidget="0_userdata.0.Tabellen.IPDevices_MD_List"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                          let pfadBilderMaterialWidget="/vis.0/armin/img/"                       // PFAD zu den bildern, die in die vis geladen wurden/
                          let mySchedule=" */3 * * * * ";                       //jede minute  -  nicht unter eine minute gehen -besser 3 oder 5 minuten nutzen !!!
                          const domainName="fritz.box";                  // domainname in der fritzbox definiert
                          const ipbereich="192.168.178.0/24";           //  gilt nicht für windows
                          const dnsServer="192.168.178.1"               // gilt nicht für windows
                          let sortiereClient=false;                     //true nach client false nach ip
                          const waitTime=20000;                        // falls längere zeit keine daten kommen - diesen wert erhöhn um 5000 (ms)
                          const lastZellColorSetting="lightgreen"      // farbe der zusammenfassung in der letzten zelle der tabelle 
                          const oerationSystemchange=false;              // false ist linux, true ist windows
                          const onlyWinEthernetIF="eth0"                // nur windows über befehl "nmap --iflist" herausfinden
                          const farbeNichtErreichbar="#FFBF00";         // farbe für devices, die gerade nicht online sind
                          const styleNichtErreichbar="i";             // möglich i=schräg, b ist fett und span ist normal - nur eines  davon !!!
                          const kuerzungNamen=23;                      // länge der namen kürzen
                          
                          //hier eintragen für die übersetzung der standardnamen - aliase - rechte seite wird statt linker  angezeigt - die beispiele kann man raus löschen
                          // BITTE AUF DIE KOMMAs ACHTEN
                          const myDeviceNames={ "192.168.178.24"  :"HF Küche Licht",     // ein leeres array wird so erzeugt: const myDeviceNames=[];
                                               "192.168.178.29"  :"TrekStor13",
                                               "192.168.178.10"  :"Proxmox",
                                               "192.168.178.156" :"EchoShow5",
                                               "192.168.178.73"  :"MediaPadT5",
                                               "192.168.178.151" :"FireTab7",
                                               "192.168.178.201" :"VPN Netzwerk",
                                               "192.168.178.126" :"Matrix Büro",
                                               "192.168.178.20"  :"Matrix Küche",
                                               "192.168.178.21"  :"GoSund 2 Matrix",
                                               "192.168.178.155" :"GoSund 3 Freezer",
                                               "192.168.178.150" :"Gosund 1",
                                               "192.168.178.33"  :"SonoffS26",
                                               "192.168.178.77"  :"WerBinIch",
                                               "192.168.178.81"  :"GalaxyTabA16",
                                               "192.168.178.56"  :"FireHDStick",
                                               "192.168.178.148" :"Echo Dot 3",
                                               "192.168.178.118" :"Echo Beige",
                                               "192.168.178.100" :"Echo Plus",
                                               "192.168.178.50"  :"Echo Dot Zimmer",
                                               "192.168.178.68"  :"HF Desk Haupt"
                          
                          }
                          
                          var symbolOK="✔️";     // auch möglich: ="✅"   🟩   ✔️  🌎
                          var symbolKO="🔔";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz  oder : ="❌"  ⚪   🟢 ⚫ ⭕  🔴 🔵  🚫 ⏱ 💀 👍 👎 📑 💲 👀 😡 🟥 ⬜ 🧊 💬 🗑️ 🔔
                          var symbolWARN="ℹ️";    // ="⚠️" oder info: "ℹ️"
                          var symbolKO_MD="🟥"    //symbol für "nicht erreichbar" im MaterialDesign Widget
                          var externalOhneInfo=false;  //noch nicht integriert
                          //---------------------------------------
                          
                          //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
                          var htmlFeld1='Name';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
                          var htmlFeld2='IP';        var Feld2lAlign="left";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
                          var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
                          //-----------------------------------
                          
                          
                          //ÜBERSCHRIFT ÜBER TABELLE
                          let   htmlUberschrift=true;                           // mit Überschrift über der tabelle
                          let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
                          const htmlFeldUeber='IP Devices List';              // Ü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=3;                              // 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="white";                // 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="2";                   // Linie nur unter Spaltenüberschrift - 
                          const farbeLinieUnterUeberschrift="lightblue";
                          const groesseUeberschrift=16;
                          const UeberschriftStyle="normal"                     // möglich "bold"
                          //GANZE TABELLE
                          let abstandZelle="1";
                          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="1200";                                     //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"   ///"Helvetica";
                          const htmlSchriftgroesse="14px";
                          //FELDER UND RAHMEN
                          let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
                          const htmlFarbFelderschrift="#D8D8D8";                  // 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="none";                            // 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 ---------------------SETTING ENDE ----------------------------------------
                          // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                          // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                          
                          
                          
                          const dpPrefix = "javascript."+ instance +".";
                          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:0px 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=\"1px\" 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 3
                          
                          var htmlTabUeber2=  "<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
                          var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                                             "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
                          //------------------------------------------------------
                          var rootcount=true;
                          var myObjOld=[];
                          var myJsonWidget=[]; 
                          var myJsonWidget2=[];
                          var htmlTabUeber="";
                          var htmlOut="";
                          var mix;
                          var counter;
                          //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
                          var val1; var val0; var val2;
                          var json1; var json2; var json3; var json4; var json5;
                          
                          function writeHTML(){
                          
                          
                          htmlOut="";
                          
                          counter=-1;
                          htmlTabUeber="";
                          switch (mehrfachTabelle) { 
                             case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber3;  break;
                             case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
                             case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
                             case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
                          };   
                          if (!UeberschriftSpalten) {htmlTabUeber=""}
                          
                          
                          //--------------------------------------------------------------------------------------------------------------------------------------------------
                          //---------hier kommt eure schleife rein counter++, tabelleBind() und tabelleFinish() müssen so integriert bleiben !!!------------------------------
                          //---------alle valx werte müssen von euch bestimmt werden - val0,val1,val2 !!!---------------------------------------------------------------------
                          //--------------------------------------------------------------------------------------------------------------------------------------------------
                          var myData="xxxxx"; 
                          let myArr=[];
                          let myObjExtra=[];
                          if(oerationSystemchange ==false){
                          exec("sudo -u root nmap -sPR --dns-servers "+dnsServer+" "+ipbereich  , function (error, result, stderr) {
                             myData=result
                            // setState("0_userdata.0.Tabellen.IPDeviceERROR", result)
                             // console.log(result);
                          });} else {
                          
                          exec((['"C:\\\\Program Files (x86)\\\\Nmap\\\\nmap" ','-sPR  -e ',onlyWinEthernetIF,' --dns-servers ',dnsServer,' ',ipbereich].join('')), function (error, result, stderr) {
                             myData=result
                          });}
                          
                          let timeout = setTimeout(function () {
                          // myData=getState("0_userdata.0.Tabellen.DeviceIPFake").val       //   FÜR TEST
                          ////////////////////////////////log(myData)
                           if (!myData.includes("xxxx")) {
                          
                          var myTimeScanArr=myData.match(/(scanned in) (\d+\.\d+ seconds)/g); //log(myTimeScan)
                          
                          // myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+.\d+.\d+.\d+)\)|(fritz.\w+)\s+\((\d+.\d+.\d+.\d+)\)|(\d+.\d+.\d+.\d+)$/g)
                          
                          myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+\.\d+\.\d+\.\d+)\)|(fritz\.\w+)\s+\((\d+\.\d+\.\d+\.\d+)\)|(\d+\.\d+\.\d+\.\d+)$/gm)
                          // log(myArr.toString())
                          //myArr.push("10.0.1.200")
                          //myArr.push("for iobroker (10.0.1.200)")
                          //myArr.push("10.0.1.201")
                          //myArr.push("fritz.repeater (10.0.1.200)")
                          /////////////////////////////////////log(myArr.toString())
                          if(myArr!=null) {
                          let var1; let var2; let var3; let varOhneName=[];
                          var myObj=[]
                          for(var i=0;i<myArr.length;i++) {
                              var1="na"; var2="na";
                              var1=myArr[i].replace(/(for .+) \(\d+\.\d+\.\d+\.\d+\)/,"$1") 
                              var1=var1.replace(/(.+)\(.+\)/," $1")
                              var2=myArr[i].replace(/for .+ \((\d+\.\d+\.\d+\.\d+)\)/,"$1");//log(var2)
                              var2=var2.replace(/.+\((.+)\)/,"$1")
                              
                              varOhneName=myArr[i].match(/^(\d+\.\d+\.\d+\.\d+)$/) 
                              if (varOhneName!=null) {var1=varOhneName[0];var2=varOhneName[0]}
                              var3="true";
                             /* var2=var2.replace(/[(,)]/g,"")
                              for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                                        //log(index)
                                                         if ((var2.trim()).match(index)) {var1="for "+myDeviceNames[index];
                                                        // log(val0+" - "+index)
                                                           }
                          
                              }  */
                          
                          
                            let help=[var1.trim(),var2.trim(),var3]
                            if (!(var1=="na" || var2=="na")) myObj.push(help)
                            if (rootcount) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                                            myObjOld.push(help);    
                                            }
                          }
                            if (rootcount) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                                           // myObjOld.push(help);
                                            createState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld,  { name: 'Device_Collection', desc: 'Device_Collection', type: 'array',read: true, write: true });
                                             
                                            }
                                            else{
                                            myObjOld=getState(dpPrefix+"Tabellen.IPDevices.Device_Collection").val;    
                                            }
                          
                          //log("++++++++++++++++++ "+myObj.toString())
                          
                          //setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())
                             
                             let varhelp1; let varhelp2; let varhelp3="true";    //neue erkannt geräte zu datenbank hinzufügen
                            for (var i=0;i<myObj.length;i++){ 
                                 //  log(myObj[i][0]+"-----"+myObjOld[i][0])
                                     if (!myObjOld.toString().includes(myObj[i][1]))  {  varhelp1=myObj[i][0].trim() ; varhelp2=myObj[i][1]; varhelp3="true"; 
                                                                              let help=[varhelp1,varhelp2,varhelp3]
                                                                             if (!(varhelp1.indexOf("scanned")>-1)) myObjOld.push(help)               
                                                               }                       }
                          
                            for (var i=0;i<myObjOld.length;i++){                // ist gerät noch da ???
                                 //  log(myObj[i][0]+"-----"+myObjOld[i][0])
                                     if (!myObj.toString().includes(myObjOld[i][1]))  {  varhelp1=myObjOld[i][0].trim() ; varhelp2=myObjOld[i][1]; varhelp3="false"; 
                                                                              let help=[varhelp1,varhelp2,varhelp3]
                                                                              myObj.push(help)               
                                                               }                      }
                           
                             // log("------------------------------------------------"+myObjOld[1].toString())
                          
                              if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) sortiereClient=true
                          
                           /*    if (sortiereClient){ 
                          
                                  myObj.sort(function (alpha, beta) {
                                      if (alpha[0].toUpperCase().trim() > beta[0].toUpperCase().trim())
                                         return 1;
                                      if (beta[0].toUpperCase().trim() > alpha[0].toUpperCase().trim())
                                         return -1;
                                      return 0;
                                     });} else {  */
                          if (!sortiereClient){ 
                                     myObj.sort(function (alpha, beta) {
                                      //   if (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")) > parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))
                                       if ((parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                                             return -1;
                                         if ((parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                                             return 1;
                                      return 0;
                                     });  
                                     }
                              var1="scanned in" //nur scanned seconds
                             var3="true"
                             var2=myTimeScanArr[0].replace(/.+ (\d+\.\d+.+$)/,"$1");//log(var2)
                             let help=[var1,var2,var3]
                            if (sortiereClient) help=["xxxx"+var1,var2,var3]
                            myObj.push(help)
                          if (!rootcount)  setState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld)
                          ///////////////////////////log("myObject ------- "+myObj.length.toString()+"---- ")
                           // setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())   // zur fehlersuche
                          for(var i=0;i<myObj.length;i++) {            // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                          
                                    counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                                  //  log(myObj[i][0].toString())
                                    val0=myObj[i][0].replace("for","").trim()
                                    val0=val0.replace("."+domainName,"")
                                    val0=val0.replace(/[(,)]/g,"")
                                    val1=myObj[i][1]
                                    val1=val1.replace(/[(,)]/g,"")
                                    
                          for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                                        //log(index)
                                                         if ((val1.trim()).match(index.trim()) && val1.trim().length == index.trim().length) {val0=myDeviceNames[index];
                                                         //log(val0+" - "+index)
                                                           }
                          
                          } 
                          
                                      if (val0.length>=(kuerzungNamen)+2)  val0=val0.substring(0,kuerzungNamen)+" ..." 
                                    
                                    var val2help=myObj[i][2]
                                if (!sortiereClient){ 
                                    if (val2help=="false") {val2=symbolKO;
                          
                                                            val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                                            val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{val2=symbolOK}        
                          
                                    
                          
                               
                               if(val0=="scanned in") {val2=symbolWARN;val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter+"</i>"; val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>"}
                               tabelleBind(); }//HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                               else {let help=[val0.trim(),val1,val2help];myObjExtra.push(help);}
                             //}
                          }; //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                          
                              if (sortiereClient){ 
                                 counter=-1;
                                  myObjExtra.sort(function (alpha, beta) {
                                      if ((alpha[0].toUpperCase()).trim() > (beta[0].toUpperCase()).trim())
                                         return 1;
                                      if ((beta[0].toUpperCase()).trim() > (alpha[0].toUpperCase()).trim())
                                         return -1;
                                      return 0;
                                     });} 
                          
                                     for(var i=0;i<myObjExtra.length;i++) {
                                         counter++
                                         json1=val0=myObjExtra[i][0] ;
                                         json2=val1=myObjExtra[i][1] ;
                                         val2help=myObjExtra[i][2] ;
                                          if (val2help=="false") {json3=val2=symbolKO; json5="red";
                                                            val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                                            val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{json3=val2=symbolOK;   json5="green";} 
                                         if(val0=="xxxxscanned in") {json3=val2=symbolWARN;   json5="blue"; json1="Anzahl: "+counter;
                                                                      val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter+" um: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")+"</i>"; 
                                                                      val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>"}
                                           tabelleBind();
                                        json4=pfadBilderMaterialWidget+"fixed-ipaddress_icon.png"
                                         if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) {
                                            if (val2help=="false") {json3=val2=symbolKO_MD; }
                                           makeJsonWidget(json1,json2,json3,json4,json5);}
                                     }
                                    
                          //-------------------------------------------------------------------------------------------------------------------------------------------------
                          //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
                          //-------------------------------------------------------------------------------------------------------------------------------------------------
                          
                                // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
                                let timeout = setTimeout(function () {
                                                                       tabelleFinish();
                                                                       if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                                                                     }, 2000); 
                          
                                 }  else {log("no Array","warn")} //Ende Array falsch
                                 } else {log("no Data","warn")} // ende daten falsch
                                 rootcount=false;
                          }, waitTime); 
                          
                          } // function ende
                          
                          //MAIN:
                           
                          schedule(mySchedule,  function () { 
                           if (!rootcount) writeHTML();
                          // if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                          }); 
                          writeHTML();                                   
                          
                           function tabelleBind(){
                             //  counter=counter+mehrfachTabelle;
                                 switch (mehrfachTabelle) { 
                          
                                   case 1: if(counter%2==0)         {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}else    
                                                                    {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}
                                   case 2: if(counter%4==0){
                                              if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                  ";\" align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                         else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;
                                                }else{
                                                          if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                  ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                         else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;}
                                                              
                                   case 3:if(counter%2==0)   {
                                              if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                  ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                         else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                                          else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>";}
                                                                    } break;}else{
                                              if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                  ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                         else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                                          else     {htmlOut = htmlOut+"<td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>";}
                                                                    } break;}                                     
                          
                          
                                   case 4:  // counter=counter+8;
                                             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  style=\" border-right: "+trennungsLinie+"px solid "+ farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } // teil1
                                                             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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} //teil 2
                                                                          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></tr>";} //teil 4
                                                                                            else    {htmlOut =htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"  align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                                    } 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  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } //teil 1
                                                             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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} // teil 2
                                                                          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></tr>";} // teil 4
                                                                                            else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                                    } break;}                                    
                                  } //switch ende
                          
                          }
                          
                          function tabelleFinish() {
                          
                          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></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></tr>");        
                                           if(counter%3==0)      htmlOut = htmlOut.replace(/<\/td>$/, "</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></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></tr>");
                                           if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</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></tr>");    
                                           if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&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></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="";
                          
                                //  log(" ist htmlUnter - signature "+htmlUnter)
                                    //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                                     var htmlOutVIS="";
                                   //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                                      if (htmlUberschrift) 
                                          { zentriert ? htmlOutVIS=htmlZentriert+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter ;
                          
                                        } else {
                                         zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter;
                          
                                           }
                                           
                          
                            // log("bin raus aus tabelleBind");
                                     if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
                                     
                          
                           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 (braucheMaterialDesignWidgetList) {
                               
                                 setState(dpMaterialListWidget,JSON.stringify(myJsonWidget2)); 
                                 myJsonWidget2=[];
                          }
                          if (braucheMaterialDesignWidget) {
                            
                            setState(dpMaterialTabelWidget,JSON.stringify(myJsonWidget)); 
                               myJsonWidget=[];
                          }
                          
                          }
                          
                           function makeJsonWidget(vax1,vax2,vax3,vax4,vax5) {
                          //log(vax3+vax6+htmlFeld1)
                             if ( braucheMaterialDesignWidgetList) {
                             myJsonWidget.push({
                                 Device : vax4,
                                 IP : vax1,
                                 Status : vax2,
                                 Kategorie : vax3
                             }
                          
                             );}
                          
                          //	log(myJsonWidget)
                          if (braucheMaterialDesignWidget) {
                              let colorIP="lightgreen";
                            //  log(vax3)
                              if (vax3==symbolKO_MD) colorIP="lightcoral";
                              
                          let mysubText = `<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
                                                        <div style="flex: 1;font-size: 16px; color: ${colorIP};">${vax2}</div>
                                                        <div style="color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic; text-align: right;">${vax3}</div>
                                                    </div>`
                               let ip=vax2                     
                            
                               myJsonWidget2.push({
                                         text: vax1,
                                         subText: mysubText,
                                         statusBarColor: vax5,
                                         image: vax4,
                                         imageColor: "",
                                         listType: "text",
                                         showValueLabel: true,
                                         ip: ip, //vax2,
                                         status: vax3
                                     });
                          }
                           }
                          
                          
                          

                          sigi234S Online
                          sigi234S Online
                          sigi234
                          Forum Testing Most Active
                          schrieb am zuletzt editiert von sigi234
                          #147

                          @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                          zum test - material design - falls interesse ( @sigi234 ?)

                          Immer :grinning:

                          Läuft! :+1:

                          Screenshot (1940).png

                          Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                          Immer Daten sichern!

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

                            zum test - material design - falls interesse ( @sigi234 ?)

                            Image 4.png Image 5.png

                            • neue datenpunkte erstellen und eintragen
                            • deine aliase wieder zurückkopieren
                            • die anderen einstellungen wieder überprüfen - kannst du alle kopieren und nachträglich die settings von zeile 0 bis 9 drüberkopieren (also neu sind zeile 9 bis 14 ohne 11 - und zeile 57)
                            • bilder für einzelne kategorien ( server, pc, schalter, sensor, ..) sind nicht realisiert
                              bild:

                            fixed-ipaddress_icon.png

                            [{"tpl":"tplVis-materialdesign-Table","data":{"oid":"0_userdata.0.Tabellen.IPDevices_MD_Table","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","countCols":"3","tableLayout":"standard","showHeader":"true","headerTextSize":"headline6","showColumn0":"true","colType0":"image","textAlign0":"left","showColumn1":"true","colType1":"text","textAlign1":"left","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,"showColumn2":"true","colType2":"text","textAlign2":"left","showColumn3":"true","colType3":"text","textAlign3":"center","dataJson":"","colTextSize0":"headline4","label1":"Name","label0":" ","label2":"IP","sortKey0":"name","fontFamily0":"RobotoCondensed-Regular","padding_left0":"10","colTextColor0":"#beb7b7","colorBackground":"#ffffff","colorHeaderRowBackground":"#424242","colorHeaderRowText":"#b6b9b7","borderColor":"#000000","fontFamily1":"RobotoCondensed-Regular","colTextColor1":"","rowHeight":"19","label3":" Status","imageSize3":"20","padding_right3":"-5","imageSize0":"25","colTextSize3":"12px","colTextColor2":"#beb7b7","fontFamily2":"RobotoCondensed-Regular","dividers":"grey"},"style":{"left":"1143px","top":"138px","z-index":"1","width":"586px","height":"786px","overflow-y":"scroll"},"widgetSet":"materialdesign"}]
                            

                            [{"tpl":"tplVis-materialdesign-Icon-List","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":true,"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":"card","itemLayout":"horizontal","listType0":"text","showValueLabel0":"true","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,"maxItemsperRow":"4","json_string_oid":"0_userdata.0.Tabellen.IPDevices_MD_List","labelFontSize":"18","subLabelFontSize":"5","labelFontFamily":"RobotoCondensed-Regular","horizontalIconContainerWidth":"70","buttonHeight":"70","iconHeight":"35","iconItemMinWidth":"300","labelFontColor":"#f3f1f1","valueFontFamily":"RobotoCondensed-Regular","itemBackgroundColor":"#423d3d","valueFontColor":"#f3f1f1","subLabelFontColor":"#f3f1f1","subLabelFontFamily":"RobotoCondensed-Regular","valueFontSize":"12","itemGaps":"5","valueAppendix1":"","label1":"IP"},"style":{"left":"117px","top":"67px","width":"54.88%","height":"87.8%","overflow-y":"auto","background":"#423d3d"},"widgetSet":"materialdesign"}]
                            

                            //@liv-in-sky Januar 2020 7.3-13:15
                            
                            
                            //HIER WIRD PFAD UND FILENAME DEFINIERT
                            const path = "/htmlip.html";                   //FIlenamen definieren
                            const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                            let   braucheEinFile=true;                          // 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=true;             // bei true wird ein html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
                            let   braucheMaterialDesignWidgetList=true;        // bei true wird ein html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
                            let dpVIS="0_userdata.0.Tabellen.IPDevices"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                            let dpMaterialTabelWidget="0_userdata.0.Tabellen.IPDevices_MD_Table"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                            let dpMaterialListWidget="0_userdata.0.Tabellen.IPDevices_MD_List"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                            let pfadBilderMaterialWidget="/vis.0/armin/img/"                       // PFAD zu den bildern, die in die vis geladen wurden/
                            let mySchedule=" */3 * * * * ";                       //jede minute  -  nicht unter eine minute gehen -besser 3 oder 5 minuten nutzen !!!
                            const domainName="fritz.box";                  // domainname in der fritzbox definiert
                            const ipbereich="192.168.178.0/24";           //  gilt nicht für windows
                            const dnsServer="192.168.178.1"               // gilt nicht für windows
                            let sortiereClient=false;                     //true nach client false nach ip
                            const waitTime=20000;                        // falls längere zeit keine daten kommen - diesen wert erhöhn um 5000 (ms)
                            const lastZellColorSetting="lightgreen"      // farbe der zusammenfassung in der letzten zelle der tabelle 
                            const oerationSystemchange=false;              // false ist linux, true ist windows
                            const onlyWinEthernetIF="eth0"                // nur windows über befehl "nmap --iflist" herausfinden
                            const farbeNichtErreichbar="#FFBF00";         // farbe für devices, die gerade nicht online sind
                            const styleNichtErreichbar="i";             // möglich i=schräg, b ist fett und span ist normal - nur eines  davon !!!
                            const kuerzungNamen=23;                      // länge der namen kürzen
                            
                            //hier eintragen für die übersetzung der standardnamen - aliase - rechte seite wird statt linker  angezeigt - die beispiele kann man raus löschen
                            // BITTE AUF DIE KOMMAs ACHTEN
                            const myDeviceNames={ "192.168.178.24"  :"HF Küche Licht",     // ein leeres array wird so erzeugt: const myDeviceNames=[];
                                                 "192.168.178.29"  :"TrekStor13",
                                                 "192.168.178.10"  :"Proxmox",
                                                 "192.168.178.156" :"EchoShow5",
                                                 "192.168.178.73"  :"MediaPadT5",
                                                 "192.168.178.151" :"FireTab7",
                                                 "192.168.178.201" :"VPN Netzwerk",
                                                 "192.168.178.126" :"Matrix Büro",
                                                 "192.168.178.20"  :"Matrix Küche",
                                                 "192.168.178.21"  :"GoSund 2 Matrix",
                                                 "192.168.178.155" :"GoSund 3 Freezer",
                                                 "192.168.178.150" :"Gosund 1",
                                                 "192.168.178.33"  :"SonoffS26",
                                                 "192.168.178.77"  :"WerBinIch",
                                                 "192.168.178.81"  :"GalaxyTabA16",
                                                 "192.168.178.56"  :"FireHDStick",
                                                 "192.168.178.148" :"Echo Dot 3",
                                                 "192.168.178.118" :"Echo Beige",
                                                 "192.168.178.100" :"Echo Plus",
                                                 "192.168.178.50"  :"Echo Dot Zimmer",
                                                 "192.168.178.68"  :"HF Desk Haupt"
                            
                            }
                            
                            var symbolOK="✔️";     // auch möglich: ="✅"   🟩   ✔️  🌎
                            var symbolKO="🔔";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz  oder : ="❌"  ⚪   🟢 ⚫ ⭕  🔴 🔵  🚫 ⏱ 💀 👍 👎 📑 💲 👀 😡 🟥 ⬜ 🧊 💬 🗑️ 🔔
                            var symbolWARN="ℹ️";    // ="⚠️" oder info: "ℹ️"
                            var symbolKO_MD="🟥"    //symbol für "nicht erreichbar" im MaterialDesign Widget
                            var externalOhneInfo=false;  //noch nicht integriert
                            //---------------------------------------
                            
                            //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
                            var htmlFeld1='Name';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
                            var htmlFeld2='IP';        var Feld2lAlign="left";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
                            var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
                            //-----------------------------------
                            
                            
                            //ÜBERSCHRIFT ÜBER TABELLE
                            let   htmlUberschrift=true;                           // mit Überschrift über der tabelle
                            let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
                            const htmlFeldUeber='IP Devices List';              // Ü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=3;                              // 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="white";                // 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="2";                   // Linie nur unter Spaltenüberschrift - 
                            const farbeLinieUnterUeberschrift="lightblue";
                            const groesseUeberschrift=16;
                            const UeberschriftStyle="normal"                     // möglich "bold"
                            //GANZE TABELLE
                            let abstandZelle="1";
                            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="1200";                                     //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"   ///"Helvetica";
                            const htmlSchriftgroesse="14px";
                            //FELDER UND RAHMEN
                            let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
                            const htmlFarbFelderschrift="#D8D8D8";                  // 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="none";                            // 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 ---------------------SETTING ENDE ----------------------------------------
                            // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                            // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                            
                            
                            
                            const dpPrefix = "javascript."+ instance +".";
                            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:0px 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=\"1px\" 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 3
                            
                            var htmlTabUeber2=  "<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
                            var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                                               "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
                            //------------------------------------------------------
                            var rootcount=true;
                            var myObjOld=[];
                            var myJsonWidget=[]; 
                            var myJsonWidget2=[];
                            var htmlTabUeber="";
                            var htmlOut="";
                            var mix;
                            var counter;
                            //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
                            var val1; var val0; var val2;
                            var json1; var json2; var json3; var json4; var json5;
                            
                            function writeHTML(){
                            
                            
                            htmlOut="";
                            
                            counter=-1;
                            htmlTabUeber="";
                            switch (mehrfachTabelle) { 
                               case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber3;  break;
                               case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
                               case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
                               case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber2_1+htmlTabUeber3; break;
                            };   
                            if (!UeberschriftSpalten) {htmlTabUeber=""}
                            
                            
                            //--------------------------------------------------------------------------------------------------------------------------------------------------
                            //---------hier kommt eure schleife rein counter++, tabelleBind() und tabelleFinish() müssen so integriert bleiben !!!------------------------------
                            //---------alle valx werte müssen von euch bestimmt werden - val0,val1,val2 !!!---------------------------------------------------------------------
                            //--------------------------------------------------------------------------------------------------------------------------------------------------
                            var myData="xxxxx"; 
                            let myArr=[];
                            let myObjExtra=[];
                            if(oerationSystemchange ==false){
                            exec("sudo -u root nmap -sPR --dns-servers "+dnsServer+" "+ipbereich  , function (error, result, stderr) {
                               myData=result
                              // setState("0_userdata.0.Tabellen.IPDeviceERROR", result)
                               // console.log(result);
                            });} else {
                            
                            exec((['"C:\\\\Program Files (x86)\\\\Nmap\\\\nmap" ','-sPR  -e ',onlyWinEthernetIF,' --dns-servers ',dnsServer,' ',ipbereich].join('')), function (error, result, stderr) {
                               myData=result
                            });}
                            
                            let timeout = setTimeout(function () {
                            // myData=getState("0_userdata.0.Tabellen.DeviceIPFake").val       //   FÜR TEST
                            ////////////////////////////////log(myData)
                             if (!myData.includes("xxxx")) {
                            
                            var myTimeScanArr=myData.match(/(scanned in) (\d+\.\d+ seconds)/g); //log(myTimeScan)
                            
                            // myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+.\d+.\d+.\d+)\)|(fritz.\w+)\s+\((\d+.\d+.\d+.\d+)\)|(\d+.\d+.\d+.\d+)$/g)
                            
                            myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+\.\d+\.\d+\.\d+)\)|(fritz\.\w+)\s+\((\d+\.\d+\.\d+\.\d+)\)|(\d+\.\d+\.\d+\.\d+)$/gm)
                            // log(myArr.toString())
                            //myArr.push("10.0.1.200")
                            //myArr.push("for iobroker (10.0.1.200)")
                            //myArr.push("10.0.1.201")
                            //myArr.push("fritz.repeater (10.0.1.200)")
                            /////////////////////////////////////log(myArr.toString())
                            if(myArr!=null) {
                            let var1; let var2; let var3; let varOhneName=[];
                            var myObj=[]
                            for(var i=0;i<myArr.length;i++) {
                                var1="na"; var2="na";
                                var1=myArr[i].replace(/(for .+) \(\d+\.\d+\.\d+\.\d+\)/,"$1") 
                                var1=var1.replace(/(.+)\(.+\)/," $1")
                                var2=myArr[i].replace(/for .+ \((\d+\.\d+\.\d+\.\d+)\)/,"$1");//log(var2)
                                var2=var2.replace(/.+\((.+)\)/,"$1")
                                
                                varOhneName=myArr[i].match(/^(\d+\.\d+\.\d+\.\d+)$/) 
                                if (varOhneName!=null) {var1=varOhneName[0];var2=varOhneName[0]}
                                var3="true";
                               /* var2=var2.replace(/[(,)]/g,"")
                                for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                                          //log(index)
                                                           if ((var2.trim()).match(index)) {var1="for "+myDeviceNames[index];
                                                          // log(val0+" - "+index)
                                                             }
                            
                                }  */
                            
                            
                              let help=[var1.trim(),var2.trim(),var3]
                              if (!(var1=="na" || var2=="na")) myObj.push(help)
                              if (rootcount) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                                              myObjOld.push(help);    
                                              }
                            }
                              if (rootcount) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                                             // myObjOld.push(help);
                                              createState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld,  { name: 'Device_Collection', desc: 'Device_Collection', type: 'array',read: true, write: true });
                                               
                                              }
                                              else{
                                              myObjOld=getState(dpPrefix+"Tabellen.IPDevices.Device_Collection").val;    
                                              }
                            
                            //log("++++++++++++++++++ "+myObj.toString())
                            
                            //setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())
                               
                               let varhelp1; let varhelp2; let varhelp3="true";    //neue erkannt geräte zu datenbank hinzufügen
                              for (var i=0;i<myObj.length;i++){ 
                                   //  log(myObj[i][0]+"-----"+myObjOld[i][0])
                                       if (!myObjOld.toString().includes(myObj[i][1]))  {  varhelp1=myObj[i][0].trim() ; varhelp2=myObj[i][1]; varhelp3="true"; 
                                                                                let help=[varhelp1,varhelp2,varhelp3]
                                                                               if (!(varhelp1.indexOf("scanned")>-1)) myObjOld.push(help)               
                                                                 }                       }
                            
                              for (var i=0;i<myObjOld.length;i++){                // ist gerät noch da ???
                                   //  log(myObj[i][0]+"-----"+myObjOld[i][0])
                                       if (!myObj.toString().includes(myObjOld[i][1]))  {  varhelp1=myObjOld[i][0].trim() ; varhelp2=myObjOld[i][1]; varhelp3="false"; 
                                                                                let help=[varhelp1,varhelp2,varhelp3]
                                                                                myObj.push(help)               
                                                                 }                      }
                             
                               // log("------------------------------------------------"+myObjOld[1].toString())
                            
                                if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) sortiereClient=true
                            
                             /*    if (sortiereClient){ 
                            
                                    myObj.sort(function (alpha, beta) {
                                        if (alpha[0].toUpperCase().trim() > beta[0].toUpperCase().trim())
                                           return 1;
                                        if (beta[0].toUpperCase().trim() > alpha[0].toUpperCase().trim())
                                           return -1;
                                        return 0;
                                       });} else {  */
                            if (!sortiereClient){ 
                                       myObj.sort(function (alpha, beta) {
                                        //   if (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")) > parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))
                                         if ((parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                                               return -1;
                                           if ((parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                                               return 1;
                                        return 0;
                                       });  
                                       }
                                var1="scanned in" //nur scanned seconds
                               var3="true"
                               var2=myTimeScanArr[0].replace(/.+ (\d+\.\d+.+$)/,"$1");//log(var2)
                               let help=[var1,var2,var3]
                              if (sortiereClient) help=["xxxx"+var1,var2,var3]
                              myObj.push(help)
                            if (!rootcount)  setState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld)
                            ///////////////////////////log("myObject ------- "+myObj.length.toString()+"---- ")
                             // setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())   // zur fehlersuche
                            for(var i=0;i<myObj.length;i++) {            // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                            
                                      counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                                    //  log(myObj[i][0].toString())
                                      val0=myObj[i][0].replace("for","").trim()
                                      val0=val0.replace("."+domainName,"")
                                      val0=val0.replace(/[(,)]/g,"")
                                      val1=myObj[i][1]
                                      val1=val1.replace(/[(,)]/g,"")
                                      
                            for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                                          //log(index)
                                                           if ((val1.trim()).match(index.trim()) && val1.trim().length == index.trim().length) {val0=myDeviceNames[index];
                                                           //log(val0+" - "+index)
                                                             }
                            
                            } 
                            
                                        if (val0.length>=(kuerzungNamen)+2)  val0=val0.substring(0,kuerzungNamen)+" ..." 
                                      
                                      var val2help=myObj[i][2]
                                  if (!sortiereClient){ 
                                      if (val2help=="false") {val2=symbolKO;
                            
                                                              val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                                              val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{val2=symbolOK}        
                            
                                      
                            
                                 
                                 if(val0=="scanned in") {val2=symbolWARN;val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter+"</i>"; val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>"}
                                 tabelleBind(); }//HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                                 else {let help=[val0.trim(),val1,val2help];myObjExtra.push(help);}
                               //}
                            }; //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                            
                                if (sortiereClient){ 
                                   counter=-1;
                                    myObjExtra.sort(function (alpha, beta) {
                                        if ((alpha[0].toUpperCase()).trim() > (beta[0].toUpperCase()).trim())
                                           return 1;
                                        if ((beta[0].toUpperCase()).trim() > (alpha[0].toUpperCase()).trim())
                                           return -1;
                                        return 0;
                                       });} 
                            
                                       for(var i=0;i<myObjExtra.length;i++) {
                                           counter++
                                           json1=val0=myObjExtra[i][0] ;
                                           json2=val1=myObjExtra[i][1] ;
                                           val2help=myObjExtra[i][2] ;
                                            if (val2help=="false") {json3=val2=symbolKO; json5="red";
                                                              val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                                              val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{json3=val2=symbolOK;   json5="green";} 
                                           if(val0=="xxxxscanned in") {json3=val2=symbolWARN;   json5="blue"; json1="Anzahl: "+counter;
                                                                        val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter+" um: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")+"</i>"; 
                                                                        val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>"}
                                             tabelleBind();
                                          json4=pfadBilderMaterialWidget+"fixed-ipaddress_icon.png"
                                           if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) {
                                              if (val2help=="false") {json3=val2=symbolKO_MD; }
                                             makeJsonWidget(json1,json2,json3,json4,json5);}
                                       }
                                      
                            //-------------------------------------------------------------------------------------------------------------------------------------------------
                            //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
                            //-------------------------------------------------------------------------------------------------------------------------------------------------
                            
                                  // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
                                  let timeout = setTimeout(function () {
                                                                         tabelleFinish();
                                                                         if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                                                                       }, 2000); 
                            
                                   }  else {log("no Array","warn")} //Ende Array falsch
                                   } else {log("no Data","warn")} // ende daten falsch
                                   rootcount=false;
                            }, waitTime); 
                            
                            } // function ende
                            
                            //MAIN:
                             
                            schedule(mySchedule,  function () { 
                             if (!rootcount) writeHTML();
                            // if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                            }); 
                            writeHTML();                                   
                            
                             function tabelleBind(){
                               //  counter=counter+mehrfachTabelle;
                                   switch (mehrfachTabelle) { 
                            
                                     case 1: if(counter%2==0)         {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}else    
                                                                      {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}
                                     case 2: if(counter%4==0){
                                                if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                    ";\" align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                           else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;
                                                  }else{
                                                            if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                    ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                           else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;}
                                                                
                                     case 3:if(counter%2==0)   {
                                                if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                    ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                           else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                                            else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>";}
                                                                      } break;}else{
                                                if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                    ";\"align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                           else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                                            else     {htmlOut = htmlOut+"<td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>";}
                                                                      } break;}                                     
                            
                            
                                     case 4:  // counter=counter+8;
                                               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  style=\" border-right: "+trennungsLinie+"px solid "+ farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } // teil1
                                                               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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} //teil 2
                                                                            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></tr>";} //teil 4
                                                                                              else    {htmlOut =htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"  align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                                      } 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  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } //teil 1
                                                               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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} // teil 2
                                                                            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></tr>";} // teil 4
                                                                                              else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                                      } break;}                                    
                                    } //switch ende
                            
                            }
                            
                            function tabelleFinish() {
                            
                            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></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></tr>");        
                                             if(counter%3==0)      htmlOut = htmlOut.replace(/<\/td>$/, "</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></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></tr>");
                                             if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</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></tr>");    
                                             if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&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></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="";
                            
                                  //  log(" ist htmlUnter - signature "+htmlUnter)
                                      //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                                       var htmlOutVIS="";
                                     //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                                        if (htmlUberschrift) 
                                            { zentriert ? htmlOutVIS=htmlZentriert+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter ;
                            
                                          } else {
                                           zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter;
                            
                                             }
                                             
                            
                              // log("bin raus aus tabelleBind");
                                       if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
                                       
                            
                             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 (braucheMaterialDesignWidgetList) {
                                 
                                   setState(dpMaterialListWidget,JSON.stringify(myJsonWidget2)); 
                                   myJsonWidget2=[];
                            }
                            if (braucheMaterialDesignWidget) {
                              
                              setState(dpMaterialTabelWidget,JSON.stringify(myJsonWidget)); 
                                 myJsonWidget=[];
                            }
                            
                            }
                            
                             function makeJsonWidget(vax1,vax2,vax3,vax4,vax5) {
                            //log(vax3+vax6+htmlFeld1)
                               if ( braucheMaterialDesignWidgetList) {
                               myJsonWidget.push({
                                   Device : vax4,
                                   IP : vax1,
                                   Status : vax2,
                                   Kategorie : vax3
                               }
                            
                               );}
                            
                            //	log(myJsonWidget)
                            if (braucheMaterialDesignWidget) {
                                let colorIP="lightgreen";
                              //  log(vax3)
                                if (vax3==symbolKO_MD) colorIP="lightcoral";
                                
                            let mysubText = `<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
                                                          <div style="flex: 1;font-size: 16px; color: ${colorIP};">${vax2}</div>
                                                          <div style="color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic; text-align: right;">${vax3}</div>
                                                      </div>`
                                 let ip=vax2                     
                              
                                 myJsonWidget2.push({
                                           text: vax1,
                                           subText: mysubText,
                                           statusBarColor: vax5,
                                           image: vax4,
                                           imageColor: "",
                                           listType: "text",
                                           showValueLabel: true,
                                           ip: ip, //vax2,
                                           status: vax3
                                       });
                            }
                             }
                            
                            
                            

                            GlasfaserG Offline
                            GlasfaserG Offline
                            Glasfaser
                            schrieb am zuletzt editiert von Glasfaser
                            #148

                            @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                            zum test - material design - falls interesse

                            Danke ... mußte noch den "sudo -u root " entfernen , aber das wußte ich ja .
                            sieht sehr gut aus :+1:

                            11111111.jpg

                            Synology 918+ 16GB - ioBroker in Docker v9 , VISO auf Trekstor Primebook C13 13,3" , Hikvision Domkameras mit Surveillance Station .. CCU RaspberryMatic in Synology VM .. Zigbee CC2538+CC2592 .. Sonoff .. KNX .. Modbus ..

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

                              und noch eine tabelle - es werden alle geräte des netzwerkes gesucht und angezeigt - script wurde zusammen mit @homoran entwickelt - nur für einen netzwerkbereich nutzbar

                              NEUE VERSION auf GITHUB: https://github.com/liv-in-sky/nmap-ip-iobroker-script

                              • netzwerk wird mit externen befehl gescannt - dazu muss das tool nmap installiert werden - in linux,windows

                              • das tool nmap wird unter linux auf der console mit "apt-get install nmap" installiert - für windows das tool downloaden und im standardverzeichnis installieren https://nmap.org/download.html

                              • in linux muss in der iobroker datei /etc/sudoers.d/iobroker ein eintrag geschrieben werden https://forum.iobroker.net/post/375519 - der befhel nmap muss mit root ausgeführt werden !!!

                              • im setting der javascript instanz das exec. anklicken https://forum.iobroker.net/post/409294

                              • in windows habe ich dem user, der iobroker installiert hat, volle rechte auf das standardverzeichnis der nmap installation gegeben wichtig: es muss der befehl "nmap --iflist" ausgeführt werden - dmit bekommt man die aktuelle ethernetschnittstelle heraus ( "up") - diese wird unter const onlyWinEthernetIF eingetragen

                              • damit man eine anzeige bekommt, muss ein datenpunkt (zeichenkette, string) angelgt werden, der anschliessend auch im script eingetragen werden muss (dpVis) - im settingbereich des scriptes
                                die anderen settings müssen im script auch angeglichen werden z.b. dns server, domainname und der ipbereich

                              • die aliasnamen in myDeviceNames: android, amazon-geräte werden bei fritzbox-dnsserver-nutzung mit dem eigennamen des gerätes angezeigt - ist ein fritzbox problem seit fritzos 7

                              • es ist möglich eine datei zu erzeugen um die tabelle in iqontrol zu nutzen oder in der vis mit einem iframe einzubinden - standardmäßig nutzt man das standard-html-widget in der vis mit einem binding auf dpVis https://forum.iobroker.net/post/375754

                              • symbole, farben tabellensettings sind alle individuell einstellbar!

                              • docker bzw. synology-user: https://forum.iobroker.net/post/376631 ihr müßt im ersten exec befehl das "sudo -u root nmap " mit nur "nmap" ersetzen - siehe auch https://forum.iobroker.net/post/376920

                              • die javascript adapter version sollte 4.3.x sein oder höher !!!

                              AApossis (18).gif


                              1581282746893-nmap_finetuning.png

                              Anleitung für mehrere links pro server ist hier: https://forum.iobroker.net/post/597255

                              in den ersten 20 zeilen sind die wichtigen settings - bitte alle durchgehen !!!

                              //@liv-in-sky Januar 2021 13.3-19:00
                              
                              
                              //HIER WIRD PFAD UND FILENAME DEFINIERT
                              // @ts-ignore
                              const path = "/htmlip.html";                   //FIlenamen definieren
                              const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                              let   braucheHostDaten=false;
                              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 html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
                              let   braucheMaterialDesignWidgetList=false;        // bei true wird ein html-tabelle in einen dp geschrieben - MUSS ANGELEGT WERDEN !!!
                              let dpHost="0_userdata.0.Tabellen.IPDevices_HostDaten"         //WICHTIG wenn braucheHostDaten auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                              let dpSort="0_userdata.0.Tabellen.IPDevicesSort";           //WICHTIG - Sortierung
                              let dpVIS="0_userdata.0.Tabellen.IPDevices"         //WICHTIG wenn braucheMaterialDesignWidgetList auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                              let dpMaterialTabelWidget="0_userdata.0.Tabellen.IPDevices_MD_Table"         //WICHTIG wenn braucheMaterialDesignWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                              let dpMaterialListWidget="0_userdata.0.Tabellen.IPDevices_MD_List"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget // string
                              let pfadBilderMaterialWidget="/vis.0/armin/img/"                       // PFAD zu den bildern, die in die vis geladen wurden/
                              let mySchedule=" */15 * * * * ";                       //jede minute  -  nicht unter eine minute gehen -besser 3 oder 5 minuten nutzen !!!
                              const domainName="fritz.box";                  // domainname in der fritzbox definiert
                              const ipbereich="192.168.178.0/24";           //  gilt nicht für windows
                              const dnsServer="192.168.178.1"               // gilt nicht für windows
                              let mysortiereClient=1;                     //1 nach client 2 nach ip 
                              const waitTime=500;                        // falls längere zeit keine daten kommen - diesen wert erhöhn um 5000 (ms)
                              const lastZellColorSetting="lightgreen"      // farbe der zusammenfassung in der letzten zelle der tabelle 
                              const oerationSystemchange=false;              // false ist linux, true ist windows
                              const onlyWinEthernetIF="eth0"                // nur windows über befehl "nmap --iflist" herausfinden
                              const farbeNichtErreichbar="#819FF7" //"#FFBF00";         // farbe für devices, die gerade nicht online sind
                              const styleNichtErreichbar="i";             // möglich i=schräg, b ist fett und span ist normal - nur eines  davon !!!
                              const kuerzungNamen=23;                      // länge der namen kürzen
                              const materialD_IP_erreichbar="#D8D8D8";        // material design farbe der ip adresse bei erreichbaren klient
                              const materialD_IP_nichtErreichbar="#F7819F";    // material design farbe der ip adresse bei nicht erreichbaren klient
                              const htmlGragient=[150,30,70];                          // einstellung des gradienten
                              
                              //hier eintragen für die übersetzung der standardnamen - aliase - rechte seite wird statt linker  angezeigt - die beispiele kann man raus löschen
                              // BITTE AUF DIE KOMMAs ACHTEN
                              const myDeviceNames={ "192.168.178.24"  :"HF Küche Licht",     // ein leeres array wird so erzeugt: const myDeviceNames=[];
                                                   "192.168.178.118" :"Echo Beige",
                                                   "192.168.178.100" :"Echo Plus",
                                                   "192.168.178.50"  :"Echo Dot Zimmer",
                                                   "192.168.178.68"  :"HF Desk Haupt"
                              
                              }
                              
                              const myDeviceNamesNew= [{"ip" : "192.168.178.10", "name" : "Proxmox", "link" : "https://192.168.178.10:8006/", "kat":"server", "linkFirstName":"WEB"},
                                                      {"ip" : "192.168.178.157", "name" : "sqltulla", "link" : "http://192.168.178.157:8181/settings", "kat":"server", "linkFirstName":"TAUTULLA" },
                                                      {"ip" : "192.168.178.145", "name" : "pi-hole", "link" : "http://192.168.178.145/admin", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.59", "name" : "iobroker", "link" : "http://192.168.178.59:8081/#tab-objects", "kat":"server","linkFirstName":"OBJ", "morelinks":[{"TAB":"http://192.168.178.59:8081/#tab-logs"},{"INS":"http://192.168.178.59:8081/#tab-instances"}] },
                                                      {"ip" : "192.168.178.199", "name" : "NAS-FILE-Server", "link" : "", "kat":"server" },
                                                      {"ip" : "192.168.178.72", "name" : "AXHD60", "link" : "http://192.168.178.72", "kat":"server" },
                                                      {"ip" : "192.168.178.173", "name" : "ESP-KAMERA1", "link" : "http://192.168.178.173", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.117", "name" : "ESP-SWITCH-CAM1", "link" : "http://192.168.178.117", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.174", "name" : "ESP-KAMERA2", "link" : "http://192.168.178.174", "kat":"server", "linkFirstName":"WEB" },
                                                       {"ip" : "192.168.178.172", "name" : "ESP-SWITCH-CAM2", "link" : "http://192.168.178.172", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.175", "name" : "ESP-KAMERA3", "link" : "http://192.168.178.175", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.171", "name" : "ESP-SWITCH-CAM3", "link" : "http://192.168.178.171", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.191", "name" : "ESP-KAMERA4", "link" : "http://192.168.178.191", "kat":"server", "linkFirstName":"WEB" },
                                                       {"ip" : "192.168.178.135", "name" : "ESP-SWITCH-CAM4", "link" : "http://192.168.178.135", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.192", "name" : "ESP-KAMERA5", "link" : "http://192.168.178.192", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.83", "name" : "ESP-SWITCH-CAM5", "link" : "http://192.168.178.83", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.73", "name" : "MediaPadT5", "link" : "", "kat":"tablet" },
                                                      {"ip" : "192.168.178.148", "name" : "Echo Dot 3", "link" : "", "kat":"echo_dot3" },
                                                      {"ip" : "192.168.178.29", "name" : "TrekStor13", "link" : "", "kat":"tablet" },
                                                      {"ip" : "192.168.178.151", "name" : "FireTab7", "link" : "", "kat":"tablet" },
                                                      {"ip" : "192.168.178.201", "name" : "VPN Netzwerk", "link" : "", "kat":"vpn" },
                                                      {"ip" : "192.168.178.56", "name" : "FireHDStick", "link" : "", "kat":"firetvstick" },
                                                      {"ip" : "192.168.178.41", "name" : "FireTVStick", "link" : "", "kat":"firetvstick" },
                                                      {"ip" : "192.168.178.37", "name" : "FireTVStick1", "link" : "", "kat":"firetvstick" },
                                                      {"ip" : "192.168.178.33", "name" : "SonoffS26Alexa", "link" : "", "kat":"sonoff26" },
                                                      {"ip" : "192.168.178.124", "name" : "Galaxy-S9", "link" : "", "kat":"handygal" },
                                                      {"ip" : "192.168.178.28", "name" : "Google-Home-Mini", "link" : "", "kat":"googlemini" },
                                                      {"ip" : "192.168.178.81", "name" : "GalaxyTabA16", "link" : "", "kat":"tablet" },
                                                      {"ip" : "192.168.178.21", "name" : "GoSund 2 Matrix", "link" : "", "kat":"gosund111" },
                                                      {"ip" : "192.168.178.155", "name" : "GoSund 3 Freezer", "link" : "", "kat":"gosund111" },
                                                      {"ip" : "192.168.178.126", "name" : "Matrix Büro", "link" : "", "kat":"matrix" },
                                                      {"ip" : "192.168.178.168", "name" : "Matrix Küche", "link" : "", "kat":"matrix" },
                                                      {"ip" : "192.168.178.147", "name" : "MatrixTV", "link" : "", "kat":"matrix" },
                                                      {"ip" : "192.168.178.80", "name" : "MatrixCPU", "link" : "", "kat":"matrix" },
                                                      {"ip" : "192.168.178.150", "name" : "Gosund 1", "link" : "", "kat":"gosund111" },
                                                      {"ip" : "192.168.178.77", "name" : "SteckdoseAlexa", "link" : "", "kat":"fragezeichen" },
                                                      {"ip" : "192.168.178.235", "name" : "MotionEye", "link" : "http://192.168.178.235:8765/", "kat":"server", "linkFirstName":"EYE"  },
                                                      {"ip" : "192.168.178.142", "name" : "AdGuard", "link" : "http://192.168.178.142/", "kat":"server" },
                                                      {"ip" : "192.168.178.1", "name" : "DragonRoot", "link" : "http://192.168.178.1", "kat":"fritzbox", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.129", "name" : "WLEDRund", "link" : "http://192.168.178.129/", "kat":"server", "linkFirstName":"WEB"},
                                                      {"ip" : "192.168.178.132", "name" : "WLEDLang", "link" : "http://192.168.178.132/", "kat":"server", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.88", "name" : "DragonRoot-Dect", "link" : "http://192.168.178.88", "kat":"fritzbox" },
                                                      {"ip" : "192.168.178.74", "name" : "LGwebOSTV", "link" : "", "kat":"LG_TV_2" },
                                                      {"ip" : "192.168.178.139", "name" : "MCU Thermometer", "link" : "http://192.168.178.139", "kat":"sonoff" },
                                                       {"ip" : "192.168.178.140", "name" : "EASY1", "link" : "http://192.168.178.140", "kat":"sonoff", "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.163", "name" : "EASY2", "link" : "http://192.168.178.163", "kat":"sonoff" , "linkFirstName":"WEB"},
                                                      {"ip" : "192.168.178.141", "name" : "BridgeSensateTemp", "link" : "", "kat":"" },
                                                      {"ip" : "192.168.178.101", "name" : "DashPlayboy", "link" : "", "kat":"" },
                                                      {"ip" : "192.168.178.86", "name" : "DashSakrotan", "link" : "", "kat":"" },
                                                      {"ip" : "192.168.178.95", "name" : "Sonoff2-Distance", "link" : "http://192.168.178.95", "kat":"sonoff" }, 
                                                      {"ip" : "192.168.178.14", "name" : "Plex", "link" : "http://192.168.178.14:32400/web/index.html", "kat":"server" , "linkFirstName":"WEB" },
                                                      {"ip" : "192.168.178.156", "name" : "EchoShow5", "link" : "", "kat":"Echo-Show-5" }
                                                      ]
                              
                              var symbolOK="✔️";     // auch möglich: ="✅"   🟩   ✔️  🌎
                              var symbolKO="🔵" //"🔔";     //z.b. auch "<font color=\"red\"><b>X</b>" für ein rotes kreuz  oder : ="❌"  ⚪   🟢 ⚫ ⭕  🔴 🔵  🚫 ⏱ 💀 👍 👎 📑 💲 👀 😡 🟥 ⬜ 🧊 💬 🗑️ 🔔
                              var symbolWARN="ℹ️";    // ="⚠️" oder info: "ℹ️"
                              var symbolKO_MD="🟥"    //symbol für "nicht erreichbar" im MaterialDesign Widget
                              var symbolLink="🌎";
                              var externalOhneInfo=false;  //noch nicht integriert
                              //---------------------------------------
                              
                              //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
                              var htmlFeld1='Name';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
                              var htmlFeld2='IP';        var Feld2lAlign="left";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
                              var htmlFeld3='Status';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
                              //-----------------------------------
                              
                              
                              //ÜBERSCHRIFT ÜBER TABELLE
                              let   htmlUberschrift=true;                           // mit Überschrift über der tabelle
                              let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
                              const htmlFeldUeber='IP Devices List';              // Ü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=3;                              // 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="white";                // Farbe der Überschrift bei jeder 2.ten Tabelle
                              const htmlFarbTableColorUber="#BDBDBD";               // Überschrift in der tabelle - der einzelnen Spalten
                              //ÜBERSCHRIFT SPALTEN
                              const UeberSchriftHoehe="35";                          //Überschrift bekommt mehr Raum - darunter und darüber - Zellenhöhe
                              const LinieUnterUeberschrift="2";                   // Linie nur unter Spaltenüberschrift - 
                              const farbeLinieUnterUeberschrift="lightblue";
                              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="1200";                                     //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"   ///"Helvetica";
                              const htmlSchriftgroesse="14px";
                              //FELDER UND RAHMEN
                              let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
                              const htmlFarbFelderschrift="#D8D8D8";                  // SchriftFarbe der Felder  #D8D8D8
                              const htmlFarbFelderschrift2="#D8D8D8";                 // SchriftFarbe der Felder für jede 2te Tabelle
                              const htmlFarbTableColorGradient1="#424242";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
                              const htmlFarbTableColorGradient2="#424242";          //  Gradient - Hintergrund der Tabelle - ist dieser Wert gleich Gradient1 gibt es keinen verlauf
                              const htmlFarbTableBorderColor="grey";             // Farbe des Rahmen - is tdieser gleich den gradienten, sind die rahmen unsichtbar
                              let htmlRahmenLinien="none";                            // Format für Rahmen: MÖGLICH: "none" oder "all" oder "cols" oder "rows"
                              const htmlSpalte1Weite="cols";                   //  Weite der ersten beiden  Spalten oder z.b. 115px
                              
                              // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                              // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                              // HIER NICHTS  ÄNDERN ---------------------SETTING ENDE ----------------------------------------
                              
                              
                              
                              const dpPrefix = "javascript."+ instance +".";
                              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";
                              
                              let searchMe="<div><input class=\"myinputclassnmap\" type=\"search\" id=\"searchnmap\" placeholder=\"Filter by Item\"></div>";
                              const htmlZentriert="<style>  .myinputclassnmap {border: 1px solid; border-color: "+htmlFarbTableColorGradient2+"; margin-bottom: 20px; color: "+htmlFarbTableColorUber+"; height: 30px;background-image: linear-gradient("+htmlGragient[0]+"deg,"+htmlFarbTableColorGradient2+" "+htmlGragient[1]+"%,"+htmlFarbTableColorGradient1+" "+htmlGragient[2]+"%); font-family:"+htmlSchriftart+"\ }"+
                                                  "</style><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:0px 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=\"1px\" 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=\""+UeberSchriftHoehe+"\" 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 3
                              
                              var htmlTabUeber2=  "<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
                              var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                                                 "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
                              
                              const buttonScript =  '<script> function setOnOtherValue22(myval) {	var Self = this;	vis.setValue(\"0_userdata.0.Tabellen.IPDevicesSort\",myval); console.log("nmap: "+myval) }'
                                                   +'$( "button.myButt" ).click(function() {  $(".myButt" ).slideUp(); setTimeout(function() { $( ".mySpan" ).text(\"wait ...\")}, 1000);  });'    //$this.prop("border", "10px");
                                                   + `var allRows = $("[class*='nmapspecial']");  $("input#searchnmap").on("keydown keyup", function() {  allRows.hide();  $("tr:contains('" + $(this).val() + "')").show();});`
                                                   +'</script>' 
                              //------------------------------------------------------
                              var rootcount=true;
                              var myObjOld=[];
                              var myJsonWidget=[]; 
                              var myJsonWidget2=[];
                              var htmlTabUeber="";
                              var htmlOut="";
                              var mix;
                              var valButton=1;
                              var myObj;
                              var counter;
                              //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
                              var val1; var val0; var val2;
                              var json1; var json2; var json3; var json4; var json5; var json6;
                              let myObjExtra=[];
                              let laeuftSchon=false;
                              var hostDaten="";
                              
                              async function  writeHTML(){
                                 laeuftSchon=true;
                                 mysortiereClient=getState(dpSort).val;
                              let htmlTabUeber2_2= "<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+"<span class=\"mySpan\"></span>"+"<button class=\"myButt\" style\=\" border-radius: 4px; border:1px solid; background-color\: "+"transparent"+"\; color: "+htmlFarbTableColorUber+"; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnOtherValue22\(\'"+"1"+"\')\">"+htmlFeld1+"</button>"+"&ensp;</td>"+
                                                  "<td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+"<span class=\"mySpan\"></span>"+"<button class=\"myButt\" style\=\" border-radius: 4px; border:1px solid; background-color\: "+"transparent"+"\; color: "+htmlFarbTableColorUber+"; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnOtherValue22\(\'"+"2"+"\')\">"+htmlFeld2+"</button>"+"&ensp;</td>"+
                                                  "<td  align="+Feld3lAlign+">&ensp;"+"<span class=\"mySpan\"></span>"+"<button class=\"myButt\" style\=\" border-radius: 4px; border:1px solid; background-color\: "+"transparent"+"\; color: "+htmlFarbTableColorUber+"; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnOtherValue22\(\'"+"1"+"\')\">"+htmlFeld3+"</button>"+"&ensp;</td>";
                              
                              htmlOut="";
                              
                              counter=-1;
                              htmlTabUeber="";
                              switch (mehrfachTabelle) { 
                                 case 1: htmlTabUeber=htmlTabUeber1+htmlTabUeber2_2+htmlTabUeber3;  break;
                                 case 2: htmlTabUeber=htmlTabUeber1+htmlTabUeber2_2+htmlTabUeber2_1+htmlTabUeber3; break;
                                 case 3: htmlTabUeber=htmlTabUeber1+htmlTabUeber2_2+htmlTabUeber2_1+htmlTabUeber2+htmlTabUeber3; break;
                                 case 4: htmlTabUeber=htmlTabUeber1+htmlTabUeber2_2+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 !!!---------------------------------------------------------------------
                              //--------------------------------------------------------------------------------------------------------------------------------------------------
                              hostDaten="";
                              var myData="xxxxx"; 
                              let myArr=[];
                              myObjExtra=[];
                              
                              async function holeData() {
                                   return new Promise((resolve) => {
                              if(oerationSystemchange == false){
                              exec("sudo -u root nmap -sPR --dns-servers "+dnsServer+" "+ipbereich  , async function (error, result, stderr) {
                                 myData=result
                               //  setState("0_userdata.0.Tabellen.IPDeviceERROR", result)
                                 // console.log(result);
                                  resolve()
                              });} else {
                              
                              exec((['"C:\\\\Program Files (x86)\\\\Nmap\\\\nmap" ','-sPR  -e ',onlyWinEthernetIF,' --dns-servers ',dnsServer,' ',ipbereich].join('')), function (error, result, stderr) {
                                 myData=result
                                  resolve()
                              });}
                              });
                              }
                              
                              await holeData().then( async function () {  //})
                              //let timeout = setTimeout(function () {
                              // myData=getState("0_userdata.0.Tabellen.DeviceIPFake").val       //   FÜR TEST
                              ////////////////////////////////log(myData)
                              
                               if (!myData.includes("xxxx")) {
                              
                              
                              
                              var myTimeScanArr=myData.match(/(scanned in) (\d+\.\d+ seconds)/g); //log(myTimeScan)
                              
                              // myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+.\d+.\d+.\d+)\)|(fritz.\w+)\s+\((\d+.\d+.\d+.\d+)\)|(\d+.\d+.\d+.\d+)$/g)
                              
                              myArr=myData.match(/for\s+([A-Za-z0-9-_]+).f[^(]+\((\d+\.\d+\.\d+\.\d+)\)|(fritz\.\w+)\s+\((\d+\.\d+\.\d+\.\d+)\)|(\d+\.\d+\.\d+\.\d+)$/gm)
                               //log(myArr.toString())
                              //myArr.push("10.0.1.200")
                              //myArr.push("for iobroker (10.0.1.200)")
                              //myArr.push("10.0.1.201")
                              //myArr.push("fritz.repeater (10.0.1.200)")
                              /////////////////////////////////////log(myArr.toString())
                              if(myArr!=null) {
                              let var1; let var2; let var3; let varOhneName=[];
                               myObj=[]
                              for(var i=0;i<myArr.length;i++) {
                                  var1="na"; var2="na";
                                  var1=myArr[i].replace(/(for .+) \(\d+\.\d+\.\d+\.\d+\)/,"$1") 
                                  var1=var1.replace(/(.+)\(.+\)/," $1")
                                  var2=myArr[i].replace(/for .+ \((\d+\.\d+\.\d+\.\d+)\)/,"$1");//log(var2)
                                  var2=var2.replace(/.+\((.+)\)/,"$1")
                                  
                                  varOhneName=myArr[i].match(/^(\d+\.\d+\.\d+\.\d+)$/) 
                                  if (varOhneName!=null) {var1=varOhneName[0];var2=varOhneName[0]}
                                  var3="true";
                                 /* var2=var2.replace(/[(,)]/g,"")
                                  for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                                            //log(index)
                                                             if ((var2.trim()).match(index)) {var1="for "+myDeviceNames[index];
                                                            // log(val0+" - "+index)
                                                               }
                              
                                  }  */
                              
                              
                                let help=[var1.trim(),var2.trim(),var3]
                                if (!(var1=="na" || var2=="na")) myObj.push(help)
                                if (true) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                                                myObjOld.push(help);    
                                                }
                              }
                              //log("vor await")
                              await needDP(myObjOld)
                              
                                               await Sleep(1500); 
                                               myObjOld=await getData(dpPrefix+"Tabellen.IPDevices.Device_Collection")
                                              // log("nach await")
                                if (false) {/* myObjOld= getState("0_userdata.0.Tabellen.IPDeviceERROR").val */ 
                                               // myObjOld.push(help);
                                              //  createState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld,  { name: 'Device_Collection', desc: 'Device_Collection', type: 'array',read: true, write: true });
                                               await needDP(myObjOld).then(myObjOld=await getData(dpPrefix+"Tabellen.IPDevices.Device_Collection"))
                                               await Sleep(3000); log("")
                                              //  myObjOld=await getData(dpPrefix+"Tabellen.IPDevices.Device_Collection") //getState(dpPrefix+"Tabellen.IPDevices.Device_Collection").val; 
                                               // log(myObjOld.toString())
                                                }
                                                else{
                                                myObjOld=getState(dpPrefix+"Tabellen.IPDevices.Device_Collection").val;    
                                                // log("-----"+myObjOld.toString()) ; 
                                                }
                              
                              //log("++++++++++++++++++ "+myObj.toString())
                              
                              //setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())
                                 
                                 let varhelp1; let varhelp2; let varhelp3="true";    //neue erkannt geräte zu datenbank hinzufügen
                                for (var i=0;i<myObj.length;i++){ 
                                     //  log("kommen vom myObject: "+myObjOld[i][1]+" mit: "+myObjOld[i][0])
                                         if (!myObjOld.toString().includes(myObj[i][1]))  {  varhelp1=myObj[i][0].trim() ; varhelp2=myObj[i][1]; varhelp3="true"; 
                                                                                  let help=[varhelp1,varhelp2,varhelp3]; /*log("+++++++!!!+++++++++help "+help.toString())*/
                                                                                 if (!(varhelp1.indexOf("scanned")>-1)) myObjOld.push(help)               
                                                                   }                       }
                              
                                for (var i=0;i<myObjOld.length;i++){                // ist gerät noch da ???
                                   //  if (i>0 && i<10)  log("-----"+myObjOld[i][0]+" alles: ") ;     if (i>0 && i<2) log(myObj.toString())
                                         if (!myObj.toString().includes(myObjOld[i][1]))  {  varhelp1=myObjOld[i][0].trim() ; varhelp2=myObjOld[i][1]; varhelp3="false"; 
                                                                                  let help=[varhelp1,varhelp2,varhelp3]; /*if (i>=0 && i<80)  log("+++++++???+++++++++help "+help.toString())*/
                                                                                  myObj.push(help)               
                                                                   }                      }
                               
                                 // log("------------------------------------------------"+myObjOld[1].toString())
                              //log(mysortiereClient.toString())
                                  if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) mysortiereClient=1
                              
                               /*    if (mysortiereClient==1){ 
                              
                                      myObj.sort(function (alpha, beta) {
                                          if (alpha[0].toUpperCase().trim() > beta[0].toUpperCase().trim())
                                             return 1;
                                          if (beta[0].toUpperCase().trim() > alpha[0].toUpperCase().trim())
                                             return -1;
                                          return 0;
                                         });} else {  */
                              if (mysortiereClient==2){ 
                                         myObj.sort(function (alpha, beta) {
                                          //   if (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")) > parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))
                                           if ((parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                                                 return -1;
                                             if ((parseFloat(alpha[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(alpha[1].replace(/.+\.(.+)\..+$/,"$1"))*1000) > (parseFloat(beta[1].replace(/.+\.(.+)$/,"$1")))+(parseFloat(beta[1].replace(/.+\.(.+)\..+$/,"$1"))*1000))
                                                 return 1;
                                          return 0;
                                         });  
                                         }
                                  var1="scanned in" //nur scanned seconds
                                 var3="true"
                                 var2=myTimeScanArr[0].replace(/.+ (\d+\.\d+.+$)/,"$1");//log(var2)
                                 let help=[var1,var2,var3]
                              
                                if (mysortiereClient==1) help=["xxxx"+var1,var2,var3]
                                myObj.push(help)
                              /*if (!rootcount)*/  setState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld)
                              ///////////////////////////log("myObject ------- "+myObj.length.toString()+"---- ")
                               // setState("0_userdata.0.Tabellen.IPDeviceERROR", myObj.toString())   // zur fehlersuche
                                      for(var i=0;i<myObj.length;i++) {            // hier eigene schleife definieren und den wert counter++ nicht vergessen  !!!
                              
                                        counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                                      //  log(myObj[i][0].toString())
                                        val0=myObj[i][0].replace("for","").trim()
                                        val0=val0.replace("."+domainName,"")
                                        val0=val0.replace(/[(,)]/g,"")
                                        val1=myObj[i][1]
                                        val1=val1.replace(/[(,)]/g,"")
                              
                                    //  log(val0+" --- "myDeviceNamesNew[].ip)
                              
                              for (var index in myDeviceNames) {                   //ersetze mit aliasnamen
                                                            //log(index)
                                                             if ((val1.trim()).match(index.trim()) && val1.trim().length == index.trim().length) {val0=myDeviceNames[index];
                                                                                                                                                  
                                                             //log(val0+" - "+index)
                                                               } } 
                              let helperIP=""
                              let helperlink=""
                              for (var index in myDeviceNamesNew) {                   //ersetze mit aliasnamen
                                                            //log(index)
                                                             if ((val1.trim()).match(myDeviceNamesNew[index].ip) && val1.trim().length == (myDeviceNamesNew[index].ip).length) {
                                                                 
                                                                                                                                               val0=myDeviceNamesNew[index].name; 
                              
                                                                                                                                             //   if (val0.length>=(kuerzungNamen)+2)  val0=val0.substring(0,kuerzungNamen)+" ...";
                                                                                                                                               // helperIP=val0 ;  //log(val0)
                                                                                                                                                if (myDeviceNamesNew[index].link!="") {helperlink=myDeviceNamesNew[index].link; 
                                                                                                    myDeviceNamesNew[index].hasOwnProperty("linkFirstName") ? helperIP=helperIP+` <a href="${helperlink}" target="_blank"><button style="font-size: 75%; background: ${farbeNichtErreichbar}; color:${htmlFarbFelderschrift}">${myDeviceNamesNew[index].linkFirstName}</button></a>` 
                                                                                                                                                            : helperIP =helperIP+` <a style="text-decoration:none;" href="${helperlink}" target="_blank"> ${symbolLink}</a>` 
                                                                                                      
                                                                                                    if(myDeviceNamesNew[index].hasOwnProperty("morelinks")) {//log(JSON.stringify(myDeviceNamesNew[index].morelinks))
                                                                                                  
                                                                                                    for(let o=0;o<myDeviceNamesNew[index].morelinks.length;o++) {
                                                                                                                                                                 let test=JSON.parse(JSON.stringify(myDeviceNamesNew[index].morelinks))
                                                                                                                                                                 let key1=Object.keys(test[o])[0]
                                                                                                                                                                 //log(    Object.keys(test[o])[0]    );
                                                                                                                                                               //  log(   test[o][key1]  );
                                                                                                                                                                 helperIP=helperIP+ ` <a href="${test[o][key1]}" target="_blank"><button style="font-size: 75%; background: ${farbeNichtErreichbar}; color:${htmlFarbFelderschrift}">${Object.keys(test[o])[0]}</button> </a>`         //`<button onclick="window.location.href =${test[o][key1]};">${Object.keys(test[o])[0]}</button>`                        //` ${Object.keys(test[o])[0]}<a style="text-decoration:none;" href="${test[o][key1]}" target="_blank"> ${symbolLink}</a>`
                                                                                                                                                                    }  
                                                                                                    }
                                                                                                  //  val0=helperIP;    
                                                                                                   }
                                                                                              
                                                             //log(val0+" - "+index)
                                                               } }                                   
                              
                                          if (val0.length>=(kuerzungNamen)+2)  val0=val0.substring(0,kuerzungNamen)+" ..." 
                                               val0=val0+helperIP;          
                              
                                          
                                        
                                        var val2help=myObj[i][2]
                                    if (mysortiereClient==2){ 
                              
                                     if(val0=="scanned in") {val2=symbolWARN;val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter+"</i>"; 
                                     let valer=val1.replace(/.* (um.*)/,"$1");
                                                            val1=val1.replace(/(.*) um.*/,"$1");
                                                            
                                                            val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>"}
                                    
                              
                                        if (val2help=="false") {val2=symbolKO;
                              
                                                                val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                                                val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{val2=symbolOK}        
                              
                                        
                              
                                   
                               
                              
                              
                                   tabelleBind(); }//HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                                   else {let help=[val0.trim(),val1,val2help];myObjExtra.push(help);}
                                 //}
                              }; //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                                  var valLink=""; var valKat="";  
                                  if (mysortiereClient==1){ 
                                     counter=-1;
                                      myObjExtra.sort(function (alpha, beta) {
                                          if ((alpha[0].toUpperCase()).trim() > (beta[0].toUpperCase()).trim())
                                             return 1;
                                          if ((beta[0].toUpperCase()).trim() > (alpha[0].toUpperCase()).trim())
                                             return -1;
                                          return 0;
                                         });} 
                                         var valLink=""; var valKat="";     
                                      
                                       for(var i=0;i<myObjExtra.length;i++) {
                              
                                             json4="standard"
                                             json6="";
                                              let val0helping="";
                                             counter++
                                             val0=myObjExtra[i][0]//.replace(/(^.*?) <a.*/,"$1")
                                             json1=myObjExtra[i][0] ;// if(i>20 && i<30) log(val0)
                                             json2=val1=myObjExtra[i][1] ;
                                              val2help=myObjExtra[i][2] ;
                                                  for (var index in myDeviceNamesNew) { 
                                                      //   log("bin hier bei "+myDeviceNamesNew[index].ip+" mit ...")
                                                        if ((myObjExtra[i][1].match(myDeviceNamesNew[index].ip)) && myObjExtra[i][1].length == myDeviceNamesNew[index].ip.length) {
                                                           //  log("bin hier bei "+myDeviceNamesNew[index].name+" mit "+  myObjExtra[i][0]+" und kat: " + myDeviceNamesNew[index].kat)
                                                       
                                                           /*  if (myDeviceNamesNew[index].link!="") {json6=myDeviceNamesNew[index].link; 
                                                                                                    myDeviceNamesNew[index].hasOwnProperty("linkFirstName") ? json6=` <a href="${json6}" target="_blank"><button style="font-size: 75%; background: ${farbeNichtErreichbar}; color:${htmlFarbFelderschrift}">${myDeviceNamesNew[index].linkFirstName}</button></a>` 
                                                                                                                                                            : json6 =` <a style="text-decoration:none;" href="${json6}" target="_blank"> ${symbolLink}</a>` 
                                                                                                      
                                                                                                    if(myDeviceNamesNew[index].hasOwnProperty("morelinks")) {//log(JSON.stringify(myDeviceNamesNew[index].morelinks))
                                                                                                  
                                                                                                    for(let o=0;o<myDeviceNamesNew[index].morelinks.length;o++) {
                                                                                                                                                                 let test=JSON.parse(JSON.stringify(myDeviceNamesNew[index].morelinks))
                                                                                                                                                                 let key1=Object.keys(test[o])[0]
                                                                                                                                                                 //log(    Object.keys(test[o])[0]    );
                                                                                                                                                               //  log(   test[o][key1]  );
                                                                                                                                                                 json6=json6+ ` <a href="${test[o][key1]}" target="_blank"><button style="font-size: 75%; background: ${farbeNichtErreichbar}; color:${htmlFarbFelderschrift}">${Object.keys(test[o])[0]}</button> </a>`         //`<button onclick="window.location.href =${test[o][key1]};">${Object.keys(test[o])[0]}</button>`                        //` ${Object.keys(test[o])[0]}<a style="text-decoration:none;" href="${test[o][key1]}" target="_blank"> ${symbolLink}</a>`
                                                                                                                                                                    }  
                                                                                                    }
                                                                                                    val0helping=json6;    
                                                                                                   }*/
                                                             if (myDeviceNamesNew[index].kat!="")  json4=myDeviceNamesNew[index].kat;}  }
                                                         if (val2help=="false") {json3=val2=symbolKO; json5="red";
                                                                val0=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val0+ "<\/"+styleNichtErreichbar+">";
                                                                val1=("<font color=\""+farbeNichtErreichbar+"\"><"+styleNichtErreichbar+">")+val1+ "<\/"+styleNichtErreichbar+">";}  else{json3=val2=symbolOK;   json5="green";} 
                                             if(val0=="xxxxscanned in") {json3=val2=symbolWARN;   json5="blue"; json1="Anzahl: "+counter; json4="info";
                                                                          val0="<font color=\""+lastZellColorSetting+"\"><i>"+" Anzahl "+counter; 
                                                                          val1="<font color=\""+lastZellColorSetting+"\"><i>"+val1+"</i>" //" um "+formatDate(getDateObject((new Date().getTime())), "SS:mm:ss")+
                                                                          json2=myObjExtra[i][1]+", "+formatDate(getDateObject(((new Date().getTime()))), "SS:mm:ss")}
                              
                                                                         if (val2help) val0=val0+val0helping ; // link
                                               tabelleBind();
                                            
                                             if (braucheMaterialDesignWidget || braucheMaterialDesignWidgetList) {
                                                if (val2help=="false") {json3=val2=symbolKO_MD; }
                                               makeJsonWidget(json1,json2,json3,json4,json5,json6);}
                                         }
                                        
                              //-------------------------------------------------------------------------------------------------------------------------------------------------
                              //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
                              //-------------------------------------------------------------------------------------------------------------------------------------------------
                              
                                    // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
                                    let timeout = setTimeout(function () {
                                                                           tabelleFinish();
                                                                           if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                                                                           if (braucheHostDaten) {for(var i=0;i<myObjExtra.length;i++) {  if (myObjExtra[i][0]!="xxxxscanned"){
                                                                                                                                          hostDaten=hostDaten+myObjExtra[i][1]+"\t"+myObjExtra[i][0]+"\n" }}}
                                                                            setState(dpHost,hostDaten); //log(hostDaten)
                                                                         }, 2000); 
                                 
                                     }  else {log("no Array","warn")} //Ende Array falsch
                                     } else {log("no Data","warn")} // ende daten falsch
                                   //  rootcount=false;
                              //}, waitTime);
                               laeuftSchon=false;
                               })
                              //laeuftSchon=false;
                              } // function ende
                              
                              //MAIN:
                               
                              schedule(mySchedule,  function () { 
                               if ( !laeuftSchon) writeHTML();
                              // if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                              }); 
                              if ( !laeuftSchon) writeHTML();                                   
                              
                               function tabelleBind(){
                                 //  counter=counter+mehrfachTabelle;
                                     switch (mehrfachTabelle) { 
                              
                                       case 1: if(counter%2==0)         {  htmlOut=htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}else    
                                                                        {  htmlOut=htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td></tr>"; break;}
                                       case 2: if(counter%4==0){
                                                  if(counter%2==0)  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                      ";\" align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                             else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;
                                                    }else{
                                                              if(counter%2==0)  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                      ";\" align="+Feld3lAlign+">"+val2+"</td>"; } 
                                                             else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td></tr>";} break;}
                                                                  
                                       case 3:if(counter%2==0)   {
                                                  if(counter%3==0 )  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeGeradeZeilen+"\"><td align=\""+Feld1lAlign+"\">"+val0+"</td><td align=\""+Feld2lAlign+"\">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                      ";\" align=\""+Feld3lAlign+"\">"+val2+"</td>"; } 
                                                             else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align=\""+Feld1lAlign+"\" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align=\""+Feld2lAlign+"\" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align=\""+Feld3lAlign+"\" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                                              else    {htmlOut = htmlOut+"<td align=\""+Feld1lAlign+"\">"+val0+"</td><td align=\""+Feld2lAlign+"\">"+val1+"</td><td align=\""+Feld3lAlign+"\">"+val2+"</td></tr>";}
                                                                        } break;}else{
                                                  if(counter%3==0 )  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeUngeradeZeilen+"\"><td align=\""+Feld1lAlign+"\">"+val0+"</td><td align=\""+Feld2lAlign+"\">"+val1+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                                                      ";\" align=\""+Feld3lAlign+"\">"+val2+"</td>"; } 
                                                             else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align=\""+Feld1lAlign+"\" style=\"color:"+htmlFarbFelderschrift2+"\">"+val0+"</td><td  align=\""+Feld2lAlign+"\" style=\"color:"+htmlFarbFelderschrift2+"\">"+val1+"</td><td  align=\""+Feld3lAlign+"\" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">"+val2+"</td>";} 
                                                                              else     {htmlOut = htmlOut+"<td align=\""+Feld1lAlign+"\">"+val0+"</td><td align=\""+Feld2lAlign+"\">"+val1+"</td><td align=\""+Feld3lAlign+"\">"+val2+"</td></tr>";}
                                                                        } break;}                                
                              
                              
                                       case 4:  // counter=counter+8;
                                                 if(counter%8==0)   {
                                                 if(counter%4==0)  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td  style=\" border-right: "+trennungsLinie+"px solid "+ farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } // teil1
                                                                 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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} //teil 2
                                                                              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></tr>";} //teil 4
                                                                                                else    {htmlOut =htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"  align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                                        } break;}else{
                                                 if(counter%4==0)  {htmlOut = htmlOut+"<tr class=\"nmapspecial\" bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td  style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } //teil 1
                                                                 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=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} // teil 2
                                                                              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></tr>";} // teil 4
                                                                                                else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>";}} //teil 3
                                                                        } break;}                                    
                                      } //switch ende
                              
                              }
                              
                              function tabelleFinish() {
                              
                              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></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></tr>");        
                                               if(counter%3==0)      htmlOut = htmlOut.replace(/<\/td>$/, "</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></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></tr>");
                                               if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</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></tr>");    
                                               if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&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></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((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((new Date().getTime())), "SS:mm:ss")+"</div>";
                                      htmlUeber=htmlUeber+searchMe
                                      if (!htmlSignature) htmlUnter="";
                              
                                    //  log(" ist htmlUnter - signature "+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+"</center>"+ buttonScript : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+"</center>"+ buttonScript ;
                              
                                            } else {
                                             zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+"</center>"+ buttonScript :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter+"</center>"+ 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(((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 (braucheMaterialDesignWidgetList) {
                                   
                                     setState(dpMaterialListWidget,JSON.stringify(myJsonWidget2)); 
                                     myJsonWidget2=[];
                              }
                              if (braucheMaterialDesignWidget) {
                                
                                setState(dpMaterialTabelWidget,JSON.stringify(myJsonWidget)); 
                                   myJsonWidget=[];
                              }
                              
                              }
                              
                               function makeJsonWidget(vax1,vax2,vax3,vax4,vax5,vax6) {
                              //log(vax3+vax6+htmlFeld1)
                              vax4=pfadBilderMaterialWidget+vax4+".png" ;
                                 if ( braucheMaterialDesignWidgetList) {
                                 myJsonWidget.push({
                                     Device : vax4,
                                     IP : vax1,
                                     Status : vax2,
                                     Kategorie : vax3+" "+vax6
                                 }
                              
                                 );}
                              
                              //	log(myJsonWidget)
                              if (braucheMaterialDesignWidget) {
                                  let colorIP= materialD_IP_erreichbar   //"lightgreen";
                                //  log(vax3)
                                  if (vax3==symbolKO_MD) colorIP=materialD_IP_nichtErreichbar     //"lightcoral";
                                //  vax4=pfadBilderMaterialWidget+vax4+".png" ; 
                              let mysubText = `<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
                                                            <div style="flex: 1;font-size: 16px; color: ${colorIP};">${vax2}</div>
                                                            <div style="color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic; text-align: right;">${vax3}${vax6}</div>
                                                        </div>`
                                   let ip=vax2                     
                                
                                   myJsonWidget2.push({
                                             text: vax1,
                                             subText: mysubText,
                                             statusBarColor: vax5,
                                             image: vax4,
                                             imageColor: "",
                                             listType: "text",
                                             showValueLabel: true,
                                             ip: ip, //vax2,
                                             status: vax3,
                                             link:vax6
                                             
                                         });
                              }
                               }
                              
                               
                              
                                 on({id: "0_userdata.0.Tabellen.IPDevicesSort", ack: false, change: "any"}, function (obj) { 
                                   //  log(obj.id);log(String(mehrfachTabelle))
                                   mysortiereClient=obj.state.val
                                 log(mysortiereClient.toString())
                                 
                                 //  log(String(mehrfachTabelle))
                                setTimeout(function () { // log('file written')
                                   if ( !laeuftSchon)  writeHTML();
                                     if (braucheEinFile && !laeuftSchon) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                              }, 350);
                                  
                              
                                   
                                 })
                              
                              
                                  function extraTablefinish() {   
                              } //extraTablefinish
                              
                              async function needDP(myData){
                                  if (!(await existsStateAsync("Tabellen.IPDevices.Device_Collection"))) {
                                     await createStateAsync("Tabellen.IPDevices.Device_Collection", myData,{type: "array", name: "Device_Collection", desc: 'Device_Collection', role: "value", read: true, write: true, } ); }
                                 //await Sleep(3000); 
                              }
                              
                              async function getData(myData){
                                  
                                 return getState(myData).val; 
                              }
                              //createState(dpPrefix+"Tabellen.IPDevices.Device_Collection", myObjOld,  { name: 'Device_Collection', desc: 'Device_Collection', type: 'array',read: true, write: true });
                              
                              function Sleep(milliseconds) {
                              return new Promise(resolve => setTimeout(resolve, milliseconds));
                              }
                              
                              
                              
                              
                              
                              
                              

                              sigi234S Online
                              sigi234S Online
                              sigi234
                              Forum Testing Most Active
                              schrieb am zuletzt editiert von
                              #149

                              @liv-in-sky

                              Netzwerkstatus_icons.zip

                              Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                              Immer Daten sichern!

                              liv-in-skyL 1 Antwort Letzte Antwort
                              0
                              • sigi234S sigi234

                                @liv-in-sky

                                Netzwerkstatus_icons.zip

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

                                @sigi234

                                Image 2.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

                                sigi234S IccubeI 2 Antworten Letzte Antwort
                                1
                                • liv-in-skyL liv-in-sky

                                  @sigi234

                                  Image 2.png

                                  sigi234S Online
                                  sigi234S Online
                                  sigi234
                                  Forum Testing Most Active
                                  schrieb am zuletzt editiert von sigi234
                                  #151

                                  @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                                  @sigi234

                                  Screenshot (1963).png

                                  Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                                  Immer Daten sichern!

                                  liv-in-skyL 1 Antwort Letzte Antwort
                                  0
                                  • sigi234S sigi234

                                    @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                                    @sigi234

                                    Screenshot (1963).png

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

                                    @sigi234 bei dem design bin ich nicht sicher: grüne ip bei erreichbarkeit oder weiße farbe - das gilt auch für nicht erreichbare - rot oder weiß was meinst du ?

                                    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

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

                                      @sigi234 bei dem design bin ich nicht sicher: grüne ip bei erreichbarkeit oder weiße farbe - das gilt auch für nicht erreichbare - rot oder weiß was meinst du ?

                                      sigi234S Online
                                      sigi234S Online
                                      sigi234
                                      Forum Testing Most Active
                                      schrieb am zuletzt editiert von
                                      #153

                                      @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                                      @sigi234 bei dem design bin ich nicht sicher: grüne ip bei erreichbarkeit oder weiße farbe - das gilt auch für nicht erreichbare - rot oder weiß was meinst du ?

                                      Für mich ist Grün immer : true/Online/
                                      Rot immer : flase/Offline

                                      Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                                      Immer Daten sichern!

                                      liv-in-skyL 1 Antwort Letzte Antwort
                                      0
                                      • sigi234S sigi234

                                        @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                                        @sigi234 bei dem design bin ich nicht sicher: grüne ip bei erreichbarkeit oder weiße farbe - das gilt auch für nicht erreichbare - rot oder weiß was meinst du ?

                                        Für mich ist Grün immer : true/Online/
                                        Rot immer : flase/Offline

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

                                        @sigi234 also du denkst, ich soll es so lassen - ich bin mir nicht sicher, ob es zuviel farbe ist

                                        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

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

                                          @sigi234 also du denkst, ich soll es so lassen - ich bin mir nicht sicher, ob es zuviel farbe ist

                                          sigi234S Online
                                          sigi234S Online
                                          sigi234
                                          Forum Testing Most Active
                                          schrieb am zuletzt editiert von sigi234
                                          #155

                                          @liv-in-sky sagte in IP Devices im Netzwerk - HTML Tabelle vis, Iqontrol:

                                          @sigi234 also du denkst, ich soll es so lassen - ich bin mir nicht sicher, ob es zuviel farbe ist

                                          Die IP würde ich nicht in der Farbe machen bzw ev. auswählbar.
                                          Würde auch eine Rotes X nehmen.

                                          Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                                          Immer Daten sichern!

                                          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

                                          744

                                          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