Nicht jeder Sensor hängt an einem ESP32. Ein Raspberry Pi im Gewächshaus, ein Pico W mit MicroPython, ein Gateway, das Werte aus einer anderen Quelle weiterreicht, ein Cronjob auf dem Server. Damit auch sie Sensordaten senden, gibt es jetzt das HydroNode SDK für Python, MicroPython, Node.js und Go: eine Datei pro Sprache, ohne Abhängigkeiten, mit derselben Signatur wie die Arduino-Library.
Eine Datei pro Sprache
| Du hast | Du kopierst | Braucht |
|---|---|---|
| Raspberry Pi, Linux, macOS, Windows | python/hydronode.py | Python 3.8+ |
| ESP32, ESP8266, Pico W mit MicroPython | python/hydronode.py und hydronode_roots.py | MicroPython 1.20+ |
| Node.js, Deno, Bun | node/hydronode.mjs | Node 18+ |
| Go | github.com/TexhFexLabs/hydronode-sdk/go | Go 1.21+ |
| Eine Shell | shell/hydronode.sh | bash, curl, openssl |
Alles liegt auf GitHub. Sensor ID und Secret holst du wie gewohnt unter SettingsConnection des Sensors.
Die erste Messung
from hydronode import HydroNode
hydro = HydroNode("YOUR_SENSOR_ID", "YOUR_SECRET")
hydro.send_values({"TEMPERATURE": 21.5, "HUMIDITY": 48})import { HydroNode } from './hydronode.mjs';
const hydro = new HydroNode({ sensorId: 'YOUR_SENSOR_ID', secret: 'YOUR_SECRET' });
await hydro.sendValues({ TEMPERATURE: 21.5, HUMIDITY: 48 });client := hydronode.New("YOUR_SENSOR_ID", "YOUR_SECRET")
client.SendValues(ctx, hydronode.Values{{"TEMPERATURE", 21.5}, {"HUMIDITY", 48}})SENSOR_ID=... SECRET=... ./hydronode.sh send TEMPERATURE=21.5 HUMIDITY=48
# what would be signed, without sending
SENSOR_ID=... SECRET=... ./hydronode.sh dry-run TEMPERATURE=21.5202 heißt angenommen. Öffne danach die Sensorseite und drück `: Die Console zeigt die Anfrage, die Signaturprüfung und wie weit die Uhr deines Rechners daneben liegt.
- Dein CodePython, Node, Go, Shell
- SigniertHMAC-SHA256 über die Werte
- 202Gespeichert und im Diagramm
- BefehleKommen mit der Antwort
MicroPython auf ESP32 und Pico W
Dieselbe Datei läuft unter MicroPython. Sie rechnet HMAC selbst, weil MicroPython kein hmac-Modul hat, und formatiert Werte exakt, obwohl MicroPython auf diesen Boards nur 32-Bit-Zahlen kennt. Mit ca=ROOTS prüft sie auch das Zertifikat des Servers.
import network, ntptime, time
from hydronode import HydroNode
from hydronode_roots import ROOTS
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("YOUR_WIFI", "YOUR_PASSWORD")
while not wlan.isconnected():
time.sleep(0.5)
ntptime.settime() # the signature carries the time
hydro = HydroNode("YOUR_SENSOR_ID", "YOUR_SECRET", ca=ROOTS) # checks the certificate
while True:
hydro.send_values([("TEMPERATURE", 21.5), ("HUMIDITY", 48)])
time.sleep(60)ca=ROOTS prüft MicroPython den Server nicht. Die Signatur schützt deine Werte zwar vor Fälschung, aber jemand dazwischen könnte sie mitlesen oder dir falsche Befehle schicken. Lass die Prüfung an, wo das Board den Speicher hat, also auf ESP32 und Pico W. Offline sammeln, später senden
record() legt eine Messung mit ihrem Zeitpunkt ab, flush() schickt alles Gesammelte in einer Anfrage, bis zu 100 Runden und sieben Tage zurück. Das Beispiel raspberry_pi_offline_safe.py speichert den Puffer in einer Datei, damit auch ein Neustart nichts kostet. Eine Messung, die zweimal ankommt, wird einmal gespeichert.
hydro.load_buffer("buffer.json") # what waited before a restart
hydro.record({"TEMPERATURE": read_cpu_temperature()})
hydro.save_buffer("buffer.json")
try:
hydro.flush() # every stored reading, each with its own time
except OSError:
pass # offline: they stay for the next tryBefehle aus der App
Befehle funktionieren wie auf dem ESP32: Name, Typ, Wert. Das SDK bestätigt jeden Befehl, bevor dein Handler läuft, und lehnt ab, was keinen Handler hat oder den falschen Typ trägt. In der App steht dann Confirmed oder der Grund.
def run_pump(ms):
ms = min(ms, 10000) # never trust a network value
pump_on(ms)
hydro.on("pump", run_pump, "UINT32")
hydro.on("lamp", lambda on: relay(on), "BOOL")
hydro.send_values({"WATER_LEVEL": 72}) # commands arrive with this answerJede andere Sprache
Kann deine Plattform HTTPS und HMAC-SHA256, kann sie mit HydroNode reden. Das ganze Protokoll steht in PROTOCOL.md, jeder Endpunkt, jede Antwort, jede Grenze. Kurz:
X-Sensor-Id: <sensor id>
X-Timestamp: <Unix seconds>
X-Signature: Base64(HMAC-SHA256(secret, canonical + X-Timestamp))
canonical = {"sensorId":"<id>","timestamp":1730638800,"values":[{"type":"TEMPERATURE","value":21.50}]}21.125 wird 21.13, nicht das 21.12, das printf liefert. Die Datei vectors/signature-vectors.json enthält genau solche Fälle mit den erwarteten Signaturen. Der HydroNode-Server, die Arduino-Library und jedes SDK testen gegen diese eine Datei. Besteht dein eigener Client sie, funktioniert er. Wie es weitergeht
- Die Kurzfassung mit allen Dateien steht in der SDK-Anleitung.
- Lieber Arduino, auch ohne WLAN: ESP32 über LTE-M, NB-IoT und Ethernet.
- Mehr aus denselben Werten: Taupunkt und VPD ohne neue Hardware.

