so nachdem nun endlich das Skript so ist wie ich es mir gewünscht habe, danke an alle die mir geholfen haben und/oder mich am richtigen weg gebraucht haben
Was das Ziel war:
Unsichtbares HTML Overlay über ein Zimmer
- bei Click geht das Licht An oder Aus, je nach aktuellem Status
- bei long Press am Zimmer tauchen Widgets auf welche zu vor mit einem entsprechenden Filterwort versehen wurden (werden nach x Sekunden wieder ausgeblendet)
Vorraussetzung:
.) Dieses Skript funktioniert nur sofern aktuell keine anderen Widgets oder Navigationen mit Filterwörter verwendet werden!
.) Alle Widgets welche mit Filterwort genutzt werden sollen, müssen beim Starten unsichtbar sein. Hierfür im Sichtbarkeits Objekt Verlinkung einen manuell erstelten Datenpunkt auswählen welcher imer auf fals steht (z.b. 0_userdata.0.VIS.false_state = false) eventuell kann man das schöner lösen ich weiß es nicht
HTML Overlay - HTML Code:
<input id="buero" style="height: 100%;width: 100%" type="button" onpointerdown="func('hm-rpc.0.OEQ0236727.3.STATE','buero_detail')" onpointerup="revert('hm-rpc.0.OEQ0236727.3.STATE','buero_detail')"/>
Wobei:
"hm-rpc.0.OEQ0236727.3.STATE" - muss mit deinem IoBroker Objekt Pfad zu deinem licht getauscht werden
"buero_detail" - ist das Filterwort das die für das Zimmer Relevanten Widgets haben müssen
Vis JS-Skript:
var timer;
var hidetimer;
var istrue = true;
var filterVisible = [];
var delay = 500; // after delay Click = Longpress
var showTime = 5; // sek after hide shown Tag-Widgets
//objID = Objekt ID from Device z.b. hm-rpc.0.OEQ0236727.3.STATE
//visObjID = Widget Tag
function func(objID,visObjID)
{
istrue = true;
timer = setTimeout(function(){ makeChange(objID,visObjID);},delay);
}
function makeChange(objID,visObjID)
{
if(timer) clearTimeout(timer);
if(hidetimer) clearTimeout(hidetimer);
if(istrue)
{ //Longpress Event Start
istrue = false;
//IF visObjID is not set!
if(typeof filterVisible[visObjID] === 'undefined')
{
//Show Widget with Tags = visObjID
vis.changeFilter(null, visObjID, null, null, null, null);
clearArray(filterVisible); //Clear other visObjID entrys
filterVisible = []; //Set back to Array
filterVisible[visObjID] = true; //set status for this visObjID
//Hide after (showTime) Sek the Tags-Widgets
hidetimer = setTimeout(function(){
//Hide Back Widgets with Tags = visObjID
vis.changeFilter(null, "TagNotExists", null, null, null, null);
clearArray(filterVisible); //clear
filterVisible = []; //Set back to Array
}, showTime*1000)
}
//if the same visObjID and visObjID = true
else
{
//Hide Back Widgets with Tags = visObjID
vis.changeFilter(null, "TagNotExists", null, null, null, null);
clearArray(filterVisible); //clear
filterVisible = []; //Set back to Array
}
}
}
function revert(objID,visObjID)
{
if(timer && istrue)
{ //Click Event
clearTimeout(timer);
istrue = false;
//Get ObjektID Status (Bool) and set oposide (Light On/Off)
servConn._socket.emit('getStates', objID, (error, states) => {
servConn._socket.emit('setState', objID, !states[objID].val);
});
}
}
function clearArray(array) {
while (array.length) {
array.pop();
}
}
Wobei:
var delay = zeit in ms, welche mindestens für ein Longpress vergehen muss (bitte testet das auf euer system)
var showTime = zeit in sekunden, nach welcher die eingeblendeten widgets wieder ausgeblendet werden
Wichtig:
Solltet Ihr Lichter haben welche andere Werte als false oder true vorraussetzen funktioniert dieses Skript ohne umbau nicht!! Bitte hierfür den Bereich in der revert Funktion bearbeiten z.b.: (ungetestet):
servConn._socket.emit('getStates', objID, (error, states) => {
if(states[objID].val == 0)
servConn._socket.emit('setState', objID, 1);
else
servConn._socket.emit('setState', objID, 0);
});
Hat mich echt was an Zeit gekostet und ich denke das JS-Skript geht auch besser, aber es funktioniert und macht was es soll
danke nochmals besonder @oliverio für den tiefen einblick
mfg,
Seek