This repo is free. My 2am dryback debugging is not. If it saved you a crop, a weekend, or a nervous breakdown — buy the rabbit a bag of nutes. If it didn't, keep your money. I respect a tight nutrient budget.
A parts catalogue for automated grow rooms, where the quality ratings are earned from evidence instead of asserted.
Most "awesome" hardware lists are a pile of links someone thought looked good. This one starts from a different question: which of these parts has actually survived in a production room, and how do we know?
The seed data comes from a real commercial indoor growing operation — 149 live ESPHome device configs across three flower/veg rooms, a drying room and back of house. A part tagged field-proven is named in a stated number of those live configs, and the filenames are recorded in the entry so you can check the claim. A part tagged avoid has a documented reason, usually "someone already tried this here and it did not work".
Everything beyond that seed is contributable. If you have run a part in anger, send it in.
→ Browse the catalogue site · searchable, filterable, with a copy-paste config example per part and an I²C address collision map.
A sourced comparison of AROYA, Growlink, TrolMaster, Pulse Grow and Argus against a DIY build, with an interactive break-even calculator. Every figure carries the confidence level and the source it came from, and modelled numbers are not presented with the same weight as published ones.
The table groups by what each product actually does, because a monitor and a controller are not substitutes and ranking them together implies they are. Runs the room: TrolMaster ~$6.4k · Growlink ~$27k · Argus ~$51k at four rooms over five years (Argus's own published 9-zone cannabis example is ~$195k, 2018 dollars). Analytics rather than control: AROYA ~$76k at 8,000 sq ft canopy. Monitoring only, and not a substitute for a controller: Grow Sensor ~$3.8k · Pulse ~$12k.
Some of what the research turned up:
- AROYA's commercial subscription tiers are published in their ROI calculator's page JavaScript — $150–$3,900/month, billed per canopy square foot facility-wide. They corroborate three independent user-reported quotes, including one that an AROYA employee publicly disputed.
- "No subscription" is not the same as no recurring cost. TrolMaster's app is free, but their own API Gateway page charges $15/month per device for programmatic access to your own data.
- Only two of five vendors will say what happens to your hardware if you stop paying. TrolMaster and Pulse both answer it. AROYA's FAQ declines and routes to a sales demo. Growlink's Terms of Service contains no "Effect of Termination" clause at all.
- Monitoring is not control. Pulse Grow and Grow Sensor are monitoring and alerting platforms with no relay outputs and no equipment control — they cannot run a room, and the page groups them separately rather than listing their cost beside a controller's.
- Priva and iUNU could not be priced at all — not published anywhere, including through distributors. iUNU has also exited cannabis: their own contact form no longer lists it as a crop.
The page also reproduces, in full and unsoftened, the case against DIY — no support contract, no warranty, you are the integrator, calibration is your problem, no compliance audit trail, key-person risk. You should be able to read that section and reasonably decide to buy. If it were not there, the rest would not be worth trusting.
| 🚿 SAFETY.md | The three-part pattern that stops a network blip flooding a room. Read this before you wire a valve to anything. |
| 🔌 Build recipes | Complete BOMs with auto-calculated totals: budget tent monitor, PoE room controller, multi-zone substrate array. |
| 🧭 I²C collision map | Every part's bus address side by side, so you find conflicts while planning instead of while soldering. |
| ✍️ CONTRIBUTING.md | The part template and what counts as evidence. |
| Tier | What it means |
|---|---|
| field-proven | Named in ≥3 live production device configs. The count and the filenames are in the entry. |
| works | Known good, but not deployed at scale here — or deployed once and uneventful. |
| experimental | Someone got it running. Not yet trustworthy for anything load-bearing. |
| avoid | Documented dead end. The entry says exactly what went wrong. |
The tier is not an opinion field. CI enforces that anything claiming
field-proven carries deployment_count ≥ 3 and the list of config
filenames backing it, and that anything marked avoid states its
failure_modes.
A five-star review tells you someone liked a part on the day it arrived. A deployment count tells you the part is still in a wall, in a hot humid room, eighteen months later, and nobody has ripped it out. Those are very different claims. This catalogue only makes the second one.
The single most annoying failure when building a sensor node: two parts that both want the same I²C address, discovered after everything is mounted.
The site's I²C page lists every part by address, flags every collision, and shows which parts can be strapped to an alternate. It also handles composite modules properly — an M5Stack ENV.III is two chips occupying 0x44 and 0x70, and that second address is what silently collides with a TCA9548A multiplexer's default. That is exactly the kind of thing you want to find on a web page rather than with a logic analyser.
Known collisions in the current catalogue: 0x28, 0x44, 0x51, 0x62,
0x69, 0x70, 0x76.
The catalogue is data first. One YAML file per part in parts/,
validated in CI against schema/part.schema.json.
The README tables, the website and the recipe totals are all generated from it —
nothing is maintained by hand in two places.
parts/<id>.yaml one part, schema-validated
recipes/<id>.yaml a BOM referencing parts by id
schema/ the JSON Schema
assets/parts/ self-hosted thumbnails (never hotlinked)
docs/ generated static site (GitHub Pages)
scripts/ validate · build site · generate README · check links
Vendor links rot, so every entry also records canonical
part_numbers. When a shop URL dies, the part is still findable — and
scripts/check_links.py only fails the build if a part has no reachable
vendor and no part number to search on.
python scripts/validate.py # schema + cross-refs + secret scan
python scripts/gen_thumbnails.py # placeholder art for any part missing an image
python scripts/build_site.py # -> docs/
python scripts/gen_readme.py # -> the tables below
python scripts/check_links.py # vendor/driver link rot66 parts. Generated from parts/*.yaml by scripts/gen_readme.py — edit the YAML, not this table.
Prices: each part records one price - what was actually paid, in the currency it was paid in. Figures marked ~ are derived, not quoted, converted at 1 NZD = 0.5879 USD (rate date 2026-08-01; see data/fx.yaml). Rates move, so treat the band as the durable signal. Parts with no observed price show a band only. ^r = from a purchase receipt (what was actually paid); ^l = a vendor listing; unmarked = an estimate.
Parts named in the stated number of live production ESPHome device configs.
| Part | Live configs | Bus | I²C | Price | Notes |
|---|---|---|---|---|---|
| M5Stack PoESP32 / ESP32 Ethernet unit (IP101G PHY) | 48 | Ethernet/PoE/Grove/I2C/UART | NZ$65.00 (~US$38.21) | PoE ESP32 node with wired Ethernet PHY | |
| Sensirion SCD41 true NDIR CO2 sensor | 29 | I2C/Grove | 0x62 | NZ$77.11 (~US$45.33) ^l | CO2 / temperature / humidity |
| MFRC522 / RC522 13.56 MHz RFID reader | 19 | I2C/SPI | 0x28 | NZ$8.00 (~US$4.70) | 13.56 MHz MIFARE reader |
| M5Stack 4-Relay Unit | 18 | I2C/Grove | 0x26 | NZ$22.72 (~US$13.36) ^r | 4-channel I2C relay module, Grove |
| M5Stack ATOM Lite (ESP32-PICO) | 14 | WiFi/BLE/I2C/UART/Grove/GPIO | NZ$18.00 (~US$10.58) | Compact WiFi ESP32 | |
| METER TEROS 12 substrate VWC / EC / temperature probe | 14 | SDI-12 | NZ$430.00 (~US$252.80) | SDI-12 dielectric probe | |
| PCF8563 real-time clock | 13 | I2C | 0x51 | NZ$6.00 (~US$3.53) | I2C real-time clock with battery backup |
| TCA9548A 8-channel I2C multiplexer | 9 | I2C | 0x70 | NZ$12.00 (~US$7.05) | 1-to-8 I2C switch |
| M5Stack AirQ (SEN55 + SCD40 air quality node) | 8 | I2C/WiFi/BLE | 0x69 | NZ$145.00 (~US$85.25) | Integrated multi-sensor node |
| Sensirion SEN55 PM / VOC / NOx / T / RH module | 8 | I2C | 0x69 | NZ$125.00 (~US$73.49) | Particulate + VOC + NOx |
| SSR-25DA solid state relay | 8 | GPIO | NZ$18.00 (~US$10.58) | DC-controlled AC solid state relay | |
| Hunter PGV 24 VAC irrigation solenoid valve | 6 | Mains | NZ$47.06 (~US$27.67) ^r | 24 VAC in-line solenoid zone valve | |
| Infiwin MT22 SDI-12 substrate probe | 6 | SDI-12 | NZ$85.00 (~US$49.97) | SDI-12 dielectric probe (budget) | |
| Netafim white lateral dripline pipe (20 mm, 3 bar) | 6 | None | NZ$182.00 (~US$107.00) ^r per 200 m roll | 20 mm LDPE lateral, 200 m roll | |
| Netafim PCJ pressure-compensating dripper | 6 | None | NZ$1.23 (~US$0.72) ^r per dripper, incl. spike and tube | Pressure-compensating emitter with spike and tube | |
| M5Stack Dial (round display + rotary encoder + RFID) | 5 | I2C/SPI/WiFi/Grove/GPIO | 0x28 | NZ$110.00 (~US$64.67) | Round touch display node |
| Sensirion SHT30 temperature & humidity sensor | 5 | I2C | 0x44 | NZ$12.00 (~US$7.05) | Temperature / humidity |
| Amiad 25 mm compact screen filter (130 micron) | 4 | None | NZ$48.82 (~US$28.70) ^r | In-line screen filter, stainless element | |
| HX711 24-bit load cell amplifier | 4 | GPIO | NZ$6.00 (~US$3.53) | Load cell front end | |
| Load cell (50kg half-bridge or 200kg bar) | 4 | Analog | NZ$15.00 (~US$8.82) | Strain gauge load cell | |
| M5Stack ENV III Unit (SHT30 + QMP6988) | 4 | I2C/Grove | 0x44 | NZ$18.00 (~US$10.58) | Temperature / humidity / pressure |
| MLX90640 32x24 thermal camera array | 4 | I2C | 0x33 | NZ$115.50 (~US$67.90) ^l | 32x24 far-infrared thermopile array |
| Peristaltic dosing pump (12/24V, relay or PWM driven) | 4 | GPIO/PWM/UART | NZ$51.32 (~US$30.17) ^r | Nutrient dosing pump | |
| 25 mm PVC pressure pipe (PN12) | 4 | None | NZ$15.49 (~US$9.11) ^r per 5.8 m length | Rigid mains-side distribution pipe | |
| 240 V to 24 VAC 150 VA transformer | 4 | Mains | NZ$95.90 (~US$56.38) ^r | Mains-to-24 VAC supply for solenoid valves | |
| Tygon A-60-G chemical-resistant peristaltic tubing | 4 | None | NZ$14.59 (~US$8.58) ^r per metre | Peristaltic pump tubing, chemical dispensing grade | |
| Growlink TerraLink substrate probe | 3 | SDI-12 | $$$ | SDI-12 dielectric probe | |
| 24VAC irrigation solenoid valve | 3 | Mains | NZ$47.06 (~US$27.67) ^r | Zone valve |
Documented dead ends. Listed so nobody repeats the work.
| Part | Why it is here |
|---|---|
| Seeed LeapMMW 24 GHz mmWave presence radar | Written and debugged, then abandoned before a single production deployment - the component is dead code. |
| ZPHS01B all-in-one air quality module | The shipped lambdas return {} (no value) rather than a reading - the integration was never finished. |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| MFRC522 / RC522 13.56 MHz RFID reader | field-proven | 19 | I2C/SPI | 0x28 | NZ$8.00 (~US$4.70) |
| Seeed LeapMMW 24 GHz mmWave presence radar | avoid | UART | NZ$40.00 (~US$23.52) |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| M5Stack 4-Relay Unit | field-proven | 18 | I2C/Grove | 0x26 | NZ$22.72 (~US$13.36) ^r |
| SSR-25DA solid state relay | field-proven | 8 | GPIO | NZ$18.00 (~US$10.58) | |
| M5Stack 2-channel SPST relay unit | works | I2C/Grove | 0x25 | NZ$24.75 (~US$14.55) ^l | |
| KinCony F16 16-channel relay controller | experimental | 1 | Ethernet/RS485/Modbus/I2C | 0x24 | NZ$210.00 (~US$123.46) |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| Sensirion SCD41 true NDIR CO2 sensor | field-proven | 29 | I2C/Grove | 0x62 | NZ$77.11 (~US$45.33) ^l |
| M5Stack AirQ (SEN55 + SCD40 air quality node) | field-proven | 8 | I2C/WiFi/BLE | 0x69 | NZ$145.00 (~US$85.25) |
| Sensirion SEN55 PM / VOC / NOx / T / RH module | field-proven | 8 | I2C | 0x69 | NZ$125.00 (~US$73.49) |
| Sensirion SHT30 temperature & humidity sensor | field-proven | 5 | I2C | 0x44 | NZ$12.00 (~US$7.05) |
| M5Stack ENV III Unit (SHT30 + QMP6988) | field-proven | 4 | I2C/Grove | 0x44 | NZ$18.00 (~US$10.58) |
| Bosch BME680 gas / T / RH / pressure sensor | works | 1 | I2C/SPI | 0x76 | NZ$28.00 (~US$16.46) |
| Bosch BMP280 pressure & temperature sensor | works | 1 | I2C/SPI | 0x76 | NZ$6.00 (~US$3.53) |
| ComWinTop CWT-LEAF-TH-S-N leaf surface temperature & wetness sensor | works | 1 | RS485/Modbus | NZ$95.00 (~US$55.85) | |
| Sensirion SHT40 temperature & humidity sensor | works | 1 | I2C | 0x44 | NZ$14.00 (~US$8.23) |
| Bosch BME280 temperature / humidity / pressure sensor | works | I2C/SPI | 0x76 | NZ$9.00 (~US$5.29) | |
| Sensirion SCD30 NDIR CO2 sensor | works | I2C | 0x61 | NZ$105.00 (~US$61.73) | |
| Sensirion SCD40 NDIR CO2 sensor | works | I2C/Grove | 0x62 | NZ$40.00 (~US$23.52) | |
| ComWinTop CWT-SWS-C wind speed sensor | experimental | RS485/Modbus | $$ | ||
| ZPHS01B all-in-one air quality module | avoid | UART | NZ$180.00 (~US$105.82) |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| PCF8563 real-time clock | field-proven | 13 | I2C | 0x51 | NZ$6.00 (~US$3.53) |
| TCA9548A 8-channel I2C multiplexer | field-proven | 9 | I2C | 0x70 | NZ$12.00 (~US$7.05) |
| MAX485 / SP3485 RS485-to-TTL transceiver | works | 2 | RS485/Modbus/UART | NZ$8.00 (~US$4.70) |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| M5Stack ATOM Lite (ESP32-PICO) | field-proven | 14 | WiFi/BLE/I2C/UART/Grove/GPIO | NZ$18.00 (~US$10.58) | |
| M5Stack AtomS3 Lite (ESP32-S3) | works | 25 | WiFi/BLE/I2C/UART/Grove/USB/GPIO | NZ$22.00 (~US$12.93) | |
| WT32-ETH01 (ESP32 + LAN8720 Ethernet) | works | Ethernet/UART/I2C/GPIO | NZ$20.00 (~US$11.76) |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| M5Stack Dial (round display + rotary encoder + RFID) | field-proven | 5 | I2C/SPI/WiFi/Grove/GPIO | 0x28 | NZ$110.00 (~US$64.67) |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| Shelly Pro 3EM three-phase energy meter | works | Ethernet/WiFi/Mains | NZ$249.99 (~US$146.97) ^l |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| Hunter PGV 24 VAC irrigation solenoid valve | field-proven | 6 | Mains | NZ$47.06 (~US$27.67) ^r | |
| Netafim PCJ pressure-compensating dripper | field-proven | 6 | None | NZ$1.23 (~US$0.72) ^r per dripper, incl. spike and tube | |
| Netafim white lateral dripline pipe (20 mm, 3 bar) | field-proven | 6 | None | NZ$182.00 (~US$107.00) ^r per 200 m roll | |
| 240 V to 24 VAC 150 VA transformer | field-proven | 4 | Mains | NZ$95.90 (~US$56.38) ^r | |
| 25 mm PVC pressure pipe (PN12) | field-proven | 4 | None | NZ$15.49 (~US$9.11) ^r per 5.8 m length | |
| Amiad 25 mm compact screen filter (130 micron) | field-proven | 4 | None | NZ$48.82 (~US$28.70) ^r | |
| 24VAC irrigation solenoid valve | field-proven | 3 | Mains | NZ$47.06 (~US$27.67) ^r | |
| Netafim automatic line flush valve (16 mm) | works | 2 | None | NZ$12.38 (~US$7.28) ^r | |
| Senninger 20 psi fixed pressure regulator | works | 2 | None | NZ$22.32 (~US$13.12) ^r | |
| Adjustable pressure reducing valve (15-50 mm) | works | 1 | None | NZ$152.15 (~US$89.45) ^r |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| BH1750 ambient light sensor | works | 2 | I2C | 0x23 | NZ$7.00 (~US$4.12) |
| AS7341 11-channel spectral sensor | works | I2C | 0x39 | NZ$48.00 (~US$28.22) | |
| ComWinTop CWT-PS PAR / quantum sensor | experimental | RS485/Modbus | $$ |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| M5Stack PoESP32 / ESP32 Ethernet unit (IP101G PHY) | field-proven | 48 | Ethernet/PoE/Grove/I2C/UART | NZ$65.00 (~US$38.21) | |
| W5500 SPI Ethernet module | works | 2 | SPI/Ethernet | NZ$12.00 (~US$7.05) |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| METER TEROS 12 substrate VWC / EC / temperature probe | field-proven | 14 | SDI-12 | NZ$430.00 (~US$252.80) | |
| Infiwin MT22 SDI-12 substrate probe | field-proven | 6 | SDI-12 | NZ$85.00 (~US$49.97) | |
| Growlink TerraLink substrate probe | field-proven | 3 | SDI-12 | $$$ | |
| Chill Division SDI-12 substrate sensor | works | SDI-12/WiFi | $$ | ||
| THC-S RS485 soil moisture / EC / temperature probe | works | RS485/Modbus | NZ$45.00 (~US$26.46) |
| Part | Tier | Live | Bus | I²C | Price |
|---|---|---|---|---|---|
| MLX90640 32x24 thermal camera array | field-proven | 4 | I2C | 0x33 | NZ$115.50 (~US$67.90) ^l |
| MLX90614 non-contact IR thermometer (M5Stack NCIR) | works | I2C/Grove | 0x5a | NZ$33.52 (~US$19.71) ^l |
- Deployment counts were derived by scanning 149 ESPHome device configs for
active (uncommented) component blocks. Archived and backup configs were
excluded. Where a count looked ambiguous it is explained in the entry's
evidencefield. - Prices are indicative, mostly NZD, with the observation date recorded.
They will drift. Treat the band (
$–$$$$) as the durable signal. - Config examples are distilled from real production configs and have been
scrubbed of credentials — see SECURITY.md. They use
!secretplaceholders; they are not drop-in copies of anyone's live system. - This is one facility's experience. It is a strong signal, not a universal truth — a part that failed here may work fine in your conditions, and vice versa. Contributions that contradict the seed data with evidence are welcome.
Thumbnails are self-hosted, never hotlinked — a vendor reorganising their CDN must not break the catalogue. Each image is downloaded, normalised to a square white-backed PNG at two sizes, and committed.
Product images remain the property of their respective manufacturers and
vendors, and are reproduced here for the sole purpose of identifying the part
being catalogued. Every image records image_source and image_source_url in
its part file, so the origin of any picture is traceable in one step.
Preference order when sourcing: the manufacturer's own product page or press kit, then a vendor listing, then nothing. Where no usable image is found the entry keeps a generated placeholder — a truthful placeholder beats a wrong or misleading picture.
Takedown: if you hold rights to an image here and would like it removed, open an issue on this repository, or contact the maintainer through the GitHub profile linked from it. Images are removed on request, no argument — the entry falls back to a generated placeholder and nothing else about it changes.
Catalogue data and documentation: CC BY 4.0. Scripts and site code: MIT.