Turn on your thermostat before an alarm with Tasker (Android)
Dec 03, 2020
My main Black Friday purchase this year was a Tado° system (thermostat + smart radiator valves), which I acquired with the goal in mind of regulating the temperature in my bedroom by:
- Turning the heat down early enough to be consistently cold at night.
- Turning the heat up in the morning to make it easier to wake up. Ideally 1h before.
The first part is easy, but the second part can’t quite be achieved, at least out-of-the-box. If your daily sleep schedule is consistent, you can just set a corresponding heating schedule in the Tado app. But my own wake-up time varies between 7a-9a, and I found it cumbersome to change the “Smart Schedule” every evening in anticipation of when I would wake up the following morning.
Why IFTTT isn’t enough
Tado’s IFTTT integration is a good start, but it isn’t perfect. It is relatively straight-forward to create a recipe that turns on our heating when our Android alarm goes off. But ideally it would trigger some amount of time ahead of the alarm, so that the room has time to actually rise to temperature.
IFTTT doesn’t have any capability for this sort of pre-trigger logic. I toyed with triggering based on a “dummy” alarm set 1h ahead, but ultimately realized that actions trigger on the alarm being dismissed rather than going off.
There are two things we need to do, which we can achieve using a combination of IFTTT and Tasker:
- Calculate when to trigger the heat, based on the next alarm set.
- Actually trigger the Tado° thermostat to turn on at that time.
Calculate when to trigger
We’ll use the AutoAlarm plugin (Google Play) to enable tasker to see the time of the next alarm we have set. These instructions are heavily based on this forum post, which includes a video walk-through that is useful if you’re not familiar with the Tasker interface.
- Create a new time-based profile (
Tasker → Profiles → (+) → Time)
- From/to → if you use other android alarms throughout the day (besides for waking up) you’ll want to set a window here to only run around when your wake-up alarm should be. I used 5a-10a.
- Every → I set it to run every 5 minutes, but I suppose you could run it less frequently to minimize effect on battery. This is less of a concern for me personally, because my phone is always plugged in overnight.
- Add the following actions to your profile
Plugins → AutoAlarm→ this will run the plugin, exposing a
%secondsvariable which contains the number of seconds until our next alarm.
- Set a variable
%minsBeforeto the number of minutes ahead of your alarm that you want your heat to turn on. I used 60 here, but adjust accordingly.
- Set a variable
%TriggerHeatAtSecthat calculates the formula
round(%TIMES + %seconds - (%minsBefore * 60)). Make sure the variable name starts with an uppercase character, so that it is available in “global scope” for later use by a different profile. If you’re trying to understand this formula:
%TIMESis a built-in Tasker variable that returns the current time in UNIX format (number of seconds since January 1970, don’t ask).
- If you use other alarms throughout the day, also set the variable
%NextAlarmHourso it can be used as a condition later.
☠️ There are some reports of this method sometimes not working, possibly due to other apps using alarms silently in the background. If it’s acting funky, double-check that you have the Reliable Alarms option disabled in Tasker. This option sets background alarms in the built-in Android clock app to ensure that the Tasker app does not get killed due to battery-saving settings. But it interferes with what we’re trying to do here. If this doesn’t help, you may have a different app that is causing the interference. You can try debugging with the ClockTask plugin, which has a variable that tells you which app the next alarm is set.
Actually trigger the thermostat
Now we need to trigger our thermostat to kick in at the previously calculated time. We could probably do this entirely via Tasker using the tado API, but using IFTTT relieves us of the burden of dealing with OAuth tokens, etc.
- Connect your Tado account to IFTTT
- Enable the IFTTT Webhooks channel.
- Create an applet that triggers your thermostat based on a webhook event. Here is mine.
- Go back to the webhooks channel page and click Documentation in the top-right to get to a page where you can test out your configuration. Fill in the name of your event and click Test It. After a few seconds, check your Tado app (or listen to your radiator valve) and you should notice that it was triggered successfully.
- Go back to Tasker and create a second profile that runs from/until
- To prevent the logic from triggering for random alarms later in the day, you can set an additional constraint to the trigger logic:
%NextAlarmHour < 13(to only turn on heating for alarms before 1p).
- Add a single task that uses HTTP Request to make a GET request to the webhooks URL we tested earlier, which will look something like