Device Builder
Turns an ESP32 or ESP8266 board into a HydroNode sensor without writing code. Pick the board, what is wired to which pin, how often it sends and how it sleeps. Then flash it straight from the browser or download the code. A board flashed here is the last one that needs the USB cable: from then on, firmware and settings reach it over the air from Fleet. Find the builder under Fleet → Device builder, or on the chart of a sensor that has not sent anything yet.
What you need
Three ways in, one page per question
The builder starts with What do you want to do? and three cards. Each card is its own short wizard. A rail on the left shows the steps; a finished step gets a tick, and you can go back to any of them.
| Start with | Steps | Use it to |
|---|---|---|
| Build for a sensor | Sensor, board, wiring, power, timing, WiFi, flash or download | Put one board on one sensor. The setup is saved on the sensor for reflashing and for changes over the air. |
| Create template | Board, wiring, power, timing, save | Describe a kind of board once, without a sensor and without WiFi, to flash many boards from it. |
| Flash from template | Template, sensor, WiFi, flash | Put a saved template on a new board. Pick the sensor or create it on the spot. |
| Reflash (from the sensor settings) | Starts on WiFi, everything before it is filled in | Flash a sensor again with its saved setup, for example on a new board. |
Seven questions, one page each
Build for a sensor asks all seven. The template wizards ask only the ones they need.
- 1SensorThe HydroNode sensor the device reports to. Click one to go on.
- 2BoardYour ESP board. If yours is not listed, pick the development kit with the same chip. Each chip family is tagged with what it takes over the air: firmware and config, or config only on the ESP8266.
- 3WiringAdd each sensor and output and pick its pin. The pin map shows conflicts as you go, a scan finds what is wired.
- 4PowerWhether it stays on, naps or deep sleeps between rounds.
- 5TimingHow often a round starts, what it costs, and which values go out less often.
- 6WiFiNetwork name and password, filled in with your passkey if you saved them. Or skip to download with placeholders.
- 7Flash or downloadCheck the summary, then flash over USB, take the code or save the setup as a template.
Sensors and pins
A new sensor lands on the usual pin of your board, marked default in the pin list, for example GPIO4 (1-Wire default) or GPIO21 (SDA default). You can move it to any pin that fits. The pin map shows what is taken, and pins that decide how the chip boots or carry the serial console are flagged. Every value gets its own HydroNode type; a second temperature becomes TEMPERATURE2.
| Sensor | Connection | Sends |
|---|---|---|
| DS18B20 | 1-Wire, several probes on one pin | TEMPERATURE |
| DHT11 / DHT22 / AM2302 | One data pin | TEMPERATURE, HUMIDITY |
| SHT4x, SHT3x, AHT10/20, HTU21D | I²C | TEMPERATURE, HUMIDITY |
| BME280 | I²C | TEMPERATURE, HUMIDITY, PRESSURE |
| BMP280 | I²C | TEMPERATURE, PRESSURE |
| BME680 | I²C | TEMPERATURE, HUMIDITY, PRESSURE, GAS_RESISTANCE |
| SCD40 / SCD41 | I²C | CO2, TEMPERATURE, HUMIDITY |
| SGP30 | I²C, samples every second | ECO2, VOC |
| SGP40 | I²C, samples every second | VOC_INDEX |
| SGP41 | I²C, samples every second | VOC_INDEX, NOX_INDEX |
| BH1750, VEML7700 | I²C | LIGHT |
| INA219 | I²C | VOLTAGE, CURRENT, POWER |
| Capacitive soil moisture | Analog pin | SOIL_MOISTURE |
| Analog value | Analog pin | any type you choose |
| Battery voltage | Analog pin, through a divider | BATTERY_VOLTAGE |
| MS8607 | I²C | TEMPERATURE, HUMIDITY, PRESSURE |
| BMP388 / BMP390, DPS310, LPS22 | I²C | TEMPERATURE, PRESSURE |
| SHTC3 | I²C | TEMPERATURE, HUMIDITY |
| MCP9808, TMP117 | I²C | TEMPERATURE |
| TSL2591 | I²C | LIGHT |
| LTR390 | I²C | UV_INDEX, LIGHT |
| SCD30 | I²C | CO2, TEMPERATURE, HUMIDITY |
| PMSA003I, PMS5003 / PMS7003 | I²C or serial | PM1, PM25, PM10 |
| SEN54 / SEN55 | I²C | PM1, PM25, PM4, PM10, TEMPERATURE, HUMIDITY, VOC_INDEX, NOX_INDEX |
| INA226, INA260 | I²C | VOLTAGE, CURRENT, POWER |
| ADS1115 | I²C, four more analog inputs | any type you choose |
| VL53L0X, HC-SR04 / JSN-SR04T | I²C, or trigger and echo pin | DISTANCE, TANK_LEVEL |
| Water flow meter, rain gauge | Pulse pin, board stays awake | WATER_FLOW_RATE, WATER_VOLUME, RAINFALL |
| pH probe, TDS / EC probe | Analog pin | WATER_PH, WATER_TDS, WATER_EC |
| WiFi signal | No wiring | RSSI |
| Relay, LED, switched output | One pin | nothing, listens to commands |
| Button | One pin | BUTTON on each press |
Gas sensors learn the normal air of the room and need regular samples. The SGP40 and the VOC value of the SGP41 run in light sleep: the board wakes every 10 s for a 30 ms reading, Sensirion's low-power mode. The SGP30 and the NOx value of the SGP41 need one sample per second, so Always on or Modem sleep. Their first values arrive after about a minute, NOx after about five. A temperature and humidity sensor on the same device is used for their humidity compensation automatically. The SCD41 works in deep sleep: two shots per round, the first after waking is thrown away as Sensirion recommends, then it powers down. The SCD40 cannot.
Sensors are read the frugal way and sleep in between: BME280, BMP280 and BME680 in forced mode, TMP117, DPS310, BH1750 and the light sensors in one-shot mode, the INA current sensors triggered. A Plantower fan (PMS5003, PMSA003I) sleeps when its SET pin is wired and runs 30 s before a reading; a SEN5x idles or, when it sends VOC or NOx, keeps learning on its own with the fan off. A sensor whose values are not due in a round is not woken at all. Each part's behaviour per power mode is in the firmware's catalog, and the power step tells you which part rules out a mode and what would free it.
The battery input measures through a voltage divider: battery plus to a 100 kΩ resistor, that to a second 100 kΩ resistor, that to GND. The point between the two goes to the ADC pin, which then sees half the battery voltage. A divider factor of 2 turns it back.
A sensor that measures more than you need sends less: remove a value with its ×, it comes back under Not sent. Distance sensors also report a fill level once you enter the distance to the empty and to the full tank.
Scan the board
Not sure the wiring is right? Scan the board next to the pin map flashes a small scanner, then lists every I²C address that answers and every DS18B20 on the 1-Wire pin you pick. Next to each address stand the sensors it could be, for example 0x76: BME280, BMP280, BME680, MS8607. One click adds it to the device. Flashing the HydroNode firmware at the end replaces the scanner. Without a browser that talks to USB, download the scanner as an .ino sketch for the Arduino IDE instead.
Relays, LEDs and buttons
Outputs are switched by commands from the HydroNode app or the sensor console. Each output has a command name you choose, relay1 by default, and says whether it switches on at HIGH or at LOW (most cheap relay modules switch at LOW) and whether it starts on or off after power-up.
| Command | Type | Does |
|---|---|---|
| relay1 true | bool | Switches on; false switches off. |
| relay1 1400 | uint32 | Switches on for 1400 ms, then off. 0 switches off at once, at most 24 hours. |
| led1_level 40 | uint32 | Dimmable LEDs: brightness 40 %. |
Commands arrive with the answer to a sent value, so a board with outputs always sends at least one value. WiFi signal needs no wiring for that. The timing step shows how long a command can take at most. A button sends each press at once as the value 1 and can toggle an output on the same board, even without WiFi. Outputs keep their state in light and deep sleep (firmware 0.6.0, not on the ESP8266) and get their commands with the next round; dimming needs the board awake. A button or a rain gauge wakes the board from deep sleep when it is wired to a pin that can (the builder marks the others): the press goes out right away, a tip is counted and sent with the next round.
How it sleeps, and how often it sends
The board works in rounds: wake the sensors that are due, nap while they measure, read them, send the values, sleep. The power step picks the most frugal mode your parts allow and moves it again when you add or remove one; choose another and the builder keeps it. Next to each mode it shows the average current of this very setup.
| Mode | Current | Good for |
|---|---|---|
| Always on | 80–120 mA | USB power, readings every few seconds |
| Modem sleep | 20–40 mA | USB power, stays connected with less heat |
| Light sleep | about 1 mA | Intervals of a minute or more, keeps memory |
| Deep sleep | 10–150 µA chip | Batteries, every 5 minutes or longer |
| Hibernate | about 5 µA chip | Longest battery life. ESP32, S2 and S3 only |
Boards marked with the battery icon have no USB chip or power LED that stays on, so in deep sleep the whole board draws well under 1 mA. Development kits keep drawing 1 to 10 mA. The ESP8266 wakes from deep sleep only with a wire from GPIO16 (D0) to RST; the builder asks you to confirm it.
The timing step sets how often a round starts. Rounds start on the interval, however long the board was awake, and in sleeping modes they are aligned to internet time, so a sleep timer that runs a few percent fast does not add up. The step also shows what a round costs: WiFi, the secure connection, every value and the time napping while sensors measure. Measured on a NodeMCU, four values take about 6 seconds awake; the fastest interval leaves room for a slow router. Single values can go out less often, every n-th round or every so many minutes, for example CO₂ every 5 minutes while the temperature goes every minute; their sensor then only wakes in those rounds, and the step shows the average round. Enter your battery's capacity to see how long it lasts, an estimate from the data sheets of board and sensors.
Four ways onto the board
The last step sums up your answers and offers the ways onto the board. Only Flash now puts the HydroNode firmware on it, and only that firmware updates over the air afterwards. The step says so in a box above the choices, together with what your board can take.
| Output | What you get | Later updates |
|---|---|---|
| Flash now | Connect by USB and press Flash. The browser checks the chip, writes the HydroNode firmware and your settings, and then follows the board until its first reading arrives. | Over the air from Fleet. ESP32 boards take firmware and config, the ESP8266 takes config. |
| Save as template | Keeps board, wiring, power and timing under a name, without the sensor and without WiFi. Works with a skipped WiFi step too. | Change the template once and apply it to every linked board. |
| PlatformIO project | A readable project for VS Code. Every library is pinned to an exact version and fetched by PlatformIO. | Your code, your updates. Fleet lists the board as own sketch, with health and errors. |
| Arduino sketch | An .ino sketch. The README names the board and menu settings to pick under Tools and the libraries to install. | Your code, your updates. Fleet lists the board as own sketch, with health and errors. |
| ESPHome YAML | A configuration for ESPHome or Home Assistant using the HydroNode component. ESP32 boards only. | ESPHome installs updates over the air itself. Fleet lists the board as ESPHome. |
While flashing, the page shows each phase (preparing, connecting, writing, restarting) and then follows the board through its checklist until the first reading arrives. Erase the whole flash first wipes anything an earlier firmware stored; it takes longer and is rarely needed. Afterwards the step links to the device in Fleet.
Downloads contain only code written for your device. Libraries are fetched by your build tool, each under its own license. The firmware used for flashing is open source: hydronode-firmware, licenses on the firmware licenses page.
After a firmware update
When a new HydroNode firmware comes out, Fleet shows it in the firmware column of every board that can take it, for example → 0.5.1. What to do depends on the board.
| Board runs | To get the new firmware |
|---|---|
| HydroNode firmware 0.5.0 or later on an ESP32, S2, S3, C3 or C6 | Nothing on the board. Pick it in Fleet and press Update firmware, or update many boards with Bulk change. |
| HydroNode firmware on an ESP8266 | Reflash over USB. Its config still changes over the air. |
| HydroNode firmware before 0.5.0 | Reflash once over USB from Sensor settings → Device setup. Every later update goes over the air. |
| A downloaded project or sketch | Download it again, or flash it with Flash now to switch to updates over the air. |
An update over the air keeps the saved setup in step: its firmware version and config revision follow the board. When you open a setup or a template that was saved with an older firmware, the builder checks it against today's list of boards and sensors. A yellow box names what changed, for example "Saved with firmware 0.4.2, the builder now uses 0.5.0. Check the marked steps.", and a dot on the rail marks the steps to look at. Pins are never moved silently.
How the update runs, the check after the restart and the rollback are described in Fleet and Over-the-Air Updates.
Reflash and the saved setup
After every flash and every download, the builder saves its answers on the sensor: board, wiring, power and timing. This device setup never contains the WiFi network, the password or the sensor secret, and never any code. It is what makes config changes over the air and one-click reflashing possible. A sensor keeps only its latest setup. If saving fails, the flash still counts: the page says "Flashed. The setup could not be saved for reflashing later."
Open it under Sensor settings → Device setup. The owner and Admin shares of an HTTP sensor see it; LoRaWAN sensors have no such tab.
| You see | Meaning |
|---|---|
| Flashed in the browser | Where the setup came from. Also: Downloaded for PlatformIO, Arduino or ESPHome, or Updated over the air after a config change from Fleet. |
| Firmware and r14 | The firmware version and the config revision of the last flash or update. |
| Template v3 | The template the board was flashed from, with drifted when it was changed on its own since. |
| Board, Power, Devices | Every part on its pins and bus, with the values it sends and how often. Outputs list their command name. |
| Reflash | Opens the builder with this setup, starting on the WiFi step. Owner only. |
| Save as template | Turns this setup into a template for more boards. Owner only. |
| Forget setup | Deletes the saved setup. The board keeps running as it is; a reflash then starts from the first step, and config changes over the air need a new flash. |
| Open in Fleet | Opens the device in Fleet with its details. |
Reflash opens the builder with this setup. Sensor, board, wiring, power and timing are ticked, and it starts on the WiFi step. Change any step on the way, then flash. Use it to put a board back to its known state, to replace a broken board with the same wiring, or to move a board from firmware before 0.5.0 to one that updates over the air.
One setup for many boards
A template is a setup without a sensor and without WiFi. Build it once, then flash every board of the same kind from it in four steps. Templates have versions: saving a changed template adds v2, v3 and so on, each with a short summary of what changed. Boards flashed from a template stay linked to it, so a later change can reach all of them at once.
- 1CreatePick Create template in the builder, or Save as template on the last step of any build. Give it a name (up to 80 characters) and an optional description.
- 2Flash from templatePick the template, then the sensor (an existing HTTP sensor or Create sensor), join WiFi and flash. A sensor with another saved setup gets it replaced; the builder says so first. Customize switches to a normal build with the template prefilled.
- 3EditOpens the template in the builder. Save changes stores the next version. Save as new template keeps the old one as it is.
- 4Apply to linked boardsAfter a change, Fleet asks whether linked boards should take it over the air. You check every board before anything is sent.
You can keep up to 50 templates, each with its own name. The list, the linked devices and Apply to linked devices live on the Templates tab in Fleet, see Fleet and Over-the-Air Updates.
Your WiFi password stays with you
Save WiFi with a passkey
Typing the same WiFi password for every board gets old. On the WiFi step you can save the network in your HydroNode account, encrypted with a passkey, and fill it in with one touch on this or any other computer. HydroNode stores only the encrypted copy and cannot read the network name or the password.
- 1Type the network onceEnter name and password on the WiFi step as usual. Below the fields, Save this network with your passkey appears.
- 2Save with passkeyA dialog explains what is stored. Confirm with Save with passkey. The first time, your browser creates a passkey called "HydroNode WiFi vault"; it cannot sign anyone in.
- 3Fill in next timeOn any computer signed in to your account, Fill in with your passkey lists your saved networks after one passkey prompt. Pick one and the fields are filled in.
- 4Remove or delete allThe bin icon next to a network removes it on all your devices. Delete saved networks removes all of them, for example when the passkey is lost. Boards that already use a network keep working.
| Question | Answer |
|---|---|
| What is stored | Network name, password and a fixed IP if you set one, encrypted together. HydroNode keeps only the encrypted copy and the ID of the passkey. |
| Where does the key come from | From your passkey. The browser derives a key for each network from it and never sends it to HydroNode. |
| Which devices | Every device where the same passkey is available: synced through iCloud Keychain, Google Password Manager or 1Password, on a security key, or from your phone by QR code. |
| How long | 30 days after the last fill-in or save. Every use starts the 30 days again. An empty vault is deleted together with its last network. |
| How many | Up to 10 networks per account. |
| Not offered | The option only appears in browsers that can encrypt with a passkey (WebAuthn PRF). Elsewhere the WiFi step works as before, and nothing is saved. A passkey that cannot encrypt is refused with a message. |
| Account deleted | The saved networks are deleted with it. |
Five typical devices
Battery probe in the garden
ESP32-C3 SuperMini, two DS18B20 probes on one pin, deep sleep every 15 minutes, battery voltage.
DS18B20 probes GPIO10 (1-Wire default), 4.7 kΩ from data to 3.3 V Battery GPIO3 (analog default), 100 kΩ / 100 kΩ divider Sends TEMPERATURE, TEMPERATURE2, BATTERY_VOLTAGE
Greenhouse climate on USB power
ESP32 DevKitC, BME280 and a soil moisture sensor, modem sleep every minute.
BME280 I²C: SDA GPIO21, SCL GPIO22, address 0x76 Soil moisture GPIO34 (analog default) Sends TEMPERATURE, HUMIDITY, PRESSURE, SOIL_MOISTURE
Indoor air quality on USB power
ESP32-C3 SuperMini, SCD41 for CO₂, SGP41 for VOC and NOx, SHT40 for compensation, modem sleep every minute.
SCD41 I²C: SDA GPIO6, SCL GPIO7, address 0x62 SGP41 same bus, address 0x59 SHT40 same bus, address 0x44 Sends CO2, TEMPERATURE, HUMIDITY, VOC_INDEX, NOX_INDEX, TEMPERATURE2, HUMIDITY2
Watering with a tank level
ESP32 DevKitC, a relay for the pump, an ultrasonic sensor above the tank and a button, modem sleep every minute.
Relay relay1 GPIO26, switches on at LOW JSN-SR04T trigger GPIO27, echo GPIO25 through a 1 kΩ / 2 kΩ divider Button GPIO32 to GND, toggles relay1 Sends DISTANCE, TANK_LEVEL, BUTTON Commands relay1 true, relay1 false, relay1 30000 (water for 30 s)
Room sensor from the drawer
Wemos D1 mini (ESP8266) with a DHT22, modem sleep every 5 minutes.
DHT22 D6 (GPIO12, digital default) Sends TEMPERATURE, HUMIDITY
When it does not send
| You see | What to do |
|---|---|
| The browser does not list the board | Use a data cable. ESP32-S2: hold BOOT, press RESET, then flash. |
| The DHT never answers | Its data pin must read high when idle. A DHT without power pulls the line low: check 3.3 V and GND first, then the model (DHT11 or DHT22). |
| Sending fails with -2 | The board got no time from the internet (NTP). Check that the network allows outgoing UDP port 123. |
| WiFi fails in the checklist | 2.4 GHz network? Password correct? The board needs to be in range. |
| Sending fails with 401 | Another device sends with the same sensor, or the secret was rotated. Flash again. |
| The USB port disappears after flashing | Expected in deep sleep. Press RESET to reach the board again. |
| Arduino IDE: "Missing FQBN" | Pick the board under Tools > Board, as the README in the download says. |
| A command does nothing | Commands arrive with the next sent value, so wait up to one round. "Declined: no handler" means the command name differs from the output name. |
| The scan finds nothing | Check 3.3 V and GND first, then SDA and SCL (swapped wires are common). "SDA is held low" means a missing pull-up or a short. |
| Arduino IDE: "bad CPU type in executable" | On Apple silicon Macs install Rosetta 2 once: softwareupdate --install-rosetta. |
| Fleet says "needs USB once" or "not reported" | The board runs firmware before 0.5.0. Reflash it once from Sensor settings → Device setup; after that it updates over the air. |
| Save this network with your passkey is missing | Your browser or passkey cannot encrypt. Try a current Chrome, Edge or Safari with Touch ID, Windows Hello, your phone or a security key. |
| "No passkey was used" when filling in | On another computer, choose "HydroNode WiFi vault" in your password manager or scan the QR code with your phone. If the passkey is lost, delete the saved networks and type the password. |
| A saved network was deleted | It was not used for 30 days. Type the password again and save it once more. |
The Device Console on the sensor page shows every request the device makes, including refused ones and why.