diff --git a/examples/mqttRSSI/mqttRSSI.ino b/examples/mqttRSSI/mqttRSSI.ino index 2905105..713a419 100644 --- a/examples/mqttRSSI/mqttRSSI.ino +++ b/examples/mqttRSSI/mqttRSSI.ino @@ -15,6 +15,7 @@ #if defined(ARDUINO_ARCH_ESP8266) #include +#include #elif defined(ARDUINO_ARCH_ESP32) #include #include @@ -26,7 +27,14 @@ #define PARAM_FILE "/param.json" #define AUX_SETTING_URI "/mqtt_setting" #define AUX_SAVE_URI "/mqtt_save" +#define AUX_CLEAR_URI "/mqtt_clear" +// JSON definition of AutoConnectAux. +// Multiple AutoConnectAux can be defined in the JSON array. +// In this example, JSON is hard-coded to make it easier to +// understand the AutoConnectAux API. In practice, it will be +// an external content which separated from the sketch, +// as the mqtt_RSSI_FS example shows. static const char AUX_mqtt_setting[] PROGMEM = R"raw( [ { @@ -125,6 +133,16 @@ static const char AUX_mqtt_setting[] PROGMEM = R"raw( "type": "ACText", "value": "

Parameters saved as:

", "style": "text-align:center;color:#2f4f4f;padding:10px;" + }, + { + "name": "parameters", + "type": "ACText" + }, + { + "name": "clear", + "type": "ACSubmit", + "value": "Clear channel", + "uri": "/mqtt_clear" } ] } @@ -202,6 +220,8 @@ int getStrength(uint8_t points) { return points ? static_cast(rssi / points) : 0; } +// Load parameters saved with saveParams from SPIFFS into +// the elements defined in /mqtt_setting JSON. String loadParams(AutoConnectAux& aux, PageArgument& args) { (void)(args); SPIFFS.begin(); @@ -216,42 +236,54 @@ String loadParams(AutoConnectAux& aux, PageArgument& args) { return ""; } +// Save the value of each element entered by /mqtt_setting to +// the parameter file. The saveParams as below is a callback +// function of /mqtt_save. +// When this callback is invoked, the input value of each element +// of /mqtt_setting is already stored in the AutoConnectAux object. +// In Sketch, you can output to stream its elements specified by name. String saveParams(AutoConnectAux& aux, PageArgument& args) { - String echo; - + // PageArgument is a copy set of the elements that AutoConnectAux has. serverName = args.arg("mqttserver"); serverName.trim(); - echo = "mqttserver: " + serverName + "
"; channelId = args.arg("channelid"); channelId.trim(); - echo += "channelid: " + channelId + "
"; userKey = args.arg("userkey"); userKey.trim(); - echo += "userkey: " + userKey + "
"; apiKey = args.arg("apikey"); apiKey.trim(); - echo += "apikey: " + apiKey + "
"; String upd = args.arg("period"); updateInterval = upd.substring(0, 2).toInt() * 1000; - echo += "period: " + String(updateInterval) + "
"; String uniqueid = args.arg("uniqueid"); - echo += "uniqueid: " + uniqueid + "
"; hostName = args.arg("hostname"); hostName.trim(); - echo += "hostname: " + hostName + "
"; + // The entered value is owned by AutoConnectAux of /mqtt_setting. + // In order to retrieve the elements of /mqtt_setting, + // it is necessary to get the AutoConnectAux object of /mqtt_setting. SPIFFS.begin(); File param = SPIFFS.open(PARAM_FILE, "w"); portal.aux("/mqtt_setting")->saveElement(param, { "mqttserver", "channelid", "userkey", "apikey", "period", "uniqueid", "hostname" }); param.close(); SPIFFS.end(); - return echo; + + // Echo back saved parameters to AutoConnectAux page. + AutoConnectText& echo = aux.getElement("parameters"); + echo.value = "Server: " + serverName + "
"; + echo.value += "Channel ID: " + channelId + "
"; + echo.value += "User Key: " + userKey + "
"; + echo.value += "API Key: " + apiKey + "
"; + echo.value += "Update period: " + String(updateInterval / 1000) + " sec.
"; + echo.value += "Use APID unique: " + uniqueid + "
"; + echo.value += "ESP host name: " + hostName + "
"; + + return ""; } void handleRoot() { @@ -262,7 +294,7 @@ void handleRoot() { "" "" "" - "

" AUTOCONNECT_LINK(COG_24) "

" + "

" AUTOCONNECT_LINK(COG_24) "

" "" ""; @@ -274,6 +306,31 @@ void handleRoot() { server.send(200, "text/html", content); } +// Clear channel using Thingspeak's API. +void handleClearChannel() { + HTTPClient httpClient; + String endpoint = serverName; + endpoint.replace("mqtt", "api"); + String delUrl = "http://" + endpoint + "/channels/" + channelId + "/feeds.json?api_key=" + userKey; + + Serial.println(delUrl + ":" + String(httpClient.begin(delUrl))); + Serial.println("res:" + String(httpClient.sendRequest("DELETE"))); + String res = httpClient.getString(); + httpClient.end(); + + // Returns the redirect response. The page is reloaded and its contents + // are updated to the state after deletion. +#if defined(ARDUINO_ARCH_ESP8266) + ESP8266WebServer& server = portal.host(); +#elif defined(ARDUINO_ARCH_ESP32) + WebServer& server = portal.host(); +#endif + server.sendHeader("Location", String("http://") + server.client().localIP().toString() + String("/")); + server.send(302, "text/plain", ""); + server.client().flush(); + server.client().stop(); +} + void setup() { delay(1000); Serial.begin(115200); @@ -289,10 +346,12 @@ void setup() { if (hostnameElm.value.length()) { config.hostName = hostnameElm.value; } + config.bootUri = AC_ONBOOTURI_HOME; + config.homeUri = "/"; + portal.config(config); portal.on(AUX_SETTING_URI, loadParams); - portal.on(AUX_SAVE_URI, saveParams, AC_EXIT_LATER); - portal.config(config); + portal.on(AUX_SAVE_URI, saveParams); } else Serial.println("load error"); @@ -315,6 +374,7 @@ void setup() { WebServer& server = portal.host(); #endif server.on("/", handleRoot); + server.on(AUX_CLEAR_URI, handleClearChannel); } void loop() {