Loading...
Author Cloudapp
E.G.

Tapo H100: Cellar Humidity Monitoring in Home Assistant

June 12, 2026
Table of Contents

Cellars sweat. On a warm humid day the air you let in is warmer than the cold concrete, and the moment it touches a cold surface it gives up its water. That's condensation, and over enough summers it's how a basement grows mould in the corners you never look at. I wanted a number that warned me before that happened. The catch I already knew going in: a raw relative-humidity reading isn't that number.

This is Part 08 of the series. The hub was already in the house running other things, and the install was genuinely the easy 20 minutes. The part worth writing about is what came after the sensor showed up: turning its two raw readings into a dew-point spread, and deciding when that spread means "act" versus "ignore the spike."

Why the H100, and why 868 MHz is the whole point

The hub is a TP-Link Tapo H100, a little smart hub that acts as a radio bridge for TP-Link's battery sensors — the T100 motion, the T110 contact, and the one I care about here, the T310 temperature/humidity sensor. Here's the load-bearing detail, and the reason I reached for this hub instead of a WiFi sensor: the Tapo sensors don't talk WiFi. They talk to the H100 over 868 MHz sub-GHz radio.

That matters in a cellar more than anywhere else. Sub-GHz is long-range and punches through concrete and floors in a way 2.4 GHz WiFi simply doesn't. There's no WiFi worth having down in my cellar, and no interest in running a repeater into a damp room just to read a sensor. The T310 sits down there on a battery, the H100 upstairs where the network is, and the radio link between does the work. One H100 supports up to 64 sensors — for a house, more headroom than I'll ever use.

Getting the sensors into Home Assistant

The native TP-Link integration doesn't expose the H100's child sensors — it's built for the plugs and bulbs. The one that works is the community Tapo Controller integration (petretiandrea's TP-Link Tapo), installed through HACS, the same custom-integration store I've leaned on throughout this series. If you've followed along, you already have HACS; this is one more repository to add.

Setup is by the hub's local IP plus your Tapo cloud account email and password — the honest catch worth flagging, since it means the initial pairing needs internet rather than a local-only token. Once paired, every sensor on the hub is auto-discovered. Each T310 shows up as two entities — a sensor.tapo_temperature_* and a sensor.tapo_humidity_* — plus a battery sensor per device. I renamed the cellar one's children by location, so I'm working with sensor.tapo_humidity_keller rather than a random suffix. Do that early; it makes every template downstream readable.

Relative humidity is the wrong trigger — dew point is the right one

Here's the engineering beat. Alert on "humidity above 70%" and you get a sensor that screams every muggy afternoon and tells you nothing about whether the cellar is actually in danger. Relative humidity is relative to temperature; 75% RH in a cool cellar and 75% RH in a warm room are completely different amounts of water in the air. What actually predicts condensation is the dew point — and the spread between it and the coldest surface in the room. When that spread gets small, you're close to the wall going wet.

Home Assistant doesn't hand you a dew point. But it hands you temperature and humidity, and dew point is arithmetic on top of those — the Magnus formula. This is exactly the pattern I've used elsewhere in my config: I already keep a templates.yaml where raw sensors get turned into derived ones — scaling a raw boiler register, computing PV percentages like self-consumption and autarky. A cellar dew-point sensor is the same move, with a different equation, defined as a template sensor with its own unique_id, unit, and device_class. Here's the cellar one.

# Derived dew-point sensor for the cellar T310 (templates.yaml style)
template:
  - sensor:
      - name: "Taupunkt Keller"
        unique_id: taupunkt_keller
        unit_of_measurement: "°C"
        device_class: temperature
        state: >
          {% set t = states('sensor.tapo_temperature_keller') | float(0) %}
          {% set rh = states('sensor.tapo_humidity_keller') | float(0) %}
          {% set a = 17.27 %}{% set b = 237.7 %}
          {% set g = (a * t) / (b + t) + log(rh / 100) %}
          {{ ((b * g) / (a - g)) | round(1) }}

A word on the thresholds, to be honest about what's measured versus guidance. These are general building-science values, not something I calibrated against my own walls: relative humidity becoming a concern around 65–70% RH when sustained, mould risk climbing once surface RH sits above roughly 70–80%, and a dew-point spread under about 3 °C as the real "condensation imminent" line. Treat them as starting dials, not gospel. The point of computing dew point locally is that you can tune them — you own the formula and the trigger.

Making the alert fire on a real problem, not a spike

The other decision worth more than the formula: timing. Humidity is noisy — open a door, dry some laundry nearby, and the reading jumps for a few minutes then settles. If the automation fired on a single high sample I'd train myself to ignore it within a week. So the trigger only fires on a sustained breach — humidity above threshold held for a continuous 30 minutes. That debounce is the difference between an alert I trust and one I mute.

And then the part I genuinely like about this hub: the alert needs no extra hardware. The H100 isn't just a passive bridge — it exposes a switch for its built-in siren, a select for the alarm sound, a number for volume, and an RGB night-light ring. So a humidity warning can drive the hub's own light: flash it red when the cellar crosses the line. No buzzer to wire, no smart bulb to buy — the thing that bridges the sensor also announces the problem. That's three escalation paths I get for free: a Home Assistant push, the siren switch, and the RGB ring.

# Flash the H100's own light red when cellar humidity is too high
automation:
  - alias: "Keller: Feuchtigkeit Warnung"
    trigger:
      - platform: numeric_state
        entity_id: sensor.tapo_humidity_keller
        above: 70
        for: "00:30:00"
    action:
      - service: light.turn_on
        target:
          entity_id: light.tapo_h100_light
        data:
          rgb_color: [255, 0, 0]
          brightness: 128

That red is a deliberate [255, 0, 0] at brightness 128 — bright enough to catch your eye on the stairs, not a floodlight. For a slow-moving problem like cellar damp, a quiet push plus a red glow is plenty; the siren I keep for things that actually want to be loud.

When sensors don't show up

Three things account for almost every "my T310 isn't in Home Assistant" moment. Most often the sensor simply isn't paired to the H100 in the Tapo app yet — the integration only sees what the hub already knows, so pairing happens in the app first, discovery second. Next is a flat battery; these are coin-cell devices and a dead one just goes silent. And sometimes Home Assistant needs a restart to pick up a freshly paired device. When none of that explains it, I filter the log to tapo and read what the integration is actually complaining about — usually an auth hiccup against the cloud account or a hub it can't reach.

Worth being fair about the trade-offs. The cloud-account login is the annoying part of an otherwise local setup; the 64-sensor ceiling is a non-issue for a house. But the radio is the reason this works at all: a battery sensor on the wrong side of a concrete wall, reporting periodically rather than being polled, reaching a hub upstairs over 868 MHz — a problem WiFi sensors don't solve. The dew-point template and the 30-minute debounce were the new bits I built on top; the hub and its auto-discovered entities were already running. That's the honest shape of it: a small cheap sensor and a bit of arithmetic turned a reading I couldn't act on into a warning I can.

Related articles