Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. HTMLTabelle UnifiClients-newAdapter

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    HTMLTabelle UnifiClients-newAdapter

    This topic has been deleted. Only users with topic management privileges can see it.
    • liv-in-sky
      liv-in-sky @MyMeyer last edited by

      @MyMeyer hi,

      was steht den in dem datenpunkt in is_online für iobroker

      und könntest du mal nachsehen, ob bei anderen LAN clients das is_wired überall auf true steht und beim "abziehen" des kabels das is_wired auf false geht

      das X kommt, wenn is_online gleich false

      M 1 Reply Last reply Reply Quote 0
      • liv-in-sky
        liv-in-sky @MyMeyer last edited by

        @MyMeyer

        sind alle anderen LAN geräte richtig angezeigt ?

        M 1 Reply Last reply Reply Quote 0
        • M
          MyMeyer @liv-in-sky last edited by

          @liv-in-sky Das sieht alles gut aus...
          754befd4-e5b2-433f-8984-b27681452253-image.png

          Steht aber immer noch das X !

          1 Reply Last reply Reply Quote 0
          • M
            MyMeyer @liv-in-sky last edited by

            @liv-in-sky sagte in HTMLTabelle UnifiClients-newAdapter:

            @MyMeyer

            sind alle anderen LAN geräte richtig angezeigt ?

            Kann ich nicht genau sagen.Sehe im Vis nur 43 Geräte. Habe aber ca. 60 Geräte in meiner Controller Software von Unifi.

            liv-in-sky 1 Reply Last reply Reply Quote 0
            • liv-in-sky
              liv-in-sky @MyMeyer last edited by

              @MyMeyer

              kannst du nicht irgendwie rausfinden, was fehlt - und die, die fehlen, haben die die entweder den datenpunkt ap_mac oder sw_mac - oder fehlen die

              M 1 Reply Last reply Reply Quote 0
              • M
                MyMeyer @liv-in-sky last edited by

                @liv-in-sky Es ist nur der Iobroker das Bild was vorher geschickt habe. Der Datenpunkt ist sw_mac dieser ist auch gefüllt.SW_MAC ist doch die Mac Adresse vom Switch auf das Gerät als letztes ist/war oder nicht. Also sw_port ist der Port wo der Server steckt. Kann es vielleicht damit zu tun haben das es alles auf ProxMox läuft ? Gleich Port 5 Server laufen da aktuell, aber die anderen werden alle Online angezeigt.

                liv-in-sky 2 Replies Last reply Reply Quote 0
                • liv-in-sky
                  liv-in-sky @MyMeyer last edited by

                  @MyMeyer

                  hab mir das nochmal angesehen - wenn im datenpunkt true steht sollte iobroker als online angezeigt werden - im moment habe ich keine idee, warum das bei dir nicht funktioniert - es werden nur die datenpunkte im script analysiert - daher hat das nichts mit dem port oder proxmox zu tun

                  zur not mach mal einen neustart der javascript instanz - evtl ein cache problem ?

                  konntest du herausfinden, was die fehlenden geräte gemein haben ? es fehlen ja 17 geräte - sind denn die 17 fehlenden geräte als datenpunkte vorhanden

                  vielleicht hast du am WE zeit und ich kann bei dir mit anydesk/teamvierwer drauf gehen und wir analysieren mal, was da los ist

                  1 Reply Last reply Reply Quote 0
                  • liv-in-sky
                    liv-in-sky @MyMeyer last edited by

                    @MyMeyer

                    also das mit dem unterschiedlichen anzahlen war ein denkfehler von mir - ich habe mal den unifi adapter gestoppt und alle client datenpunkte gelöscht -. es werden momentan keine datenpunkte im adapter gelöscht und daher waren einige "leichen" vorhanden

                    im controller werden nur die clients angezeigt, die angemeldet sind - im unifi adapter werden auch die angezeigt, die nicht da sind - daher kommen unterschiedliche anzahlen heraus -da hab ich wohl noch geschlafen 😞 😴

                    M 1 Reply Last reply Reply Quote 0
                    • M
                      MyMeyer @liv-in-sky last edited by

                      @liv-in-sky Lese Gerade deine Nachricht. Bin aber noch nicht zur Analyse gekommen. Schaue es mir die Tage an Sorry.

                      1 Reply Last reply Reply Quote 0
                      • M
                        MyMeyer last edited by

                        Jau nach dem Löschen sieht alles wieder normal aus. Dann müssen wir wohl noch warten bis der Adapter löschen unterstützt. 😞

                        liv-in-sky 1 Reply Last reply Reply Quote 0
                        • liv-in-sky
                          liv-in-sky @MyMeyer last edited by

                          @MyMeyer das problem hatte ich bei meinem script auch - der adapter findet ein gerät und legt es an. ist das gerät nicht am netz, wird es im controller nicht mehr angezeigt - es ist aber für den adapter nicht ersichtlich, ob man die datenpunkte noch braucht - d.h. der adapter wird wohl nie clientdatenpunkte löschen können, da nicht im controller sichtbar erstmal bedeutet -> client offline

                          das muss man wohl immer mal wieder "von hand" machen, vorallem, wenn man esp' s flasht

                          1 Reply Last reply Reply Quote 0
                          • M
                            MyMeyer last edited by

                            @liv-in-sky Dann sollte man im Arbeit einbauen das Gerät nach einer bestimmte Zeit gelöscht werden, wenn sie x Stunden nicht Online sind/waren. Nach wie viel Stunden genau gelöscht werden darf, sollte man als Einstellmöglichkeit im Adapter haben. So kann jeder Benutzer selber entscheiden wie lange Offline Geräte sichtbar sind.

                            liv-in-sky 1 Reply Last reply Reply Quote 0
                            • liv-in-sky
                              liv-in-sky @MyMeyer last edited by

                              @MyMeyer

                              das könntest du im adapter thread oder auf github als vorschlag posten

                              1 Reply Last reply Reply Quote 1
                              • liv-in-sky
                                liv-in-sky last edited by liv-in-sky

                                habe das script upgedated um eine Anzeige für länger-abwesende-WLAN-clients - ist einfach übersichtlicher und ich kann herausfinden, welche clients ich von "hand" aus den datenpunkten löschen kann - zb. einmalige gäste, geflashte ESP's, unbenannte clients ...

                                neue settings sind dazugekommen:

                                abwesendZeit ist der zeitrahmen, in millisekunden !
                                htmlColorDeviceLangAbwesend ist die farbe der überschrift

                                Image 8.png

                                das ganze funktioniert auch bei z.b einer 3 spalten anzeige

                                Image 9.png

                                script liegt im ersten post

                                1 Reply Last reply Reply Quote 0
                                • liv-in-sky
                                  liv-in-sky last edited by

                                  noch ein kleines update:

                                  • wird von einem gerät der datenpunkt "is_online" vom adapter verändert - wird das script getriggert und zeigt den aktuellen zustand an
                                  • in der letzten zeile wird der zeitstempel des letzten updates angezeigt
                                  • die lang abwesenden clients zeigen anstatt des accesspoints nun, wie lange sie nicht mehr aktiv waren
                                  • die lang abwesenden werden alphabetisch sortiert

                                  Image 1.png

                                  1 Reply Last reply Reply Quote 0
                                  • liv-in-sky
                                    liv-in-sky last edited by liv-in-sky

                                    und noch ein update

                                    • es wurden neue settings eingeführt, daher alles ersetzen - am besten neues script anlegen, damit man die settings kopieren kann
                                    • ein neuer datenpunkt muss angelegt werden und ins script eingetragen werden: dpDelete (zeichenkette) damit kann man unter den Lange Abwesend clients einen client löschen - direkt aus der tabelle

                                    smart46.gif

                                    man muss damit nicht mehr nach der mac adresse suchen und von hand alte clients löschen - geht nun über vis mit dieser tabelle

                                    1 Reply Last reply Reply Quote 0
                                    • M
                                      MyMeyer last edited by

                                      Hatte paar Tage Pause 🙂 ...das schaue ich mir doch mal an. 😊

                                      1 Reply Last reply Reply Quote 0
                                      • M
                                        MyMeyer last edited by

                                        @liv-in-sky Hi, bekomme ein paar Fehler im Log angezeigt. Habe die aktuelle Version am laufen.


                                        script.js.Allgemein.Unifi_Tabelle_1
                                        12.7.2020, 22:49:44.065 [warn ]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:191:20
                                        12.7.2020, 22:49:44.065 [warn ]: javascript.0 (27555) at writeHTML (script.js.Allgemein.Unifi_Tabelle_1:175:36)
                                        12.7.2020, 22:49:44.066 [warn ]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:342:1
                                        12.7.2020, 22:49:44.070 [error]: javascript.0 (27555) script.js.Allgemein.Unifi_Tabelle_1: script.js.Allgemein.Unifi_Tabelle_1:230
                                        12.7.2020, 22:49:44.070 [error]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:230:148
                                        12.7.2020, 22:49:44.071 [error]: javascript.0 (27555) at writeHTML (script.js.Allgemein.Unifi_Tabelle_1:229:18)
                                        12.7.2020, 22:49:44.071 [error]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:342:1
                                        12.7.2020, 22:49:58.214 [info ]: javascript.0 (27555) Stop script script.js.Allgemein.Unifi_Tabelle_1
                                        12.7.2020, 22:49:58.271 [info ]: javascript.0 (27555) Start javascript script.js.Allgemein.Unifi_Tabelle_1
                                        12.7.2020, 22:49:58.284 [warn ]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:191:20
                                        12.7.2020, 22:49:58.284 [warn ]: javascript.0 (27555) at writeHTML (script.js.Allgemein.Unifi_Tabelle_1:175:36)
                                        12.7.2020, 22:49:58.284 [warn ]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:342:1
                                        12.7.2020, 22:49:58.288 [error]: javascript.0 (27555) script.js.Allgemein.Unifi_Tabelle_1: script.js.Allgemein.Unifi_Tabelle_1:230
                                        12.7.2020, 22:49:58.289 [error]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:230:148
                                        12.7.2020, 22:49:58.289 [error]: javascript.0 (27555) at writeHTML (script.js.Allgemein.Unifi_Tabelle_1:229:18)
                                        12.7.2020, 22:49:58.289 [error]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:342:1
                                        12.7.2020, 22:50:00.010 [warn ]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:191:20
                                        12.7.2020, 22:50:00.010 [warn ]: javascript.0 (27555) at writeHTML (script.js.Allgemein.Unifi_Tabelle_1:175:36)
                                        12.7.2020, 22:50:00.010 [warn ]: javascript.0 (27555) at Object.<anonymous> (script.js.Allgemein.Unifi_Tabelle_1:339:2)
                                        12.7.2020, 22:50:00.015 [error]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:230:148
                                        12.7.2020, 22:50:00.015 [error]: javascript.0 (27555) at writeHTML (script.js.Allgemein.Unifi_Tabelle_1:229:18)
                                        12.7.2020, 22:50:00.015 [error]: javascript.0 (27555) at Object.<anonymous> (script.js.Allgemein.Unifi_Tabelle_1:339:2)
                                        12.7.2020, 22:50:11.404 [info ]: javascript.0 (27555) Stop script script.js.Allgemein.Unifi_Tabelle_1
                                        12.7.2020, 22:50:32.535 [info ]: javascript.0 (27555) Start javascript script.js.Allgemein.Unifi_Tabelle_1
                                        12.7.2020, 22:50:32.544 [warn ]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:191:20
                                        12.7.2020, 22:50:32.545 [warn ]: javascript.0 (27555) at writeHTML (script.js.Allgemein.Unifi_Tabelle_1:175:36)
                                        12.7.2020, 22:50:32.545 [warn ]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:342:1
                                        12.7.2020, 22:50:32.550 [error]: javascript.0 (27555) script.js.Allgemein.Unifi_Tabelle_1: script.js.Allgemein.Unifi_Tabelle_1:230
                                        12.7.2020, 22:50:32.551 [error]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:230:148
                                        12.7.2020, 22:50:32.551 [error]: javascript.0 (27555) at writeHTML (script.js.Allgemein.Unifi_Tabelle_1:229:18)
                                        12.7.2020, 22:50:32.551 [error]: javascript.0 (27555) at script.js.Allgemein.Unifi_Tabelle_1:342:1

                                        liv-in-sky 1 Reply Last reply Reply Quote 0
                                        • liv-in-sky
                                          liv-in-sky @MyMeyer last edited by

                                          @MyMeyer
                                          hallo - es scheint du hast dieses problem : https://forum.iobroker.net/post/459129

                                          du hast auch die doppelte anzahl an zeilen - bitte wie dort beschrieben den chrome browser mal probieren, um das script zu kopieren

                                          ansonsten wichtig:

                                          • datenpunkte müssen von hand angelegt sein und im script eingetragen werden
                                          • alle benötigten datenpunkte müssen im adaptersetiing angegeben sein (erster post)
                                          • wenn dann noch probleme, kann es nicht schaden, das script stoppen, die unifi instanz zu stoppen - alle datenpunkte unter unifi.0 (also den ganzen ordner) zu löschen , instanz wieder starten - etwas warten - script wieder starten (nur wichtig, falls objecte da aber states sind leer)
                                          1 Reply Last reply Reply Quote 0
                                          • B
                                            bauerpower last edited by

                                            Hallo zusammen,

                                            kann ich um etwas Geburtshilfe bitten?

                                            Ich habe die Datenpunkte angelegt .... und hoffentlich alle Anpassungen gemacht...
                                            Leider bekomme ich folgenden Fehler:

                                            5a43f9de-1285-4e80-98c9-770c2cd05025-image.png

                                            Und im Log is Chaos 🙂

                                            dd495d9e-260b-4cc9-8315-fbb0b6518b69-image.png

                                            //@liv-in-sky 2020  8.7.2020 17 19:30
                                            //HIER WIRD PFAD UND FILENAME DEFINIERT
                                            const path = "/unifi.html";                   //FIlenamen definieren
                                            const home = 'vis.0'                               //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                                            let braucheEinFile = false;                          // bei true wird ein file geschrieben
                                            let braucheEinVISWidget = true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
                                            let dpVIS = "0_userdata.0.Tabellen.Unifi-Clients"         //WICHTIG wenn "braucheEinVISWidget" auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget type Zeichenkette
                                            let dpSort = "0_userdata.0.Tabellen.Unifi-Clients-Sort"   //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget  type logic
                                            let dpSortIPMAC = "0_userdata.0.Tabellen.Unifi-MAC-IP"   //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget  type logic
                                            let dpSortDevice = "0_userdata.0.Tabellen.Unifi-Clients-Device"   //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget  type logic
                                            let dpDelete = "0_userdata.0.Tabellen.Unifi-Clients-DeleteDP"     //WICHTIG wenn "braucheEinVISWidget" auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget type Zeichenkette
                                            let mySchedule = " */30 * * * * * ";                      //jede minute  
                                            let kuerzungNamen = 15                      // länge der namen kürzen
                                            let offlineColor = true;                     // wenn true dann wird farbe von apName nicht beachtet
                                            let offlineFarbe = "#66b3ff";
                                            let abwesendZeit = 187200000                  // in millisekunden für länger abwesende clients
                                            let htmlColorDeviceLangAbwesend = "white";     // frbe überschrift für länger abwesende
                                            
                                            const apName = {
                                                "74:83:c2:b3:85:b4": { aname: "APAC-WZ", afarbe: "#737373" },      // standard #BDBDBD   afarbe ist die farbe 
                                                "74:83:c2:b3:86:9e": { aname: "APAC-KG", afarbe: "#b3b300" },    // standard #BDBDBD
                                                "78:8a:20:8c:dc:75": { aname: "APAC-EL", afarbe: "#D8D8D8" }
                                            }    // standard #BDBDBD
                                            
                                            let sortiereClient = false; // false ist nach IP; true nach Name
                                            
                                            let symbolSort = "↔️"                //"👁️‍🗨️";
                                            let symbolSortMAC = "👁️‍🗨️";
                                            let symbolSortDevice = "👁️‍🗨️";
                                            let symbolTrue = "⚫";                       //  oder : ="❌"  ⚪  ⚫ ⭕  🔴 🔵 ⏱ 💀 👍 👎 📑 💲 👀 🔹
                                            let symbolFalse = "🔹";
                                            let symbolDelete = "☢️";
                                            
                                            //---------------------------------------
                                            
                                            //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 4
                                            var htmlFeld1 = 'Name'; var Feld1lAlign = "left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
                                            var htmlFeld2 = 'IP/MAC'; var Feld2lAlign = "left";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
                                            var htmlFeld3 = 'Device'; var Feld3lAlign = "left";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
                                            var htmlFeld4 = 'Online'; var Feld4lAlign = "center";                    // überschrift Tabellen Spalte4 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 = 'Unifi Clients';              // Überschrift und Signature
                                            const htmlFarbUber = "white";                         // Farbe der Überschrift
                                            const htmlSchriftWeite = "normal";                       // bold, normal - Fettschrift für Überschrift
                                            const htmlÜberFontGroesse = "18px";                       // schriftgröße überschrift
                                            //MEHRERE TABELLEN NEBENEINANDER
                                            let mehrfachTabelle = 2;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
                                            const 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 = "3";                   // Linie nur unter Spaltenüberschrift - 
                                            const farbeLinieUnterUeberschrift = "white";
                                            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 = "auto";                                     //Weite der Tabelle
                                            let zentriert = true;                                   //ganze tabelle zentriert
                                            const backgroundAll = "#000000";                        //Hintergrund für die ganze Seite - für direkten aufruf oder iqontrol sichtber - keine auswirkung auf vis-widget
                                            const htmlSchriftart = "Helvetica";
                                            const htmlSchriftgroesse = "14px";
                                            //FELDER UND RAHMEN
                                            let UeberschriftSpalten = true;                // ein- oder ausblenden der spatlen-überschriften
                                            const htmlFarbFelderschrift = "#BDBDBD";                  // SchriftFarbe der Felder
                                            const htmlFarbFelderschrift2 = "#BDBDBD";                 // SchriftFarbe der Felder für jede 2te Tabelle   D8D8D8
                                            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
                                            
                                            let borderHelpBottum;
                                            let borderHelpRight;
                                            let htmlcenterHelp;
                                            let htmlcenterHelp2;
                                            
                                            if (htmlRahmenLinien == "rows") { borderHelpBottum = 1; borderHelpRight = 0; }
                                            if (htmlRahmenLinien == "cols") { borderHelpBottum = 0; borderHelpRight = 1; }
                                            if (htmlRahmenLinien == "none") { borderHelpBottum = 0; borderHelpRight = 0; }
                                            if (htmlRahmenLinien == "all") { borderHelpBottum = 1; borderHelpRight = 1; }
                                            zentriert ? htmlcenterHelp = "auto" : htmlcenterHelp = "left";
                                            zentriert ? htmlcenterHelp2 = "center" : htmlcenterHelp2 = "left";
                                            
                                            
                                            const htmlZentriert = '<center>'
                                            const htmlStart = "<!DOCTYPE html><html lang=\"de\"><head><title>Vorlage</title><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">" +
                                                "<style> * {  margin: 0;} body {background-color: " + backgroundAll + "; margin: 0 auto;  }" +
                                                " p {padding-top: 10px; padding-bottom: 10px; text-align: " + htmlcenterHelp2 + "}" +
                                                // " div { margin: 0 auto;  margin-left: auto; margin-right: auto;}"+
                                                " td { padding:" + abstandZelle + "px; border:0px solid " + htmlFarbTableBorderColor + ";  border-right:" + borderHelpRight + "px solid " + htmlFarbTableBorderColor + ";border-bottom:" + borderHelpBottum + "px solid " + htmlFarbTableBorderColor + ";}" +
                                                " table { width: " + weite + ";  margin: 0 " + htmlcenterHelp + "; border:1px solid " + htmlFarbTableBorderColor + "; border-spacing=\"" + abstandZelle + "0px\" ; }" +   // margin macht center
                                                "td:nth-child(1) {width: " + htmlSpalte1Weite + "}" + "td:nth-child(2) {width:" + htmlSpalte1Weite + "}" +
                                                " </style></head><body> <div>";
                                            //const htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-weight: bold\">"+htmlFeldUeber+"</p>";                    
                                            const htmlTabStyle = "<table bordercolor=\"" + htmlFarbTableBorderColor + "\" border=\"2px\" cellspacing=\"" + abstandZelle + "\" cellpadding=\"" + abstandZelle + "\" width=\"" + weite + "\" rules=\"" + htmlRahmenLinien + "\" style=\"color:" + htmlFarbFelderschrift + ";  font-size:" + htmlSchriftgroesse +
                                                "; font-family:" + htmlSchriftart + ";background-image: linear-gradient(42deg," + htmlFarbTableColorGradient2 + "," + htmlFarbTableColorGradient1 + ");\">";
                                            const htmlTabUeber1 = "<tr height=\"" + UeberSchriftHöhe + "\" style=\"color:" + htmlFarbTableColorUber + "; font-size: " + groesseUeberschrift + "px; font-weight: " + UeberschriftStyle + " ;  border-bottom: " + LinieUnterUeberschrift + "px solid " + farbeLinieUnterUeberschrift + " \">";
                                            const htmlTabUeber3 = "</tr>";
                                            
                                            
                                            
                                            
                                            //NICHTS ÄNDERN - abhängig von den oben definierten _Spalten - in diesem Beispiel sind es 4
                                            
                                            var buttonScript = '<script> function setOnSort1() {	var Self = this; var objID =\'' + dpSort + '\';	Self.servConn.getStates(\'' + dpSort + '\', (error, states) => {  console.log(states); self.servConn.setState(\'' + dpSort + '\', !states[\'' + dpSort + '\'].val);}  )}' +
                                                'function setOnSort() {	var Self = this; var objID =\'' + dpSortIPMAC + '\';	Self.servConn.getStates(\'' + dpSortIPMAC + '\', (error, states) => {  console.log(states); self.servConn.setState(\'' + dpSortIPMAC + '\', !states[\'' + dpSortIPMAC + '\'].val);}  )}' +
                                                'function setOnSort2() {	var Self = this; var objID =\'' + dpSortDevice + '\';	Self.servConn.getStates(\'' + dpSortDevice + '\', (error, states) => {  console.log(states); self.servConn.setState(\'' + dpSortDevice + '\', !states[\'' + dpSortDevice + '\'].val);}  )}' +
                                                'function setOnDelete( myvalue ) {	 var Self = this; var objID = myvalue; console.log(myvalue); self.servConn.setState(\'' + dpDelete + '\',myvalue)   }' +
                                                '</script>'
                                            
                                            var htmlTabUeber2 = "<td width=" + htmlSpalte1Weite + " align=" + Feld1lAlign + ">&ensp;" + htmlFeld1 +
                                                "&ensp;<button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnSort1\()\">" + symbolSort + "</button></td><td width=" + htmlSpalte1Weite + " align=" + Feld2lAlign + ">&ensp;" + htmlFeld2 +
                                                "&ensp;<button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnSort\()\">" + symbolSortMAC + "</button>" + "&ensp;</td><td  align=" + Feld3lAlign + ">&ensp;" + htmlFeld3 +
                                                "&ensp;<button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnSort2\()\">" + symbolSortDevice + "</button>" + "&ensp;</td><td align=" + Feld4lAlign + ">&ensp;" + htmlFeld4 + "&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><td  align=" + Feld4lAlign + " style=\"color:" + htmlFarbZweiteTabelle + "\">&ensp;" + htmlFeld4 +
                                                "&ensp;</td>";
                                            //------------------------------------------------------
                                            //'function setOnDelete( myvalue ) {	var Self = this; var objID = myvalue;	Self.servConn.getStates(objID, (error, states) => {  console.log(states);  Self.servConn.setState(objID, !states[objID].val); }); }'+
                                            
                                            var htmlOut = "";
                                            var mix;
                                            var counter;
                                            var val1; var val2; var val0; var val3;
                                            var htmlTabUeber = "";
                                            var myReactionArr = []
                                            
                                            function writeHTML() {
                                            
                                                let myObj = [];
                                                let myObjOlder = [];
                                                myReactionArr = []
                                                let varhelp0; let varhelp1; let varhelp2; let varhelp3
                                                htmlOut = "";
                                            
                                            
                                            
                                                counter = -1;
                                                htmlTabUeber = "";
                                                switch (mehrfachTabelle) {
                                                    case 1: htmlTabUeber = htmlTabUeber1 + htmlTabUeber2 + htmlTabUeber3; break;
                                                    case 2: htmlTabUeber = htmlTabUeber1 + htmlTabUeber2 + htmlTabUeber2_1 + htmlTabUeber3; break;
                                                    case 3: htmlTabUeber = htmlTabUeber1 + htmlTabUeber2 + htmlTabUeber2 + htmlTabUeber2 + htmlTabUeber3; break;
                                                    case 4: htmlTabUeber = htmlTabUeber1 + htmlTabUeber2 + htmlTabUeber2_1 + htmlTabUeber2 + htmlTabUeber2_1 + htmlTabUeber3; break;
                                                };
                                                if (!UeberschriftSpalten) { htmlTabUeber = "" }
                                            
                                                //--------------------------------------------------------------------------------------------------------------------------------------------------
                                                //---------hier kommt eure schleife rein counter++, tabelleBind() und tabelleFinish() müssen so integriert bleiben !!!------------------------------
                                                //---------alle valx werte müssen von euch bestimmt werden - val0,val1,val2,val3 !!!---------------------------------------------------------------------
                                                //--------------------------------------------------------------------------------------------------------------------------------------------------
                                            
                                                sortiereClient = getState(dpSort).val
                                                let zeigeMAC = getState(dpSortIPMAC).val
                                                let sortDevice = getState(dpSortDevice).val
                                                let jetzt = new Date().getTime();
                                                let help = [];
                                                //log("jetzt: "+jetzt.toString()+"  test : " + Date.parse('2020-07-04 17:27:42')) //ew Date('July 20, 69 00:20:18 GMT+00:00')
                                                $('unifi.0.default.clients.*.mac').each(function (id, i) {           // hier eigene schleife definieren
                                                    var ida = id.split('.');
                                                    if (existsState(id.replace("mac", "ap_mac")) || existsState(id.replace("mac", "sw_mac"))) {
                                                        //counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                                                        //log(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+"."+ida[4])
                                                        varhelp0 = getObject(ida[0] + "." + ida[1] + "." + ida[2] + "." + ida[3] + "." + ida[4]).common.name;
                                                        varhelp1 = getState(id.replace("mac", "ip")).val;
                                                        zeigeMAC ? varhelp1 = getState(id.replace("mac", "ip")).val : varhelp1 = getState(id).val;
                                                        if (existsState(id.replace("mac", "sw_mac"))) { varhelp2 = getState(id.replace("mac", "sw_mac")).val }
                                                        if (existsState(id.replace("mac", "ap_mac"))) { varhelp2 = getState(id.replace("mac", "ap_mac")).val }
                                                        let farbehelp;
                                                        for (let device_name in apName) {                            //Abfrage welcher AP
                                                            //   dlog(versuch[i].ap_mac +" - " + device_name +" - " + apName[device_name].aname); 
                                                            if (varhelp2 == device_name) { varhelp2 = apName[device_name].aname; farbehelp = apName[device_name].afarbe }
                                                        };
                                            
                                            
                                                        varhelp3 = getState(id.replace("mac", "is_online")).val;
                                            
                                                        myReactionArr.push(id.replace("mac", "is_online"));
                                            
                                                        //  log(varhelp3)
                                                        if (existsState(id.replace("mac", "last_seen_by_uap"))) {
                                                            if (jetzt - Date.parse(getState(id.replace("mac", "last_seen_by_uap")).val) > abwesendZeit) {     //
                                                                // log(" "+ getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+"."+ida[4]).common.name);
                                                                let varhelp2_2 = jetzt - Date.parse(getState(id.replace("mac", "last_seen_by_uap")).val)
                                                                varhelp2 = Math.floor(((varhelp2_2 / 1000) / 60 / 60 / 24)) + "d " + Math.floor(((varhelp2_2 / 1000) / 60 / 60) % 24) + "h " + Math.floor(((varhelp2_2 / 1000) / 60) % 60) + "m ";
                                                                let valButton = ida[0] + "." + ida[1] + "." + ida[2] + "." + ida[3] + "." + ida[4] //'unifi.0.default.clients.bc:54:51:eb:74:44'
                                                                varhelp3 = "<button style\=\"border:none\; background-color\:transparent\; color\:white\; font\-size\:1em\; text\-align:left\" value=\"toggle\" onclick=\"setOnDelete\(\'" + valButton + "\')\">" + symbolDelete + "</button>";
                                                                help = [varhelp0, varhelp1, varhelp2, varhelp3, farbehelp];
                                                                myObjOlder.push(help)
                                                            } else {
                                                                help = [varhelp0, varhelp1, varhelp2, varhelp3, farbehelp];
                                                                myObj.push(help)
                                                            }
                                                            //  if (i==4) {log(getObject(ida[0]+"."+ida[1]+"."+ida[2]+"."+ida[3]+"."+ida[4]).common.name+" "+(jetzt-(getState(id.replace("mac","is_online")).lc)).toString()+"  ts : "+getState(id.replace("mac","is_online")).lc)}
                                                        }  //exists uap
                                                        else {
                                                            help = [varhelp0, varhelp1, varhelp2, varhelp3, farbehelp];
                                                            myObj.push(help)
                                                        }
                                            
                                            
                                                    }   //  abfrage ap_mac
                                                }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
                                            
                                                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 {
                                            
                                                    myObj.sort(function (alpha, beta) {
                                                        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;
                                                    });
                                                }
                                                if (sortDevice) {
                                                    myObj.sort(function (alpha, beta) {
                                                        if (alpha[2].toUpperCase().trim() > beta[2].toUpperCase().trim())
                                                            return 1;
                                                        if (beta[2].toUpperCase().trim() > alpha[2].toUpperCase().trim())
                                                            return -1;
                                                        return 0;
                                                    });
                                                    setStateDelayed(dpSortDevice, false, 2500);
                                                }
                                            
                                                for (var i = 0; i < myObj.length; i++) {
                                            
                                                    counter++
                                                    if (!offlineColor) {
                                                        val0 = myObj[i][0]; if (val0.length >= (kuerzungNamen) + 2) val0 = val0.substring(0, kuerzungNamen) + " ..."; val0 = "<font color=\"" + myObj[i][4] + "\">" + val0
                                                        val1 = myObj[i][1]; val1 = "<font color=\"" + myObj[i][4] + "\">" + val1
                                                        val2 = myObj[i][2]; val2 = "<font color=\"" + myObj[i][4] + "\">" + val2
                                                        val3 = myObj[i][3]; if (!val3) { val3 = symbolFalse } else { val3 = symbolTrue }   //val3="<font color=\""+myObj[i][4]+"\">"+val3
                                                    } else {
                                                        // log(val3)
                                                        val3 = myObj[i][3]
                                                        val0 = myObj[i][0]; if (val0.length >= (kuerzungNamen) + 2) val0 = val0.substring(0, kuerzungNamen) + " ..."; if (val3 == false) val0 = "<font color=\"" + offlineFarbe + "\">" + val0
                                                        val1 = myObj[i][1]; if (val3 == false) val1 = "<font color=\"" + offlineFarbe + "\">" + val1
                                                        val2 = myObj[i][2]; if (val3 == false) val2 = "<font color=\"" + offlineFarbe + "\">" + val2
                                                        // val3=myObj[i][3] ;  
                                                        if (!val3) { val3 = symbolFalse } else { val3 = symbolTrue }
                                                    }
                                            
                                            
                                                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                                            
                                                } // log(counter.toString())
                                            
                                                // log(counter.toString())
                                                tabelleMachSchoen()
                                                counter = -1;
                                                for (var i = 0; i < mehrfachTabelle; i++) {
                                                    if (i == 0) {
                                                        val0 = "<font color=\"" + htmlColorDeviceLangAbwesend + "\"><b><i>Abwesend</i></b>";
                                                        val1 = "<font color=\"" + htmlColorDeviceLangAbwesend + "\"><i>über: " + Math.floor(((abwesendZeit / 1000) / 60 / 60 / 24)) + "d " + Math.floor(((abwesendZeit / 1000) / 60 / 60) % 24) + "h " + Math.floor(((abwesendZeit / 1000) / 60) % 60) + "m " + "</i></b>";
                                                        //  val1=Math.floor( ((abwesendZeit/1000)/60/60/24) )+"d "+ Math.floor(((abwesendZeit/1000)/60/60) % 24) +"h "+ Math.floor( ((abwesendZeit/1000)/60) % 60 )+" m"
                                                        //  val2="<font color=\""+htmlColorDeviceLangAbwesend+"\"><i>um "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")+"</i>";
                                                    } else { val0 = ""; val1 = ""; }
                                                    val2 = ""; val3 = ""; counter++; tabelleBind();
                                                }
                                            
                                                // val0="Lange Abwesend";
                                                // val1="";val2="";val3="";
                                            
                                                myObjOlder.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;
                                                });
                                            
                                            
                                                counter = -1;
                                                for (var i = 0; i < myObjOlder.length; i++) {
                                            
                                                    counter++
                                                    if (!offlineColor) {
                                                        val0 = myObjOlder[i][0]; if (val0.length >= (kuerzungNamen) + 2) val0 = val0.substring(0, kuerzungNamen) + " ..."; val0 = "<font color=\"" + myObjOlder[i][4] + "\">" + val0
                                                        val1 = myObjOlder[i][1]; val1 = "<font color=\"" + myObjOlder[i][4] + "\">" + val1
                                                        val2 = myObjOlder[i][2]; val2 = "<font color=\"" + myObjOlder[i][4] + "\">" + val2
                                                        val3 = myObjOlder[i][3];  //if (!val3) {val3=symbolFalse} else{val3=symbolTrue}   //val3="<font color=\""+myObj[i][4]+"\">"+val3
                                                    } else {
                                                        // log(val3)
                                                        val3 = myObjOlder[i][3]
                                                        val0 = myObjOlder[i][0]; if (val0.length >= (kuerzungNamen) + 2) val0 = val0.substring(0, kuerzungNamen) + " ..."; if (val3 == false) val0 = "<font color=\"" + offlineFarbe + "\">" + val0
                                                        val1 = myObjOlder[i][1]; if (val3 == false) val1 = "<font color=\"" + offlineFarbe + "\">" + val1
                                                        val2 = myObjOlder[i][2]; if (val3 == false) val2 = "<font color=\"" + offlineFarbe + "\">" + val2
                                                        // val3=myObj[i][3] ;  
                                                        // if (!val3) {val3=symbolFalse} else{val3=symbolTrue}
                                                    }
                                            
                                            
                                                    tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                                            
                                            
                                            
                                                } // log(counter.toString())
                                            
                                                counter++
                                                val0 = "<font color=\"" + htmlColorDeviceLangAbwesend + "\"><b><i>Last Update</i></b>";
                                                val1 = "<font color=\"" + htmlColorDeviceLangAbwesend + "\"><i>um " + formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss") + "</i>";
                                                val2 = ""; val3 = ""
                                                tabelleBind()
                                            
                                                //-------------------------------------------------------------------------------------------------------------------------------------------------
                                                //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
                                                //-------------------------------------------------------------------------------------------------------------------------------------------------
                                            
                                                tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
                                            
                                            } // function ende
                                            
                                            //MAIN:
                                            
                                            
                                            schedule(mySchedule, function () {
                                                writeHTML();
                                                if (braucheEinFile) { writeFile(home, path, htmlOut, function (error) { /* log('file written');*/ }); }
                                            });
                                            writeHTML();
                                            
                                            
                                            function tabelleBind() {
                                                //HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT - hat man oben 4 Felder definiert, braucht man hier 4 Werte 
                                            
                                                switch (mehrfachTabelle) {
                                                    case 1: if (counter % 2 == 0) { htmlOut = htmlOut + "<tr bgcolor=\"" + farbeGeradeZeilen + "\"><td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td></tr>"; break; } else { htmlOut = htmlOut + "<tr bgcolor=\"" + farbeUngeradeZeilen + "\"><td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td></tr>"; break; }
                                                    case 2: if (counter % 4 == 0) {
                                                        if (counter % 2 == 0) {
                                                            htmlOut = htmlOut + "<tr bgcolor=\"" + farbeGeradeZeilen + "\"><td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie +
                                                            ";\"align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td>";
                                                        }
                                                        else { htmlOut = htmlOut + "<td align=" + Feld1lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val0 + "&ensp;</td><td  align=" + Feld2lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val1 + "&ensp;</td><td  align=" + Feld3lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val2 + "&ensp;</td><td  align=" + Feld4lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val3 + "&ensp;</td></tr>"; } break;
                                                    } else {
                                                        if (counter % 2 == 0) {
                                                            htmlOut = htmlOut + "<tr bgcolor=\"" + farbeUngeradeZeilen + "\"><td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie +
                                                            ";\" align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td>";
                                                        }
                                                        else { htmlOut = htmlOut + "<td align=" + Feld1lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val0 + "&ensp;</td><td  align=" + Feld2lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val1 + "&ensp;</td><td  align=" + Feld3lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val2 + "&ensp;</td><td  align=" + Feld4lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val3 + "&ensp;</td></tr>"; } break;
                                                    }
                                                    case 3: if (counter % 2 == 0) {
                                                        if (counter % 3 == 0) {
                                                            htmlOut = htmlOut + "<tr bgcolor=\"" + farbeGeradeZeilen + "\"><td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie +
                                                            ";\" align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td>";
                                                        }
                                                        else {
                                                            if (counter % 3 == 1) {
                                                                htmlOut = htmlOut + "<td align=" + Feld1lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val0 + "&ensp;</td><td  align=" + Feld2lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val1 + "&ensp;</td><td  align=" + Feld3lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val2 + "&ensp;</td><td  align=" + Feld4lAlign + " style=\"border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie +
                                                                ";color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val3 + "&ensp;</td>";
                                                            }
                                                            else { htmlOut = htmlOut + "<td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td></tr>"; }
                                                        } break;
                                                    } else {
                                                        if (counter % 3 == 0) {
                                                            htmlOut = htmlOut + "<tr bgcolor=\"" + farbeUngeradeZeilen + "\"><td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie +
                                                            ";\" align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td>";
                                                        }
                                                        else {
                                                            if (counter % 3 == 1) {
                                                                htmlOut = htmlOut + "<td align=" + Feld1lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val0 + "&ensp;</td><td  align=" + Feld2lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val1 + "&ensp;</td><td  align=" + Feld3lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val2 + "&ensp;</td><td  align=" + Feld4lAlign + " style=\"border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie +
                                                                ";color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val3 + "&ensp;</td>";
                                                            }
                                                            else { htmlOut = htmlOut + "<td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td></tr>"; }
                                                        } break;
                                                    }
                                            
                                                    case 4: if (counter % 8 == 0) {
                                                        if (counter % 4 == 0) { htmlOut = htmlOut + "<tr bgcolor=\"" + farbeGeradeZeilen + "\"><td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + ";\" align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td>"; }
                                                        else {
                                                            if (counter % 4 == 1) { htmlOut = htmlOut + "<td align=" + Feld1lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val0 + "&ensp;</td><td  align=" + Feld2lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val1 + "&ensp;</td><td  align=" + Feld3lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val2 + "&ensp;</td><td  align=" + Feld4lAlign + " style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "; color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val3 + "&ensp;</td>"; }
                                                            else {
                                                                if (counter % 4 == 3) { htmlOut = htmlOut + "<td align=" + Feld1lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\"&ensp;>" + val0 + "&ensp;</td><td  align=" + Feld2lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + " style=\"border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + ";color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val2 + "&ensp;</td><td  align=" + Feld4lAlign + " style=\"border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val3 + "&ensp;</td></tr>"; }
                                                                else { htmlOut = htmlOut + "<td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td  style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + ";\"align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td>"; }
                                                            }
                                                        } break;
                                                    } else {
                                                        if (counter % 4 == 0) { htmlOut = htmlOut + "<tr bgcolor=\"" + farbeUngeradeZeilen + "\"><td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + ";\" align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td>"; }
                                                        else {
                                                            if (counter % 4 == 1) { htmlOut = htmlOut + "<td align=" + Feld1lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val0 + "&ensp;</td><td  align=" + Feld2lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val1 + "&ensp;</td><td  align=" + Feld3lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val2 + "&ensp;</td><td  align=" + Feld4lAlign + " style=\"border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + ";color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val3 + "&ensp;</td>"; }
                                                            else {
                                                                if (counter % 4 == 3) { htmlOut = htmlOut + "<td align=" + Feld1lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\"&ensp;>" + val0 + "&ensp;</td><td  align=" + Feld2lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + " style=\"color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val2 + "&ensp;</td><td  align=" + Feld4lAlign + "  color:" + htmlFarbFelderschrift2 + "\">&ensp;" + val3 + "&ensp;</td></tr>"; }
                                                                else { htmlOut = htmlOut + "<td align=" + Feld1lAlign + ">&ensp;" + val0 + "&ensp;</td><td align=" + Feld2lAlign + ">&ensp;" + val1 + "&ensp;</td><td align=" + Feld3lAlign + ">&ensp;" + val2 + "&ensp;</td><td  style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + ";\"align=" + Feld4lAlign + ">&ensp;" + val3 + "&ensp;</td>"; }
                                                            }
                                                        } break;
                                                    }
                                            
                                                } //switch ende
                                            
                                            }
                                            
                                            function tabelleMachSchoen() {
                                            
                                                // tabelle fertigstellen
                                            
                                            
                                                switch (mehrfachTabelle) {
                                                    case 1: break;
                                            
                                                    case 2:
                                                        if (counter % 2 == 0) htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                                            
                                                        break;
                                            
                                                    case 3: if (counter % 3 == 2) htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");
                                                        if (counter % 3 == 1) htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                                                        if (counter % 3 == 0) htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                                            
                                                        break;
                                                    case 4: if (counter % 4 == 3) { log(htmlOut); htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>"); log(htmlOut) }
                                                        if (counter % 4 == 2) htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                                                        if (counter % 4 == 1) htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                                                        if (counter % 4 == 0) htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                                                        break;
                                                }
                                            }
                                            
                                            
                                            function tabelleFinish() {
                                            
                                                // tabelle fertigstellen
                                            
                                            
                                                switch (mehrfachTabelle) {
                                                    case 1: break;
                                            
                                                    case 2:
                                                        if (counter % 2 == 0) htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                                            
                                                        break;
                                            
                                                    case 3: if (counter % 3 == 2) htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");
                                                        if (counter % 3 == 1) htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>');
                                                        if (counter % 3 == 0) htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                                            
                                                        break;
                                                    case 4: if (counter % 4 == 3) { log(htmlOut); htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>"); log(htmlOut) }
                                                        if (counter % 4 == 2) htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                                                        if (counter % 4 == 1) htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                                                        if (counter % 4 == 0) htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td style=\" border-right: " + trennungsLinie + "px solid " + farbetrennungsLinie + "\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                                                        break;
                                                }
                                            
                                            
                                                var htmlUeber = "<p style=\"color:" + htmlFarbUber + "; font-family:" + htmlSchriftart + "; font-size: " + htmlÜberFontGroesse + "; font-weight:" + htmlSchriftWeite + "\">" + htmlFeldUeber + "&ensp;&ensp;Last Update: " + formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss"); +"</p>";
                                                var htmlUnter = "<div  style=\"color:" + htmlFarbUber + "; font-family:" + htmlSchriftart + "; font-size: 70%; text-align: right;\" >" + htmlFeldUeber + "&ensp;&ensp;Last Update: " + formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss"); +"</div>";
                                            
                                                if (!htmlSignature) htmlUnter = "";
                                                //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                                                var htmlOutVIS = "";
                                                //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                                                if (htmlUberschrift) {
                                                    zentriert ? htmlOutVIS = htmlZentriert + htmlUeber + htmlTabStyle + htmlTabUeber + htmlOut + "</table>" + htmlUnter + buttonScript : htmlOutVIS = htmlUeber + htmlTabStyle + htmlTabUeber + htmlOut + "</table>" + htmlUnter + buttonScript;
                                            
                                                } else {
                                                    zentriert ? htmlOutVIS = htmlZentriert + htmlTabStyle + htmlTabUeber + htmlOut + "</table>" + htmlUnter + buttonScript : htmlOutVIS = htmlTabStyle + htmlTabUeber + htmlOut + "</table>" + htmlUnter + buttonScript;
                                            
                                                }
                                            
                                                // log("bin raus aus tabelleBind");
                                                if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS);
                                            
                                                var htmlUnter = "<div  style=\"color:" + htmlFarbUber + "; font-family:" + htmlSchriftart + "; font-size: 80%;  text-align: center; \" >" + htmlFeldUeber + "&ensp;&ensp;Last Update: " + formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss"); +"</div>"
                                            
                                                if (!htmlSignature) htmlUnter = "";
                                                var htmlEnd = "</table>" + htmlUnter + "</div></body>";
                                                //mit oder ohne überschrift - zentriert oder links
                                                htmlUberschrift ? htmlOut = htmlStart + htmlUeber + htmlTabStyle + htmlTabUeber + htmlOut + htmlEnd : htmlOut = htmlStart + htmlTabStyle + htmlTabUeber + htmlOut + htmlEnd;
                                                //log(htmlOut);
                                            
                                            
                                            }
                                            
                                            on({ id: dpSort, change: "any" }, function (obj) {
                                            
                                            
                                                var timeout2 = setTimeout(function () {
                                            
                                                    writeHTML();
                                            
                                                }, 1500);
                                                // }
                                            
                                            });
                                            on({ id: dpSortIPMAC, change: "any" }, function (obj) {
                                            
                                            
                                                var timeout2 = setTimeout(function () {
                                            
                                                    writeHTML();
                                            
                                                }, 1500);
                                                // }
                                            
                                            });
                                            
                                            on({ id: dpSortDevice, val: true }, function (obj) {
                                            
                                            
                                                var timeout2 = setTimeout(function () {
                                            
                                                    writeHTML();
                                            
                                                }, 1500);
                                                // }
                                            
                                            });
                                            
                                            
                                            on({ id: myReactionArr, change: "any" }, function (obj) {
                                                //log("bin da","error")
                                                writeHTML();
                                                if (braucheEinFile) { writeFile(home, path, htmlOut, function (error) { /* log('file written');*/ }); }
                                            
                                            
                                            });
                                            
                                            
                                            //  LÖSCHE alte Datenpunkte
                                            on({ id: dpDelete, change: "any" }, function (obj) {
                                            
                                                deleteMydp(getState(dpDelete).val)
                                            
                                            
                                                var timeout2 = setTimeout(function () {
                                            
                                                    writeHTML();
                                            
                                                }, 3000);
                                                // }
                                            
                                            })
                                            
                                            function deleteMydp(myID) {
                                                var obj = getObject("system.adapter.unifi.0");
                                                obj.common.enabled = false;  // Adapter ausschalten
                                                setObject("system.adapter.unifi.0", obj);
                                            
                                            
                                                deleteObject(myID, true);
                                            
                                                var obj = getObject("system.adapter.unifi.0");
                                                obj.common.enabled = true;  // Adapter ausschalten
                                                setObject("system.adapter.unifi.0", obj);
                                            }
                                            
                                            

                                            Freue mich sehr über Hilfe 🙂

                                            Liebe Grüsse
                                            Jörg

                                            liv-in-sky 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            539
                                            Online

                                            31.7k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

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