A robot to simplify setting the Tado heating schedule

We've had a Tado smart thermostat for a couple of years, but we recently got some of the radiator robots which means setting the schedule(s) is now a lot more tedious. So, I made this

Using it

It's easiest to run it as a Docker container. So:

git clone
cd potado
make build


To do anything useful, you need to

cp potado/conf/credentials-example.yaml potado/conf/credentials.yaml

and fill in your Tado username, password, and client secret (which doesn't seem to change and can be found here), and

cp potado/conf/settings-example.yaml potado/conf/settings.yaml

and sweeten to taste

At this point, you have three choices:

Prepare the default schedules

All of this relies on you having set up the Tado Zones when your equipment was being fitted. Presuming this is true, then running

make init

will fire up the Docker container, gather up your zone names, and dump a dummy schedule at potado/conf/schedule-default.yaml. Note that this is a terrible schedule and I don't recommend applying it as-is, but it provides a good starting-point. Presuming you're starting from scratch, then

cp potado/conf/schedule-default.yaml potado/conf/schedule.yaml

and fill it in. The potado/conf/schedule-example.yaml file has some comments in it which might help

A note about temperatures and periods

Potado will fill in any gaps in your schedule with mode: ambient periods, which resolves to whatever you have as temperatures.ambient in potado/conf/settings.yaml (16 Celsius in my case). We have to do this because the API gets very unhappy if we try to submit a schedule that does not cover a full 24 hours. It also doesn't like periods shorter than 15 minutes (don't ask how I found this out)

I've got it set up so my active periods use mode: warm, which equates to 23 Celsius, but you can get as fancy as you want with these - see potado/conf/settings-example.yaml for some examples, but be aware that your Tado will only honour temperatures between 5 and 25 degrees

Apply the schedules

Once you've got the schedules set up the way you want, then to actually set them, do

make schedule

Get on the container

If you want to run the tests or something, then try

make run

to get a shell on the container (with potado mounted at `/opt/potado)

Then do


to run the tests

Tado's API

I've made some Choices here. In particular I've assumed that we want the same schedule on each weekday, then probably something different on the weekend, which fits with Tado's THREE_DAY timetable type (which recognises MONDAY_TO_FRIDAY, SATURDAY and SUNDAY). All together, Potado supports

  • mon-fri
  • saturday
  • sunday
  • weekend (expands to saturday and sunday)
  • all (expands to mon-fri, saturday and sunday)

See potado/conf/schedule-example.yaml for more on this. It shouldn't be too hard to support the two other timetable types (ONE_DAY and SEVEN_DAY) if anybody wants to have a crack at some of my Python

In general, the API seems to be powerful but very undocumented. I am eternally grateful to Terence Eden and Stephen Phillips for working out at least some of how this all works

Why have you done this?

Have you met me? Also, because trying to set such a large number of schedules on the fiddly little mobile app is awful. And as an excuse to learn some better Python testing techniques (and I'm pretty sure I've still not fully understand Python mocking)

At this point, wouldn't it have been quicker to just suck it up and set the schedules on the app?

Yes. Yes it would