// @Liv-in-sky Okt. 2019 // WICHTIG // hier muss die instanz der eigenen datenpunkte angegeben werden oder zusätzlich, die man prüfen möchte , "alexa2.0" //oder auch nur einzelne ornder in der datenstruktur z.b. "javascript.2.WLANUnifi" const instanzArr=[ "controll-own.0"]; // beispiel const instanzArr=[ "eigeneDatenpunkte.0", "ping.0",]; var color_in_table="black" // Farbe text in webseite let schriftart="Helvetica"; // möglich: Helvetica,Serif var color_gradient1="#819FF7"; // Hintergrund webseite var colorHeadlines="darkblue"; // Farbe Überschriften in der VIS Anzeige var colorHeadlinesDP="#36d5ec "; // Farbe Überschriften in der WebSeite Anzeige var warnFarbe = "#36d5ec"; //Farbe für Warnungen in vis und Webseite //------------------------------------------AB HIER NICHTS ÄNDERN-------------------------------------------------------- const versionNr = "15102019-1.5" const warnColor = warnFarbe ; const format = "Putzer"; const htmlTable=""; const htmlReset="

!!! ohne Javascript Instanzen !!! kann enabled werden

" const htmlHeaders = "style=\"color:"+colorHeadlines+";\""; const htmlHeadersDP = "style=\"color:"+colorHeadlinesDP+";\""; // var htmlOhneAnzahl="

!!! ohne DatenpunktZählung !!! kann enabled werden

" const htmlError="

Script hat Fehler - bitte Log checken !!!

