-
Autor
Ich möchte diesem Script eine funktion hinzufügen. Wenn von rgbw_2 Kanal 4 aktiviert wird, sollen alle lichter mit Helligkeit x an gehen und keine Reaktion mehr auf die Bewegungsmelder geschehen. Wenn rgbw_2 Kanal 4 ausgeschaltet wird soll das script wie zuvor weiterlaufen.
Wie kann ich von einem anderen Shelly nur einen bestimmten Kanal als auslöser abfragen?
Vielen Dank voran.
Code
//Config
var rgbw_1= '192.168.10.26', //IP Dimmer Treppe Teil1
rgbw_2= '192.168.10.27', //IP Dimmer Treppe Teil2
dimmer2= '192.168.10.25', //IP des Extra Dimmers
bwm_Unten= 'input:1', //Bewegungsmelder Treppe Unten
bwm_Oben= 'input:0', //Bewegungsmelder Treppe Oben
bwm_Keller= 'input:2', //Bewegungsmelder Keller.
cTimeout= 3, //Call Time out, wie lange auf die Antwort des Dimmers gewartet werden soll
sofort_Aus= false, //Schalte die Treppe Sofort aus wenn sie Durchquert wurde
delay_Aus= 20, //Auto aus nach x Sekunden, wenn keine neue Eingabe erfolgt
delay_Entprellung= 12, //Wie lange jemand zum durchqueren braucht, wird nur benötigt bei sofort_Aus= false,
nightMode= [23,10], //Zeitraum Nacht, in Stunden von x bis y
day_Dimm_Treppe= 30, //Tag Dimwert LED Streifen Wand
night_Dimm_Treppe= 1, //Nacht Dimwert LED Streifen Wand
day_Dimm_Extra= 100, //Tag Dimwert Deckenlicht
night_Dimm_Extra= 0, //Nacht Dimwert Deckenlicht
debug= false; //only for short periods(debug)!!! --> default ist false
function Treppe_Keller(bright){
if(debug) print('Debug: Treppe_Keller!');
v_Hoch= 1; callLimit= 1; cSp= 0.8; //Active Call Limit and speed betwinn calls
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/0?turn=on&brightness='+bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/1?turn=on&brightness='+bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/2?turn=on&brightness='+bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/0?turn=on&brightness='+bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/1?turn=on&brightness='+bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/2?turn=on&brightness='+bright, timeout: cTimeout});
}
function Treppe_Rauf(bright,bright2){
if(debug) print('Debug: Treppe_Rauf!');
function Next_A(result,_bright){
callLimit= 1; cSp= 1.2; //Active Call Limit and speed betwinn calls
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/0?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/1?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/2?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/0?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/1?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/2?turn=on&brightness='+_bright, timeout: cTimeout});
}
v_Hoch= 1; callLimit= 2; cSp= 0; //Active Call Limit and speed betwinn calls
Call('HTTP.get',{url: 'http://' + dimmer2 + '/light/0?turn=on&brightness='+bright2, timeout: cTimeout},Next_A,bright);
}
function Treppe_Runter(bright,bright2){
if(debug) print('Debug: Treppe_Runter!');
function Next_R(result,_bright){
callLimit= 2; cSp= 0.8; //Active Call Limit and speed betwinn calls
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/0?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/2?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/1?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/1?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/2?turn=on&brightness='+_bright, timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/0?turn=on&brightness='+_bright, timeout: cTimeout});
}
v_Runter= 1; callLimit= 2; cSp= 0; //Active Call Limit and speed betwinn calls
Call('HTTP.get',{url: 'http://' + dimmer2 + '/light/0?turn=on&brightness='+bright2, timeout: cTimeout},Next_R,bright);
}
function Treppe_Aus(){
if(debug) print('Debug: Treppe_Aus!');
function Next(){
callLimit= 2; cSp= 0.1; //Active Call Limit and speed betwinn calls
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/0?turn=off', timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/2?turn=off', timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/1?turn=off', timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/1?turn=off', timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_2 + '/white/2?turn=off', timeout: cTimeout});
Call('HTTP.get',{url: 'http://' + rgbw_1 + '/white/0?turn=off', timeout: cTimeout});
}
v_Runter= 0; v_Hoch= 0; callLimit= 2; cSp= 0; //Active Call Limit and speed betwinn calls
Call('HTTP.get',{url: 'http://' + dimmer2 + '/light/0?turn=off', timeout: cTimeout},Next);
}
let tH1= 0, tH2= 0, tH3= 0, v_Runter= 0, v_Hoch= 0; //Global Timer
function Event_Loop(data){
try{
let trigger= Efilter(data,{device:[bwm_Unten,bwm_Oben,bwm_Keller],filterKey:['state']}); //Filter for BWM Event
data= null; if(!trigger) return; //Clear useless Data and exit if useless Data
let timeN= new Date(); timeN= timeN.getHours(); //Get Time in hours
let brD1= day_Dimm_Treppe, brD2= day_Dimm_Extra; //Default Day Dimwerte
if(nightMode[0] <= timeN || nightMode[1] > timeN) {brD1= night_Dimm_Treppe; brD2= night_Dimm_Extra} //Night Dimwerte
let bwm_U= Status(Cut(bwm_Unten,':',0,true),Number(Cut(bwm_Unten,':',1))).state; //Get Status bwm_Unten
let bwm_O= Status(Cut(bwm_Oben,':',0,true),Number(Cut(bwm_Oben,':',1))).state; //Get Status bwm_Oben
let bwm_K= Status(Cut(bwm_Keller,':',0,true),Number(Cut(bwm_Keller,':',1))).state; //Get Status bwm_Keller
if(bwm_U || bwm_O || bwm_K) {Timer.clear(tH1); tH1= 0; cCache= [];} //Reset, Timer und Call Cache
let callsFin= (!aC && !cCache.length); //Set Flag for all calls Finished
if(debug) print('Debug: callsFin->',callsFin,'bwm_Unten->',bwm_U,', bwm_Oben->',bwm_O,', bwm_Keller->',bwm_Keller,', timeN->',timeN); //Debug output
if(debug) print('Debug: Timer_Aus->',tH1&&1,'Timer_Entp->',tH3&&1,', v_Hoch->',v_Hoch,', v_Runter->',v_Runter); //Debug output
if(callsFin && tH2) {Timer.clear(tH2); tH2= 0;} //Rest fake Intervall Event
if(!callsFin && (bwm_U || bwm_O || bwm_K) && !tH2) tH2= Timer.set(1000,true,function(){Event_Loop({info:{component:bwm_Unten,state:false}});}); //Start Fake Intervall Timer
let start_Hoch= (callsFin && bwm_U), start_Runter= (callsFin && bwm_O), start_Keller= (callsFin && bwm_K); //Start Parameter
if(start_Hoch && !bwm_O && !(sofort_Aus && v_Runter)) Treppe_Rauf(brD1,brD2); //Do Sequenz Rauf
if(start_Runter && !bwm_U && !(sofort_Aus && v_Hoch)) Treppe_Runter(brD1,brD2); //Do Sequenz Runter
if(start_Keller && !bwm_U && !bwm_O && !(sofort_Aus && v_Runter)) Treppe_Keller(brD1); //Do Sequenz Keller
if(!bwm_K && !bwm_U && !bwm_O && !tH1){
if(tH3) Timer.clear(tH3); tH3= 0;//Reset Entprell Timer
tH1= Timer.set(1000*delay_Aus,false,Treppe_Aus); //Start Auto Aus Timer Do Sequenz
if(!sofort_Aus) tH3= Timer.set(1000*delay_Entprellung,false,function(){v_Runter= 0; v_Hoch= 0;}); //Start Entprell Timer
}
if(sofort_Aus && start_Runter && v_Hoch) {Timer.clear(tH1); tH1=0; Treppe_Aus();} //Treppe Sofort aus wenn durchquert
if(sofort_Aus && start_Hoch && v_Runter) {Timer.clear(tH1); tH1=0; Treppe_Aus();} //Treppe Sofort aus wenn durchquert
}catch(e){ErrorMsg(e,'Event_Loop()');} //Error Handler
}
function Main(){
Event_Loop({info:{component:bwm_Unten,state:false}}); //Frist Shot
Shelly.addEventHandler(Event_Loop); //Create a Asyncron Event_Loop
}
// Dekats Toolbox, a universal Toolbox for Shelly scripts
function Efilter(d,p,deBug) { //Event Filter, d=eventdata, p={device:[], filterKey:[], filterValue:[], noInfo:true, inData:true}->optional_parameter
try{
let fR= {}; //d.info= d.info.data;
if(p.noInfo){fR= d; d= {}; d.info= fR; fR= {};} if(p.inData && d.info.data){Object.assign(d.info,d.info.data) delete d.info.data;}
if(!d.info) fR.useless= true; if(p.device && p.device.length && p.device.indexOf(d.info.component) === -1) fR.useless= true;
if(p.device && p.device.length && !fR.useless && !p.filterKey && !p.filterValue) fR= d.info;
if(p.filterKey && !fR.useless) for(f of p.filterKey) for(k in d.info) if(f === k) fR[k]= d.info[k];
if(p.filterValue && !fR.useless) for(f of p.filterValue) for(v of d.info) if(Str(v) && f === v) fR[Str(v)]= v;
if(deBug) print('\nDebug: EventData-> ', d, '\n\nDebug: Result-> ', fR, '\n');
if(Str(fR) === '{}' || fR.useless){return;} return fR;}catch(e){ErrorMsg(e,'Efilter()');}}
function ErrorChk(r,e,m,d){ //Shelly.call error check
try{
aC--; if(aC<0) aC= 0;
if(d.CB && d.uD) d.CB(r,d.uD); if(d.CB && !d.uD) d.CB(r);
if(!d.CB && d.uD) print('Debug: ',d.uD); if(e) throw new Error(Str(m));
if(Str(r) && Str(r.code) && r.code !== 200) throw new Error(Str(r));
}catch(e){ErrorMsg(e,'ErrorChk(), call Answer');}}
function Cqueue(){ //Shelly.call queue
try{
if(!cCache[0] && !nCall[0]) return;
while(cCache[0] && aC < callLimit){if(cCache[0] && !nCall[0]){nCall= cCache[0]; cCache.splice(0,1);}
if(nCall[0] && aC < callLimit){Call(nCall[0],nCall[1],nCall[2],nCall[3],nCall[4]); nCall= [];}} if(tH9){Timer.clear(tH9); tH9= 0;}
if(nCall[0] || cCache[0])if(cSp <= 0) cSp= 0.1; tH9= Timer.set(1000*cSp,0,function(){tH9= 0; Cqueue();});}catch(e){ErrorMsg(e,'Cqueue()');}}
function Call(m,p,CB,uD,deBug){ //Upgrade Shelly.call
try{
let d= {};
if(deBug) print('Debug: calling:',m,p); if(CB) d.CB= CB; if(Str(uD)) d.uD= uD; if(!m && CB){CB(uD); return;}
if(aC < callLimit){aC++; Shelly.call(m,p,ErrorChk,d);}else if(cCache.length < cacheLimit){
cCache.push([m,p,CB,uD,deBug]); if(deBug) print('Debug: save call:',m,p,', call queue now:',cCache.length); Cqueue();
}else{throw new Error('to many Calls in use, droping call: '+Str(m)+', '+Str(p));}}catch(e){ErrorMsg(e,'Call()');}}
function Str(d){ //Upgrade JSON.stringify
try{
if(d === null || d === undefined) return null; if(typeof d === 'string')return d;
return JSON.stringify(d);}catch(e){ErrorMsg(e,'Str()');}}
function Cut(f,k,o,i){ //Upgrade slice f=fullData, k=key-> where to cut, o=offset->offset behind key, i=invertCut
try{
let s= f.indexOf(k); if(s === -1) return; if(o) s= s+o.length || s+o; if(i) return f.slice(0,s);
return f.slice(s);}catch(e){ErrorMsg(e,'Cut()');}}
function Setup(){ //Wating 2sek, to avoid a Shelly FW Bug
try{
if(Main && !tH9){tH9= Timer.set(2000,0,function(){print('\nStatus: started Script _[', scriptN,']_');
if(callLimit > 5){callLimit= 5;} try{Main();}catch(e){ErrorMsg(e,'Main()'); Setup();}});}}catch(e){ErrorMsg(e,'Setup()');}}
function ErrorMsg(e,s,deBug){ //Toolbox formatted Error Msg
try{
let i= 0; if(Cut(e.message, '-104: Timed out')) i= 'wrong URL or device may be offline';
if(s === 'Main()' || deBug) i= e.stack; if(Cut(e.message, '"Main" is not')) i= 'define a Main() function before using Setup()';
print('Error:',s || "",'---> ',e.type,e.message); if(i) print('Info: maybe -->',i);}catch(e){print('Error: ErrorMsg() --->',e);}}
var tH8= 0, tH9= 0, aC= 0, cCache= [], nCall= [], callLimit= 5, cacheLimit= 40, cSp= 0.1; //Toolbox global variable
var Status= Shelly.getComponentStatus, Config= Shelly.getComponentConfig; //Renamed native function
var info= Shelly.getDeviceInfo(), scriptID= Shelly.getCurrentScriptId(), scriptN= Config('script',scriptID).name; //Pseudo const, variabel
//Toolbox v3.4 -Alpha(cut), Shelly FW >1.0.8
Setup();
Alles anzeigen