Two Milliliters, Then Prove It — A pH Doser That Refuses to Guess
🤝 Want this built for you? Start a request — our AI scopes it, estimates a price range, and matches you with a vetted AI Advisor. →
Two ways to open it
Unlocks this full walkthrough on your account — no subscription, and no account needed until you check out.
Over 160 project walkthroughs, the 6-week course, and your certificate.
🔒 Secure checkout by Stripe · Already a member? Sign in
What you'll do
A pH controller for a recirculating reservoir that Claude Code built with you across two tiers that do not trust each other — an ESP32 running ESPHome that owns an Atlas Scientific EZO-pH circuit and an EZO-PMP dosing pump and enforces every refusal locally in firmware (no dose on a reading older than five minutes, none below the level float, none inside the cooldown, none above a rolling 24-hour millilitre ceiling, and none at all once latched), and a small Python ledger service on your Home Assistant host that learns your reservoir's real millilitres-per-0.1-pH from its own dose history, sizes the next request from that curve instead of a guess, and can only ever ask. Every dose runs a stir-and-taste cycle — dose a capped volume, run the circulation pump through a listed smart plug, wait out the settle window, re-read — and the dose is only recorded as successful if the water moved in the predicted direction by a minimum margin; three no-move doses in a row and the whole system latches off, tells you the jug is probably empty or the pump is dry, and waits for a human, because the alternative is a machine that keeps pouring acid into water it cannot actually taste.