Skip to main content

Pollens smart home integration, free and open source

Pollens integration for Gladys Assistant

Pollen risk for the locations you choose, from the Copernicus CAMS European forecast.

This integration exposes the pollen risk of the locations you choose as Gladys devices: one device per location, with a 0-to-3 risk level — Gladys's own scale — for each pollen type. You add your Gladys houses in one click, or a location by typing its town.

No account to create, no API key to paste.

The risk also shows on your dashboard (two widgets) and drives your scenes (two triggers, two actions).

This version requires Gladys 5.1 or newer: an integration's dashboard widgets and scene cards do not exist before it.

Where the data comes from​

Pollen concentrations come from the CAMS European air quality forecast (Copernicus Atmosphere Monitoring Service, the atmospheric service of the EU Copernicus programme, operated by ECMWF). It is the reference model in Europe, on a ~11 km grid.

It is queried through Open-Meteo, which republishes CAMS as open data with no account and no API key.

The towns you type are turned into coordinates by the Open-Meteo geocoding API, backed by the GeoNames database — also open and unauthenticated, and worldwide, so there is no country to pick anywhere in this integration.

What about Atmo France? Atmo France does publish a pollen index for France, but its API requires an account and an authentication token that every user would have to create before the integration works at all. CAMS was chosen because it is official and usable with zero setup.

Adding your Gladys houses, in one click​

You have already told Gladys where you live: that is the map in Settings > Houses. The "Add my Gladys houses" button reads those houses and creates a location for each one that is not watched yet — no town to type.

Four things worth knowing:

  • The access is a permission. Where you live is personal data: Gladys only shares it if you accepted the request on the integration's install screen. If the button answers that the access is refused, remove and re-install the integration, accepting the request shown there.
  • A house you never placed on the map has no coordinates. It is named in the answer; locate it in Settings > Houses and click the button again.
  • A house outside the CAMS European domain is named too, and left out: no pollen forecast covers it (see "Geographic coverage" below).
  • This is not a sync. The houses are read at the moment you click. What comes out is an ordinary location, which you rename and remove like any other, and a house moved in Gladys afterwards does not move its location.

Clicking again is safe: a house already watched is reported, not added twice.

Reading the houses needs the house coordinates Gladys opened in 4.85.0 — this integration requires Gladys 4.86.0 or newer in any case.

Adding a location​

  1. Open the integration's Configuration tab.
  2. Click Add a location.
  3. Type the town, e.g. Montauban. Naming the location is optional: the town's name is used when you leave the field empty.
  4. Submit.

Most place names are shared by several towns — there are two Montauban in France alone, and a dozen Paris in the world. When that happens the integration lists the candidates instead of guessing: run the action again with a comma and the region, the country or the postal code, e.g. Montauban, Tarn-et-Garonne or Paris, France.

You can also add a point directly: fill in the latitude and the longitude (WGS-84 decimal degrees, both of them — one alone is not a point). They are read with either decimal separator, so 48,8566 works as well as 48.8566. Coordinates win over the town, which is then only kept as the label of the location.

The location then shows up in the Discovery tab, named Pollens — <name>. Click it to create the device in Gladys — that is when it becomes usable in dashboards and scenes.

You can add up to 20 locations.

Seeing and removing your locations​

Show my locations prints them, numbered:

• 1. Home — Montauban, Tarn-et-Garonne, France (44.01810, 1.35490)
• 2. Office — Toulouse, Haute-Garonne, France (43.60426, 1.44367)

Those numbers are what the deletion dropdown offers, because a dropdown declared in a manifest can only hold fixed options — never your location names.

To remove one: click Remove a location, pick its number, tick I confirm and submit. Running it without the checkbox tells you which location would be removed. The location disappears from the Discovery tab immediately, and the locations below it move up a rank — so print the list again before deleting a second one.

If you had already added the device to Gladys, delete it from the device page too: an integration is not allowed to delete a device you created. Conversely, if you delete the device without removing the location, it comes back in the Discovery tab, ready to be added again.

What the device measures​

Each device exposes sixteen measurements: an overall risk, its wording, the dominant pollen, the date of the data, then for each of the six pollens a risk index and the same risk spelled out.

