Ein ESP32, ein BME280 und zwanzig Minuten. Am Ende dieses Artikels landen Temperatur, Luftfeuchte und Luftdruck jede Minute in HydroNode, und du schaltest ein Relais aus der App. WLAN, Uhrzeit, TLS und die Signatur jeder Anfrage übernimmt die Library.
Was du brauchst
Sensor ID und Secret holen
- Sensor öffnenUnter Sensors auf deinen Sensor klicken.
- Einstellungen öffnenOben rechts auf Settings, dann links Connection.
- Beides kopierenUnter Direct connection stehen Sensor ID und Secret, jeweils mit Kopierknopf. Das Secret gehört nur auf dein Gerät, nie in ein öffentliches Repository.
Library installieren
- Bibliotheksverwalter öffnenToolsManage Libraries
- Suchen und installierenNach
HydroNode-Librarysuchen und installieren. Die IDE fragt, ob sie ArduinoJson und ArduinoHttpClient mitinstallieren soll: ja. - Sensor-Library dazuFür den BME280 zusätzlich
Adafruit BME280 Libraryinstallieren.
Die PlatformIO-Registry kennt nicht immer die neueste Version, deshalb direkt per Git-Tag:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
https://github.com/TexhFexLabs/HydroNode-Library.git#1.7.0
adafruit/Adafruit BME280 LibraryDen BME280 anschließen
Vier Kabel: VIN an 3,3 V, GND an GND, SDA an GPIO 21 und SCL an GPIO 22. Das sind die I²C-Standardpins eines klassischen ESP32. Liegt SDO auf GND, hat der Sensor die Adresse 0x76, auf 3,3 V 0x77.
Der Sketch
Trag oben deine vier Werte ein und lade den Sketch hoch. sendValues() schickt alle drei Werte einer Runde in einer einzigen signierten Anfrage, mit dem Zeitpunkt der Messung. Das spart pro Wert einen Verbindungsaufbau, was auf einem ESP8266 schnell mehrere Sekunden sind.
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <HydroNode.h>
const char* WIFI_SSID = "YOUR_WIFI_SSID";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
const char* SENSOR_ID = "your-sensor-id"; // Settings > Connection
const char* SECRET_KEY = "your-secret-key"; // Settings > Connection
HydroNode hydro(SENSOR_ID, SECRET_KEY);
Adafruit_BME280 bme;
void setup() {
Serial.begin(115200);
hydro.setDebug(Serial); // prints every request and answer
if (!bme.begin(0x76)) {
Serial.println("BME280 not found, check the wiring");
}
while (!hydro.connectWiFi(WIFI_SSID, WIFI_PASSWORD)) {
Serial.println("WiFi failed, retrying");
}
hydro.begin();
}
void loop() {
HydroNodeValue reading[] = {
{"TEMPERATURE", bme.readTemperature()},
{"HUMIDITY", bme.readHumidity()},
{"PRESSURE", bme.readPressure() / 100.0f},
};
int codes[3];
int status = hydro.sendValues(reading, 3, codes);
Serial.printf("HydroNode answered %d\n", status);
delay(60000); // one round per minute
}- MessenBME280 über I²C
- sendValues()Eine signierte HTTPS-Anfrage
- 202Gespeichert und im Diagramm
- BefehleKommen mit der Antwort
Prüfen, ob die Werte ankommen
Öffne den Seriellen Monitor mit 115200 Baud. HydroNode answered 202 heißt: angenommen. Dann die Sensorseite in HydroNode aufrufen und mit ` die Console öffnen. Dort erscheint jede Anfrage, sobald sie ankommt, mit hmac ok und der Abweichung der Geräteuhr.
| Antwort | Bedeutung | Was tun |
|---|---|---|
| 202 | Angenommen | Nichts, alles gut. |
| 401 | Signatur oder Zeit falsch | Sensor ID und Secret prüfen. Die Console zeigt den genauen Grund. |
| 429 | Zu schnell | Pro Messgröße höchstens ein Wert alle 10 Sekunden. |
| -2 | Keine Uhrzeit | UDP-Port 123 (NTP) im Netz erlauben. |
| -4 | Typname ungültig | Großbuchstaben verwenden: TEMPERATURE, nicht temperature. |
Bleibt es hängen, hilft Fehlersuche mit der Console.
Ein Relais aus der App schalten
Befehle haben in HydroNode einen Namen, einen Typ und einen Wert. Dein Gerät meldet für jeden Befehl zurück, ob es ihn angenommen hat oder warum nicht. Ein Name kann mehrere Typen haben: relay1 true schaltet dauerhaft, relay1 1400 nur für 1,4 Sekunden.
const int RELAY_PIN = 5; // most relay modules switch on at LOW
void setup() {
// WiFi and hydro.begin() as in the sketch above
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // off after power-up
// relay1 true / relay1 false
hydro.onBool("relay1", [](bool on) {
digitalWrite(RELAY_PIN, on ? LOW : HIGH);
});
// relay1 1400: on for 1400 ms, then off again
hydro.onUInt32("relay1", [](uint32_t ms) {
ms = min(ms, (uint32_t)10000); // local safety limit
digitalWrite(RELAY_PIN, LOW);
delay(ms);
digitalWrite(RELAY_PIN, HIGH);
});
}- Befehl sendenAuf der Sensorseite oben auf Send command, Name
relay1, TypBOOL, Werttrue. Oder in der Console im Tab Commands einfachrelay1:bool truetippen. - Auf die nächste Runde wartenBefehle kommen mit der Antwort auf den nächsten gesendeten Wert. Bei einer Runde pro Minute dauert es also bis zu einer Minute.
- Status ansehenAcknowledged heißt angenommen. Declined nennt den Grund, zum Beispiel
NO_HANDLER, wenn es auf dem Gerät keinen Callback für diesen Namen und Typ gibt.
Wie es weitergeht
- Lieber ohne Code? Der Device Builder baut dieselbe Firmware im Browser und hält sie per Funk aktuell.
- Wann ein Wert ungewöhnlich ist, erklärt Anomalien ohne Lärm.
- Alle Funktionen der Library stehen in der Arduino-Anleitung und auf GitHub.





