diff --git a/src/web/AmsWebServer.cpp b/src/web/AmsWebServer.cpp index d067c87a..f56d4889 100644 --- a/src/web/AmsWebServer.cpp +++ b/src/web/AmsWebServer.cpp @@ -22,10 +22,7 @@ #include "root/upload_html.h" #include "root/delete_html.h" #include "root/reset_html.h" -#include "root/temperature_head_html.h" -#include "root/temperature_row_html.h" -#include "root/temperature_none_html.h" -#include "root/temperature_foot_html.h" +#include "root/temperature_html.h" #include "base64.h" @@ -43,6 +40,7 @@ void AmsWebServer::setup(AmsConfiguration* config, MQTTClient* mqtt) { server.on("/application.js", HTTP_GET, std::bind(&AmsWebServer::applicationJs, this)); server.on("/temperature", HTTP_GET, std::bind(&AmsWebServer::temperature, this)); server.on("/temperature", HTTP_POST, std::bind(&AmsWebServer::temperaturePost, this)); + server.on("/temperature.json", HTTP_GET, std::bind(&AmsWebServer::temperatureJson, this)); server.on("/config-meter", HTTP_GET, std::bind(&AmsWebServer::configMeterHtml, this)); server.on("/config-wifi", HTTP_GET, std::bind(&AmsWebServer::configWifiHtml, this)); server.on("/config-mqtt", HTTP_GET, std::bind(&AmsWebServer::configMqttHtml, this)); @@ -133,76 +131,73 @@ void AmsWebServer::temperature() { server.sendHeader("Pragma", "no-cache"); server.sendHeader("Expires", "-1"); - String html; - int c = hw->getTempSensorCount(); - int num = 8; - - int start = server.hasArg("start") && !server.arg("start").isEmpty() ? server.arg("start").toInt() : 0; - int end = min(start + num, c); - - for(int i = start; i < end; i++) { - TempSensorData* data = hw->getTempSensorData(i); - - String row = String((const __FlashStringHelper*) TEMPERATURE_ROW_HTML); - row.replace("${index}", String(i-start, DEC)); - row.replace("${address}", toHex(data->address, 8)); - row.replace("${name}", data->name); - row.replace("${common}", data->common ? "checked" : ""); - row.replace("${value}", data->lastRead > -85 ? String(data->lastRead, 1) : "N/A"); - - html += row; - } - - if(c == 0) { - html += String((const __FlashStringHelper*) TEMPERATURE_NONE_HTML); - } - - if(start > 0 || end < c) { - html += "
"; - if(start > 0) { - html += "previous"; - } - html += "
"; - if(end < c) { - html += "next"; - } - html += "
"; - } - - server.setContentLength(html.length() + HEAD_HTML_LEN + TEMPERATURE_HEAD_HTML_LEN + FOOT_HTML_LEN + TEMPERATURE_FOOT_HTML_LEN); + server.setContentLength(HEAD_HTML_LEN + TEMPERATURE_HTML_LEN + FOOT_HTML_LEN); server.send_P(200, "text/html", HEAD_HTML); - server.sendContent_P(TEMPERATURE_HEAD_HTML); - server.sendContent(html); - server.sendContent_P(TEMPERATURE_FOOT_HTML); + server.sendContent_P(TEMPERATURE_HTML); server.sendContent_P(FOOT_HTML); } void AmsWebServer::temperaturePost() { - int start = server.hasArg("start") && !server.arg("start").isEmpty() ? server.arg("start").toInt() : 0; - for(int i = 0; i < 4; i++) { + printD("Saving temperature sensors..."); + for(int i = 0; i < 32; i++) { if(!server.hasArg("sensor" + String(i, DEC))) break; String address = server.arg("sensor" + String(i, DEC)); - String name = server.arg("sensor" + String(i, DEC) + "name"); + String name = server.arg("sensor" + String(i, DEC) + "name").substring(0,16); bool common = server.hasArg("sensor" + String(i, DEC) + "common") && server.arg("sensor" + String(i, DEC) + "common") == "true"; + if(debugger->isActive(RemoteDebug::DEBUG)) { + debugger->printf("Addr: %s, name: %s\n", address.c_str(), name.c_str()); + } config->updateTempSensorConfig(fromHex(address, 8), name.c_str(), common); + delay(1); } if(config->save()) { - server.sendHeader("Location", String("/temperature?start=") + String(start, DEC), true); + printD("Successfully saved temperature sensors"); + server.sendHeader("Location", String("/temperature"), true); server.send (302, "text/plain", ""); uint8_t c = config->getTempSensorCount(); for(int i = 0; i < c; i++) { TempSensorConfig* tsc = config->getTempSensorConfig(i); hw->confTempSensor(tsc->address, tsc->name, tsc->common); + delay(1); } } } +void AmsWebServer::temperatureJson() { + printD("Serving /temperature.json over http..."); + + if(!checkSecurity(2)) + return; + + int count = hw->getTempSensorCount(); + + StaticJsonDocument<4096> json; + json["c"] = count; + JsonArray sensors = json.createNestedArray("s"); + for(int i = 0; i < count; i++) { + TempSensorData* data = hw->getTempSensorData(i); + JsonObject obj = sensors.createNestedObject(); + obj["i"] = i; + obj["a"] = toHex(data->address, 8); + obj["n"] = String(data->name).substring(0,16); + obj["v"] = String(data->lastRead, 2); + obj["c"] = data->common; + delay(1); + } + + String jsonStr; + serializeJson(json, jsonStr); + + server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + + server.setContentLength(jsonStr.length()); + server.send(200, "application/json", jsonStr); +} + void AmsWebServer::indexHtml() { printD("Serving /index.html over http..."); diff --git a/src/web/AmsWebServer.h b/src/web/AmsWebServer.h index 29287b8b..7eea8c1a 100644 --- a/src/web/AmsWebServer.h +++ b/src/web/AmsWebServer.h @@ -62,6 +62,7 @@ private: void applicationJs(); void temperature(); void temperaturePost(); + void temperatureJson(); void configMeterHtml(); void configWifiHtml(); void configMqttHtml(); diff --git a/web/application.js b/web/application.js index 0ddae242..f320fd74 100644 --- a/web/application.js +++ b/web/application.js @@ -106,6 +106,7 @@ $(function() { }); $('#ntpEnable').trigger('change'); + // Navbar switch(window.location.pathname) { case '/temperature': $('#config-temp-link').addClass('active'); @@ -133,6 +134,7 @@ $(function() { break; } + // Check for software upgrade var swv = $('#swVersion') if(meters.length > 0 && swv.length == 1 && swv.text() != "SNAPSHOT") { var v = swv.text().substring(1).split('.'); @@ -191,6 +193,12 @@ $(function() { } }); } + + // Temperature + var tt = $('#temp-template'); + if(tt.length > 0) { + setTimeout(loadTempSensors, 500); + } }); var setStatus = function(id, status) { @@ -356,3 +364,40 @@ var upgrade = function() { } } } + +var loadTempSensors = function() { + $.ajax({ + url: '/temperature.json', + timeout: 10000, + dataType: 'json', + }).done(function(json) { + if($('#loading').length > 0) { + $('#loading').hide(); + + var list = $('#sensors'); + if(json.c > 0) { + list.empty(); + var temp = $.trim($('#temp-template').html()); + $.each(json.s, function(i, o) { + var item = temp.replace(/{{index}}/ig, o.i); + var item = item.replace(/{{address}}/ig, o.a); + var item = item.replace(/{{name}}/ig, o.n); + var item = item.replace(/{{value}}/ig, o.v > -50 && o.v < 127 ? o.v : "N/A"); + var item = item.replace(/{{common}}/ig, o.c ? "checked" : ""); + list.append(item); + }); + } else { + $('#notemp').show(); + } + } else { + $.each(json.s, function(i, o) { + $('#temp-'+o.i).html(o.v > -50 && o.v < 127 ? o.v : "N/A"); + }); + } + setTimeout(loadTempSensors, 10000); + }).fail(function() { + setTimeout(loadTempSensors, 60000); + $('#loading').hide(); + $('#error').show(); + }); +} \ No newline at end of file diff --git a/web/temperature.html b/web/temperature.html new file mode 100644 index 00000000..42199d92 --- /dev/null +++ b/web/temperature.html @@ -0,0 +1,48 @@ + + +
+ +
+
Loading temperature sensors
+ + +
+
+
+
+ Back +
+
+ +
+
+
diff --git a/web/temperature_foot.html b/web/temperature_foot.html deleted file mode 100644 index 6fd0cae3..00000000 --- a/web/temperature_foot.html +++ /dev/null @@ -1,11 +0,0 @@ - -
-
-
- Back -
-
- -
-
- diff --git a/web/temperature_head.html b/web/temperature_head.html deleted file mode 100644 index 7bbf003e..00000000 --- a/web/temperature_head.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/web/temperature_none.html b/web/temperature_none.html deleted file mode 100644 index e03e50d3..00000000 --- a/web/temperature_none.html +++ /dev/null @@ -1 +0,0 @@ -
No temperature sensors is configured or found
\ No newline at end of file diff --git a/web/temperature_row.html b/web/temperature_row.html deleted file mode 100644 index 1b181115..00000000 --- a/web/temperature_row.html +++ /dev/null @@ -1,28 +0,0 @@ - -
-
-
-
- Address -
- -
-
-
-
-
- Name -
- -
-
-
-
- - -
-
-
- ${value} °C -
-