Es hat leider niemand geantwortet aber falls einer das gleiche Problem haben sollte. Man die ID des Skriptes von einem anderen Shelly dieses direkt ansprechen, sodass man eine Schleife innerhalb der Schleifen einen Trigger hat der stabil ist. Grade bei Gen1 Geräten der sauberere Weg.
Beiträge von Tester1
VPN/Proxy erkannt
Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.
-
-
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
Alles anzeigen//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(); -
Ich benötige dasfür einen PLUS RGBW PM. Dort sind die Befehle leider anders.
Vllt kann jmd helfen?
-
Hallo zusammen,
lässt sich der Plus RGBW per script auf einem i4 dimmen?
Ziel ist I4 mit zwei Tasten (3&4)
3 press long dim down
3 press short toggle
3 double press 100% Brightness
4 press long dim up
4 press short toggle
4 double press 100% Brightness