SmurfnSurf Posted October 1 Share Posted October 1 Hi, Apologies if this appears to be covered elsewhere, I did look but could only find this thread. By way of background I discovered after a long search that Shelly Gen 1 devices had a really nice way to turn off ALL schedules with: http://192.168.1.xxx/settings/relay/0?schedule=false which could be used as a simple single line URL called from e.g. a Button Press linked to a Switch. Unfortunately it seems Gen 2+ devices do not have this global schedule on/off function and referencing the note in the thread above (thank you to the responder), while it works well when posted into a browser or a single schedule ID, does not work as a batch for say 9 IDs (i.e. 9 schedules for one Switch, Central Heating). http://ip_from_your_plus1pm/rpc/Schedule.Update?id=1&enable=false for schedule=off Id= Schedule-ID - 1 for the first.... I tried (I am not clear on the scripting syntax at all, sorry) to make a script (essentially for a batch of IDs) that I could call via a URL, but I am at a loss as to how to write it as a batch script or to run it from a saved URL script (where is it saved to and how do you call it?). I keep getting -3 reference_errors and the like, http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=2&enable=false http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=3&enable=false http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=4&enable=false http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=5&enable=false http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=6&enable=false http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=7&enable=false http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=8&enable=false http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=9&enable=false http://admin:remote_shelly_pw@192.168.47.127/rpc/Schedule.Update?id=10&enable=false I would really appreciate some pointers to get this up and running, I have been reading aa lot of what turne dou to be red herrings over the last week. I would prefer to stay in the Shelly ecosystem for the moment if it is a simple script, not HA for the moment at least. Thank you! Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
towiat Posted October 2 Share Posted October 2 The following should work: Go to the 'Scripts' tab of your Shelly and click 'Create Script'. Copy and paste the following code into the script window, give it some name in the corresponding field and click 'Save' and 'Start': function switchSchedules(value) { Shelly.call("Schedule.List", {}, function (result) { for (let job of result.jobs) { job.enable = value; Shelly.call("Schedule.Update", job); } }); } Then, go back to the Scripts tab and make sure that the text below the script name says 'running'. You should also activate the 'Run on startup' toggle to make sure that the script restarts after a reboot. You now have a switchSchedules function that can be called with either 'true' (to enable all Schedules) or 'false' (to disable them). You can do that with Script.Eval rpc calls: http://192.168.xxx.xxx/rpc/Script.Eval?id=1&code=switchSchedules%28true%29 # enables all schedules http://192.168.xxx.xxx/rpc/Script.Eval?id=1&code=switchSchedules%28false%29 # disables all schedules Note: the 'id=1' in the URL refers to the internal script number of the Shelly. If you only have one script, that number will be 1 - otherwise, you have to count... Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
SmurfnSurf Posted October 3 Author Share Posted October 3 (edited) First of all, thank you for taking the time to put this together, it's a very elegant solution, although I am pretty sure I would never have been able to put together that function in a month of Sundays! I ran it from a browser to test it and it runs with a "pretty-print" result " { "result": "undefined" } It works, but seems to only disable the first 4 schedules as shown, then stops? The script itself stops running and the console says "Too many calls". I attach the files showing the sequence of operations I followed as you noted above. I only need it to turn off (and later turn on again) the schedules that turn the relay on (3 of 9), so I was wondering if, to make it less processing (calls) intensive, whether the function could operate ONLY on those ones (that turn it on) rather than attempting all 9? Final and separate question, %28true%29 (pct28truepct29), is that what I actually write or like %20 is a blank, does %28 and %29 mean something else? I tried quotes "true" but that didn't work. Thank you again, it's amazing what these things can do, but they do seem a wee bit limited by processing power. Edited October 3 by SmurfnSurf Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
towiat Posted October 3 Share Posted October 3 Ha, this is what I get for testing it with only two schedules... Let's start with the simple questions: Getting "undefined" back in the browser means that the call was successful, so this is fine. %28 and %29 are the left and right parantheses - so 'switchSchedules%28true%29' is exactly the same as 'switchSchedules(true)', which is the JavaScript syntax for calling the function 'switchSchedules' with the parameter 'true'. Most browsers and tools will actually be fine with using the parantheses directly instead of their %-equivalent, but sometimes this may cause issues - which is why I chose the safe route. If you ever need an overview over the various URL encoding values, you can find a handy table here. Now to the actual problem: The Shellys have a documented hard limit of 5 simultaneous RPC calls (I'm sure I have read that before, but I have clearly forgotten about it). In our script, we have one "Schedules.List" call, followed by four successful "Schedules.Update" calls. The fifth "Schedule.Update" exceeds the limit and causes the script to fail. Getting around this limit in a general way is actually surprisingly hard, mainly because the Shelly has a whole bunch of restrictions in its JavaScript version. So, if you only need three schedules switched, the simplest solution is to specify these schedules in the script. For that, replace the current script code with the following: function switchSchedules(value) { let schedules = [1, 3, 6, 7]; // <-- example: change only the 1st, 3rd, 6th and 7th schedule Shelly.call("Schedule.List", {}, function (result) { for (let job of result.jobs) { if (schedules.indexOf(job.id) !== -1) { job.enable = value; Shelly.call("Schedule.Update", job); } } }); } You can define the IDs of the schedules that you want to switch between the square brackets in the second line. You must specifiy at least one and (obviously) not more than four IDs. Don't forget to save and start the script after you have made the change and make sure that it is running. With that, you can then use the URLs as described above to switch only the defined schedules. Please let me know if this works and solves your problem. Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
SmurfnSurf Posted October 4 Author Share Posted October 4 (edited) 11 hours ago, towiat said: Please let me know if this works and solves your problem. Hi, RIght, thank you once again for giving it a go and your explanations :-). Unfortunately it doesn't seem to do anything this time? No schedules (at all) get turned off, see pics for logs? Can I do anything to help troubleshoot it? Quick Qs: How do I actually call the script from a URL (I’m putting this in a Shelly Button 1) “link” later. Is it just: http://admin:password@192.168.47.127/rpc/nameofthescriptarethereanyswitches Not to expand on your generosity, but I have been having a bit of an Authorization issue with it on, I use admin:password@ which worked for some calls but Chrome threw a 401 error on some other calls e.g. these both work in a Browser, all I do is type admin and the PWD in the browser dialogue. http://192.168.47.127/rpc/Switch.GetConfig?id=0 http://192.168.47.127/rpc/Schedule.List But as noted in the separate post, this doesn't seem to work with other URL calls. https://community.shelly.cloud/topic/2556-authentication-dialogue-box-does-not-work-for-switchsetconfig-change-of-in_mode/#comment-12813 If you know of a quick solution to this it’d be appreciated but not a must, I’ll keep looking. Ta Edited October 4 by SmurfnSurf Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
towiat Posted October 4 Share Posted October 4 You still have to call the Script.Eval URLs from the first post to actually trigger the switch (sorry, I thought this was clear from context): http://192.168.xxx.xxx/rpc/Script.Eval?id=1&code=switchSchedules%28true%29 # enables the defined schedules http://192.168.xxx.xxx/rpc/Script.Eval?id=1&code=switchSchedules%28false%29 # disables the defined schedules The only job of the script is to provide the switchSchedule function - it does absolutely nothing unless this function is called via the above URLs. Regarding authentication: sorry, I have no experience with that feature. I am, however, very certain that the presence of this (or any other) script should have no impact whatsoever on the authentication process - such a behavior would clearly be a bug (and an unfortunate one at that for your specific problem). Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
wooly Posted October 4 Share Posted October 4 have you tried to insert a pause in the loop, so asking to wayt 5 seconds between each call ? Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
SmurfnSurf Posted October 4 Author Share Posted October 4 (edited) 47 minutes ago, wooly said: have you tried to insert a pause in the loop, so asking to wayt 5 seconds between each call ? I haven't but if you could suggest how I should do that in the script, I can try it! Edited October 4 by SmurfnSurf Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
SmurfnSurf Posted October 4 Author Share Posted October 4 (edited) 2 hours ago, towiat said: You still have to call the Script.Eval URLs from the first post to actually trigger the switch (sorry, I thought this was clear from context): http://192.168.xxx.xxx/rpc/Script.Eval?id=1&code=switchSchedules%28true%29 # enables the defined schedules http://192.168.xxx.xxx/rpc/Script.Eval?id=1&code=switchSchedules%28false%29 # disables the defined schedules The only job of the script is to provide the switchSchedule function - it does absolutely nothing unless this function is called via the above URLs. Regarding authentication: sorry, I have no experience with that feature. I am, however, very certain that the presence of this (or any other) script should have no impact whatsoever on the authentication process - such a behavior would clearly be a bug (and an unfortunate one at that for your specific problem). Oh goodness me, I'm really sorry, totally missed that I needed to issue those, too many hours staring at this little screen! It totally works, see attached! Thank you :-). I now have a working script it seems, just need to get my head around the authentication issue. It would be cool if they could all be disabled / enabled with a 5 sec wait loop, but now that this works, less urgency on that. Awesome, thanks again. Edited October 4 by SmurfnSurf Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
towiat Posted October 4 Share Posted October 4 You're welcome! Without going into too much detail: You actually can not just wait a few seconds in a JavaScript program. This is intentional and a consequence of the architecture of JavaScript (there are ways around that, but they do not work on a Shelly). You could use a Timer to delay execution of code, but the Shellys have another limit that says that only five Timers may be active at the same time - so we would just hit that limit instead of the original one. In general, none of these issues would be a problem in a 'normal' JavaScript environment, but the limited hardware of the Shelly devices obviously requires some compromises (which doesn't change the fact that it is still impressive what these things can do). Anyway, I'm glad that this is useful and wish you good luck with your other issues! 1 Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
SmurfnSurf Posted October 4 Author Share Posted October 4 That’s hugely informative, 🙏 thank you, means I can stop chasing avenues that have a very low chance of working. All good 👍. Quote Translate Revert translation? English (American) Finnish French German Italian Portuguese (European) Spanish Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.