" var allInstArr=[]; var instanzArrHelp=[]; const dpPrefix = "javascript."+ instance +"."; var mylogs=false; var htmlDP=[]; var htmlMSG=[]; var counterAll=0; var directSearch=false; var switchOn=false; var helplogs=true; var htmlHelper=""; var htmlHelperFile=""; var alarmInstanz1=false; var unusedDayFactor ; var unusedDay; var aliasArr; var ali; var monster; createState(dpPrefix + "ProofingDatapoints.HTMLTable", { name: 'HTMLTable', type: 'string', read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.ScriptVersion", versionNr,{ name: 'ScriptVersion', type: 'string', read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.RunScript",false, { name: 'RunScript', type: 'boolean', role:"switch", read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.JavaInstanzCheck", true,{ name: 'JavaInstanzCheck', type: 'boolean', role:"switch", read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.ObjectAnzahlCheck", true,{ name: 'ObjectAnzahlCheck', type: 'boolean', role:"switch", read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.MonsterSearch", false,{ name: 'MonsterSearch', type: 'boolean', role:"switch", read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.ohneInstanzAnzeige", false,{ name: 'ohneInstanzAnzeige', type: 'boolean', role:"switch", read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.OrdnerCheck", "", { name: 'OrdnerCheck', type: 'string', read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.RunSuccessful", false, { name: 'RunSuccessful', type: 'boolean', role:"state", read: true, write: false,}); createState(dpPrefix + "ProofingDatapoints.LatestChangeDP", false, { name: 'LatestChangeDP', type: 'boolean', role:"state", read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.LatestChangeDP_Factor", 100, { name: 'LatestChangeDP_Factor', type: 'number', role:"state", read: true, write: true,}); createState(dpPrefix + "ProofingDatapoints.CheckAliase", false, { name: 'Check_Alias_0_Ordner', type: 'boolean', role:"state", read: true, write: true,}); //------------------------------------------CHECK INSTANZEN-------------------------------------------------------- async function instanzCount(){ return new Promise(async (resolve, reject) => { var ohneInstanz = getState(dpPrefix + "ProofingDatapoints.ohneInstanzAnzeige").val; var counter=0; var counter2=0;var counter3=0; $('system.adapter.*.alive').each(function(id, i) { var ida = id.split('.'); allInstArr.push(ida[2]+"."+ida[3]); if (!ohneInstanz && !directSearch) { if(!id.includes("vis")){ counter++; if (getState(id).val==null) {counter2++; mylog(ida[2]+ida[3]+"--------------------der hier wurde nie gestartet"); htmlDP.push(ida[2]+"."+ida[3]); htmlMSG.push("Instanzen ohne Werte");} //else{instanzArr.push(ida[2]+"."+ida[3])} if (getState(id).val==false) {counter3++;mylog(ida[2]+ida[3]+"-----------------------der hier ist ausgeschalten"); htmlDP.push(ida[2]+"."+ida[3]); htmlMSG.push("nicht aktiviert");} /*else{instanzArr.push(ida[2]+"."+ida[3])}*/ }} }); if (!ohneInstanz) { mylog("______________________________________________Anzahl Instanzen: " + counter.toString()); htmlDP.push(""); htmlMSG.push(""); htmlDP.push("Anzahl Instanzen"); htmlMSG.push(counter.toString()); mylog("______________________________________________Anzahl gestoppter Instanzen ohne Werte: " + counter2.toString()) htmlDP.push("Instanzen ohne Werte"); htmlMSG.push(counter2.toString()); htmlDP.push("Instanzen nicht aktiviert"); htmlMSG.push(counter3.toString()); } if (htmlDP.length != htmlMSG.length) {console.log("-------- !!! FEHLER in AUSGABE CHECK INSTANZEN : "+ "AnzahlDP: "+htmlDP.length+" AnzahlMSG: "+htmlMSG.length,"error");} resolve(); }); //end promise } // end function //------------------------------------------CHECK TYPE -- ZUORDNUNG-------------------------------------------------------- async function checkTypes(select) { return new Promise(async (resolve, reject) => { try { helplog("bin in check types"); var counter=0; htmlMSG.push(""); htmlDP.push(""); // log(",,,,,,,,,,,,,,liste aliasArr: "+aliasArr.toString(),"error"); var sub= select.substring(select.length-1, select.length); //log("---------: "+sub);//console.log("----------select: "+select); mylog(select) $(select).each(function (id, i) { counter++ // var rrr=getState("abs").val // console.log("===== falls script nach diesem Eintrag endet, gibt es eine nicht-exisitierende Hauptkategorie - letzte kontrollierte Kategorie: "+ id+" ====="); //console.log(getObject("abc").common.hasOwnProperty("type")); // if(getObject(id).common.hasOwnProperty("alias")) console.log(id); // TEST ABSTURZ if (!id.includes('scriptEnabled') && !id.includes('scriptProblem') /*&& getState(id).val !== null && !id.includes('Log-Script') && !id.includes('Ereignisliste') && !id.includes('GETPROCESS')*/ ){ //console.log("===============id vor null - kein value zu: "+id); //console.log("status0-checkType"); //if (getState(id).val==null) console.log("===============nullwert - kein value zu: "+id); //console.log("status1-checkType"); //console.log(JSON.stringify(getObject(id).common)); if (!JSON.stringify(getObject(id)).includes("type") && !JSON.stringify(getObject(id)).includes("name") /*&& !JSON.stringify(getObject(id)).includes("meta")*/ ) { //console.log("===============id nach stringify - kein value zu: "+id); var valType = typeof getState(id).val; htmlDP.push(id+": "+valType); htmlMSG.push("missing DP-OBEJCT !!" );} else{ //console.log("status2-checkType"); var dpType = getObject(id).common.type; var valType = typeof getState(id).val; if(getObject(id).common.type ==null || getObject(id).common.type == undefined || getObject(id).common.type =="") { //console.log("shit happens","error"); htmlDP.push(id); htmlMSG.push("-col-ACHTUNG common.type fehlt"); } else { let typesIOhelp=false; // VERGLEICH/PRÜFUNG MIT ALLEN TYPES for (var i =0; iACHTUNG common.type falsch: "+dpType+"");}} if (getState(id).val !== null){ // ANZEIGE ALLER DATENPUNKTE MIT STATE=null if(dpType != "mixed" ) { if(dpType !== valType && !(dpType == 'array' && valType == 'object' && dpType == 'meta.user') /*&& !(dpType =='text' && valType=='string') && !(dpType =='string' && valType=='text')*/ ) { mylog(id + ': Datenpunkttyp: ' + dpType + ', Wert: ' + valType); htmlDP.push(id+": "+valType); htmlMSG.push(dpType );} }//end of check common.type and value-type } //end of mixed } // end of check object includes name and type }//ende if scriptenabled }); htmlDP.push("ID + IST-WERT"); htmlMSG.push("SOLL-WERT"); htmlDP.push("-col-geprüfte Instanz"); htmlMSG.push("-col-"+select+""); if (htmlDP.length != htmlMSG.length) {console.log("-------- !!! FEHLER in AUSGABE CHECK WERTE : "+ "AnzahlDP: "+htmlDP.length+" AnzahlMSG: "+htmlMSG.length,"error");} helplog("fertg in checkType mit:" + counter.toString()+ " Durchläufen") resolve(); } catch (e) {console.log("------------ERROR: "+e ); reject(); return alarmInstanz1=true} }); //end promise } //end function //------------------------------------------CHECK WERTE-------------------------------------------------------- async function checkWerte(select) { return new Promise(async (resolve, reject) => { try{ helplog("bin in check Werte"); var counter=0; var jetzt=new Date().getTime(); mylog(select); $(select).each(function (id, i) { counter++ //console.log(getObject("abc").common.hasOwnProperty("type")); // TEST ABSTURZ // console.log("statusalias"); if (!id.includes('scriptEnabled') && !id.includes('scriptProblem') /*&& !id.includes('alias.0') ) && !id.includes('Ereignisliste') && !id.includes('GETPROCESS')*/ ){ //var dpType = getObject(id).common.type; if (!JSON.stringify(getObject(id)).includes("type") && !JSON.stringify(getObject(id)).includes("name") ) { //CHECK MISSING OBJECT)) try{ valType = typeof getState(id).val; } catch (e) {console.log("------------ERROR: "+e + "bei id: " + id); return alarmInstanz1=true} htmlDP.push(id+": "+valType); htmlMSG.push("missing DP-OBEJCT !!" );} else { // console.log("status0"); var valType = getState(id).val; // if(dpType != "mixed" ) {} // console.log("status1"); if(valType === null) {mylog(id + ': Datenpunkttyp: ' /*+ dpType */+ ", Wert: "+valType); htmlDP.push(id); var ddd = jetzt-getObject(id).ts; //getState(id).ts // if (ddd == NaN) log(ddd.toString(),"error"); //log(getState(id).ts.toString(),"error"); //if(ddd==undefined) htmlMSG.push("not used & created at: " + Math.floor((ddd)/1000/60/60/24)+"d "+Math.floor((ddd)/1000/60/60 %24)+"h "+Math.floor((ddd)/1000/60 %60)+"m"); } else { if (unusedDay){//console.log( (jetzt - (86400000 * unusedDayFactor))-getObject(id).ts + id + getState(id).ts ); var ddd = jetzt-getState(id).ts; if ( (jetzt - (86400000 * unusedDayFactor)) - getState(id).ts > 0 ){ htmlDP.push(id); htmlMSG.push("lastChange over "+ unusedDayFactor +" days"); htmlDP.push(""); htmlMSG.push("created: "+ Math.floor((ddd)/1000/60/60/24)+"d "+Math.floor((ddd)/1000/60/60 %24)+"h "+Math.floor((ddd)/1000/60 %60)+"m"); }}} // console.log("status2"); if(getObject(id).common.hasOwnProperty("states") /*&& JSON.stringify(getObject(id).common.states)!=null && JSON.stringify(getObject(id).common.states)!=undefined */){ // console.log("======2=============no type: "+id +"object: "+JSON.stringify(getObject(id).common.states)); //console.log("der hier: " +id); try{ var helpStates= Object.keys(getObject(id).common.states); } catch (e) {console.log("------------ERROR: "+e + "bei id: " + id); extendObject(id, {common: {states:{"0":"script"}}})} var helpType= getObject(id).common.type; // console.log(helpType);//console.log(helpStates.toString()); // console.log(helpStates[0] + helpStates[1] ); if (helpType=="number" || helpType=="boolean") { var alarmString=false;var alarmString2=false; for (var i=0; i < helpStates.length ;i++){ // console.log( helpStates[i]); mylog(isNaN(helpStates[i]).toString()) ; if (isNaN(helpStates[i]) && helpType=="number") alarmString=true; //type number - stehen da nummern drin var helpTypeBool= helpStates[i].toString() + helpType; if (helpType=="boolean") {if (helpTypeBool !="falseboolean" && helpTypeBool != "trueboolean") alarmString2=true;} //type boolean - stehen da booleans } if (alarmString){ htmlDP.push(id); htmlMSG.push("-col-ACHTUNG Multstate must be number")} if (alarmString2){ htmlDP.push(id); htmlMSG.push("-col-ACHTUNG Multstate must be boolean")} } else {htmlDP.push(id); htmlMSG.push("-col-ACHTUNG Multstate wrong Def.")} } //ende states check // var ddd = (new Date().getTime()-864000000) getObject(id).ts; /* console.log("_____________________bin in type check groß:länge types: "+ typesIO.length ); if(getObject(id).common.hasOwnProperty("type")){ let typesIOhelp=false; for (var i =0; iACHTUNG common.type falsch - "+getObject(id).common.type+"");} } else {mylog("ok in type constante :" + id);}*/ //ende alle typen check } //ende check missing object } // ende script enabled check }); // ende selct.each if (htmlDP.length != htmlMSG.length) {console.log("-------- !!! FEHLER in ANZAHL AUSGABE CHECK WERTE : "+ "AnzahlDP: "+htmlDP.length+" AnzahlMSG: "+htmlMSG.length,"error");} helplog("bin raus aus check Werte"); resolve(); } catch (e) {console.log("------------ERROR: "+e ); reject(); return alarmInstanz1=true} }); //end promise } //end function //--------------------------------------------------------------------------------------------------------------------- function mylog(message) { if(mylogs) console.log(message); }function helplog(message) { if(helplogs) console.log(message); } //------------------------------------------Zähle Objecte der INSTANZEN-------------------------------------------------------- async function countDP(idb){ mylog("bin richtig in count"); var counter4=0; $(idb+".*").each(function(id, i) { counter4++; }) mylog(idb+counter4); htmlDP.unshift(idb); htmlMSG.unshift(counter4.toString()); counterAll=counterAll+counter4; if (htmlDP.length != htmlMSG.length) {console.log("-------- !!! FEHLER in AUSGABE ZÄHLEN INSTANZEN : "+ "AnzahlDP: "+htmlDP.length+" AnzahlMSG: "+htmlMSG.length,"error");} mylog("bin raus aus count"); } //----------------------------------------------Direct Suchen on({id:dpPrefix + "ProofingDatapoints.OrdnerCheck", ack: false, change: "any"}, function (obj) { directSearch=true; instanzArrHelp=[]; setState(dpPrefix + "ProofingDatapoints.RunScript",true); }); //-----------------------------------------------ALIAS CHECK------------------------------------------------ async function checkAlias() { return new Promise(async (resolve, reject) => { try{ helplog("bin in check aliase"); let counter=0; var jetzt=new Date().getTime(); var aliasArrAlarm aliasArr=[]; var aliasArrOrg=[]; for(var l=0;lACHTUNG wrong DP assignment: ");}} // log(aliasArr.toString(),"error"); // if(!aliasArrAlarm && parseInt(index) > aliasArr.length-1){break;} /* if (aliasArrAlarm) {console.log("========================hier fehler mit a l i a s: " ); htmlDP.push(aliasArr[index]); htmlMSG.push("-col-ACHTUNG missing ALIAS: ");} else { htmlDP.push(aliasArr[index]); htmlMSG.push("ALIAS: ok")} if(!aliasArrAlarm && parseInt(index) > aliasArr.length-1){break;}*/ /* if(select.includes("alias.0") ) {aliasArrAlarm=false;} for (var i =0; iACHTUNG missing ALIAS: "); } } */ htmlDP.push("ALIAS DP ASSIGNMENT"); htmlMSG.push("ALIAS STATUS"); htmlDP.push("-col-geprüftes Alias"); htmlMSG.push("-col-Anzahl: "+aliasArr.length+""); htmlDP.push(""); htmlMSG.push(""); if (htmlDP.length != htmlMSG.length) {console.log("-------- !!! FEHLER in ANZAHL AUSGABE CHECK ALIAS : "+ "AnzahlDP: "+htmlDP.length+" AnzahlMSG: "+htmlMSG.length,"error");} helplog("bin raus aus check aliase"); resolve(); } catch (e) {console.log("------------ERROR: "+e ); reject(); return alarmInstanz1=true} }); //end promise } //end function //-----------------------------------------------SCHALTER MAIN------------------------------------------------ on({id:dpPrefix + "ProofingDatapoints.RunScript", ack: false, val: true}, function (obj) { mainScript(); }); async function mainScript(){ setState(dpPrefix + "ProofingDatapoints.RunSuccessful",false); let java= getState(dpPrefix + "ProofingDatapoints.JavaInstanzCheck").val; let instanzAnzahl= getState(dpPrefix + "ProofingDatapoints.ObjectAnzahlCheck").val; monster= getState(dpPrefix + "ProofingDatapoints.MonsterSearch").val; var ohneInstanz = getState(dpPrefix + "ProofingDatapoints.ohneInstanzAnzeige").val; unusedDayFactor = getState(dpPrefix + "ProofingDatapoints.LatestChangeDP_Factor").val; ali = getState(dpPrefix + "ProofingDatapoints.CheckAliase").val; unusedDay = getState(dpPrefix + "ProofingDatapoints.LatestChangeDP").val; var endehtmlConst= "

Letztes File Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")+"

"; var endehtmlDPConst= "

Letztes Table Update: "+formatDate(getDateObject((parseFloat((new Date().getTime())))), "SS:mm:ss")+"

"; setState(dpPrefix + "ProofingDatapoints.ScriptVersion",versionNr); htmlHelper=""; htmlHelperFile=""; counterAll=0; instanzArrHelp=[]; allInstArr=[]; htmlDP=[]; htmlMSG=[]; aliasArr=[]; setState(dpPrefix + "ProofingDatapoints.HTMLTable",htmlReset+endehtml+htmlError); setStateDelayed(dpPrefix + "ProofingDatapoints.RunScript",false,2500); writeFile(null, "/ProofingDatapoints/htmlputz.html" ,htmlReset+endehtml+htmlError+"", function (error) {mylog('file written'); }); await instanzCount(); //überprüft instanzen und stellt allInstArr her htmlDP.push("-col-INSTANZ INFO"); htmlMSG.push(""); htmlDP.push(""); htmlMSG.push(""); mylog(instanzArr.length+"==================="+instanzArr.toString()); if (monster) {instanzArrHelp=allInstArr;} else {instanzArrHelp=instanzArr} //ACHTUNG MONSTERSEARCH if (directSearch) {instanzArrHelp=[]; instanzArrHelp.push(getState(dpPrefix + "ProofingDatapoints.OrdnerCheck").val);} for(let name in instanzArrHelp){ await checkWerte(instanzArrHelp[name]+".*").then(console.log("Funktion Check Werte erfolgreich")).catch(); //checkt alle werte in intanzArr mylog("!!!!!!!!!!!!!!!!!!!!: "+instanzArrHelp[name]);} if (instanzAnzahl){ htmlDP.unshift(""); htmlMSG.unshift("");htmlDP.unshift("OBJECTE IN INSTANZ"); htmlMSG.unshift("Anzahl"); for(let name in instanzArrHelp){ countDP(instanzArrHelp[name]);mylog("bin in zählen");} if (java && !monster) countDP("javascript") htmlDP.unshift("-col-GESAMT GEPRÜFTE OBJECTE IN INSTANZEN"); htmlMSG.unshift("-col-"+counterAll.toString()+""); } mylog("=============: "+counterAll); if (java && !monster && !ohneInstanz && !directSearch) await checkWerte('javascript.*').catch().then(); //checkt alle javainstanzen htmlDP.push("-col-ID's OHNE WERT:"); htmlMSG.push(""); for(let name in instanzArrHelp){ await checkTypes(instanzArrHelp[name]+".*").catch().then(); mylog("!!!!!!!!!!!!!!!!!!!!: "+instanzArrHelp[name])}; htmlDP.push(""); htmlMSG.push(""); htmlDP.push("-col-IDs MIT FALSCHEN TYPE:"); htmlMSG.push(""); if (java && !monster && !ohneInstanz && !directSearch ) await checkTypes('javascript.*').catch().then(); //checkt java instanz dp auf type //log(allInstArr.toString(),"error"); if(ali) await checkAlias(); //ab hier geht es um die ausgabe if (htmlDP.length != htmlMSG.length) {console.log("-------- !!! FEHLER in ANZAHL DATENAUSGABE : "+ "AnzahlDP: "+htmlDP.length+" AnzahlMSG: "+htmlMSG.length,"error");} else { //console.log(htmlMSG.length+"--"+htmlDP.length) for(var i= htmlDP.length-1; i>-1; i--) { //console.log(htmlDP[i]+"anerer :"+htmlMSG[i]); // if (htmlMSG[i].includes("-col-")) console.log(htmlMSG[i]); let htmlDPVis; let htmlDPFile;let htmlMSGVis;let htmlMSGFile; if(htmlDP[i].includes("-col-")) {htmlDPVis=htmlDP[i].replace("-col-", (htmlHeadersDP+">")); htmlDPVis=" "+htmlDPVis } else {htmlDPVis=">"+htmlDP[i]} if(htmlMSG[i].includes("-col-")) {htmlMSGVis=htmlMSG[i].replace("-col-", (htmlHeadersDP+">"));htmlMSGVis=" "+htmlMSGVis } else {htmlMSGVis=">"+htmlMSG[i]} htmlHelper= htmlHelper+"
" // if(htmlDP[i].includes("-col-")) {htmlDP[i]=htmlDP[i].replace("-col-", (htmlHeaders+">")); htmlDPFile=htmlDP[i]; htmlDPFile= " "+htmlDPFile ; } else {htmlDPFile=">"+htmlDP[i]} if(htmlDP[i].includes("-col-")) {htmlDPFile=htmlDP[i].replace("-col-", (htmlHeaders+">")); htmlDPFile= " "+htmlDPFile ; } else {htmlDPFile=">"+htmlDP[i]} if(htmlMSG[i].includes("-col-")) {htmlMSGFile=htmlMSG[i].replace("-col-", (htmlHeaders+">")); htmlMSGFile=" "+htmlMSGFile; } else {htmlMSGFile=">"+htmlMSG[i]} htmlHelperFile= htmlHelperFile+"" } var endehtml=endehtmlConst; var endehtmlDP=endehtmlDPConst; if (monster){endehtml="

!!! Monster Suche wird automatisch deaktiviert !!!

"+endehtml; endehtmlDP="

!!! ACHTUNG: SYSTEM WIRD BELASTET !!!

!!! Monster Suche wird automatisch deaktiviert !!!

BERICHT/AUSWERTUNG NUR ÜBER WEBSEITE

"+endehtmlDP;} if (!instanzAnzahl){endehtml="

!!! Auswertung ohne DatenpunktZählung !!! kann enabled werden

"+endehtml; endehtmlDP="

!!! Auswertung ohne DatenpunktZählung !!! kann enabled werden

"+endehtmlDP;} if (!java){ endehtml="

!!! Auswertung ohne Javascript Instanzen !!! kann enabled werden

"+endehtml; endehtmlDP="

!!! Auswertung ohne Javascript Instanzen !!! kann enabled werden

"+endehtmlDP;} if(!monster) { setStateDelayed(dpPrefix + "ProofingDatapoints.HTMLTable",endehtmlDP+"
"+htmlHelper,900);} else{setStateDelayed(dpPrefix + "ProofingDatapoints.HTMLTable",endehtmlDP,900);} mylog("================================schreibe file") ; writeFile(null, "/ProofingDatapoints/htmlputz.html" ,format+endehtml+htmlTable+htmlHelperFile+"
", function (error) { mylog('file written'); }); // endehtml=endehtmlConst; // endehtmlDP=endehtmlDPConst; setState(dpPrefix + "ProofingDatapoints.MonsterSearch",false); //setzt monstersearch zurück directSearch=false; setState(dpPrefix + "ProofingDatapoints.RunSuccessful",true); } //ende else bei fehler im array zur ausgabe } const typesIO = ["boolean", "number", "string", "object", "array", "mixed", "sensor.window", "sensor.door", "sensor.alarm", "sensor.alarm.flood", "sensor.alarm.fire", "sensor.alarm.secure", "sensor.alarm.flood", "sensor.alarm.power", "sensor.alarm.secure", "sensor.door", "sensor.light", "sensor.lock", "sensor.motion", "sensor.rain", "sensor.noise", "sensor.rain", "sensor.window", "button", "button.long", "button.stop", "button.start", "button.open.door", "button.open.window", "button.mode", "button.mode.auto", "button.mode.manual", "button.mode.silent", "button.open.door", "button.open.window", "button.start", "button.stop", "value", "value.window", "value.temperature", "value.humidity", "value.battery", "value.blind", "value.brightness", "value.min", "value.max", "value.current", "value.curtain", "value.default", "value.battery", "value.valve", "value.time", "value.direction", "value.distance", "value.distance.visibility", "value.gps", "value.gps.elevation", "value.gps.latitude", "value.gps.longitude", "value.humidity", "value.interval", "value.gps.longitude", "value.gps.latitude", "value.gps.elevation", "value.gps", "value.power.consumption", "value.direction", "value.curtain", "value.blind", "value.tilt", "value.lock", "value.speed", "value.max", "value.min", "value.power.consumption", "value.pressure", "value.distance", "value.distance.visibility", "value.severity", "value.warning", "value.sun.elevation", "value.speed", "value.sun.azimuth", "value.sun.elevation", "value.temperature", "value.tilt", "value.time", "value.valve", "value.voltage", "value.current", "value.warning", "value.window", "indicator", "indicator.working", "indicator.reachable", "indicator.connected", "indicator.maintenance", "indicator.maintenance.lowbat", "indicator.maintenance.unreach", "indicator.maintenance.alarm", "indicator.lowbat", "indicator.alarm", "indicator.alarm.fire", "indicator.alarm.flood", "indicator.alarm.secure", "indicator.connected", "indicator.lowbat", "indicator.maintenance", "indicator.maintenance.alarm", "indicator.maintenance.lowbat", "indicator.maintenance.unreach", "indicator.reachable", "indicator.working", "level", "level.co2", "level.dimmer", "level.blind", "level.temperature", "level.valve", "level.color.red", "level.color.green", "level.co2", "level.color.blue", "level.color.white", "level.color.green", "level.color.hue", "level.color.saturation", "level.color.rgb", "level.color.luminance", "level.color.red", "level.color.rgb", "level.color.saturation", "level.color.temperature", "level.color.white", "level.curtain", "level.dimmer", "level.temperature", "level.tilt", "level.timer", "level.timer.sleep", "level.valve", "level.volume", "level.volume.group", "level.curtain", "level.tilt", "switch", "switch.lock", "switch.lock.door", "switch.lock.window", "switch.boost", "switch.light", "switch.comfort", "switch.enable", "switch.power", "switch.light", "switch.lock", "switch.lock.door", "switch.lock.window", "switch.mode.*", "switch.mode.auto", "switch.mode.color", "switch.mode.manual", "switch.mode.silent", "switch.mode.moonlight", "switch.mode.color", "switch.mode.silent", "switch.power", "button.stop", "button.play", "button.fastforward", "button.fastreverse", "button.forward", "button.next", "button.prev", "button.pause", "switch.pause", "button.forward", "button.play", "button.prev", "button.reverse", "button.fastforward", "button.fastreverse", "button.volume.up", "button.stop", "button.volume.down", "media.seek", "media.mode.shuffle", "media.mode.repeat", "media.state", "media.artist", "button.volume.up", "level.bass", "level.treble", "media.add", "media.album", "media.title", "media.title.next", "media.artist", "media.bitrate", "media.broadcastDate", "media.clear", "media.content", "media.cover", "media.cover.big", "media.cover.small", "media.duration.text", "media.date", "media.duration", "media.elapsed.text", "media.duration.text", "media.elapsed", "media.broadcastDate", "media.mute", "media.season", "media.elapsed.text", "media.episode", "media.mute.group", "media.tts", "media.bitrate", "media.genre", "media.date", "media.track", "media.input", "media.jump", "media.link", "media.mode.repeat", "media.mode.shuffle", "media.mute", "media.mute.group", "media.playid", "media.add", "media.clear", "media.playlist", "media.season", "media.seek", "media.state", "media.title", "media.title.next", "media.track", "media.tts", "media.url", "media.url.announcement", "media.jump", "media.content", "media.link", "media.input", "level.bass", "level.treble", "switch.pause", "switch.power.zone", "value.temperature", "value.temperature.windchill", "value.temperature.dewpoint", "value.temperature.feelslike", "value.temperature.min", "value.temperature.max", "value.humidity", "value.humidity.min", "value.humidity.max", "value.speed.wind", "value.speed.max.wind", "value.speed.min.wind", "value.speed.wind.gust", "value.direction.wind", "value.direction.max.wind", "value.direction.min.wind", "weather.direction.wind", "date", "date.forecast.1", "date.sunrise", "date.sunset", "dayofweek", "location", "weather.icon", "weather.icon.wind", "weather.icon.name", "weather.state", "value.clouds", "value.direction.max.wind", "value.direction.min.wind", "value.direction.wind", "value.direction.wind.forecast.0", "value.direction.wind.forecast.1", "value.humidity", "value.humidity.max", "value.humidity.min", "value.precipitation", "value.precipitation.day.forecast.0", "value.precipitation.forecast.0", "value.precipitation.forecast.0", "value.precipitation.forecast.1", "value.precipitation.forecast.1", "value.precipitation.hour", "value.precipitation.night.forecast.0", "value.precipitation.today", "value.pressure.forecast.0", "value.pressure.forecast.1", "value.radiation", "value.uv", "value.clouds", "value.rain", "value.rain.hour", "value.rain.today", "value.snow", "value.snow.hour", "value.snow.today", "value.snowline", "value.speed.max.wind", "value.speed.min.wind", "value.speed.wind", "value.speed.wind.forecast.0", "value.speed.wind.forecast.1", "value.speed.wind.gust", "value.temperature", "value.temperature.dewpoint", "value.temperature.feelslike", "value.temperature.max", "value.temperature.max.forecast.0", "value.temperature.max.forecast.1", "value.temperature.min", "value.temperature.min.forecast.0", "value.temperature.min.forecast.1", "value.temperature.windchill", "value.uv", "weather.chart.url", "weather.chart.url.forecast", "weather.direction.wind", "weather.direction.wind.forecast.0", "weather.html", "weather.title", "weather.title.short", "weather.type", "weather.icon", "weather.icon.forecast.1", "weather.icon.name", "weather.icon.wind", "weather.json", "value.speed.wind.forecast.0", "weather.state", "weather.state.forecast.0", "value.direction.wind.forecast.0", "weather.direction.wind.forecast.0", "value.pressure.forecast.0", "value.temperature.min.forecast.0", "value.temperature.max.forecast.0", "value.precipitation.forecast.0", "value.precipitation.forecast.0", "weather.state.forecast.1", "weather.title", "weather.title.forecast.0", "value.precipitation.day.forecast.0", "value.precipitation.night.forecast.0", "weather.title.short", "weather.type", "date.forecast.1", "weather.icon.forecast.1", "weather.state.forecast.1", "value.temperature.min.forecast.1", "value.temperature.max.forecast.1", "value.precipitation.forecast.1", "value.precipitation.forecast.1", "value.direction.wind.forecast.1", "value.speed.wind.forecast.1", "value.pressure.forecast.1", "date.end", "date.start", "info.address", "info.display", "info.ip", "info.mac", "info.name", "info.address", "info.port", "info.standby", "info.status", "info.display", "date.start", "date.end", "text.phone", "url.icon", "url.cam", "url.audio", "url.blank", "url.cam", "url.icon", "url.same", "url.audio", "text.phone", "adapter.messagebox", "adapter.wakeup",]