Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Script Radar-Kontrolle und Koordinaten Übersetzer

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Script Radar-Kontrolle und Koordinaten Übersetzer

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

      wer möchte testen - anzeige, ob auf dem arbeitsweg (oder anderes) eine radarkontolle ist

      es werden die daten von blitzer.de abholt und mit opencagedata.com werden die koordinaten in straßennamen verwandelt - sollte auch für länder um deutschland herum funktionieren

      • gebraucht wird ein account und der api key von: https://opencagedata.com/ - kostenlos
      • datenpunkte sind unter javascript.x.CheckRadar
      • die koordinaten von und zurück zum wohnort müssen beide eingegeben werden - also für hinfahrt die koordinaten und für die rückfahrt die koordinaten
      • bitte das ergebnis auch mit der karte auf blitzer.de gegen-checken
      • es können auch einfach nur die adresse zu koordinaten abgefragt werden - siehe bild unten

      //by @liv-in-sky   15.1.2021 13:10
      //dank an @JayR  https://forum.iobroker.net/topic/37979/blitzer-%C3%BCber-api-abfragen
      
      const  myBASE_URL="https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box="
      const config = getObject('system.config');
      const mylat =  config.common.latitude; //*/"48.427656" //
      const mylong = config.common.longitude; //*/"13.211891"// 48.427656, 13.211891
      
      
      
      //WICHTIG - IN BEIDE RICHTUNGEN EINTRAGEN
      const myLATITUDE_START= [mylat      ,"48.402426",mylat      ,"48.647364",mylat      ,"48.566209",mylat      ,"48.474108",mylat      ,"48.827975"];  //Daheim,Freising,Daheim,Mainburg,Daheim,Au,Dahei,Moosburg.Daheim,Gögging
      const myLONGITUDE_START=[mylong     ,"11.744568",mylong     ,"11.784530",mylong     ,"11.741535",mylong     ,"11.967363",mylong     ,"11.778147"];
      const myLATITUDE_DEST=  ["48.402426",mylat      ,"48.647364",mylat      ,"48.566209",mylat      ,"48.474108",mylat      ,"48.827975",mylat      ];       //Freising,Daheim,Mainburg,Daheim,Au,Daheim,Moosburg,Daheim,Gögging,Daheim
      const myLONGITUDE_DEST= ["11.744568",mylong     ,"11.784530",mylong     ,"11.741535",mylong     ,"11.967363",mylong     ,"11.778147",mylong     ];
      
      
      const APIKEY_GEOCODING="4dd2056xxxxxxxxxxxxxxx
      
      const myStandardMarker=mylat+","+mylong  //          
      
      let mySchedule="  */15 8-20 * * *"
      
      let myRes=[];
      let kurzBlitzerAnzeige=[];
      let counterAbfrage;
      let myAddressDatabase=[];
      
      function getContent( LATITUDE_START,LONGITUDE_START,LATITUDE_DEST,LONGITUDE_DEST) {
         // kein async!
         return new Promise((resolve) => {
            
             // kein async!
             const url = myBASE_URL + LATITUDE_START + "," + LONGITUDE_START + "," + LATITUDE_DEST + "," + LONGITUDE_DEST
           //  log(url)
             request(url, function (err, response, json) { //log(json.length);log(err)
                                                                                                        //    let  myjson=Testing2
                                                                                                        //    log("get die Blitzer  "+myjson.pois[0].lat)
          //   log(JSON.stringify(response))
            // log(json)
             //log(response.body)
             //log(json.indexOf("<"))
             json=json.replace(/\n/gm,"")
                       if(json.indexOf("<")>=0)  json=json.replace(/.+?({.+)/,"$1")      
                        ////  log(json)  
              if(err==null && json.length>25) {////log("hat key")
                                                                                                        //  if(json.length>25 && err==null) {log("hat key") 
                                                                                                      
                          const myjson = JSON.parse(json).pois;
                     ////     log(JSON.stringify(json))
                          let myBlitzRes=[]; let myOldLat=""; let myOldLng="";
                             for(let i=0;i<myjson.length;i++){
                               if(myOldLat!=myjson[0].lat && myOldLng!=myjson[0].lng )            //  for(let i=0;i<myjson.pois.length;i++){
                                       myBlitzRes.push({
                                               lat: myjson[0].lat,
                                               lng: myjson[0].lng
                                                                                                        //   lat: myjson.pois[0].lat,
                                                                                                        // lng: myjson.pois[0].lng
                                       });
                                       myOldLat=myjson[0].lat
                                       myOldLng=myjson[0].lng
      
                             } resolve(myBlitzRes)
             } else{resolve(["empty"])}
             });
         });
      }
      
      
      function getAddress(lat, long) {
      
         // kein async!
         return new Promise((resolve) => {
      
         let gefunden=false
         for (let i=0;i<myAddressDatabase.length;i++){
             if(lat==myAddressDatabase[i].lat && long==myAddressDatabase[i].long){
                 myRes=myAddressDatabase[i].address
                 gefunden=true
             }
         }
       if(gefunden) {//log("hab es gefunden " + myRes);
                     resolve(myRes)} else{
              counterAbfrage++;
             // kein async!
             let geoCodeUrl = 'https://api.opencagedata.com/geocode/v1/json'
             geoCodeUrl = geoCodeUrl + '?' + 'key=' + APIKEY_GEOCODING + '&q=' + lat + ',' + long + '&pretty=1'
           //  log(geoCodeUrl)
             request(geoCodeUrl, function (err, response, json) {
               //  log(JSON.parse(json).results[0].formatted);
               if (err==null){
                   // log(JSON.stringify(response))
           //  log("--------------- "+json)
             //log(response.body)
                 const myRes = JSON.parse(json).results[0].formatted;
                 // Direkte Rückgabe des Wertes:
                 //log(myRes)
                 myAddressDatabase.push({
                     "lat":lat,
                     "long":long,
                     "address":myRes
                 })
                 resolve(myRes)} else {resolve("keine Adress-Auflösung möglich")}
             });
         }
         });
      }
      
      async function doStuff() {
         kurzBlitzerAnzeige=[];
         //für einzelne Koordinaten Abfrage 
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar.Daheim"))) {
             await createStateAsync("CheckRadar.Daheim", myStandardMarker,{type: "string", name: "Daheim", role: "value", read: true, write: true, } ); }
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar.MYBlitzer"))) {
             await createStateAsync("CheckRadar.MYBlitzer", "",{type: "string", name: "MYBlitzer-für Überwachung", role: "value", read: true, write: true, } ); }        
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar.EinzelAbfrage.Abfrage"))) {
             await createStateAsync("CheckRadar.EinzelAbfrage.Abfrage", "leer", {type: "string", name: "Einzelabfrage Abfrage - Komma Sep", role: "value", read: true, write: true, } ); }
         //if (!(await existsStateAsync("javascript." + instance + ".CheckRadar.EinzelAbfrage.AbfrageLng"))) {
           //  await createStateAsync("CheckRadar.EinzelAbfrage.AbfrageLng", {type: "string", name: "Einzelabfrage AbfrageLng", role: "value", read: true, write: true, } ); }   
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar.EinzelAbfrage.Abfrage-Ergebnis"))) {
             await createStateAsync("CheckRadar.EinzelAbfrage.Abfrage-Ergebnis", "leer",{type: "string", name: "Einzelabfrage Abfrage-Ergebnis", role: "value", read: true, write: true, } ); }      
         //-------------------------------
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar.DailyAbrage"))) {
             counterAbfrage=0;//log( counterAbfrage.toString())
             await createStateAsync("CheckRadar.DailyAbrage", 0,{type: "number", name: "DailyAbrage-Koordinaten", role: "value", read: true, write: true, } ); }
                                                                                         else{counterAbfrage= (await getStateAsync("javascript." + instance + ".CheckRadar.DailyAbrage")).val}
         for(let b=0;b<myLATITUDE_START.length;b++){
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar."+b+".StandortBlitzer"))) {
             await createStateAsync("CheckRadar."+b+".StandortBlitzer", {type: "string", name: "StandortBlitzer", role: "value", read: true, write: true, } ); }
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar."+b+".StandortBlitzerKoordinaten1"))) {
             await createStateAsync("CheckRadar."+b+".StandortBlitzerKoordinaten1", {type: "string", name: "StandortBlitzerKoordinaten1", role: "value", read: true, write: true, } ); } 
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar."+b+".StandortBlitzerKoordinaten2"))) {
             await createStateAsync("CheckRadar."+b+".StandortBlitzerKoordinaten2", {type: "string", name: "StandortBlitzerKoordinaten2", role: "value", read: true, write: true, } ); }
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar."+b+".ZusätzlicheBlitzer"))) {
             await createStateAsync("CheckRadar."+b+".ZusätzlicheBlitzer", "",{type: "string", name: "ZusätzlicheBlitzer", role: "value", read: true, write: true, } ); }   
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar."+b+".StandardMarker"))) {
             await createStateAsync("CheckRadar."+b+".StandardMarker", {type: "string", name: "StandardMarker", role: "value", read: true, write: true, } ); }                
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar."+b+".Abfahrt"))) {
             await createStateAsync("CheckRadar."+b+".Abfahrt", {type: "string", name: "Start", role: "value", read: true, write: true, } ); }
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar."+b+".Destination"))) {
             await createStateAsync("CheckRadar."+b+".Destination", {type: "string", name: "Destination", role: "value", read: true, write: true, } ); }  
         if (!(await existsStateAsync("javascript." + instance + ".CheckRadar."+b+".ZielKoordinaten"))) {
             await createStateAsync("CheckRadar."+b+".ZielKoordinaten", {type: "string", name: "ZielKoordinaten -  wenn nicht Daheim", role: "value", read: true, write: true, } ); }  
      
      //   for(let c=0;c<myLATITUDE_DEST.length;c++){
             if(myLATITUDE_DEST[b]!=mylat) await setStateAsync("javascript." + instance + ".CheckRadar."+b+".ZielKoordinaten",myLATITUDE_DEST[b]+","+myLONGITUDE_DEST[b])
        // }    
      
        // await setStateAsync("javascript." + instance + ".CheckRadar.MYBlitzer","")
         const myBlitzer = await getContent(myLATITUDE_START[b],myLONGITUDE_START[b],myLATITUDE_DEST[b],myLONGITUDE_DEST[b]);
         ////log("meine blitzer  "+JSON.stringify(myBlitzer))
         //let myVon=await getAddress(myLATITUDE_START[b],myLONGITUDE_START[b])
          setState("javascript." + instance + ".CheckRadar."+b+".Abfahrt",await getAddress(myLATITUDE_START[b],myLONGITUDE_START[b]))
       //  let myNach=await getAddress(myLATITUDE_DEST[b],myLONGITUDE_DEST[b])
          setState("javascript." + instance + ".CheckRadar."+b+".Destination",await getAddress(myLATITUDE_DEST[b],myLONGITUDE_DEST[b]))
      //   log(myVon+"  "+myNach)
         let myRes2=[];
         if(myBlitzer[0]!="empty") {
             setState("javascript." + instance + ".CheckRadar."+b+".StandortBlitzerKoordinaten1",myBlitzer[0].lat+","+myBlitzer[0].lng);
             setState("javascript." + instance + ".CheckRadar."+b+".StandortBlitzerKoordinaten2",myBlitzer[0].lat+";"+myBlitzer[0].lng);
             setState("javascript." + instance + ".CheckRadar."+b+".StandardMarker",myBlitzer[0].lat+";"+myBlitzer[0].lng);
            
               //   log(myBlitzer[0].lat);  log(myBlitzer[0].lng)
                   
                  for(let i=0;i<myBlitzer.length;i++){
                    //  await getAddress(myBlitzer[i].lat, myBlitzer[i].lng);
                      myRes2.push(await getAddress(myBlitzer[i].lat, myBlitzer[i].lng))
                  } 
                  //log(myRes.toString())
                 //// log( "------"+myRes.toString())
                   kurzBlitzerAnzeige.push(myRes2[0]);
                  setState("javascript." + instance + ".CheckRadar."+b+".StandortBlitzer",myRes2[0]);log(myRes2[0])
                  let addBlitzer=""
                  for( let a=1;a<myRes2.length;a++){
                       if(myRes2[a]!=myRes2[a-1]){; //log(a+":"+myRes[a]);setState("javascript." + instance + ".CheckRadar."+b+".ZusätzlicheBlitzer",myRes[a]);
                                                addBlitzer=addBlitzer+";"+myRes2[a] }
                  }  setState("javascript." + instance + ".CheckRadar."+b+".ZusätzlicheBlitzer",addBlitzer);
                  
                  //setState("javascript." + instance + ".CheckRadar."+b+".ZusätzlicheBlitzer",myRes[1]);
               //   setState("javascript." + instance + ".CheckRadar."+b+".StandardMarker",myRes[0]);
              
      } else {/*log("KEINE BLITZER !!!!!");*/ setState("javascript." + instance + ".CheckRadar."+b+".StandortBlitzer","Keine Blitzer");
                                         setState("javascript." + instance + ".CheckRadar."+b+".StandardMarker",myStandardMarker);
      }  setState("javascript." + instance + ".CheckRadar.DailyAbrage",counterAbfrage) ;
        
      
      }
      let alterWert="";let myGesamt=""
      //log(kurzBlitzerAnzeige.length.toString())
      for(let d=0;d<kurzBlitzerAnzeige.length;d++) {
             if(alterWert!=kurzBlitzerAnzeige[d]) { //log("alt: "+alterWert+"    neu: "+kurzBlitzerAnzeige[d])
                 myGesamt=myGesamt+kurzBlitzerAnzeige[d].replace(", Germany","")+"</br>"
                 alterWert=kurzBlitzerAnzeige[d] }
        } setState("javascript." + instance + ".CheckRadar.MYBlitzer",myGesamt)
         }
      
      
      schedule( mySchedule, function () { 
      doStuff();
      });
      doStuff();
      
      schedule("0 0 * * *", async function () {
      setState("javascript." + instance + ".CheckRadar.DailyAbrage",0) 
      });
      
      on({id: "javascript." + instance + ".CheckRadar.EinzelAbfrage.Abfrage", change: "any"}, async function (obj) {
       var value = obj.state.val;
       var oldValue = obj.oldState.val;
       if (existsState("javascript." + instance + ".CheckRadar.EinzelAbfrage.Abfrage") && getState("CheckRadar.EinzelAbfrage.Abfrage").val!="leer") {
       let myValueArr=value.split(",")
       let myAbfrage=await getAddress(myValueArr[0],myValueArr[1]);
       setState("javascript." + instance + ".CheckRadar.EinzelAbfrage.Abfrage-Ergebnis",myAbfrage)
       setState("javascript." + instance + ".CheckRadar.DailyAbrage",counterAbfrage)}
      });
      
      
      
      
      
      
      

      • minimale ansicht
        Image 1.png

         //@liv-in-sky 2020  5.11.2020-17:42
      
      
      //HIER WIRD PFAD UND FILENAME DEFINIERT
      const path = "/htmlexample.html";                   //FIlenamen definieren
      const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
      let   braucheEinFile=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="controll-own.0.AAATEST.TestHTML"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget
      let mySchedule1=" */7 * * * * ";                       //  
      
      let keineBlitzerAnzeigen=false;                      //bei false  wird alles angezeigt
      
      let farbeError="lightblue"
      let styleError="b" 
      //---------------------------------------
      
      //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 3
      var htmlFeld1='Instanz';      var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
      var htmlFeld2='Alive';        var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
      var htmlFeld3='Status';         var Feld3lAlign="right";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
      //-----------------------------------
      
      
      //hier werden die styles für die tabelle definiert
      //ÜBERSCHRIFT ÜBER TABELLE
      let   htmlUberschrift=false;                           // mit Überschrift über der tabelle
      let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
      const htmlFeldUeber='ioBroker Dienste';              // Überschrift und Signature
      const htmlFarbUber="white";                         // Farbe der Überschrift
      const htmlSchriftWeite="normal";                       // bold, normal - Fettschrift für Überschrift
      const htmlÜberFontGroesse="18px";                       // schriftgröße überschrift
      //MEHRERE TABELLEN NEBENEINANDER
      let   mehrfachTabelle=1;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
      const trennungsLinie="2";                             //extra trennungslinie bei mehrfachtabellen - evtl auf 0 stellen, wnn htmlRahmenLinien auf none sind
      const farbetrennungsLinie="white";
      const htmlFarbZweiteTabelle="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=false;                // ein- oder ausblenden der spatlen-überschriften
      const htmlFarbFelderschrift="#BDBDBD";                  // SchriftFarbe der Felder
      const htmlFarbFelderschrift2="#D8D8D8";                 // SchriftFarbe der Felder für jede 2te Tabelle
      const htmlFarbTableColorGradient1="#424242";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
      const htmlFarbTableColorGradient2="#424242";          //  Gradient - Hintergrund der Tabelle - ist dieser Wert gleich Gradient1 gibt es keinen verlauf
      const htmlFarbTableBorderColor="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;  http-equiv=\"refresh\" content=\"30\"; 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>";
      /*
      table td:first-child {}  //1
      table td:nth-child(2) {} //2
      table td:nth-child(3) {} //3
      table td:last-child {}   //4
      */
      
      //NICHTS ÄNDERN - abhängig von den oben definierten _Spalten - in diesem Beispiel sind es 3
      
         	var htmlTabUeber2="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td>";
      var htmlTabUeber2_1="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld1+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld2lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld2+
                         "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td>";
      //------------------------------------------------------
      
      
      var htmlTabUeber="";
      var htmlOut="";
      var mix;
      var counter;
      //HIER SIND DIE  WERTE, DIE IN DER SCHLEIFE GEFILTERET WER%DEN - Jede spalte einen wert - jeder valx muss in dieser schleife gesetzt werden !!
      var val1; var val0; var val2;
      
      function writeHTML(){
      
      
      htmlOut="";
      htmlTabUeber2=""
      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 !!!---------------------------------------------------------------------
      //--------------------------------------------------------------------------------------------------------------------------------------------------
      
      let mySelktor="javascript."+instance+".CheckRadar.*.StandortBlitzer"
      $(mySelktor).each(function(id, i) {           // hier eigene schleife definieren
              var ida = id.split('.');
               if(existsState(id) && existsState(id.replace("StandortBlitzer","Abfahrt")) && existsState(id.replace("StandortBlitzer","Destination"))) {
                if(keineBlitzerAnzeigen){   
                   if(getState(id).val!="Keine Blitzer") {  
                   counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                   val0=getState(id.replace("StandortBlitzer","Abfahrt")).val.replace(/.+, \d+ (.+),.+/,"$1")
                   val1=getState(id.replace("StandortBlitzer","Destination")).val.replace(/.+, \d+ (.+),.+/,"$1")
                   getState(id).val!="Keine Blitzer" ? val2="<font color=\""+farbeError+"\"><"+styleError+">"+getState(id).val.replace(", Germany","")  : val2=getState(id).val.replace(", Germany","") 
                   tabelleBind(); }            
                   } else{
                        counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                        val0=getState(id.replace("StandortBlitzer","Abfahrt")).val.replace(/.+, \d+ (.+),.+/,"$1")
                        val1=getState(id.replace("StandortBlitzer","Destination")).val.replace(/.+, \d+ (.+),.+/,"$1")
                        getState(id).val!="Keine Blitzer" ? val2="<font color=\""+farbeError+"\"><"+styleError+">"+getState(id).val.replace(", Germany","")  : val2=getState(id).val.replace(", Germany","")
                        tabelleBind();
                   }
      
            //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
                
      } }); //Schleifen Ende - je nach schleifenart muss hier etwas geändert werden !!!!!!!!!
      
      //-------------------------------------------------------------------------------------------------------------------------------------------------
      //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
      //-------------------------------------------------------------------------------------------------------------------------------------------------
      
            tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
           
      } // function ende
      
      //MAIN:
       
      schedule(mySchedule1,  function () { 
       writeHTML();
       if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
      }); 
      writeHTML();                                   //     <tdalign
      
       function tabelleBind(){
         //  counter=counter+mehrfachTabelle;
             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></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></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 style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\" align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                     else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} break;
                            }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 style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\"align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                     else {htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td></tr>";} break;}
                                          
               case 3:if(counter%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 style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\"align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } //Teil1 c=0
                                     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=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              "; color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} //Teil 2 c=1
                                                      else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>";} //Teil 3 c=3
                                                } 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 style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";\"align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td>"; } 
                                     else { if(counter%3==1 )  { htmlOut = htmlOut+"<td align="+Feld1lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val0+"&ensp;</td><td  align="+Feld2lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val1+"&ensp;</td><td  align="+Feld3lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+
                                                              ";color:"+htmlFarbFelderschrift2+"\">&ensp;"+val2+"&ensp;</td>";} 
                                                      else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+">&ensp;"+val0+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val1+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val2+"&ensp;</td></tr>";}
                                                } break;}                                          
      
      
               case 4:  // 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="";
                //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);
      
      
      }
      
      
      
      
      

      • ganze tabelle

      Image 4.png

       //@liv-in-sky 2020  5.11.2020-17:42
      
      
      //HIER WIRD PFAD UND FILENAME DEFINIERT
      const path = "/htmlexample.html";                   //FIlenamen definieren
      const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
      let   braucheEinFile=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="controll-own.0.AAATEST.TestHTML"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget
      let mySchedule1=" */7 * * * * ";                       //jede minute  
      
      let farbeError="lightblue"
      let styleError="b" 
      //---------------------------------------
      
      //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 5
      var htmlFeld1='VON';       var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
      var htmlFeld2='';        var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
      var htmlFeld3='NACH';         var Feld3lAlign="left";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
      var htmlFeld4='';        var Feld4lAlign="center";                    // überschrift Tabellen Spalte4 und  Ausrichtung left,right or center
      var htmlFeld5='BLITZER';        var Feld5lAlign="center";                    // überschrift Tabellen Spalte5 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='ioBroker Instanzen';              // Überschrift und Signature
      const htmlFarbUber="white";                         // Farbe der Überschrift
      const htmlSchriftWeite="normal";                       // bold, normal - Fettschrift für Überschrift
      const htmlÜberFontGroesse="18px";                       // schriftgröße überschrift
      //MEHRERE TABELLEN NEBENEINANDER
      let   mehrfachTabelle=1;                              // bis zu 4 Tabellen werden nebeneinander geschrieben-  verkürzt das Ganze, dafür etwas breiter - MÖGLICH 1,2,3,oder 4 !!!
      const trennungsLinie="2";                             //extra trennungslinie bei mehrfachtabellen - evtl auf 0 stellen, wnn htmlRahmenLinien auf none sind
      const farbetrennungsLinie="lightblue";
      const htmlFarbZweiteTabelle="lightblue";                // Farbe der Überschrift bei jeder 2.ten Tabelle
      const htmlFarbTableColorUber="lightblue";               // Ü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="lightblue";
      const groesseUeberschrift=16;
      const UeberschriftStyle="normal"                     // möglich "bold"
      //GANZE TABELLE
      let abstandZelle="3";
      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="650";                                     //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="13px";
      //FELDER UND RAHMEN
      let   UeberschriftSpalten=true;                // ein- oder ausblenden der spatlen-überschriften
      const htmlFarbFelderschrift="#3ca1c3";                  // SchriftFarbe der Felder
      const htmlFarbFelderschrift2="#D8D8D8";                 // SchriftFarbe der Felder für jede 2te Tabelle
      const htmlFarbTableColorGradient1="blue";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
      const htmlFarbTableColorGradient2="black";          //  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="rows";                            // Format für Rahmen: MÖGLICH: "none" oder "all" oder "cols" oder "rows"
      const htmlSpalte1Weite="150";                   //  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 5
      
      var htmlTabUeber2="<td width="+htmlSpalte1Weite+" align="+Feld1lAlign+">&ensp;"+htmlFeld1+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td width="+htmlSpalte1Weite+" align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+htmlFeld4+"&ensp;</td><td width="+htmlSpalte1Weite+"  align="+Feld5lAlign+">&ensp;"+htmlFeld5+"&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;"+htmlFeld3+
                         "&ensp;</td><td  align="+Feld3lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld3+"&ensp;</td><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld4+
                         "&ensp;</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld5+"&ensp;</td>";
                             //------------------------------------------------------
      
      
      
      var htmlOut="";
      var mix;
      var counter;
      var val1; var val2; var val0; var val3; var val4;
      var htmlTabUeber="";
      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+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,val4!!!------------------------------------------------------------
      //--------------------------------------------------------------------------------------------------------------------------------------------------
      
      let mySelktor="javascript."+instance+".CheckRadar.*.StandortBlitzer"
      $(mySelktor).each(function(id, i) {           // hier eigene schleife definieren
              var ida = id.split('.');
               if(existsState(id) && existsState(id.replace("StandortBlitzer","Abfahrt")) && existsState(id.replace("StandortBlitzer","Destination"))) {
                counter++;                                       // SEHR WICHTIG - MUSS IN JEDER SCHLEIFE INTEGRIERT SEIN
                val0=getState(id.replace("StandortBlitzer","Abfahrt")).val.replace(", Germany","")
                val1=" ▶️▶️▶️ "
                val2=getState(id.replace("StandortBlitzer","Destination")).val.replace(", Germany","")
                val3=" ▶️▶️▶️ "
                getState(id).val!="Keine Blitzer" ? val4="<font color=\""+farbeError+"\"><"+styleError+">"+getState(id).val.replace(", Germany","")  : val4=getState(id).val.replace(", Germany","") 
      
      
           tabelleBind(); //HIER NICHTS ÄNDERN : HIER WERDEN DIE DATEN DER SCHLEIFE ZUSAMMENGESETZT  - diese function muss als letztes in der eigenen schleife aufgerufen werden
          
         }})
      
      //-------------------------------------------------------------------------------------------------------------------------------------------------
      //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
      //-------------------------------------------------------------------------------------------------------------------------------------------------
      
            tabelleFinish(); // AB HIER NICHTS ÄNDERN - tabelle fertigstellen
           
      } // function ende
      
      //MAIN:
       
      schedule(mySchedule1,  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 5 Felder definiert, braucht man hier 5 Werte
         
             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><td align="+Feld4lAlign+">"+val3+"</td><td align="+Feld5lAlign+">"+val4+"</td></tr>"; break; } else
                                        {  htmlOut=htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td align="+Feld5lAlign+">"+val4+"</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 align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"  align="+Feld5lAlign+">"+val4+"</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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val3+"</td><td align="+Feld5lAlign+">"+val4+"</td></tr>";} break;
                     }else{
                                    if(counter%2==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld5lAlign+">"+val4+"</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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val3+"</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val4+"</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 align="+Feld3lAlign+">"+val2+"</td><td  align="+Feld4lAlign+">"+val3+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld5lAlign+">"+val4+"</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=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td><td  align="+Feld4lAlign+" style=\" color:"+htmlFarbFelderschrift2+"\">"+val3+"</td><td align="+Feld5lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">"+val4+"</td>";} 
                                                     else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td align="+Feld5lAlign+">"+val4+"</td></tr>";}
                                               } break;} else{
                       if(counter%3==0 )  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld5lAlign+">"+val4+"</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=\"color:"+htmlFarbFelderschrift2+"\">"+val2+"</td><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val3+"</td><td align="+Feld5lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">"+val4+"</td>";} 
                                                     else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td align="+Feld5lAlign+">"+val4+"</td></tr>";}
                                               } break; }
      
              case 4:  if(counter%8==0)   {
                       if(counter%4==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeGeradeZeilen+"\"><td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val4+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld5lAlign+">"+val3+"</td>"; } 
                                        else {if(counter%4==1 )  { 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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val3+"</td><td align="+Feld5lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">"+val4+"</td>";} 
                                                     else    {if(counter%4==3)  { 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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val3+"</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val4+"</td></tr>";} 
                                                                       else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld5lAlign+">"+val4+"</td>";}}
                                               } break;} else{
                       if(counter%4==0)  {htmlOut = htmlOut+"<tr bgcolor=\""+farbeUngeradeZeilen+"\"><td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld5lAlign+">"+val3+"</td>"; } 
                                        else {if(counter%4==1 )  { 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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val3+"</td><td align="+Feld5lAlign+" style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">"+val4+"</td>";} 
                                                     else    {if(counter%4==3)  { 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><td  align="+Feld4lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val3+"</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">"+val4+"</td></tr>";} 
                                                                       else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+" >"+val0+"</td><td align="+Feld2lAlign+">"+val1+"</td><td align="+Feld3lAlign+">"+val2+"</td><td align="+Feld4lAlign+">"+val3+"</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld5lAlign+">"+val4+"</td>";}}
                                               } break; }
      
           } //switch ende
      
      
      
      }
      
      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><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><td>&ensp;</td></tr>");        
                       if(counter%3==0)      htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&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><td>&ensp;</td></tr>");
                     
                        break;
             case 4:   if(counter%4==3)  htmlOut = htmlOut.replace(/<\/td>$/, "</td></tr>");
                       if(counter%4==2)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");
                       if(counter%4==1)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&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><td>&ensp;</td></tr>");    
                       if(counter%4==0)  htmlOut = htmlOut.replace(/<\/td>$/, "</td><td>&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><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"\">&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>");      
                       break; }
           
                          var htmlUeber=    "<p style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: "+htmlÜberFontGroesse+"; font-weight:"+htmlSchriftWeite+ "\">"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</p>"; 
             var htmlUnter= "<div  style=\"color:"+htmlFarbUber+"; font-family:"+htmlSchriftart+"; font-size: 70%; text-align: right;\" >"+htmlFeldUeber+"&ensp;&ensp;Last Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss");+"</div>"
              
              if (!htmlSignature) htmlUnter="";
                //Ausgabe über VIS html widget - tabelle in datenpunkt schreiben - html tabelle ohne html header und body
                 var htmlOutVIS="";
               //  htmlUberschrift ? htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>" : htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>";
                  if (htmlUberschrift) 
                      { zentriert ? htmlOutVIS=htmlZentriert+htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter : htmlOutVIS=htmlUeber+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter ;
      
                    } else {
                     zentriert ?  htmlOutVIS=htmlZentriert+htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter :  htmlOutVIS=htmlTabStyle+htmlTabUeber+htmlOut+"</table>"+htmlUnter;
      
                       }
      
      // log("bin raus aus tabelleBind");
                 if (braucheEinVISWidget) setState(dpVIS, htmlOutVIS );
      
       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);
       
      
      
      }
      
      
      
      

      • landkartenansicht:
        siehe:
        https://forum.iobroker.net/post/516400

      anim-gif14.gif
      zusatztrick mit eigenem icon für zuhause:
      Image 15.png

      leider kann ich keine route bestimmen - blitzer de nimmt einfach alle möglichen routen bzw evtl sogar nur einen umkreis und zeigt alle blitzer an
      um das auszuwerten, ob das in der route liegen kann, müßte ich das selbst berechnen - zum einen glaube ich, bekomm ich das mathematisch nicht hin und zum anderen kenne ich keine seite, die mir das ausrechnen könnte
      ich bräuchte den abstand zwischen den beiden punkten und müßte kontrollieren, ob der blitzer da drin liegt
      
      sorry - besser gehts im moment nicht
      
      O 1 Reply Last reply Reply Quote 3
      • liv-in-sky
        liv-in-sky last edited by liv-in-sky

        Script wurde upgedatet -

        möchte man das script nur als übersetzer von koordinaten zu einer adresse nutzen, ist das auch möglich - wenn die const myLATITUDE_START=[] (also leer ist) wird keine route berechnet, aber das script wartet auf koordinaten zur adressübersetzung

        falls das alte script schon lief, alle datenpunkte löschen - habe sie unbenannt

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

          Danke - Funktioniert super! Hat beim Installieren auch gleich einen Blitzer auf meinem Weg gemeldet. Könntest Du vielleicht noch einen State vorsehen, in dem steht, ob auf irgendeinem der Wege ein Blitzer erkannt wurde oder auch die Gesamtzahl der erkannten Blitzer - z. B. "CheckRadar.BlitzerErkannt" {type: 'boolean'} oder {type: 'number'}'? Damit ließe sich in Vis einfach ein eine View anzeigen oder verbergen, wenn auf einem der Wege Blitzer sind. Ich könnte das auch selbst einbauen, müßte dann Dein Skript aber bei jeder Änderung neu anpassen.

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

            @grrfield

            bisher habe ich so eine übersicht

            Image 4.png

            ich habe noch ein wenig probleme zu erkennen, was es eigentlich anzeigt

            • einmal zeigte es mir nur einen blitzer an, wenn die richtige richtung im script angegeben war (nur bei hin - nicht bei zurück)
            • gestern zeigte es einen blitzer in beiden routen (hin und zurück) an
            • wenn mehrere blitzer auf einer tour angezeigt werden (was bisher nur einmal war), ist das im moment nicht berücksichtigt - arbeite dran
            • die routen von blitzer sind eher seltsam - es kommen blitzer vor, die eigentlich eher im umkreis der routen liegen - wie im beispielbild - 2te zeile - von freising zu mir nachhause komme ich niemals in Oberding vorbei - ich kannte das nicht mal - auf der karte sieht es so aus

            Image 5.png

            ich schau mal wegen dem datenpunkt

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

              @liv-in-sky Ich habe mich auch schon gefragt, wie die Routen berechnet werden - es gibt ja immer mehrere Möglichkeiten, zum Ziel zu kommen. Wenn mal ein Blitzer in der Umgebung zuviel gefunden wird, ist das ja nicht so schlimm 😉 Bei mir wurden heute zweimal Blitzer in beiden Richtungen angezeigt.
              Ich habe in meiner Vis auf einem Tablet neben der Haustür ein "Service"-Feld, das normalerweise leer ist und in dem Karten zu Störungsmeldungen (z. B. Homematic-Servicemeldungen, Duty-Cycle usw.) priorisiert angezeigt werden können. Dort möchte ich eine Radarwarnung einblenden, wenn auf meiner Strecke Störungen sind - für eine Strecke habe ich das jetzt bereits angepaßt.

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

                @liv-in-sky Was mir gerade noch eingefallen ist: Bei einer Radarwarnung könnte noch eine Telegram-Message abgesendet werden: z. B. unter
                if(myBlitzer[0]!="empty") {
                in Zeile 120 etwas wie
                sendTo("telegram.0", {
                text: "Blitzer entdeckt: "+myRes[0]
                });
                einfügen.

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

                  @grrfield letztlich kommt es darauf an, wieviele routen man selbst oder evtl noch für den partner anzeigen möchte

                  daher habe ich die tabelle oben gemacht - die sehr viel platz braucht - man könnte auch das table script ändern und nur felder mit blitzer anzeigen lassen - ohne von und zu - vileicht von un zu nur mit stadt namen - dann ist alles viel kleiner

                  ich mach mal eine kleine version

                  das mit dem telegram ist sicher gut - aber das mussman über ein eigenes blockly machen- es gibt ja so viele melde-geber: mail, echo, whatsapp, sayit, ..... - da werd ich nicht mehr fertig -)

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

                    @grrfield

                    was hälst du von sowas - minimal ansicht - im moment habe ich die keine blitzer eingeblendet, weil keiner da ist - normal sollen nur zeilen angezeigt werden, die blitzer haben

                    Image 6.png

                    das ganze ist dann ziemlich klein und kann in einer ecke angezeigt werden

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

                      @liv-in-sky Sieht gut aus, aber die Spalte für die Blitzer (wo die eigentliche Information steht) ist im Verhältnis zu den anderen ziemlich klein. Ich habe das jetzt erstmal so gelöst:
                      Blitzer.png
                      (Die Farben kommen auf dem Tablet etwas anders raus)
                      Die Strecke wollte ich noch in der Überschrift Radarkontrolle unterbringen, und bei Blitzern auf mehreren Strecken erscheint der nächste dann darunter.

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

                        @grrfield im ersten post sind noch neue tabellen scripte - aber du hast ja schon eine lösung gefunden

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

                          @liv-in-sky Danke, schaue ich mir. Die hatte ich noch gar nicht gesehen.

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

                            jetzt habe ich wieder so einen "wirren" fall - die gelben striche ist: daheim

                            Image 1.png

                            daheim - freising nix
                            freising - daheim - blitzer

                            daher der rat , immer beide richtungen als route eintragen

                            obwohl - in keiner route würde man über Volkenschwand fahren - in einer route könne man das . die 2te route müßte man 15km nach norden fahren um dann 35 km nach süden zu fahren

                            aber besser eine meldung zu viel - als zu wenig

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

                              @liv-in-sky Bei mir auch gerade: ein Blitzer wird nur auf dem Hinweg angezeigt, und der ist auch noch in vollkommen anderer Richtung 9 km von meiner Route entfernt. Ist aber nicht so schlimm, Hauptsache man bekommt eine Warnung und kann dann selbst einschätzen, ob man da langfährt. Die einzige Gefahr ist, daß mehrere Blitzer da sind und nur der "falsche" angezeigt wird.

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

                                @grrfield check ich nochmal im script

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

                                  script im ersten post upgedatet!

                                  @grrfield - habe einen zusätzlichen datenpunkt, der zusätzliche blitzer pro route anzeigt - habe bis jetzt keine - wäre gut, wenn du das testen könntest und den dp beobachtest - ob überhaupt mal etwas reingeschrieben wird

                                  @ALL
                                  landkarte mit blitzer und heimatkoordinaten

                                  mit dem open street map widget kann man sich das ganze auf karte angezeigt werden - es gibt dafür neue datenpunkte, die marker dafür schreiben. grundsätzlich werden routen, die keinen blitzer haben auf den heimatstandort anzeigen, daher muss im script jetzt auch die variable myStandardMarker angegebene werden (heimstandort!)

                                  hier mal mein setting des widgets:

                                  • ich habe 5 routen und daher brauche ich 5 marker im widget
                                  • in jedem marker wird der dp StandardMarker der route eingetragen
                                    zb: javascript.0.CheckRadar.0.StandardMarker, javascript.0.CheckRadar.1.StandardMarker, javascript.0.CheckRadar.2.StandardMarker, .... bis 4
                                  • Tausche Längengrat mit Breitengrad muss angeklickt sein!

                                  Image 5.png

                                  das ganze sieht dann so aus:

                                  • schwarz daheim
                                  • rot blitzer

                                  Image 7.png

                                  das widget zum download gibt es hier https://forum.iobroker.net/post/520890 - einfach unbenötigte marker löschen und wer mehr benötigt : dazufügen

                                  • noch ein kleiner zusatztrick:
                                    wenn man einfach einen marker zusätzlich am ende angibt, kann man dort ein eigenes bild setzen für den marker - als dp nimmt man javascript.0.CheckRadar.Daheim
                                    sieht dann so aus:
                                    roter punkt: blitzer
                                    iobroker symbol: daheim

                                  Image 12.png
                                  Image 15.png

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

                                    @liv-in-sky Danke - ich beobachte das und gebe Bescheid, sobald mehrere Blitzer gemeldet werden.

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

                                      @grrfield

                                      finde eigentlich die karte am besten - habe sie 5*5cm in der vis - freu mich immer, wenn ein neuer blitzer auftaucht 🙂

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

                                        @liv-in-sky

                                        moin, cooles feature, dass du dir da ausgedacht hast..

                                        nur mit dem Trick Marker 0. am Ende verstehe ich nicht. an welchem Ende meinst du?

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

                                          @efxz du hast für jeden datenpunkt standardmarker einen marker im widget eingetragen - die zeigen etwas an, wenn ein blitzer drin steht - wenn kein blitzer drin ist, werden deine standardmarker mit deiner heimadresse überschrieben - dann machst du noch einen marker im script und dieser liegt dann auch ÜBR deiner heimadrese und allen ohne blitzer - damit ist daheim immer ein eigenes symbol

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

                                            @liv-in-sky

                                            kann dir immer noch nicht folgen.. den extra Datenpunkt mit meinen Heimatkoord. unter 1. oder 2. hinzufügen?

                                            ![Bild Text](52d71a09-7a14-4044-9c01-a8c9d0e54cb2-image.png Bild Link)

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            494
                                            Online

                                            31.8k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript
                                            10
                                            94
                                            6942
                                            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