Wi-Fi-Relais aus meinen Python-Skripten über den Commands-Endpunkt schalten
Von English mit KI übersetzt ·
Ich bin Datenanalyst, also bitte etwas Nachsicht bei der Elektronik.In unserem Testlabor hängt über dem Dauerprüfstand eine Lampe, die die Bediener während eines Tests eingeschaltet haben möchten. Die Testläufe starte ich aus meinen Python-Skripten, deshalb möchte ich, dass das Skript die Lampe ebenfalls schaltet. Ich habe ein Sonoff Basic R2 Wi-Fi-Relais gekauft, aber im Auslieferungszustand funktioniert es nur mit der eigenen Smartphone-App, und ich finde keine dokumentierte API dafür.Für die Sensoren des Prüfstands nutzen wir bereits Hermetry (ein ESP32, der Vibration und Temperatur über MQTT sendet, funktioniert einwandfrei). Idealerweise würde mein Skript mit Hermetry sprechen und Hermetry mit dem Relais, sodass ich im Labornetzwerk nichts öffnen muss und die Bediener den Lampenstatus auf demselben Board sehen.Ist das ein sinnvoller Aufbau? Wenn ja, welchen Endpunkt rufe ich auf, und wie „hört“ das Relais den Befehl? Ich habe /api/iot/devices/{deviceId}/rpc in der API-Dokumentation gefunden, bin mir aber nicht sicher, was auf Geräteseite vorhanden sein muss.
Data analyst here, so go easy on me with the electronics.
Our test lab has a lamp over the endurance rig that the operators want on while a test is running. The test runs are started from my Python scripts, so I’d like the script to switch the lamp too. I bought a Sonoff Basic R2 Wi-Fi relay, but out of the box it only works with its own phone app and I can’t find any documented API for it.
We already use Hermetry for the rig’s sensors (an ESP32 sending vibration and temperature over MQTT, works fine). Ideally my script would talk to Hermetry and Hermetry would talk to the relay, so I don’t have to open anything in the lab network and the operators see the lamp state on the same board.
Is that a sane setup? If yes, which endpoint do I call, and how does the relay „hear“ it? I found /api/iot/devices/{deviceId}/rpc in the API docs but I’m not sure what has to exist on the device side.
Von English mit KI übersetzt ·
Der Sonoff Basic enthält einen ESP8266. Du kannst darauf über die 4-polige Stiftleiste mit einem USB-Seriell-Adapter (3.3 V, nicht 5 V!) deinen eigenen Sketch flashen. Danach ist er einfach ein weiteres Hermetry-Gerät.
The Sonoff Basic has an ESP8266 inside. You can flash your own sketch on it through the 4-pin header with a USB-serial adapter (3.3 V, not 5 V!). Then it’s just another Hermetry device.
Von English mit KI übersetzt ·
Ich habe es mit einem geliehenen FTDI-Adapter geflasht, bis ich es nach drei Versuchen in den Boot-Modus bekommen habe (Taste beim Einstecken gedrückt halten). Es verbindet sich jetzt mit Hermetry über ein eigenes Zugriffstoken und sendet jede Minute {"relay": 0}. Der Sendeteil ist also erledigt. Und wie schalte ich es?
Flashed it with a borrowed FTDI adapter, took me three tries to get it into boot mode (hold the button while plugging in). It now connects to Hermetry with its own access token and sends {"relay": 0} every minute. So the sending part is done. What about switching it?
Von English mit KI übersetzt ·
Gut, das ist dasselbe Setup, das wir für einige Signallampen verwenden. Drei Teile:
- Gerätprofil des Relais, Reiter Commands: den Befehl
light.sethinzufügen, Stufe Basic, ein Parameteronvom Typ Yes / no. Die Stufe ist wichtig, da ein API-Schlüssel nur Methoden senden kann, die im Katalog des Profils enthalten sind. - Firmware:
v1/rpc/req/+abonnieren, GPIO12 schalten (das Relais auf dem Basic R2), mit derselben ID antworten und den neuen Zustand melden.
void onMsg(char* topic, byte* p, unsigned int n) {
// topic: v1/rpc/req/42
String id = String(topic).substring(11);
StaticJsonDocument<128> d; deserializeJson(d, p, n);
bool on = d["params"]["on"];
digitalWrite(12, on ? HIGH : LOW);
mqtt.publish(("v1/rpc/res/" + id).c_str(), "{"ok":true}");
mqtt.publish("v1/telemetry", on ? "{"relay":1}" : "{"relay":0}");
}
- Dein Skript: ein API-Schlüssel unter API Keys (Menü Developer) mit nur den nötigen Rechten. Die Sende-Route benötigt
iot_rpc.readplus die Berechtigung der Stufe, also genau diese beiden ankreuzen und nichts weiter, die IP-Allowlist mit der Adresse des Labor-PCs füllen und das 90-Tage-Ablaufdatum beibehalten.
import requests
r = requests.post(
f"https://{HOST}/tenant/{TENANT}/api/iot/devices/{DEVICE}/rpc",
headers={"Authorization": f"Bearer {KEY}"},
json={"method": "light.set", "params": {"on": True}, "timeoutMs": 10000},
)
print(r.status_code, r.json()["rpc"]["status"])
Ein zweiseitiger Befehl mit einem Timeout von 30 s oder weniger wartet und kommt mit 200 und SUCCESSFUL zurück. Referenz: Commands APIDer ESP8266 unterstützt TLS, aber der Speicher ist knapp; verwende BearSSL mit kleineren Puffern, falls der Verbindungsaufbau fehlschlägt.
Good, that’s the same setup we use for a few signal lamps. Three pieces:
- Device profile of the relay, Commands tab: add a command
light.set, tier Basic, one parameteronof type Yes / no. Tier matters, because an API key can only send methods that are in the profile’s catalog. - Firmware: subscribe to
v1/rpc/req/+, switch GPIO12 (the relay on the Basic R2), answer on the same id, and report the new state.
void onMsg(char* topic, byte* p, unsigned int n) {
// topic: v1/rpc/req/42
String id = String(topic).substring(11);
StaticJsonDocument<128> d; deserializeJson(d, p, n);
bool on = d["params"]["on"];
digitalWrite(12, on ? HIGH : LOW);
mqtt.publish(("v1/rpc/res/" + id).c_str(), "{"ok":true}");
mqtt.publish("v1/telemetry", on ? "{"relay":1}" : "{"relay":0}");
}
- Your script: an API key from API Keys (Developer menu) with only what it needs. The send route wants
iot_rpc.readplus the tier’s permission, so tick those two and nothing else, fill the IP allowlist with the lab PC’s address and keep the 90-day expiry.
import requests
r = requests.post(
f"https://{HOST}/tenant/{TENANT}/api/iot/devices/{DEVICE}/rpc",
headers={"Authorization": f"Bearer {KEY}"},
json={"method": "light.set", "params": {"on": True}, "timeoutMs": 10000},
)
print(r.status_code, r.json()["rpc"]["status"])
A two-way command with a timeout of 30 s or less waits and comes back 200 with SUCCESSFUL. Reference: Commands API
The ESP8266 does TLS, but memory is tight; use BearSSL with smaller buffers if the connect fails.
Von English mit KI übersetzt ·
Funktioniert. Der erste Aufruf lieferte 403, weil ich nur die Sendeberechtigung aktiviert und iot_rpc.read nicht gesetzt hatte. Nach dem Hinzufügen klickt die Lampe, und der Aufruf liefert in etwa 300 ms 200 / SUCCESSFUL zurück. Außerdem habe ich auf dem Bedienerboard eine Switch-Karte angelegt, die an relay gebunden ist, damit die Bediener den Zustand sehen. Danke euch beiden.
Works. First call came back 403 because I had only ticked the send permission and not iot_rpc.read. After adding it the lamp clicks and the call returns 200 / SUCCESSFUL in about 300 ms. I also put a Switch card on the operators‘ board bound to relay, so they see the state. Thanks both.
Von English mit KI übersetzt ·
Super! Auf dieser Platine liegt Netzspannung, also steck sie zurück in ihr Gehäuse, bevor sie jemand anfasst 😄
Nice! Mains on that board, so put it back in its case before anyone touches it 😄
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Mitdiskutieren
Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

