[Release] Gardena Smart Dual Water Control (G-19034) → MQTT bridge via ESP32/MicroPython, with a web flasher

The problem

The Gardena Smart Dual Water Control (G-19034-20) is a BLE-only irrigation valve controller with no gateway. The official gardena_bluetooth integration’s Bluetooth matcher expects a legacy scan-service UUID this device doesn’t advertise (it’s manufacturer-data-only), so it never gets discovered. There’s an unmerged core PR (https://github.com/home-assistant/core/pull/171759) with a matcher fix, tracked in core#167291 (Cannot connect Gardena Dual Water Control · Issue #167291 · home-assistant/core · GitHub) — but even with that fix applied, most BLE proxies can’t get past this: I tested ESPHome’s esp32_ble_client (Bluedroid) extensively, including custom bonding config (io_capability: none, auth_req_mode: sc_bond, etc.) on two different chips, and it consistently fails the bonding handshake with status=133 / “insufficient authentication.”

The fix

A standalone bridge, not a HA component or ESPHome component: an ESP32 running MicroPython with the NimBLE stack, where LE Secure Connections bonding to this device works reliably. It:

  • Bonds with the valve (Just-Works pairing), persists the LTK to flash so it survives reboots
  • Polls both valves + battery over BLE on a configurable interval
  • Publishes to MQTT with full HA discovery (switches, sensors, binary_sensors, all under one device)
  • Accepts valve on/off commands via MQTT and applies them over BLE
  • Re-publishes discovery every poll cycle, so a broker restart self-heals without a reboot

Entities: switch × 2 (valve 1/2), binary_sensor × 2 (per-valve availability), sensor × 2 (remaining time, error code, per valve), sensor (battery), sensor (bridge’s own IP, handy for finding the config page).

Installing it

No dev environment needed — there’s a web-based installer (Gardena Bluetooth Bridge — Web Installer) (ESP Web Tools) that flashes a prebuilt image straight from Chrome/Edge over USB. First boot starts an open WiFi AP (GardenaBridge-XXXX) with a small setup page for WiFi/MQTT/the valve’s BLE address — including a “scan for Gardena” button so you don’t have to hunt down the BLE MAC manually, and a WiFi scan picker too.

Repo (source, full technical writeup of the reverse-engineering, board-support status): GitHub - watak/gardena-bluetooth-bridge: BLE-to-MQTT bridge for a Gardena Smart Dual Water Control valve, for Home Assistant integration · GitHub

Requirements

  • An ESP32 board. ESP32-S3 is hardware-verified (this is what I run in production). Original ESP32, ESP32-C3, and ESP32-C6 builds are also published — the BLE code is written against MicroPython-level constants rather than anything chip-specific, so they should work, but I haven’t bonded a real valve on them yet. If you try one, please report back either way (issue tracker, or reply here).
  • An existing MQTT broker configured in HA (mosquitto, etc.) — this project doesn’t stand one up for you.
  • The valve factory-reset before first connect (hold the manual button while inserting the battery ~10s until 3 LEDs flash) — it only has a single BLE bond slot, so the Gardena app needs to be force-closed and phone Bluetooth off, or it grabs the bond first.

License: MIT. Issues/PRs welcome, especially board-compatibility reports for anything other than the S3.