My Zigbee soil moisture sensor shootout

Having experimented with a few Zigbee soil moisture sensors, I’ve discovered that they vary wildly in what they report for soil moisture between brands. That’s fine, since I’m trying to decide on one brand to buy, so the variance between brands doesn’t concern me as much as the variance between two devices of the same brand. With that in mind, I decided to buy two of all of the cheap Zigbee soil sensors I could find. I bought two of the following and stuck them all into a bucket of soil:

  • Plaid Spruce
  • Third Reality
  • Afra II
  • Haozee
  • Giexpress (“Giex”)/Tuya

A few notes about pairing and stuck-value issues:

  • The Giex/Tuya was the biggest pain to deal with. One of the units was just dead, completely (I have had the two Geix for about a year, so one of them had died in that time). The second one was reporting incorrect temperatures (stuck at 32F, then I’d remove and re-pair and it would be stuck at 129F, then remove and re-pair and it would be stuck at 32F… so I eventually just tossed both of these out of the test. I’m kinda fine with that, because these were the clunkiest of the brands… needing four screws for accessing the battery compartment, and these were the only resistive-type sensors in the batch, which aren’t as good as capacitive type). So, they got eliminated quickly.
  • The Plaid Spruce are getting harder to find, these days, and they used to be quite pricey (compared to other sensors). They use a magnet instead of a button in order to trigger inclusion or calibration. It’s a cute idea to prevent needing to access the electronics inside, but it’s just too fiddly. You have to get the magnet in just the right spot. Most of the time, I had to remove the top just so I could see exactly where to put the magnet… at which point, what’s the benefit in the magnet idea? One of the Spruces got stuck on certain moisture readings until I removed/re-paired it.
  • One of the Afra II’s was quite a pain. All entities became “unavailable”, then I re-paired, but moisture was stuck at 0%, then temp got stuck at 86F, and I re-paired and temp got stuck again, then I re-paired, then moisture and battery entities were “unavailable”, then moisture got stuck at 0%, re-pair, re-pair, re-pair… I finally got it to work, but what a headache.
  • The Haozee and Third Reality sensors had no issues with unavailable entities or stuck values.

So, on to the values these things were reporting. Keep in mind that I’m not looking for a particular value for a particular moistness of soil. What I want is for the difference between the two sensors of a given brand to be much less than the change they report for wet and dry soil. In other words, if one reports “100%” for wet soil and “90%” for dry, while the other reports “40%” for wet and “20%” for dry, that’s not good, since my plan is to have a universal threshold automation that alerts me whenever any sensor dips below a certain percentage. What’d I’d prefer to see is one reporting, say, “70%” for wet and “30%” for dry while the other reports “60%” for wet and “25%” for dry, since the overall change in their reporting between wet and dry soil is greater than the difference between the two devices.

With that in mind, I let all of the sensors be in dry soil for a few day, and then added a cup of water, evenly, to the bucket, and then let it be for about a week so that the moisture could evaporate away, giving me this:


So, the first take-away, here, is that the various sensors are reporting very different values for the soil moisture, but they all jumped up when I added water. The other thing to notice is that the values change with temperature. All brands did this, to some extent, so we’d like to see these intra-day ripples be smaller than the day-to-day drop from evaporation.

So, let’s look at each of these brands, individually.

AFRA II


These report 0% when dry and around 10% when wet. Not a great range, even though the two devices were fairly close in their readings.

PLAID SPRUCE


These had a huge difference between each other in their readings, with one reporting 7% for dry soil and the other reporting around 25%. For wet soil, they reported around 20% and 30%. I had previously calibrated these units (not all brands have instructions for calibrating the dry/wet points, but Spruce does). Maybe I’ll try calibrating them again.

THIRD REALITY


I liked that the Third Reality units had no pairing nor stuck-value issues, but their reporting range was a little tight (around 50% for dry soil and around 70% for wet). One really strange thing about these was that the intra-day temperature-induced ripple was up for one unit and down for the other.

HAOZEE


Now this is what I like to see! Low values for dry soil, close to 100% for freshly-watered soil, and then a steady decline over the days (with the day-to-day drop being greater than the intra-day temperature-induced spikes).

A word about temperature
All of these units also report temperature, and they all report similar measurements up until about 80F. After that, they start reporting very different values. In the graph, I’m also including the reading from an Aeotec temperature sensor under a radiation shield.