MeasurementDescription
Overall pollen riskThe highest of the six risks below (0 to 3)
Overall pollen risk (text)The measured risk spelled out: "4/5 (high)"
Dominant pollenThe name of the pollen driving that risk
Last data updateThe date and hour the displayed forecast is for
Alder pollen riskRisk from 0 to 3
Alder pollen risk (text)The measured risk spelled out: "4/5 (high)"
Birch pollen riskRisk from 0 to 3
Birch pollen risk (text)The measured risk spelled out: "4/5 (high)"
Grass pollen riskRisk from 0 to 3
Grass pollen risk (text)The measured risk spelled out: "4/5 (high)"
Mugwort pollen riskRisk from 0 to 3
Mugwort pollen risk (text)The measured risk spelled out: "4/5 (high)"
Olive pollen riskRisk from 0 to 3
Olive pollen risk (text)The measured risk spelled out: "4/5 (high)"
Ragweed pollen riskRisk from 0 to 3
Ragweed pollen risk (text)The measured risk spelled out: "4/5 (high)"

The "(text)" measurements are what a notification, a dashboard text box or a voice assistant reads: a scene reading the index gets a 3, and 3 is what it puts in its message. A pollen the model has no value for publishes nothing at all, neither index nor wording.

The index and the wording are not on the same scale, on purpose. The index is on the Gladys scale, 0 to 3 — the only one the core can name. The wording is a plain string nobody re-reads downstream, so it carries the measurement itself, 0 to 5, the European bands the CAMS data follows. A "high" day and a "very high" day both read 3 on the index, but "4/5 (high)" and "5/5 (very high)" on the text.

These are the names with the Language of the device names setting on English. It defaults to French (Risque pollinique — Bouleau) — see The language of the names below.

The numeric measurements keep their history, so you can chart the pollen season of your town.

When the model has no value for a species at that position, nothing is published for that species — a missing measurement is not a zero risk.

How old are these numbers?​

The Last data update measurement answers that. It shows the date and hour the displayed forecast is for, as 2026-08-06 13:00.

It is the date of the data, not of the last request: CAMS publishes its forecast once a day and Open-Meteo interpolates it hour by hour, so a successful refresh usually re-reads exactly the same numbers. What you want to know is how old those numbers are, not when they were last fetched.

The hour shown is the location's own: a forecast is read against the clock of the town it covers. For a location in your timezone that is simply your time; for one further away it is the local time over there. It is also why this measurement sits on every device rather than on a single one shared by the whole integration: two locations do not necessarily carry the same.

If the date stays stuck in the past, the refresh is failing: the Test the pollen provider button shows the same date for every location, and says what is going wrong if anything is.

The risk scale​

It is Gladys's scale, not one of our own. Gladys knows how to name four risk levels, and it is Gladys that writes the label next to the measurement in the "device in a room" box:

LevelWhat Gladys showsColour
0No RiskGreen
1LowYellow
2MediumOrange
3HighRed

The integration publishes exactly those four levels and nothing else. So the device box, the widgets, the scene triggers and the notifications all say the same thing about the same number. The text measurements and the widgets add the scale to the word — "2/3 (medium)" — so you can place a level without knowing the scale by heart.

The CAMS data follows the bands of the European Aeroallergen Network (EAN), which has six of them. They are folded onto Gladys's four levels:

EAN band (text measurement)Published indexGladys name
0/5 (none)0No Risk
1/5 (very low)1Low
2/5 (low)1Low
3/5 (moderate)2Medium
4/5 (high)3High
5/5 (very high)3High

Nothing important is lost in the fold: the two quiet bands both mean "there is barely any", and the two loud ones both mean "stay inside if you react to it".

The measured band stays readable: the "(text)" measurements of the device show it as it is, from 0 to 5. That is the one place it survives, because a string is displayed exactly as it was stored where Gladys re-labels a number with its own words.

The level is derived from the concentration in pollen grains per cubic metre of air, using per-species thresholds: 30 grains/m³ is a quiet day for birch (level 2) but a heavy one for ragweed (level 3), whose allergenic power is far stronger.

Coming from a 0-5 version?​

The first versions published the six EAN bands as they are, from 0 to 5. That did not work: Gladys only knows how to name four levels, so a level 3 showed up as "High" where it meant "medium", and levels 4 and 5 showed up as "Unknown". The published scale is now Gladys's own.

