It asks for a pH reader, not for your probe.
The control logic binds to capabilities. The pH loop asks for "a pH reader in zone 3" and "a millilitre doser tagged pH-down", and it cannot discover whether that is an Atlas board on I²C, a 4–20 mA transmitter, or a register on an RS-485 unit. Swapping one for another is a configuration change, not a code change.
Transports, in the order they are worth building
| Transport | Where | Control? | Note |
|---|---|---|---|
| Direct — I²C, 1-Wire, GPIO, ADC | On the node itself | ✓ | The sensors bolted to the controller. Lowest latency, no network in the path, and the only transport that is still working when the Wi-Fi is not. |
| MQTT with Home Assistant discovery | Anything on the LAN | ✓ | Every Zigbee, Z-Wave, Matter, Tasmota, ESPHome and Shelly device already bridged into a Home Assistant becomes usable through this one integration. Thousands of devices, no drivers. |
| Modbus RTU over RS-485 | Industrial probes and drives | ✓ | The industrial bread and butter, and the transport that works down a wet block-walled polyhouse where Wi-Fi is hopeless. Two wires and a hundred metres. |
| Modbus TCP | PLCs and gateways | ✓ | The same register maps over Ethernet. Usually how a third-party climate PLC is reached. |
| HTTP polling | Cloud-tethered consumer gear | monitor only | A last resort with a local endpoint where one exists. Anything that can only be reached through a vendor cloud is not eligible for a control channel here — see the transport rule below. |
| 4–20 mA and 0–10 V | Industrial transmitters, through an ADC or DAC board | ✓ | Noise-immune over long runs and still the default in agricultural instrumentation. A 4–20 mA loop also fails detectably: zero milliamps is a broken wire, not a zero reading. |
| LoRaWAN via ChirpStack | Outdoor and long spans | monitor only | Kilometres, battery powered, and far too slow for a control loop. Monitoring only, and the abstraction enforces that rather than trusting a configuration screen. |
| BACnet/IP | Commercial HVAC | monitor only | Last, and only for sites with a building-management system already in place. |
The "control" column is a hard gate at pairing, not a warning. LoRaWAN can switch a relay perfectly well and may take four minutes to hear about it; an aeroponic manifold has fifteen. A cloud-tethered device switches in a second, right up until somebody else's data centre has a bad afternoon.
Profiles that ship
A profile is a YAML file, not code — which is what makes adding a device something a grower can do this afternoon rather than something that waits for a release. "Verified" means somebody has had the physical device on a bench. "Contributed" means the registers are probably right. That distinction is published because a list where everything looks equally trustworthy is how somebody ends up dosing acid against a register that turns out to be the firmware version.
| Device | Transport | Reads / writes | Status |
|---|---|---|---|
| Generic RS-485 EC/pH/temperature transmitter Various (the ubiquitous blue-cased Chinese unit) |
modbus_rtu |
Conductivity, pH, Temperature | verified |
| Sold under a dozen names with the same register map. The one thing to check on a new batch is whether EC comes back in µS or mS — the scale below assumes µS, which is what every unit tested so far has done. | |||
| Atlas Scientific EZO pH Atlas Scientific |
direct |
pH | verified |
| The reference against which the cheap boards are judged. Reports its own calibration point count, which is what makes a real probe-health score possible rather than a guess from drift. | |||
| Atlas Scientific EZO EC Atlas Scientific |
direct |
Conductivity | verified |
| DS18B20 water temperature probe Maxim and a great many clones |
direct |
Temperature | verified |
| Four hundred rupees, waterproof, and the single highest-value sensor per rupee in the entire bill of materials. Buy two. | |||
| Shelly Plug S Shelly |
mqtt |
Relay, Power | verified |
| A switched socket with power measurement for under two thousand rupees, and the power channel is the useful half: it is how a controller tells a running air pump from a closed relay. | |||
| Anything published by Home Assistant discovery Any |
mqtt |
auto | verified |
| Not a device profile so much as a doorway. Everything already bridged into a Home Assistant — Zigbee sensors, Z-Wave valves, Matter plugs, ESPHome boards — announces itself on homeassistant/# and is mapped onto the capability table automatically. This one entry is worth more than every other profile in the list combined. | |||
| Kamoer peristaltic dosing pump on a relay Kamoer and equivalents |
direct |
Metered dose | verified |
| Metered by time against a calibrated flow rate, which is the arrangement almost everybody actually has. It also means the pump has no idea how much it delivered, so the firmware counter that enforces the dose cap is counting seconds and trusting a calibration — recalibrate it when the tubing is changed, because peristaltic tubing loses roughly a tenth of its throughput as it work-hardens. | |||
| Substrate water content / EC / temperature sensor Grodan, Teros and equivalents |
analog |
Substrate water content, Substrate conductivity, Temperature | contributed |
| The sensor that makes crop steering real, and the most expensive item per node. Without one, dryback is an intention rather than a measurement and the steering slider is decoration. | |||
| Hall-effect flow meter (YF-S201 family) Various |
direct |
Flow | verified |
| Three hundred rupees, and mandatory on NFT rather than optional. It is the only thing that distinguishes a running pump from a closed relay, and that distinction is the crop. | |||
| 4–20 mA pressure transmitter Various |
analog |
Pressure | contributed |
| Required for aeroponics and useful everywhere else. A 4–20 mA loop fails detectably, which a 0–5 V sensor does not: zero milliamps is a broken wire and cannot be confused with zero pressure. | |||
What a profile looks like
id: generic_modbus_ec_ph_transmitter
name: "Generic RS-485 EC/pH/temperature transmitter"
transport: modbus_rtu
status: verified
note: "Sold under a dozen names with the same register map. The one thing to check on a new batch is whether EC comes back in µS or mS — the scale below assumes µS, which is what every unit tested so far has done."
channels:
- capability: "ec_mscm"
register: "0x0000"
type: "float32_be"
scale: 0.001
- capability: "ph"
register: "0x0002"
type: "float32_be"
scale: 1
- capability: "temperature_c"
register: "0x0004"
type: "float32_be"
scale: 1
calibration:
supports: [two_point, slope_offset]
health:
slope_min_pct: 85
Write one of these for a device that is not listed and it works. Send it back and it ships for everybody. The registry is deliberately open and not behind a licence, because a driver registry behind a paywall is a registry nobody contributes to.
