mirror of
https://github.com/rstrouse/ESPSomfy-RTS.git
synced 2025-12-15 11:52:12 +01:00
Set up for HA firmware updates
This commit is contained in:
parent
c3b7139931
commit
9492404b98
3 changed files with 81 additions and 72 deletions
Binary file not shown.
151
Web.cpp
151
Web.cpp
|
|
@ -693,6 +693,7 @@ void Web::handleDiscovery(WebServer &server) {
|
||||||
JsonObject obj = doc.to<JsonObject>();
|
JsonObject obj = doc.to<JsonObject>();
|
||||||
obj["serverId"] = settings.serverId;
|
obj["serverId"] = settings.serverId;
|
||||||
obj["version"] = settings.fwVersion.name;
|
obj["version"] = settings.fwVersion.name;
|
||||||
|
obj["latest"] = git.latest.name;
|
||||||
obj["model"] = "ESPSomfyRTS";
|
obj["model"] = "ESPSomfyRTS";
|
||||||
obj["hostname"] = settings.hostname;
|
obj["hostname"] = settings.hostname;
|
||||||
obj["authType"] = static_cast<uint8_t>(settings.Security.type);
|
obj["authType"] = static_cast<uint8_t>(settings.Security.type);
|
||||||
|
|
@ -707,6 +708,40 @@ void Web::handleDiscovery(WebServer &server) {
|
||||||
else
|
else
|
||||||
server.send(500, _encoding_text, "Invalid http method");
|
server.send(500, _encoding_text, "Invalid http method");
|
||||||
}
|
}
|
||||||
|
void Web::handleBackup(WebServer &server, bool attach) {
|
||||||
|
webServer.sendCORSHeaders(server);
|
||||||
|
if(server.hasArg("attach")) attach = toBoolean(server.arg("attach").c_str(), attach);
|
||||||
|
if(attach) {
|
||||||
|
char filename[120];
|
||||||
|
Timestamp ts;
|
||||||
|
char * iso = ts.getISOTime();
|
||||||
|
// Replace the invalid characters as quickly as we can.
|
||||||
|
for(uint8_t i = 0; i < strlen(iso); i++) {
|
||||||
|
switch(iso[i]) {
|
||||||
|
case '.':
|
||||||
|
// Just trim off the ms.
|
||||||
|
iso[i] = '\0';
|
||||||
|
break;
|
||||||
|
case ':':
|
||||||
|
iso[i] = '_';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
snprintf(filename, sizeof(filename), "attachment; filename=\"ESPSomfyRTS %s.backup\"", iso);
|
||||||
|
Serial.println(filename);
|
||||||
|
server.sendHeader(F("Content-Disposition"), filename);
|
||||||
|
server.sendHeader(F("Access-Control-Expose-Headers"), F("Content-Disposition"));
|
||||||
|
}
|
||||||
|
Serial.println("Saving current shade information");
|
||||||
|
somfy.writeBackup();
|
||||||
|
File file = LittleFS.open("/controller.backup", "r");
|
||||||
|
if (!file) {
|
||||||
|
Serial.println("Error opening shades.cfg");
|
||||||
|
server.send(500, _encoding_text, "shades.cfg");
|
||||||
|
}
|
||||||
|
server.streamFile(file, _encoding_text);
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
void Web::handleSetPositions(WebServer &server) {
|
void Web::handleSetPositions(WebServer &server) {
|
||||||
webServer.sendCORSHeaders(server);
|
webServer.sendCORSHeaders(server);
|
||||||
if(server.method() == HTTP_OPTIONS) { server.send(200, "OK"); return; }
|
if(server.method() == HTTP_OPTIONS) { server.send(200, "OK"); return; }
|
||||||
|
|
@ -833,7 +868,46 @@ void Web::handleSetSensor(WebServer &server) {
|
||||||
server.send(500, _encoding_json, F("{\"status\":\"ERROR\",\"desc\":\"shadeId was not provided\"}"));
|
server.send(500, _encoding_json, F("{\"status\":\"ERROR\",\"desc\":\"shadeId was not provided\"}"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void Web::handleDownloadFirmware(WebServer &server) {
|
||||||
|
webServer.sendCORSHeaders(server);
|
||||||
|
if(server.method() == HTTP_OPTIONS) { server.send(200, "OK"); return; }
|
||||||
|
GitRepo repo;
|
||||||
|
GitRelease *rel = nullptr;
|
||||||
|
int8_t err = repo.getReleases();
|
||||||
|
Serial.println("downloadFirmware called...");
|
||||||
|
if(err == 0) {
|
||||||
|
if(server.hasArg("ver")) {
|
||||||
|
if(strcmp(server.arg("ver").c_str(), "latest") == 0) rel = &repo.releases[0];
|
||||||
|
else if(strcmp(server.arg("ver").c_str(), "main") == 0) {
|
||||||
|
rel = &repo.releases[GIT_MAX_RELEASES];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for(uint8_t i = 0; i < GIT_MAX_RELEASES; i++) {
|
||||||
|
if(repo.releases[i].id == 0) continue;
|
||||||
|
if(strcmp(repo.releases[i].name, server.arg("ver").c_str()) == 0) {
|
||||||
|
rel = &repo.releases[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(rel) {
|
||||||
|
DynamicJsonDocument sdoc(512);
|
||||||
|
JsonObject sobj = sdoc.to<JsonObject>();
|
||||||
|
rel->toJSON(sobj);
|
||||||
|
serializeJson(sdoc, g_content);
|
||||||
|
server.send(200, _encoding_json, g_content);
|
||||||
|
strcpy(git.targetRelease, rel->name);
|
||||||
|
git.status = GIT_AWAITING_UPDATE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
server.send(500, _encoding_json, F("{\"status\":\"ERROR\",\"desc\":\"Release not found in repo.\"}"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
server.send(500, _encoding_json, F("{\"status\":\"ERROR\",\"desc\":\"Release version not supplied.\"}"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
server.send(err, _encoding_json, F("{\"status\":\"ERROR\",\"desc\":\"Error communicating with Github.\"}"));
|
||||||
|
}
|
||||||
|
}
|
||||||
void Web::handleNotFound(WebServer &server) {
|
void Web::handleNotFound(WebServer &server) {
|
||||||
HTTPMethod method = server.method();
|
HTTPMethod method = server.method();
|
||||||
Serial.printf("Request %s 404-%d ", server.uri().c_str(), method);
|
Serial.printf("Request %s 404-%d ", server.uri().c_str(), method);
|
||||||
|
|
@ -883,6 +957,8 @@ void Web::begin() {
|
||||||
apiServer.on("/group", HTTP_GET, [] () { webServer.handleGroup(apiServer); });
|
apiServer.on("/group", HTTP_GET, [] () { webServer.handleGroup(apiServer); });
|
||||||
apiServer.on("/setPositions", []() { webServer.handleSetPositions(apiServer); });
|
apiServer.on("/setPositions", []() { webServer.handleSetPositions(apiServer); });
|
||||||
apiServer.on("/setSensor", []() { webServer.handleSetSensor(apiServer); });
|
apiServer.on("/setSensor", []() { webServer.handleSetSensor(apiServer); });
|
||||||
|
apiServer.on("/downloadFirmware", []() { webServer.handleDownloadFirmware(apiServer); });
|
||||||
|
apiServer.on("/backup", []() { webServer.handleBackup(apiServer); });
|
||||||
|
|
||||||
// Web Interface
|
// Web Interface
|
||||||
server.on("/tiltCommand", []() { webServer.handleTiltCommand(server); });
|
server.on("/tiltCommand", []() { webServer.handleTiltCommand(server); });
|
||||||
|
|
@ -909,46 +985,7 @@ void Web::begin() {
|
||||||
serializeJson(doc, g_content);
|
serializeJson(doc, g_content);
|
||||||
server.send(200, _encoding_json, g_content);
|
server.send(200, _encoding_json, g_content);
|
||||||
});
|
});
|
||||||
server.on("/downloadFirmware", []() {
|
server.on("/downloadFirmware", []() { webServer.handleDownloadFirmware(server); });
|
||||||
webServer.sendCORSHeaders(server);
|
|
||||||
if(server.method() == HTTP_OPTIONS) { server.send(200, "OK"); return; }
|
|
||||||
GitRepo repo;
|
|
||||||
GitRelease *rel = nullptr;
|
|
||||||
int8_t err = repo.getReleases();
|
|
||||||
Serial.println("downloadFirmware called...");
|
|
||||||
if(err == 0) {
|
|
||||||
if(server.hasArg("ver")) {
|
|
||||||
if(strcmp(server.arg("ver").c_str(), "latest") == 0) rel = &repo.releases[0];
|
|
||||||
else if(strcmp(server.arg("ver").c_str(), "main") == 0) {
|
|
||||||
rel = &repo.releases[GIT_MAX_RELEASES];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(uint8_t i = 0; i < GIT_MAX_RELEASES; i++) {
|
|
||||||
if(repo.releases[i].id == 0) continue;
|
|
||||||
if(strcmp(repo.releases[i].name, server.arg("ver").c_str()) == 0) {
|
|
||||||
rel = &repo.releases[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(rel) {
|
|
||||||
DynamicJsonDocument sdoc(512);
|
|
||||||
JsonObject sobj = sdoc.to<JsonObject>();
|
|
||||||
rel->toJSON(sobj);
|
|
||||||
serializeJson(sdoc, g_content);
|
|
||||||
server.send(200, _encoding_json, g_content);
|
|
||||||
strcpy(git.targetRelease, rel->name);
|
|
||||||
git.status = GIT_AWAITING_UPDATE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
server.send(500, _encoding_json, F("{\"status\":\"ERROR\",\"desc\":\"Release not found in repo.\"}"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
server.send(500, _encoding_json, F("{\"status\":\"ERROR\",\"desc\":\"Release version not supplied.\"}"));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
server.send(err, _encoding_json, F("{\"status\":\"ERROR\",\"desc\":\"Error communicating with Github.\"}"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
server.on("/cancelFirmware", []() {
|
server.on("/cancelFirmware", []() {
|
||||||
webServer.sendCORSHeaders(server);
|
webServer.sendCORSHeaders(server);
|
||||||
if(server.method() == HTTP_OPTIONS) { server.send(200, "OK"); return; }
|
if(server.method() == HTTP_OPTIONS) { server.send(200, "OK"); return; }
|
||||||
|
|
@ -960,37 +997,7 @@ void Web::begin() {
|
||||||
serializeJson(sdoc, g_content);
|
serializeJson(sdoc, g_content);
|
||||||
server.send(200, _encoding_json, g_content);
|
server.send(200, _encoding_json, g_content);
|
||||||
});
|
});
|
||||||
server.on("/backup", []() {
|
server.on("/backup", []() { webServer.handleBackup(server, true); });
|
||||||
webServer.sendCORSHeaders(server);
|
|
||||||
char filename[120];
|
|
||||||
Timestamp ts;
|
|
||||||
char * iso = ts.getISOTime();
|
|
||||||
// Replace the invalid characters as quickly as we can.
|
|
||||||
for(uint8_t i = 0; i < strlen(iso); i++) {
|
|
||||||
switch(iso[i]) {
|
|
||||||
case '.':
|
|
||||||
// Just trim off the ms.
|
|
||||||
iso[i] = '\0';
|
|
||||||
break;
|
|
||||||
case ':':
|
|
||||||
iso[i] = '_';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
snprintf(filename, sizeof(filename), "attachment; filename=\"ESPSomfyRTS %s.backup\"", iso);
|
|
||||||
Serial.println(filename);
|
|
||||||
server.sendHeader(F("Content-Disposition"), filename);
|
|
||||||
server.sendHeader(F("Access-Control-Expose-Headers"), F("Content-Disposition"));
|
|
||||||
Serial.println("Saving current shade information");
|
|
||||||
somfy.writeBackup();
|
|
||||||
File file = LittleFS.open("/controller.backup", "r");
|
|
||||||
if (!file) {
|
|
||||||
Serial.println("Error opening shades.cfg");
|
|
||||||
server.send(500, _encoding_text, "shades.cfg");
|
|
||||||
}
|
|
||||||
server.streamFile(file, _encoding_text);
|
|
||||||
file.close();
|
|
||||||
});
|
|
||||||
server.on("/restore", HTTP_POST, []() {
|
server.on("/restore", HTTP_POST, []() {
|
||||||
webServer.sendCORSHeaders(server);
|
webServer.sendCORSHeaders(server);
|
||||||
server.sendHeader("Connection", "close");
|
server.sendHeader("Connection", "close");
|
||||||
|
|
|
||||||
2
Web.h
2
Web.h
|
|
@ -24,6 +24,8 @@ class Web {
|
||||||
void handleGroup(WebServer &server);
|
void handleGroup(WebServer &server);
|
||||||
void handleSetPositions(WebServer &server);
|
void handleSetPositions(WebServer &server);
|
||||||
void handleSetSensor(WebServer &server);
|
void handleSetSensor(WebServer &server);
|
||||||
|
void handleDownloadFirmware(WebServer &server);
|
||||||
|
void handleBackup(WebServer &server, bool attach = false);
|
||||||
void begin();
|
void begin();
|
||||||
void loop();
|
void loop();
|
||||||
void end();
|
void end();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue