In diesem Thread werden einige Beispiel Scripts aufgelistet.
Status von anderen Shelly prüfen, mit HTTP Endpoint querys :
Beispiel für, wenn Shelly_x = an, Shelly_c = an und Shelly_z = aus dann schalte Shelly_k aus:
//Shelly remote states with HTTP Endpoints Exampel
//Config
var shelly_Password= ""; //'shelly_Password' is only required if a device passwort has been set, local and remote pw need to be the same.
var remote_shelly_IP= "192.168.10.23";
var endpoint_name= "exampel"; //Endpoint Name, could be anythink, as string
function Some_Logic(){
try{
print("\nYour saved_states right now are:-->",saved_states,"\n");
//Toogle local Shelly if remote switch1 and switch2 are on while switch3 is off
if(saved_states.switch1 && saved_states.switch2 && !saved_states.switch3) Shelly.call("Switch.Toggle",{id:0});
//Toggle a remote Shelly if remote switch1 and switch3 is on
if(saved_states.switch1 && saved_states.switch3) Shelly.call("http.get",{url:"http://admin:"+shelly_Password+"@"+remote_shelly_IP+"/relay/0?turn=toggle"});
}catch(e){print('Error: in Some_Logic() ---> ',e);} //Error Handling
}
var saved_states= {}; //object to save some remote states, global
function Save_Remote_State(remote_state_key,remote_state_value) {
try{
saved_states[remote_state_key]= remote_state_value; //save remote sate
//Simpel case query managment
var value_error= '_[ '+remote_state_value+' ]_ is a invalid value!';
switch(remote_state_key){
case 'switch1': //?switch1=on/off <---query
if(remote_state_value !== 'on' && remote_state_value !== 'off') throw new Error(value_error) //Check value
remote_state_value === 'on' ? saved_states[remote_state_key]= true: saved_states[remote_state_key]= false; //Change saved value into boolean
break;
case 'switch2': //?switch2=on/off <---query
if(remote_state_value !== 'on' && remote_state_value !== 'off') throw new Error(value_error) //Check value
remote_state_value === 'on' ? saved_states[remote_state_key]= true: saved_states[remote_state_key]= false; //Change saved value into boolean
break;
case 'switch3': //?switch3=on/off <---query
if(remote_state_value !== 'on' && remote_state_value !== 'off') throw new Error(value_error) //Check value
remote_state_value === 'on' ? saved_states[remote_state_key]= true: saved_states[remote_state_key]= false; //Change saved value into boolean
break;
default:
delete saved_states[remote_state_key]; //delete invalid satate
throw new Error('_[ '+remote_state_key+' ]_ is a invalid key!');
}
Some_Logic(); //Call some logic to work with the saved states.
}catch(e){print('Error: in Save_Remote_State() ---> ',e);} //Error Handling
}
function Endpoint_Loop(request, response){
try{
response.code= 200; //Response Code "ok", Shelly Actions cant handel other response
response.body= 'ok';
response.send(); //Send response to connected Client
if(!request.query || request.query.indexOf('=') === -1) return; //Exit if there is no query or invalid query
Save_Remote_State(request.query.slice(0,request.query.indexOf('=')),request.query.slice(request.query.indexOf('=')+1)); //Get remote state key and value
}catch(e){print('Error: in Endpoint_Loop() ---> ',e);} //Error Handling
}
print('Info: Your HTTP Endpoint exampel URL is:\n', 'http://admin:'+shelly_Password+'@'+Shelly.getComponentStatus('wifi').sta_ip+HTTPServer.registerEndpoint(endpoint_name, Endpoint_Loop));
Alles anzeigen
Damit das Ganze funktioniert, müssen natürlich auf den anderen Shellys die entsprechenden Actions manuell über die grafische Benutzeroberfläche erstellt werden:
Jeder externer Shelly muss dann den Link(Endpoint), den das Skript erstellt, samt query String im Link via Action aufrufen.
Der Query String ist das, was nach dem "?" kommt und in dem Beispiel sind 3 Keys vordefiniert: "switch1", "switch2" und "switch3", als Value wird "on" und "off" akzeptiert.
So könnten die Links aussehen, die man als Actions auf den anderen Shellys anlegen muss.
-->http://admin:@192.168.10.23/script/2/exampel?switch1=on
-->http://admin:@192.168.10.23/script/2/exampel?switch1=off
-->http://admin:@192.168.10.23/script/2/exampel?switch2=on
-->http://admin:@192.168.10.23/script/2/exampel?switch2=off
-->http://admin:@192.168.10.23/script/2/exampel?switch3=on
-->http://admin:@192.168.10.23/script/2/exampel?switch3=off
Warum sind Actions auf den anderen Shellys notwendig?
Woher zum Geier soll denn der Shelly im Wohnzimmer wissen, wann genau der Shelly im Flur angeschalten wird!
Ein Endpoint ist im Grunde so etwas wie eine Telefonnummer und mit Actions sagt man seinem Shelly im Flur, ruf den Shelly im Wohnzimmer unter dieser Nummer an, wenn ich das Licht einschalte.
Ein einfacher Anruf reicht aber nicht, denn der Shelly im Wohnzimmer soll ja wissen, dass etwas Bestimmtes passiert, ist und um zu übermitteln, was genau hier passiert ist, sozusagen die Nachricht,
brauchen wir Querys. Im Query String, dem Teil nach dem "?" in der URL sagt der Shelly im Flur, also dem Wohnzimmer Shelly Script, was genau der Grund für den Call war.
So ich hoffe, ich konnte das Thema jetzt einigermaßen verständlich erklären.