Two things to check after the update:

  • The device. It shows up in the Discovery tab with an Update button: one click is enough. The history, the rooms and the scenes are kept.
  • Your scenes. A trigger or a condition aimed at level 4 or 5 no longer matches anything: aim at level 3 ("high") instead. A level 3 that meant "moderate" becomes a 2.

The history already recorded keeps its old values: on a chart covering the switch, the points before it are on the 0-5 scale and the ones after on the 0-3 scale. It still reads, but a comparison across that period is not a fair one.

The measured 0-5 band is not gone, though: it is what the "(text)" measurements of the device display, next to the index. Only the numbers a scene or a chart reads are on the 0-3 scale.

The language of the names​

Device and feature names are written in French by default: the measurements read Risque pollinique global, Risque pollinique — Bouleau, and the dominant pollen shows up as Bouleau. Set Language of the device names to English in the Configuration tab to get the names in the table above.

Why a setting rather than your account language? Everything the integration displays — the message under a button, the status in the Supervision screen — is sent to Gladys in both languages, and Gladys picks the one of the person reading. A device name is not a message: it is a plain text stored as it is the day you create the device, and nothing in the integration API says which language you read. So it is chosen once, here.

One consequence: changing the setting renames the features of the devices yet to be created. A device already added to Gladys keeps the names it was created with — delete it and add it again from the Discovery tab to rename it (its history goes with the deleted device).

On your dashboard​

Two widgets ship with the integration. Add them from a Gladys dashboard: Edit the dashboard, Add a box, then pick them from the list.

Pollen — one place​

The card of one place: the overall level on a gauge, a Dominant pollen tile naming the species that level comes from, the risk spelled out — "3/3 (high)" — then the pollens actually in the air, the curve for today and tomorrow, and a Refresh button. A species at zero takes no row: a card showing nothing means there is nothing in the air, and it says so — with no pollen in the air there is no dominant one, and the tile is gone.

When the card is narrowed to a few species, the dominant pollen and the spelled out risk are about those species, like the gauge.

Three settings, per card:

SettingWhat it does
PlaceThe device to display. Only the devices you already added from the Discovery tab are offered.
Species followedTick the species you react to: the gauge, the list and the curve then only account for those. Nothing ticked means all of them.
Show the two-day forecastThe hour-by-hour curve. Untick it for a compact card.

The curve shows today and tomorrow, hour by hour, with a marker at the current time. It is a forecast: Gladys keeps no history of it, so it is read again on every display. With four followed species or fewer, each gets its own curve; beyond that, a single curve shows the worst of them.

When you follow every species, the gauge is bound to the device measurement itself and follows the published values in real time. With a selection of species no measurement matches it — the gauge then shows the number the card computed.

Pollen — all places​

One row per configured place, with its level and its dominant pollen, and a Refresh button that reads them all again. No settings: the card shows the list the Configuration tab manages. It stops at ten rows, and says so.

Both cards are written in the language of whoever is looking at them: unlike a device name, Gladys tells us here which language you read.

Using the risk in a scene​

Three ways, from the simplest to the finest.

1. The measurements, like any sensor​

The overall risk is a "risk" category measurement: it behaves like any numeric sensor. A few ideas:

  • close the shutters or stop the ventilation when the overall risk goes above 3;
  • send a notification in the morning if the "Grass" risk is ≥ 4;
  • turn the air purifier on when the dominant pollen is the one you react to.

2. The triggers​

In the scene editor, under the Integrations category:

TriggerWhen it fires
Overall pollen risk changedThe overall level of a place moves from one level to another
Pollen risk of one species changedThe level of one pollen changes at a place

Both fire on a change only, never on every refresh: the CAMS forecast is republished once a day, so a scene firing on every reading would fire twenty-four times for the same value.

Each trigger can be filtered: the place (empty means any), the levels you care about (tick 3 to react to peaks only), the direction (rising to close the windows, falling to open them again), and for the second one the species.

The scene then gets what it needs to write its message: {{triggerEvent.data.summary}} holds the ready-made sentence "Pollen in Home: risk 3/3 (high), dominant Birch.", and location_name, level, level_label, previous_level, direction, taxon, taxon_name and measured_at are available on their own.

Two details:

  • nothing fires at startup: the previous level is unknown then, and "unknown → 3" is not a change. The first real change fires normally;
  • a species with no value fires nothing: a missing measurement is not a fall back to zero, and the last known level is kept.