Notice that:

  1. Beyond about 80 degrees, we see the temperatures vary by as much as 20F
  2. Those weird moisture level spikes that we see correspond to the mid-day temperature spikes.

Anyway, I’m going to see if any of these models have calibration procedures. Meanwhile, I’m really leaning toward the Haozee sensor.

25 Likes

thanks for sharing this is great information and well writen thanks

I’ve got the Haozee also (thought they were Tuya).
Only thing Im up against, is that im using rechargeable batteries and they display the wrong percentage.
Fully charged ones start at 11-10ish percentage and gradually drop down to 6-5 percent. Where they stay awhile before dropping again.

This is troublesome, for me, because I use automations that alert me when Zigbee devices go below a certain point.

Rechargeable batteries only output 1.2v, while non-rechargeable ones output 1.5v. That’s a fair chunk of usable voltage lost, which will throw off the battery percentage calculators which all expect 100% to be 1.5v and 0% to be something like 0.9v.

Given that zigbee devices will last at least a year on a single battery, I suggest you use non-rechargeable batteries if you want to alert on low voltage. My zigbee motion/door sensors with a tiny coin cell battery have been running for 3 years without a battery change.

1 Like

I think Tuya is the true upstream source, and then Haozee and a few others slap their name on them… but I think the Giex ones are also marketed as Tuya, sometimes, so I wanted to give people a name they could search for that should uniquely take them to that particular product.

What you might want to look at are those lithium-ion AA and AAA batteries they have now. They’re really slick. They come in a case that holds 8 of them, the charger is in the lid of the case (and only needs USB-c power) and they have a built-in voltage regulator in them, so that they provide 1.5V right up until they quit. I drain-tested one against a normal alkaline and the lithium latest longer than the alkaline. The only downside is that they have the opposite problem as your NiMH’s showing a low voltage. These will probably show 100% until they just go unavailable. So… that may or may not be acceptable in your application.

3 Likes

I ordered 2 of the Haozee and like your chart.
Can you share your yaml?

Soil Moisture Sensors in Home Assistant: A Practical Reality Check

Indicative not Precision

Soil moisture sensors are useful tools — as long as you treat them like what they are: indicative, not precision instruments. They’re good for trends, not absolute truth. Think of them like checking the sky to decide whether to hang washing out — not like measuring rainfall in a lab.


What You’re Actually Measuring

Most soil sensors used in home automation don’t measure water content directly. They measure how easily electricity moves through the soil — which is influenced by several environmental factors:

  • Water content – wetter soil conducts or influences electric fields differently than dry soil
  • Temperature – affects both conductivity and dielectric behavior
  • Soil type – clay, sand, loam, etc. all behave differently
  • Salts/fertilizer – increase conductivity, can skew resistive sensor output
  • Air gaps and compaction – poor soil contact reduces accuracy

That means you can see readings change even when no watering happens. This isn’t a fault — it’s just how the physics works.


Sensor Types – Practical Overview

Sensor Type How It Works Common Issues Example Brands / Models
Capacitive Measures dielectric permittivity (how soil affects an electric field) Affected by temperature and soil type, needs calibration Thirdreality, Ecowitt WH51 / WH51L, Haozee Zigbee (flat blade), Xiaomi HHCC (BLE)
Resistive Measures electrical conductivity between exposed metal probes Corrodes over time, inaccurate in salty/fertilised soil, temp-sensitive Giex Zigbee (3-prong), Tuya 3-prong variants
TDR / FDR Measures delay or frequency shift of signal through soil Expensive, requires calibration, very accurate Vegetronix VH400, Decagon 5TE, Sentek Drill & Drop
Gypsum Block Measures resistance between electrodes embedded in gypsum Slow response, consumable, less suited to automation Delmhorst GB-1, Irrometer Watermark
Tensiometer Measures vacuum (tension) needed to extract water from soil Manual or analog by default, doesn’t work in dry soils Irrometer Jet Fill, Soilmoisture 2725AR

One Sensor Isn’t Enough

Soil conditions vary even within the same bed. A single sensor might show dry, while another spot is still holding moisture. You need multiple data points for reliable automation.

The simplest fix: use three sensors per bed and combine them into a median helper in Home Assistant.


Create a Median Sensor Helper

To combine multiple sensors into a single, stable value:

  1. Go to Settings > Devices & Services > Helpers
  2. Click “+ Create Helper”
  3. Choose “Combine the state of several sensors”
  4. Select “Median” as the calculation method
  5. Add your moisture sensors (e.g., sensor.bed1_1, sensor.bed1_2, sensor.bed1_3)
  6. Name the helper (e.g. sensor.garden_bed_1_median_moisture)

