diff --git a/firmware/esp32/overland-controller/overland-controller.ino b/firmware/esp32/overland-controller/overland-controller.ino index 8f5debf..3ca844a 100644 --- a/firmware/esp32/overland-controller/overland-controller.ino +++ b/firmware/esp32/overland-controller/overland-controller.ino @@ -91,7 +91,14 @@ function fmt(n,d=1){return typeof n==="number"?n.toFixed(d):"--"} function temp(v){return typeof v==="number"?fmt(v,1)+"°F":"Offline"} function clsAlarm(v){return v?"bad":"good"} async function relay(id,on){ - try{await fetch(`/relay/${id}/${on?"on":"off"}`); await load()}catch(e){} + try{ + await fetch("/relay/set",{ + method:"POST", + headers:{"Content-Type":"application/json"}, + body:JSON.stringify({id:id,state:on}) + }); + await load(); + }catch(e){} } function render(data){ $("conn").textContent="Live"; @@ -1124,6 +1131,36 @@ void handleSelectBms() { server.send(200, "application/json", output); } + +void handleSetRelayPost() { + DynamicJsonDocument doc(512); + DeserializationError error = deserializeJson(doc, server.arg("plain")); + + if (error) { + server.send(400, "application/json", "{\"ok\":false,\"error\":\"invalid_json\"}"); + return; + } + + String relayId = doc["id"] | ""; + bool state = doc["state"] | false; + + if (!setRelayById(relayId, state)) { + server.send(404, "application/json", "{\"ok\":false,\"error\":\"unknown_relay\"}"); + return; + } + + DynamicJsonDocument response(512); + response["type"] = "relay_response"; + response["ok"] = true; + response["relay"] = relayId; + response["state"] = state; + response["enabled"] = state; + + String output; + serializeJson(response, output); + server.send(200, "application/json", output); +} + void handleGenericRelayRoute() { String uri = server.uri(); String prefix = "/relay/"; @@ -1220,6 +1257,7 @@ void setup() { }); server.on("/status", handleStatus); + server.on("/relay/set", HTTP_POST, handleSetRelayPost); server.on("/relay/relay_1/on", HTTP_GET, handleGenericRelayRoute); server.on("/relay/relay_1/off", HTTP_GET, handleGenericRelayRoute); server.on("/relay/relay_2/on", HTTP_GET, handleGenericRelayRoute);