Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Sonoff Tasmota Timer (1-12) über ioBroker nutzen?

    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

    Sonoff Tasmota Timer (1-12) über ioBroker nutzen?

    This topic has been deleted. Only users with topic management privileges can see it.
    • I
      ITCrowd @Soundy last edited by

      @Soundy Leider bin ich nicht der Experte in MQTT und kann nicht sagen ob man die Timer darüber abfragen kann. Bin gerade dabei mich hier einzulesen.

      Um aber zu verhindern das der Garten beim Ausfall des ioBrokers absäuft, würde schon der Befehl PulseTime (Tasmota Konsole) helfen. Er begrenzt die Einschaltdauer und soll auch über MQTT erreichbar sein.

      1 Reply Last reply Reply Quote 0
      • mickym
        mickym Most Active @Soundy last edited by mickym

        @Soundy Installiere Dir den Tasmota Device Manager - da kannst Du die timer direkt einstellen.

        Wenn Du den installiert hast bekommst Du auch im cmnd-Ast alle möglichen Kommandos:

        screen.png

        evtl. hilft auch die offizielle Tasmota Doku https://tasmota.github.io/docs/Commands/

        Den PulseTimer nutze ich auch - das wurde über das Backlog wie folgt eingestellt:

        PulseTime1 0; PulseTime2 3700; PulseTime3 400; PulseTime4 1000; PulseTime5 0; PulseTime6 0; PulseTime7 0; PulseTime8 0; status; status 3

        Die Zahlen bei dem PulseTimer stimmen jedenfalls genau:

        PulseTime<x> Display the amount of PulseTime remaining on the corresponding Relay<x>
        <value> Set the duration to keep Relay<x> ON when Power<x> ON command is issued. After this amount of time, the power will be turned OFF.
        0 / OFF = disable use of PulseTime for Relay<x>
        1..111 = set PulseTime for Relay<x> in 0.1 second increments
        112..64900 = set PulseTime for Relay<x>, offset by 100, in 1 second increments. Add 100 to desired interval in seconds, e.g., PulseTime 113 = 13 seconds and PulseTime 460 = 6 minutes (i.e., 360 seconds)

        Deswegen muss man 100 bei 5min zu den 300s dazu zählen.

        Wie gesagt mit dem Tasmota Device Manager geht das super und grafisch und der setzt Dir automatisch die MQTT-Kommandos.

        Hier kannst den runterladen: Tasmota Device Manager

        Dort kannst Du mehrere Timer mit Wochentagen und Uhrzeiten ganz easy definieren und wird dann in MQTT-Kommands umgesetzt:

        screen.png

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

          @Soundy

          ich habe ein script, welches mir die timer anzeigt in der vis und zum setzen wird ein link zum device dargestellt

          denke nicht, dass du sowas suchst - habe da mal daran gearbeitet - das script könnte noch verbessert werden - sieht dann so aus

          timer.gif

          Image 4.png

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

            @liv-in-sky

            Wowwww! 🙂

            Nun, das sieht ja mal ganz gut aus, finde ich. Das Anzeigen der Timer wäre mir schon mal eine Hilfe, vielleicht finden wir gemeinsam hier im Forum eine Möglichkeit diese Timer auch über ioBroker zu setzen. Kannst du mal das/die Skript(e) reinstellen? Dann importiere ich mir das mal...

            liv-in-sky 3 Replies Last reply Reply Quote 0
            • liv-in-sky
              liv-in-sky @Soundy last edited by

              @Soundy
              das timer setzten ist auch nicht die große sache - z.b. über http mit:

              {"Timer1":{"Arm":1,"Mode":0,"Time":"09:05","Window":0,"Days":"1111111","Repeat":1,"Output":1,"Action":2}}
              

              das kann man sich in einem script zusammenbasteln und in der vis darstellen

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

                @Soundy

                im script gib es eine variable dpVis (zeichekette) und dpRefresh (logik)- im oberen bereich - da stehen datenpunkte - du mußt dir zwei eigene datenpunkte in deinem system anlegen und dann deine datenpunkte im scipt eintragen

                zusätzlich gibt es die variable filterArray, da trägst du die zu scannenden sonoffs ein - habe anfangs über alle sonoffs gescannt - aber manche - mit alter software - mögen das nicht, daher habe ich ein solches array zum eingeben gemacht (hostname unter INFO ordner eintragen)

                momentan wird alle 15 minuten abgefragt und die tabelle erzeugt - leider habe ich keinen trigger im system, der mir sagt, dass ein timer dazugekommen ist. man müßte im script noch das erstellen eines timer hinzufügen - dann könnte man darauf triggern und die tabelle sofort "refreshen". im moment wird refresht, wenn sich ein power wert ändert oder alle 15 minuten

                das script:

                 //@liv-in-sky 2020  5.9.-8:42
                
                
                //HIER WIRD PFAD UND FILENAME DEFINIERT
                const path = "/htmlexample.html";                   //FIlenamen definieren
                const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                let   braucheEinFile=false;                          // bei true wird ein file geschrieben
                let   braucheEinVISWidget=true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
                let dpVIS="controll-own.0.AAATEST.TestHTML"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget
                let dpRefresh="controll-own.0.AAATEST.TestHTMLRefresh"
                let mySchedule="  */15 * * * * ";                       //jede minute  
                //---------------------------------------
                
                var leerzeile=true           ;                            // leerzeile vor neuen kalender
                
                var styleUeber="span"
                var farbeUeber="lightblue"
                var symbolLink="🌎";
                var anzahlTimer=5;                                        // wieviele Timer sollen abgefragt werden
                
                var filterArray=["Sonoff11","Sonoff15","Sonoff16"];      // definiert, welche geräte gecheckt werden (hostname)
                
                
                //HIER DIE SPALTEN ANZAHL DEFINIEREN - jede Spalte einen Wert - in diesem Beispiel sind es 5
                var htmlFeld1='Timer';       var Feld1lAlign="left";                     // überschrift Tabellen Spalte1 und  Ausrichtung left,right or center
                var htmlFeld2='Mode';        var Feld2lAlign="center";                      // überschrift Tabellen Spalte2 und  Ausrichtung left,right or center
                var htmlFeld3='Repeat';         var Feld3lAlign="center";                    // überschrift Tabellen Spalte3 und  Ausrichtung left,right or center
                var htmlFeld4='Window';        var Feld4lAlign="center";                    // überschrift Tabellen Spalte4 und  Ausrichtung left,right or center
                var htmlFeld5='Days';        var Feld5lAlign="center";                    // überschrift Tabellen Spalte5 und  Ausrichtung left,right or center
                var htmlFeld6='Time';        var Feld6lAlign="center";                    // überschrift Tabellen Spalte5 und  Ausrichtung left,right or center
                var htmlFeld7='Output';        var Feld7lAlign="center";                    // überschrift Tabellen Spalte5 und  Ausrichtung left,right or center
                var htmlFeld8='Action';        var Feld8lAlign="center";                    // überschrift Tabellen Spalte5 und  Ausrichtung left,right or center
                
                //-----------------------------------
                
                
                
                //hier werden die styles für die tabelle definiert
                //ÜBERSCHRIFT ÜBER TABELLE
                let   htmlUberschrift=true;                           // mit Überschrift über der tabelle
                let   htmlSignature=false;                              // anstatt der Überscghrift eine signature: - kleiner - anliegend
                const htmlFeldUeber='Sonoff Devices Timers';              // Ü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="2";                   // Linie nur unter Spaltenüberschrift - 
                const farbeLinieUnterUeberschrift="white";
                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="#333333";                        //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="#151515";                 // SchriftFarbe der Felder für jede 2te Tabelle
                const htmlFarbTableColorGradient1="#1c1c1c";          //  Gradient - Hintergrund der Tabelle - Verlauffarbe
                const htmlFarbTableColorGradient2="#1c1c1c";          //  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="cols";                            // Format für Rahmen: MÖGLICH: "none" oder "all" oder "cols" oder "rows"
                const htmlSpalte1Weite="auto";                    //  Weite der ersten beiden  Spalten oder z.b. 115px
                
                // 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 width="+htmlSpalte1Weite+" align="+Feld2lAlign+">&ensp;"+htmlFeld2+"&ensp;</td><td  align="+Feld3lAlign+">&ensp;"+htmlFeld3+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+htmlFeld4+"&ensp;</td><td  align="+Feld5lAlign+">&ensp;"+htmlFeld5+"&ensp;</td><td  align="+Feld6lAlign+">&ensp;"+htmlFeld6+"&ensp;</td><td  align="+Feld7lAlign+">&ensp;"+htmlFeld7+"&ensp;</td><td  align="+Feld8lAlign+">&ensp;"+htmlFeld8+"&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><td align="+Feld6lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld6+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld7+"&ensp;</td><td align="+Feld8lAlign+" style=\"color:"+htmlFarbZweiteTabelle+"\">&ensp;"+htmlFeld8+"&ensp;</td>";
                                       //------------------------------------------------------
                
                let countMYWerte=0;
                let idOld=""
                const axios=require('axios');
                let wartezeit;
                let wartezeitInFunction=500;
                let zaehlerErfolg;
                var htmlOut="";
                var mix;
                var counter;
                var val1; var val2; var val0; var val3; var val4; var val5; var val6; var val7;
                let myArr=[]
                let myPowerOld=""
                let myPower="na"
                let myPower1="na"
                let myPower2="na"
                let arrTrigger=[];
                let running=false;
                var htmlTabUeber="";
                
                async  function writeHTML(){
                
                running=true;
                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!!!------------------------------------------------------------
                //--------------------------------------------------------------------------------------------------------------------------------------------------
                myArr=[]
                arrTrigger=[]
                //log("anfang")
                
                  zaehlerErfolg= await durchlaufen()
                
                zaehlerErfolg=10000
                
                //log("ende2")
                  wartezeit=(wartezeitInFunction*zaehlerErfolg)+5000
                setTimeout(function () {
                //log(arrTrigger.toString())
                myArr.sort(function (alpha, beta) {
                             if (alpha[2].toUpperCase() > beta[2].toUpperCase())
                                return 1;
                             if (beta[2].toUpperCase() > alpha[2].toUpperCase())
                                return -11;
                             return 0;
                            });
                
                countMYWerte=0
                
                //log(myArr.toString())
                for(let i=0;i<myArr.length;i++){
                  //counter++
                
                                 if(myArr[i][2]!=idOld){
                                      countMYWerte++
                                      tabelleMachSchoen()
                                   //   counter=-1
                                      if(leerzeile){
                                                    if(countMYWerte>1) for(var a=0;a<mehrfachTabelle;a++ ) { //leerzeile
                                                          val0=""; val1=""; val2="";val3="";val4="";val5="";val6="";val7="";counter++;tabelleBind();
                                                     } }
                              for(var ic=0;ic<mehrfachTabelle;ic++ ) {
                                     (ic==0) ? val0="<font color=\""+farbeUeber +"\"><"+styleUeber+">"+ myArr[i][2] +  "<a href=\"http:\/\/"+ getState(myArr[i][1]).val+"\/tm" + "\" target=\"_blank\" onclick=\"window.open(this.href,this.target,\'width=480,height=640\'); return false;\">"+symbolLink+"</a>" : val0=""
                                   //  log(val0)
                                   
                                      val1="";val2="";val3="";val4="";val5="";val6="";val7="";
                                      if(myArr[i][3]!="na") myArr[i][3]=="true" ? val1="P:ON" : val1="P:OFF"
                                      if(myArr[i][4]!="na") myArr[i][4]=="true" ? val2=val2+"P1:ON" : val2=val2+"P1:OFF"
                                      if(myArr[i][5]!="na") myArr[i][5]=="true" ? val3=val3+"P2:ON" : val3=val3+"P2:OFF"
                                      val1="<font color=\""+farbeUeber +"\"><"+styleUeber+">"+val1
                                      val2="<font color=\""+farbeUeber +"\"><"+styleUeber+">"+val2
                                      val3="<font color=\""+farbeUeber +"\"><"+styleUeber+">"+val3
                     
                             counter++;
                             tabelleBind();}
                             
                              idOld=myArr[i][2]; // log(idOld)
                }
                
                //counter=-1
                   let myObj=JSON.parse(myArr[i][0])        
                 //for(let a=0;a<)
                // log(myObj.hasOwnProperty(/(Timer)/g))
                   
                 let  myTimer=Object.keys(myObj)[0]
                   val0=Object.keys(myObj)[0] 
                   val1=myMode(myObj[myTimer].Mode)
                   val2=myObj[myTimer].Repeat  //""
                   val3=myObj[myTimer].Window //""
                   val4=myDay(myObj[myTimer].Days) //""
                   val5=myObj[myTimer].Time
                   if(myObj[myTimer].Mode==1)  val5=formatDate(getDateObject(getAstroDate("sunrise", undefined, 0)), "hh:mm") //""
                   if(myObj[myTimer].Mode==2)  val5=formatDate(getDateObject(getAstroDate("sunset", undefined, 0)), "hh:mm") //""
                   val6=myObj[myTimer].Output //""
                   val7=   myAction(myObj[myTimer].Action) //""
                counter++; tabelleBind();
                }
                tabelleFinish();
                //   log(myArr.toString())
                running=false;
                }, 10000); 
                
                //-------------------------------------------------------------------------------------------------------------------------------------------------
                //--------------------------------------------------Ende der schleife------------------------------------------------------------------------------
                //-------------------------------------------------------------------------------------------------------------------------------------------------
                
                } // function ende
                
                //MAIN:
                 
                schedule(mySchedule,  function () {
                 if(!running) writeHTML();
                 if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                }); 
                  if(!running) 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+" >&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><td align="+Feld5lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+">&ensp;"+val7+"&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><td align="+Feld5lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+">&ensp;"+val7+"&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 align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld8lAlign+">&ensp;"+val7+"&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><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val7+"&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 align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld8lAlign+">&ensp;"+val7+"&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><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val7+"&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 align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld8lAlign+">&ensp;"+val7+"&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=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld8lAlign+">&ensp;"+val7+"&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><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+">&ensp;"+val7+"&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 align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld8lAlign+">&ensp;"+val7+"&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=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">&ensp;"+val7+"&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><td align="+Feld4lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+">&ensp;"+val7+"&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 align="+Feld4lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld5lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld8lAlign+">&ensp;"+val7+"&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=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+" style=\border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">&ensp;"+val7+"&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+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\>&ensp;"+val7+"&ensp;</td></tr>";} 
                                                                                 else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+" >&ensp;"+val0+"&ensp;</td><td>&ensp;"+val1+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld8lAlign+">&ensp;"+val7+"&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 align="+Feld4lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld5lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\"align="+Feld8lAlign+">&ensp;"+val7+"&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=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+" style=\"border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+"; color:"+htmlFarbFelderschrift2+"\">&ensp;"+val7+"&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+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val3+"&ensp;</td><td align="+Feld5lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val6+"&ensp;</td><td align="+Feld8lAlign+" style=\"color:"+htmlFarbFelderschrift2+"\">&ensp;"+val7+"&ensp;</td></tr>";} 
                                                                                 else    {htmlOut = htmlOut+"<td align="+Feld1lAlign+" >&ensp;"+val0+"&ensp;</td><td>&ensp;"+val1+"&ensp;</td><td align="+Feld2lAlign+">&ensp;"+val2+"&ensp;</td><td align="+Feld3lAlign+">&ensp;"+val3+"&ensp;</td><td align="+Feld4lAlign+">&ensp;"+val4+"&ensp;</td><td align="+Feld6lAlign+">&ensp;"+val5+"&ensp;</td><td align="+Feld7lAlign+">&ensp;"+val6+"&ensp;</td><td style=\" border-right: "+trennungsLinie+"px solid "+farbetrennungsLinie+";\" align="+Feld8lAlign+">&ensp;"+val7+"&ensp;</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><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><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>&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><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><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>&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><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>&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><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><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);
                 
                
                
                }
                
                 function tabelleMachSchoen(){
                  switch (mehrfachTabelle) {  
                       case 1:    break;
                
                       case 2:    
                                 if(counter%2==0)  htmlOut = htmlOut.replace(/<\/td>$/, '</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td><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><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>&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><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><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>&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><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>&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><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><td>&ensp;</td><td>&ensp;</td><td>&ensp;</td></tr>"); 
                                 break; }
                
                
                 }
                
                      async function getData(url,id,hostname,power,power1,power2) {
                         
                 try {
                   const response = await axios.get(url)
                    if(JSON.stringify(response.data).includes("Timer")) { if(JSON.stringify(response.data).includes(`Arm":1,`) ) myArr.push([JSON.stringify(response.data),id,hostname,power,power1,power2]) }
                 
                 } catch (error) {
                    let myError="Verbindungsproblem - Sonoff Timer script - Script neustarten evtl. Sonoff vom Strom nehmen" //'{"Timerx":{"Arm":1,"Mode":0,"Time":"error","Window":0,"Days":"0000000","Repeat":1,"Output":1,"Action":2}}'
                    // myArr.push([myError,dpRefresh,"error"]);log(myArr.toString())
                      console.log(myError + " - " + hostname);
                 }
                }
                
                function myAction(action) {
                switch (action) {
                     case 0:
                            return "OFF"
                
                     case 1: 
                            return "ON"
                
                     case 2: 
                            return "TOGGLE"
                
                     case 3: 
                            return  "BLINK"            
                
                }
                  
                }
                
                function myDay(days) {
                   let myErgebnis=""
                
                if(days[0]==1)  myErgebnis=myErgebnis+"So,"   
                if(days[1]==1)  myErgebnis=myErgebnis+"Mo,"   
                if(days[2]==1)  myErgebnis=myErgebnis+"Di,"   
                if(days[3]==1)  myErgebnis=myErgebnis+"Mi,"   
                if(days[4]==1)  myErgebnis=myErgebnis+"Do,"   
                if(days[5]==1)  myErgebnis=myErgebnis+"Fr,"   
                if(days[6]==1)  myErgebnis=myErgebnis+"Sa,"
                
                return myErgebnis.replace(/(.+),$/,"$1")   
                
                }
                
                function myMode(mode) {
                switch (mode) {
                     case 0:
                            return "Time"
                
                     case 1: 
                            return "Sunrise"
                
                     case 2: 
                            return "Sunset"
                
                          
                
                }
                  
                }
                
                on({id: dpRefresh, change: "any"}, function (obj) { 
                     var timeout2 = setTimeout(function () {     
                         if(!running) writeHTML(); 
                      }, 1500);
                   });
                
                on({id: arrTrigger, ack: false, change: "any"}, function (obj) { 
                  
                    if(!running) writeHTML();
                    if (braucheEinFile) {writeFile(home, path ,htmlOut, function (error) { /* log('file written');*/  });}
                
                     
                   });
                
                async function durchArr(){
                myArr=[]
                //log("now")
                $('sonoff.0.*.INFO.IPAddress').each(function(id, i) {           // hier eigene schleife definieren
                        var ida = id.split('.');
                
                 if(getState("sonoff.0."+ida[2]+".alive").val && parseInt(getState("sonoff.0."+ida[2]+".INFO.Version").val.replace(/^(.).+/,"$1")) >=5) {
                   for (let ii=1;ii<=anzahlTimer;ii++){
                
                let myhttp=`http://${getState(id).val}/cm?cmnd=timer${ii}`
                resolveAfter2Seconds();
                  getData(myhttp,id,getState("sonoff.0."+ida[2]+".INFO.Hostname").val)
                
                }}
                
                })
                }
                 
                function resolveAfter2Seconds() {
                 return new Promise(resolve => {
                   setTimeout(() => {
                     resolve('resolved');
                   }, 1000);
                 });
                }
                
                async function getMyData(myhttp,id,ida)
                {
                await getData(myhttp,id,getState("sonoff.0."+ida[2]+".INFO.Hostname").val)
                }
                
                function wait(ms) {
                   return new Promise((resolve) => {
                       setTimeout(resolve, ms);
                   });
                }
                async function durchlaufen(){
                  
                   $('sonoff.0.*.INFO.IPAddress').each(async function(id, i) {          
                        var ida = id.split('.');
                        myPower="na";
                        myPower1="na";
                        myPower2="na";
                
                 if(getState("sonoff.0."+ida[2]+".alive").val && parseInt(getState("sonoff.0."+ida[2]+".INFO.Version").val.replace(/^(.).+/,"$1")) >=5) {
                        if (existsState("sonoff.0."+ida[2]+".POWER")) myPower=getState("sonoff.0."+ida[2]+".POWER").val.toString()
                        if (existsState("sonoff.0."+ida[2]+".POWER1")) myPower1=getState("sonoff.0."+ida[2]+".POWER1").val.toString()
                        if (existsState("sonoff.0."+ida[2]+".POWER2")) myPower2=getState("sonoff.0."+ida[2]+".POWER2").val.toString()      
                   for (let ii=1;ii<=anzahlTimer;ii++){
                
                       let myhttp=`http://${getState(id).val}/cm?cmnd=timer${ii}`
                
                      let helpi=getState("sonoff.0."+ida[2]+".INFO.Hostname").val;
                
                      
                  //  resolveAfter2Seconds();log("!!!!!!")
                      for(let i=0;i<filterArray.length;i++){ await wait(wartezeitInFunction)
                             if (filterArray[i]==helpi) {  getData(myhttp,id,helpi,myPower,myPower1,myPower2);//log("jetzt wird gefragt");
                                                          if(myPowerOld!=helpi){
                                                               if (myPower!="na")  arrTrigger.push("sonoff.0."+ida[2]+".POWER");
                                                               if (myPower1!="na") arrTrigger.push("sonoff.0."+ida[2]+".POWER1");
                                                               if (myPower2!="na") arrTrigger.push("sonoff.0."+ida[2]+".POWER2");
                                                               myPowerOld=helpi}
                                                               zaehlerErfolg=zaehlerErfolg+i}
                      } // await wait(2000)
                
                    }}
                
                  });  /*log("bin da");*/      }
                
                
                
                
                
                
                

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

                  @Soundy

                  was meinst du eigentlich mit timer setzen - nur enabeln und disabeln oder mehr - oder möchtest du alles machen können ( anlegen, verändern einzelner einstellungen ?)

                  sollte so funktionieren:

                  • habe die select-widgets nicht "schön" formatiert
                  • es sind nicht alle möglichkeiten integriert - viel arbeit
                  • das einrichten ist auch etwas kompliziert - ich habe noch ein extra script dafür gebraucht
                  • der refresh des ganzen dauert immer ein wenig - das liegt am aufbau der tabelle: diese ist ausgebremst, damit das lesen der sonoffs nicht zu schnell geht

                  smart84.gif

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

                    @liv-in-sky

                    Prinzipiell wäre Anlegen, Ändern sowie Enable/Disable für mich mal interessiert.

                    Derzeit komme ich mit dem Skript noch nicht ganz klar, es will bei mir absolut nichts ausgeben.

                    Welchen MQTT verwendest du denn? Instanz "sonoff.0" oder "mqtt.0". Versucht habe ich es mit beiden, aber es klappte nicht. Ich habe den Sonoff mal zurück gesetzt und nun den "sonoff.0" verwendet. Auch habe ich alles unter "sonoff.0" entfernt (testweise), damit alle Werte neu geschrieben werden.

                    Aktuell sieht es bei mir so aus:

                    //HIER WIRD PFAD UND FILENAME DEFINIERT
                    const path = "/htmlexample.html";                   //FIlenamen definieren
                    const home ='vis.0'                                 //wo soll das file im iobroker-file-system liegen ? (oder z.b auch iqontrol.meta)
                    let   braucheEinFile=false;                          // bei true wird ein file geschrieben
                    let   braucheEinVISWidget=true;                     // bei true wird ein html-tabelle in einen dp geschrieben - siehe nächste zeile
                    let dpVIS="javascript.0.Tasmota.TestHTML"         //WICHTIG wenn braucheEinVISWidget auf true gesetzt !!  dp zusätzlich für VIS-HTML-Basic-Widget
                    let dpRefresh="javascript.0.Tasmota.TestHTMLRefresh"
                    let mySchedule="  * * * * * ";                       //jede minute  
                    //---------------------------------------
                     
                    var leerzeile=true           ;                            // leerzeile vor neuen kalender
                     
                    var styleUeber="span"
                    var farbeUeber="lightblue"
                    var symbolLink="🌎";
                    var anzahlTimer=5;                                        // wieviele Timer sollen abgefragt werden
                     
                    // var filterArray=["DVES_8CBFCA","Sonoff15","Sonoff16"];      // definiert, welche geräte gecheckt werden (hostname)
                    var filterArray=["DVES_8CBFCA"];      // definiert, welche geräte gecheckt werden (hostname)
                    

                    Die Anzeige im VIS habe ich mal so erledigt:

                    [{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"html":"{javascript.0.Tasmota.TestHTML}"},"style":{"left":"24px","top":"15px","width":"934px","height":"680px","border-width":"1px","border-style":"solid","border-color":"#efff14"},"widgetSet":"basic"}]
                    

                    Im Prinzip ein "basic HTML", wo ich bei HTML dann {javascript.0.Tasmota.TestHTML} eingefügt habe.

                    Anmerkung 2020-09-06 030955.png Anmerkung 2020-09-06 030954.png

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

                      @Soundy da wird kein mqtt verwendet - alles über http get

                      wenn du lust hast, lass uns mal eine anydesk oder teamviewer session machen - da kommen wir am schnellsten zur lösung

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

                        @Soundy

                        was du noch probieren könntest: füge axios in das setting der javscript instanz ein - könnte wichtig sein !

                        Image 2.png

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

                          @liv-in-sky Geniale Arbeit von dir (mal wieder).
                          Mir würde schon die Tabelle mit den Timern reichen. Wie liest du die aus?
                          Würdest du die zur Verfügung stellen?

                          @mickym Der Device Manager funktioniert bei mir nicht weil er einen MQTT Broker braucht. Der Sonoff Adapter scheint dafür nicht geeignet.
                          Kennst du eine Lösung ohne den Broker?

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

                            @Chaot

                            script hier : https://forum.iobroker.net/post/484380 - läuft alles über http get befehle (axios)

                            und in der instanz von javascript im setting axios eintragen https://forum.iobroker.net/post/484764

                            zum testen das schedule kürzer stellen - jede minute

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

                              @liv-in-sky Ah, Danke. Jetzt wird mir klar warum da nur einer kommt.

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

                                @liv-in-sky Danke für die Klasse Arbeit.
                                Ich habe jetzt nur ein Problem das etwas schräg ist.
                                Fast alle Geräte mit Timern sind jetzt aktuell aufgeführt.
                                Aber an meinen Aquarien habe ich 3 Geräte die einfach nicht einlesbar sind. Habe ich da an den Tasmotas irgendwas übersehen?
                                Hostname(In Tasmota) - AQ-Deko, AQ1Tag, Aquarium2
                                Name im ioBroker gleich.

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

                                  @Chaot welche tasmota version haben die ?

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

                                    @liv-in-sky Das ist ja das rätselhafte.
                                    Gemischt zwischen 8.2.0.1 bis 8.4.0.2. Die anderen (die funktionieren) auch.

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

                                      @liv-in-sky

                                      was du noch probieren könntest: füge axios in das setting der javscript instanz ein

                                      Das habe ich nun drinnen, aber es funktioniert irgendwie trotzdem nicht.

                                      Wie bindest du denn die Sonoff in ioBroker ein? Mit dem "sonoff"-Adapter oder wie? Weil irgendwo müssen ja die Datenpunkte für IP, Host & Co. ja herkommen.

                                      Stimmt die Einbindung in VIS überhaupt, wie weiter oben exportiert bzw. als Screenshot gezeigt? Oder habe ich da was falsch gemacht oder was vergessen?

                                      EDIT (22:21 Uhr):

                                      Bin eben drauf gekommen, dass du anscheinend den "sonoff-Adapter" nutzt, da sonst keine Info zu IP/Host vorhanden sind. Und ich habe den Gerätenamen (bei mir rot gerahmt) verwendet, aber es muss der Hostname (grün gerahmt) sein. Siehe Screenshot:

                                      Anmerkung 2020-09-06 222135.png

                                      Jetzt werden mir die Timer 1-5 ausgelesen, aber da gibts ja 12 Timer:

                                      Anmerkung 2020-09-06 222501.png

                                      SORRY! HAB DAS ÜBERSEHEN:

                                      var anzahlTimer=5;                                        // wieviele Timer sollen abgefragt werden
                                      

                                      Die Tabelle im VIS wird mir aber noch immer nicht geschrieben.

                                      Im Datenpunkt "javascript.0.Tasmota.TestHTML" landet das hier, unter "javascript.0.Tasmota.TestHTMLRefresh" ist gar nichts. Hier ein Screenshot davon. Der Inhalt gleich danach als Code:

                                      Anmerkung 2020-09-06 222722.png

                                      <center><p style="color:white; font-family:Helvetica; font-size: 18px; font-weight:normal">Sonoff Devices Timers&ensp;&ensp;Last Update: 22:28:10<table bordercolor="grey" border="2px" cellspacing="3" cellpadding="3" width="auto" rules="cols" style="color:#BDBDBD;  font-size:14px; font-family:Helvetica;background-image: linear-gradient(42deg,#1c1c1c,#1c1c1c);"><tr height="35" style="color:#BDBDBD; font-size: 16px; font-weight: normal ;  border-bottom: 2px solid white "><td width=auto align=left>&ensp;Timer&ensp;</td><td width=auto align=center>&ensp;Mode&ensp;</td><td  align=center>&ensp;Repeat&ensp;</td><td align=center>&ensp;Window&ensp;</td><td  align=center>&ensp;Days&ensp;</td><td  align=center>&ensp;Time&ensp;</td><td  align=center>&ensp;Output&ensp;</td><td  align=center>&ensp;Action&ensp;</td></tr></table>
                                      
                                      liv-in-sky 1 Reply Last reply Reply Quote 0
                                      • liv-in-sky
                                        liv-in-sky @Soundy last edited by

                                        @Soundy

                                        ich arbeite morgen weiter am scipt und werde dann einen neuen thread öffnen - versuche das script noch etwas einfacher zu gestallten und eine bessere anleitung zu machen - ich melde mich dann bei dir

                                        ps: ausgegeben werden nur timer, die aktiviert sind

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

                                          @liv-in-sky said in Sonoff Tasmota Timer (1-12) über ioBroker nutzen?:

                                          ps: ausgegeben werden nur timer, die aktiviert sind

                                          Hmmm, also ich hab jetzt die Anzahl der Timer von 5 auf 12 im Skript angepaßt.

                                          Jetzt werden mir alle Daten ausgelesen, obwohl nur Timer 1 testweise mit Daten gefüttert und aktiviert ist.

                                          Ich freu mich schon auf die überarbeitete Version und bin gerne auch Tester. 🙂

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

                                            @Soundy
                                            @Chaot

                                            zur info:

                                            https://forum.iobroker.net/topic/36613/html-tabelle-für-tasmota-timer-setzen

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            995
                                            Online

                                            31.9k
                                            Users

                                            80.2k
                                            Topics

                                            1.3m
                                            Posts

                                            iobroker sonoff tasmota timer
                                            6
                                            24
                                            2649
                                            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