Sensordaten aus Python, MicroPython, Node.js und Go senden

Signierte Sensordaten von Raspberry Pi, Pico W mit MicroPython, Node.js, Go oder Shell-Skript senden. Eine Datei, keine Abhängigkeiten, Befehle und Offline-Puffer.

HydroNode 7 Min. Lesezeit
Die HydroNode SDK-Anleitung mit der ersten Messung in Python, JavaScript, Go und ShellDie HydroNode SDK-Anleitung mit der ersten Messung in Python, JavaScript, Go und Shell

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 hastDu kopierstBraucht
Raspberry Pi, Linux, macOS, Windowspython/hydronode.pyPython 3.8+
ESP32, ESP8266, Pico W mit MicroPythonpython/hydronode.py und hydronode_roots.pyMicroPython 1.20+
Node.js, Deno, Bunnode/hydronode.mjsNode 18+
Gogithub.com/TexhFexLabs/hydronode-sdk/goGo 1.21+
Eine Shellshell/hydronode.shbash, curl, openssl

Alles liegt auf GitHub. Sensor ID und Secret holst du wie gewohnt unter SettingsConnection des Sensors.

Die erste Messung

send.pyPython
from hydronode import HydroNode

hydro = HydroNode("YOUR_SENSOR_ID", "YOUR_SECRET")
hydro.send_values({"TEMPERATURE": 21.5, "HUMIDITY": 48})

202 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.

  1. Dein CodePython, Node, Go, Shell
  2. SigniertHMAC-SHA256 über die Werte
  3. 202Gespeichert und im Diagramm
  4. BefehleKommen mit der Antwort
Dieselbe Signatur wie auf dem ESP32. HydroNode merkt keinen Unterschied.

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.

main.pyMicroPython
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)
Zertifikat prüfen Ohne 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.

raspberry_pi_offline_safe.pyPython
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 try

Befehle 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.

commands.pyPython
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 answer

Jede 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:

protocolHTTP
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}]}
Die Falle mit den Nachkommastellen Werte gehen mit genau zwei Nachkommastellen in die Signatur, aufgerundet bei genau fünf, gerechnet auf der 32-Bit-Zahl. Aus 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