3. The actions​

Still in the scene editor, under Integrations:

ActionWhat it does
Read the pollen riskReads a place now and hands the level, the dominant pollen and the ready-made sentence to the next actions
Refresh the pollen dataReads the forecast again and republishes the measurements; leave the place empty for every place

"Read the pollen risk" is what turns "every morning at 7 am" into "every morning at 7 am, tell me the risk": pick the place, leave Overall risk (or pick a species), then send a message containing the summary output. The level (0 to 3), level_label, taxon, taxon_name, concentration, location_name and measured_at outputs are there if you would rather write your own sentence.

When the source answers nothing, the action does not fail: it returns an empty level and a summary saying the data is unavailable. It is up to the scene to decide what to do with that.

Refresh interval​

Each location is refreshed hourly by default. The CAMS forecast is recomputed once a day and interpolated hourly, so going below one hour gains nothing. The interval is configurable between 15 minutes and 24 hours in the Configuration tab. A device you have just created is refreshed straight away, without waiting for the next cycle.

Geographic coverage​

The CAMS forecast covers the European domain. A location outside that area is refused when you add it, rather than creating a device that would never hold a value.

Troubleshooting​

  • "Test the pollen provider" button: it queries the source live for every location and prints one line per location, numbered like the listing. Each line ends with the date of the data it read, so a source stuck in the past shows up here too. The quickest way to tell a network problem from a configuration one.
  • The logs: read the integration logs from the Gladys UI, or with docker logs. Set LOG_LEVEL to debug to see the URLs being queried and the exact device payload sent to Gladys.
  • Nothing appears in the Discovery tab: check the integration's status in the Supervision screen — when Gladys refuses a device, the reason is reported there.
  • A device stays empty: check that its location is still listed by "Show my locations". A device whose location was removed is no longer refreshed.

Configuration settings​

These are the settings Pollens asks for in its configuration screen in Gladys.

SettingTypeRequiredDescription
How it workssectionNoAdd a location with the button below: type a town, it is geocoded, and a pollen device appears in the Discovery tab, ready to be added to Gladys. Pollen data comes from the CAMS European air quality forecast (Copernicus), republished as open data by Open-Meteo, and places are searched through the Open-Meteo geocoding API: no account and no API key are needed. Coverage is Europe, wherever the CAMS model reaches.
General settingssectionNoThese settings apply to every configured location.
Language of the device namesselectNoThe language the pollen names are written in: "Bouleau" or "Birch". Everything else this integration displays already follows your Gladys language, but the name of a device and of its features is stored as it is published, so it has to be chosen here. A device already added to Gladys keeps the names it was created with: delete it and add it again from the Discovery tab to rename it.
Refresh interval (s)numberNoHow often each location is refreshed, in seconds. The forecast is updated once a day and interpolated hourly, so there is nothing to gain below one hour.
Your locationssectionNoUse the buttons below to add, list and remove your locations. "Add my Gladys houses" turns the houses you already placed on the map in Gladys into locations, in one click. They are not fields of this form: a list you build as you go cannot be one, so everything about them happens under a button, and the answer displayed there is what shows you the list.

How to install Pollens in Gladys​

  1. In Gladys, open Integrations: Pollens appears in the catalog, next to the native integrations, with a community badge.
  2. Click Install. Gladys pulls the Docker image (ghcr.io/prohand/gladys-pollen:2.0.3), starts it in a sandbox isolated from the core, and generates the integration's interface (devices, discovery and configuration).
  3. Open the Configuration screen of the integration, fill in the settings, and save.
  4. You can also install it directly from its repository URL: https://github.com/prohand/gladys-pollen.

Pollens requires Gladys >=5.1.0. The catalog inside Gladys refreshes every hour, so a new version becomes available at most one hour after its release.

Not running Gladys yet? It is free and open source: follow the installation guide to get started.

About external integrations​

Pollens is an external integration: a community integration packaged as a Docker container and published on GitHub, that Gladys installs in one click and runs in a sandbox isolated from its core. It is published and maintained by prohand, not by the Gladys core team.

Subscribe to the Gladys Assistant newsletter

A few emails per month about new releases and project news. Sent by Pierre-Gilles Leymarie, founder of the project. Unsubscribe anytime 🙂