This gives you a clean, steady reading you can build automations around — without being thrown off by a noisy or misbehaving sensor.


Temperature Affects Readings

Capacitive sensors are sensitive to temperature because water’s dielectric properties change as it heats or cools.

What this means:

  • Cooler soil can read wetter, even if no water has been added
  • Warmer soil can read drier, just because of heat

You’ll often see 2–5% shifts in readings with nothing more than a temperature change. This is normal, and why temperature compensation can help if you want tighter control.


Optional: Apply Temperature Compensation

If you want to reduce false watering from temperature swings, create a template sensor like this:

template:
  - sensor:
      - name: "Garden Bed 1 Moisture Corrected"
        unit_of_measurement: "%"
        state: >
          {% set raw = states('sensor.garden_bed_1_median_moisture') | float %}
          {% set temp = states('sensor.soil_temp') | float %}
          {% set correction = (temp - 20) * 0.4 %}
          {{ [0, (raw - correction), 100] | sort | join(' ') | regex_replace('^.*? (.*?) .*

Adjust the correction factor (0.4) based on how your specific sensors respond to temperature shifts.


Smarter Watering Logic

Don’t water based on a single raw percentage. Instead:

  • Base decisions on the median from multiple sensors
  • Use a delay or trend check before watering
  • Consider forecast and rain data to skip irrigation when nature handles it

Final Thought

Soil sensors aren’t magic. But used properly — with multiple inputs, trend thinking, and basic logic — they’re a solid tool for smart irrigation. They won’t replace your instincts, but they’ll give your automations something better than guesswork to run on.


12 Likes

The temperature compensation logic is pretty nice. I’ll probably add something like that. I’ve been wondering why (since all of the sensors I’ve tested have temperature reporting in them) the devices don’t have the temperature compensation built-in.

There are several Chinese battery manufacturers that make li-ion AA and AAA batteries that are post regulated to 1.5v. Some are charged via a USB connector on the battery side, others use a traditional multi bay charger, some work both ways. I have used these for a while and they work fine, although my LED headlamp flashes when using these. Other flashlights work okay. EBL is one brand.

3 Likes

I bought a Haozee and Third Reality. The Haozee reads really high even in slightly damp soil

That is a really interesting comparison.

I’ve got my first sensor of that kind and the soil moisture level since installation without watering in between is drifting upwards. Any idea what is happening?

Has anyone tried these?

https://www.aliexpress.com/item/1005010168958171.html

I’ve bought 3 of those based on a video from Smart Home Junkie and they are the worst of all soil sensors I’ve tried. The best I’ve tested is a Tuya and looks exactly like the Haozee mentioned in this post, but I inadvertently ordered the BLE version which has no way to integrate into HA. Just ordered the zigbee version but I don’t hold out much hope that any of these are reliable in the long run.

Can you not use a Bluetooth Proxy to read the data? That’s what I do with all my BLE plant sensors (MiFlora).

No, it connects but no sensors are detected. As I understand it, the sensors are disabled until the device connects to the App. For this to work on HA you would need to first connect to the Tuya bluetooth gateway and it’s not worth my time to get one just for the single sensor I have.

1 Like

Love this.

For me battery life is more important than accurate moisture, which just needs to be relative / indicative (happy to calibrate sensors where that mitigates things a bit, even if they vary for the same brand). They do need to reliably pair and report.

I’d love to know how they perform battery wise. I want a year out of these kind of devices. This is the grievance with Mi Flora.

Reporting frequency wise, it’s nice if they push me updates on large moisture changes, but realistically a few updates a day is typically enough for me to manage water.

How long battery life do you get from them?
Mine are now 7-8 months in and reporting 0% but still working.
But it’s also very cold now.
The battery could be anywhere between 0 and 20 %

I got rid of mine a few years back but this thread has a lot of discussion on the topic.

From (poor) memory it was around 3-months.

Mileage seemed to vary a lot by user.

1 Like

Has anyone compared the Apollo Automation units to any of these? I’ve got both Third Reality and Apollo PLT-1. I’m not seriously using either yet. And foolishly bought the USB-powered PLT-1 (for indoor use, of course); could have gotten battery one. I’m just curious where the Apollo PLT-1 might land in comparisons.