I recently wrote about how to show bin collection information in Home Assistant, and my next project was to pull some air quality information. Fortunately I have a ‘Tado’ account which meant I could pull this information from their API using the following code
Updated 20-Dec-2021
This was updated to tweak an issue where home assistant converts the text value “none” into “unknown”.
Much of the information for this was taken from a thread on the home assistant forums, but I was able to add pollution as well as pollen information, and I also had to tweak the code to resolve an issue with “none” being treated as “unknown” rather than as a string of text. Lots of credit to Drillbit on the forums though.
Tado account details
- You will need some information for your Tado account
- Visit https://my.tado.com/api/v2/me?username=you@emailaddress.tld&password=yourpassword
- Near the top of the output you need the numeric ID that is listed under homes: 0: id:
- Next, go to https://www.latlong.net/ and locate your home and make a note of the latitude and longitude
- Next visit https://acme.tado.com/v1/homes/your-home-ID/airComfort?latitude=12.34&longitude=12.34&username=your@email&password=your-password to make sure it loads
Code for home assistant
- Add the following code to your configuration.yaml
sensor: - platform: rest # API call to get air quality # Result goes into outdoorQuality attribute in JSON format name: TadoAir verify_ssl: true scan_interval: 1800 resource: https://acme.tado.com/v1/homes/your-home-ID/airComfort?latitude=12.34&longitude=12.34&username=your@email&password=your-password headers: User-Agent: Home Assistant Content-Type: application/json method: GET json_attributes: - roomMessages - outdoorQuality value_template: 'Tado airComfort' # Enumerate JSON to populate various template sensors - platform: template sensors: air_quality: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["aqi"]["level"] | capitalize }}' friendly_name: "Air Quality" icon_template: mdi:air-filter unique_id: "air_quality" # Pollen sensors air_pollen_level: value_template: > {% if states('sensor.tadoair.attributes["outdoorQuality"]["pollens"]["dominant"]["level"]') == 'unknown' %} None. {% else %} {{states('sensor.tadoair.attributes["outdoorQuality"]["pollens"]["dominant"]["level"]')}} {% endif %} friendly_name: "Pollen Level" icon_template: mdi:flower unique_id: "pollen_level" air_pollen_level_grass: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollens"]["types"][0]["forecast"][0]["level"] | capitalize }}.' friendly_name: "Grass Pollen" icon_template: mdi:flower unique_id: "grass_pollen_level" air_pollen_level_grass_tomorrow: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollens"]["types"][0]["forecast"][1]["level"] | capitalize }}.' friendly_name: "Grass Pollen Tomo." icon_template: mdi:flower unique_id: "grass_pollen_level_tomorrow" air_pollen_level_weed: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollens"]["types"][1]["forecast"][0]["level"] | capitalize }}.' friendly_name: "Plant Pollen" icon_template: mdi:sprout unique_id: "plant_pollen_level" air_pollen_level_weed_tomorrow: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollens"]["types"][1]["forecast"][1]["level"] | capitalize }}.' friendly_name: "Plant Pollen Tomo." icon_template: mdi:sprout unique_id: "plant_pollen_level_tomorrow" air_pollen_level_tree: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollens"]["types"][2]["forecast"][0]["level"] | capitalize }}.' friendly_name: "Tree Pollen " icon_template: mdi:tree unique_id: "tree_pollen_level" air_pollen_level_tree_tomorrow: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollens"]["types"][2]["forecast"][1]["level"] | capitalize }}.' friendly_name: "Tree Pollen Tomo." icon_template: mdi:tree unique_id: "tree_pollen_level_tomorrow" air_pollution_level_pm10: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][0]["level"] | capitalize }}: {{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][0]["concentration"]["value"]}}μg/m³' friendly_name: "PM 10" icon_template: mdi:tree unique_id: "pollution_pm10" air_pollution_level_pm25: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][1]["level"] | capitalize }}: {{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][1]["concentration"]["value"]}}μg/m³' friendly_name: "PM 2.5" icon_template: mdi:tree unique_id: "pollution_pm25" air_pollution_level_ozone: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][2]["level"] | capitalize }}: {{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][2]["concentration"]["value"]}}ppb' friendly_name: "Ozone" icon_template: mdi:tree unique_id: "pollution_ozone" air_pollution_level_sulphur: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][3]["level"] | capitalize }}: {{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][3]["concentration"]["value"]}}ppb' friendly_name: "Sulphur Dioxide" icon_template: mdi:tree unique_id: "pollution_sulphur" air_pollution_level_carbon: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][4]["level"] | capitalize }}: {{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][4]["concentration"]["value"]}}ppb' friendly_name: "Carbon Monoxide" icon_template: mdi:tree unique_id: "pollution_carbon" air_pollution_level_nitrogen: value_template: '{{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][5]["level"] | capitalize }}: {{ states.sensor.tadoair.attributes["outdoorQuality"]["pollutants"][5]["concentration"]["value"]}}ppb' friendly_name: "Nitrogen Dioxide" icon_template: mdi:tree unique_id: "pollution_nitrogen"
CIao
stavo seguendo la tua guida. Ti risulta che la stringa di tado funzioni ancora? perchè mi restituisce errore {“message”:“User is not authorized to access this resource with an explicit deny”} oppure inserendola in versione codice yaml mi restituisce {“message”:“Token di autenticazione mancante”} . Grazie
Hi Flavio
Yes, this is still working for me.
My URL is https://acme.tado.com/v1/homes/123456/airComfort?latitude=11.11&longitude=11.11&username=me@myemail.com&password=mypassword
Obviously I’ve removed the home ID, latitude, longitude, email address, and password I use. But if you get those right then it should load fine
Have you double checked your email address and password? Have you checked your home ID at https://my.tado.com/api/v2/me?username=you@emailaddress.tld&password=yourpassword
I don’t know if the Tado system is different outside of the UK — maybe they don’t have data for latitude and longitude where you are? Do you get air quality data in your Tado app when you’re logged into your account?