Add configuration HTTP API

This commit is contained in:
2026-06-04 01:36:59 -06:00
parent 53c4f8e189
commit 59c963e309
@@ -316,6 +316,161 @@ void handleDebugSerial() {
}
}
void sendConfigJson() {
DynamicJsonDocument doc(4096);
doc["device_name"] = appConfig.deviceName;
JsonArray relaysArray = doc.createNestedArray("relays");
for (int i = 0; i < MAX_RELAYS; i++) {
JsonObject relay = relaysArray.createNestedObject();
relay["id"] = appConfig.relays[i].id;
relay["name"] = appConfig.relays[i].name;
relay["pin"] = appConfig.relays[i].pin;
relay["enabled"] = appConfig.relays[i].enabled;
}
JsonObject bms = doc.createNestedObject("bms");
bms["enabled"] = appConfig.bms.enabled;
bms["name"] = appConfig.bms.name;
bms["address"] = appConfig.bms.address;
bms["address_type"] = appConfig.bms.addressType;
JsonArray temps = doc.createNestedArray("temperature_sensors");
for (int i = 0; i < MAX_TEMP_SENSORS; i++) {
JsonObject temp = temps.createNestedObject();
temp["id"] = appConfig.tempSensors[i].id;
temp["name"] = appConfig.tempSensors[i].name;
temp["address"] = appConfig.tempSensors[i].address;
temp["enabled"] = appConfig.tempSensors[i].enabled;
}
String output;
serializeJson(doc, output);
server.send(200, "application/json", output);
}
void sendOkConfig() {
saveConfig();
sendConfigJson();
}
int findRelayConfigIndex(const String& id) {
for (int i = 0; i < MAX_RELAYS; i++) {
if (appConfig.relays[i].id == id) {
return i;
}
}
return -1;
}
int findTempSensorConfigIndex(const String& id) {
for (int i = 0; i < MAX_TEMP_SENSORS; i++) {
if (appConfig.tempSensors[i].id == id) {
return i;
}
}
return -1;
}
void handleGetConfig() {
sendConfigJson();
}
void handleUpdateRelayConfig() {
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, server.arg("plain"));
if (error) {
server.send(400, "application/json", "{\"ok\":false,\"error\":\"invalid_json\"}");
return;
}
String id = doc["id"] | "";
int index = findRelayConfigIndex(id);
if (index < 0) {
server.send(404, "application/json", "{\"ok\":false,\"error\":\"unknown_relay\"}");
return;
}
if (doc["name"].is<String>()) {
appConfig.relays[index].name = doc["name"].as<String>();
}
if (doc["enabled"].is<bool>()) {
appConfig.relays[index].enabled = doc["enabled"].as<bool>();
}
sendOkConfig();
}
void handleUpdateBmsConfig() {
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, server.arg("plain"));
if (error) {
server.send(400, "application/json", "{\"ok\":false,\"error\":\"invalid_json\"}");
return;
}
if (doc["enabled"].is<bool>()) {
appConfig.bms.enabled = doc["enabled"].as<bool>();
}
if (doc["name"].is<String>()) {
appConfig.bms.name = doc["name"].as<String>();
}
if (doc["address"].is<String>()) {
appConfig.bms.address = doc["address"].as<String>();
}
if (doc["address_type"].is<String>()) {
appConfig.bms.addressType = doc["address_type"].as<String>();
}
sendOkConfig();
}
void handleUpdateTempSensorConfig() {
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, server.arg("plain"));
if (error) {
server.send(400, "application/json", "{\"ok\":false,\"error\":\"invalid_json\"}");
return;
}
String id = doc["id"] | "";
int index = findTempSensorConfigIndex(id);
if (index < 0) {
server.send(404, "application/json", "{\"ok\":false,\"error\":\"unknown_temp_sensor\"}");
return;
}
if (doc["name"].is<String>()) {
appConfig.tempSensors[index].name = doc["name"].as<String>();
}
if (doc["address"].is<String>()) {
appConfig.tempSensors[index].address = doc["address"].as<String>();
}
if (doc["enabled"].is<bool>()) {
appConfig.tempSensors[index].enabled = doc["enabled"].as<bool>();
}
sendOkConfig();
}
void handleFactoryResetConfig() {
factoryResetConfig();
sendConfigJson();
}
void handleStatus() {
DynamicJsonDocument doc(2048);
buildStatusDocument(doc);
@@ -399,6 +554,13 @@ void setup() {
server.on("/status", handleStatus);
server.on("/config", HTTP_GET, handleGetConfig);
server.on("/config/relay", HTTP_POST, handleUpdateRelayConfig);
server.on("/config/bms", HTTP_POST, handleUpdateBmsConfig);
server.on("/config/temp", HTTP_POST, handleUpdateTempSensorConfig);
server.on("/config/factory-reset", HTTP_POST, handleFactoryResetConfig);
server.on("/relay/starlink/on", handleStarlinkOn);
server.on("/relay/starlink/off", handleStarlinkOff);