#ifndef CONFIG_DISABLE_WEB const int gpioWebConf[] = CONFIG_WEB_CONTROLLED_GPIO; const int pwmWebConf[] = CONFIG_CONTROLLED_PWM; String gpioControlHTML = ""; String pwmControlHTML = ""; void WebBuildGpio(String &desc){ uint i; for (i = 0; i < NB_ELEMENTS(gpioSensors); i++){ desc += "
  • " + String(gpioSensors[i]->sensorName) + ": " + String(gpioSensors[i]->lastMeasure) + "
  • "; } } void WebHandleRoot() { String gpioDesc = ""; WebBuildGpio(gpioDesc); server.send(200, "text/html", "" "

    You are connected to " + String(conf.host) + "

    " "
    " "Sensors" "
    " + gpioControlHTML + pwmControlHTML + "
    " "Settings" "Enter Setup
    " "Put device in OTA mode
    " "MQTT Status: " + (MqttIsConnected() ? "Connected" : "Disconnected") + "
    " #ifdef CONFIG_ENABLE_BMP180 "BMP 180 (Temp+Pression) Status: " + (BMP180IsConnected() ? "Connected" : "Disconnected") + "
    " #endif "Wifi Strength: " + WiFi.RSSI() + "dBm
    " "Free space: " + ESP.getFreeSketchSpace() + "
    " "Free heap: " + ESP.getFreeHeap() + "
    " "Build the " + __DATE__ + " at " + __TIME__ + "
    " "
    " ); } void WebSendError(const char *error) { server.send(500, "text/plain", error); } void WebBuildSSIDList(String &datalist){ int n = WiFi.scanNetworks(); datalist = ""; // sort by RSSI int indices[n]; for (int i = 0; i < n; i++) { indices[i] = i; } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (WiFi.RSSI(indices[j]) > WiFi.RSSI(indices[i])) { std::swap(indices[i], indices[j]); } } } for (int i = 0; i < n; ++i){ datalist += ""; } void WebHandleSetup() { String ssidlist; WebBuildSSIDList(ssidlist); server.send(200, "text/html", "
    " "
    " "Wifi configuration:" "

    " "" + ssidlist + "" "

    " "

    " "
    " "
    " "IP Configuration" "
    DHCP Static
    " "

    " "

    " "

    " "

    " "

    " "
    " "
    " "MQTT:" "

    " "

    " "

    " "

    (8883 for secure Mqtts)
    " "
    " "
    " "
    "); } void WebHandleGpio() { if (!server.hasArg("gpio") || !server.hasArg("value")) { server.send(500, "text/plain", "Bad arguments\r\n"); return; } MqttChangeGpioValue(server.arg("gpio").toInt(), server.arg("value").toInt()); server.send(200, "text/html", "

    GPIO" + server.arg("gpio") + " changed to " + server.arg("value") + "

    "); } void WebHandlePWM() { if (!server.hasArg("gpio") || !server.hasArg("value")) { server.send(500, "text/plain", "Bad arguments\r\n"); return; } MqttChangePWMValue(server.arg("gpio").toInt(), server.arg("value").toInt()); server.send(200, "text/html", "

    PWM" + server.arg("gpio") + " changed to " + server.arg("value") + "

    "); } boolean WebSetIp(IPAddress &addr, const char *id, const char *error) { if (server.arg(id) != "" && !addr.fromString(server.arg(id).c_str())) { WebSendError(error); return false; } return true; } void WebHandleSave() { IPAddress ip; IPAddress gw; IPAddress mask; IPAddress dns; IPAddress dns2; if (!server.hasArg("ssid") || !server.hasArg("password") || !server.hasArg("host") || !server.hasArg("mqttServer") || !server.hasArg("mqttUser") || !server.hasArg("mqttPasswd") || !server.hasArg("mqttPort") || !server.hasArg("ip_config") || !server.hasArg("ip") || !server.hasArg("gw") || !server.hasArg("mask") || !server.hasArg("dns") || !server.hasArg("dns2")) { server.send(500, "text/plain", "Bad arguments\r\n"); return; } //Check Ip configuration if (server.arg("ip_config").toInt() == 1) { if (!WebSetIp(ip, "ip", "Incorrect IP") || !WebSetIp(gw, "gw", "Incorrect Gateway") || !WebSetIp(mask, "mask", "Incorrect NetMask") || !WebSetIp(dns, "dns", "Incorrect DNS") || !WebSetIp(dns2, "dns2", "Incorrect DNS2")) { return; } } productConfig newConf = {BOOTMODE_NORMAL, strdup(server.arg("ssid").c_str()), strdup(server.arg("password").c_str()), strdup(server.arg("host").c_str()), strdup(server.arg("mqttServer").c_str()), strdup(server.arg("mqttUser").c_str()), strdup(server.arg("mqttPasswd").c_str()), server.arg("mqttPort").toInt(), server.arg("ip_config").toInt(), static_cast(ip), static_cast(gw), static_cast(mask), static_cast(dns), static_cast(dns2)}; if (EepromSaveConfig(newConf) < 0) { WebSendError("Cannot Save Credentials (Too long ?Contains \";\"?)\r\n"); return; } if(WiFi.softAPIP() != IPAddress((uint32_t)0)){ //In STA mode, we can test the AP connection WiFi.begin(server.arg("ssid").c_str(), server.arg("password").c_str()); server.send(200, "text/html", "

    Configuration Saved


    " "Check Wifi Configuration
    "); }else{ server.send(200, "text/html", "

    Configuration Saved


    " "Reboot
    "); } } void WebHandleOTA() { SKETCH_DEBUG_PRINTLN("Boot mode Set to OTA"); EepromSaveBootMode(BOOTMODE_OTA); server.send(200, "text/html", "

    OTA Mode set


    " "You can reboot now
    " "Reboot
    "); } void WebHandleNotFound() { String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); } void WebHandleReboot() { SKETCH_DEBUG_PRINTLN("HTTP request to reboot"); server.send(200, "text/html", "

    Device Reboot


    "); ESP.restart(); } String statusToString(wl_status_t status) { switch(status){ case WL_IDLE_STATUS: return String("Idle"); case WL_NO_SSID_AVAIL: return String("Wifi not found"); case WL_CONNECTED: return String("Connected"); case WL_CONNECT_FAILED: return String("Connection failed (Wrong password ?)"); case WL_CONNECTION_LOST: return String("Connection Lost"); case WL_DISCONNECTED: return String("Connecting"); default: return String(status); } } void WebHandleWifiStatus() { String message; if(WiFi.status() == WL_DISCONNECTED) message += ""; message += "

    Wifi Connection Status


    "; message += "Connection to "; message += WiFi.SSID(); message += ":
    "; message += statusToString(WiFi.status()); message += "
    "; if(mode == BOOTMODE_SETUP && WiFi.status() == WL_CONNECTED){ message += "Wifi correctly setup!, you can reboot now
    "; message += "Reboot
    "; } if(WiFi.status() == WL_CONNECT_FAILED || WiFi.status() == WL_NO_SSID_AVAIL){ message += "Try to reconfigure you WiFi details
    "; message += "Enter Setup
    "; } server.send(200, "text/html", message); } void WebBuildGpioControl(){ if (NB_ELEMENTS(gpioWebConf) > 0){ gpioControlHTML += "
    " "Relay"; for (uint i = 0 ; i < NB_ELEMENTS(gpioWebConf) ; i++) { gpioControlHTML += "Relay " + String(gpioWebConf[i]) + " " + "ON/"; gpioControlHTML += "OFF
    "; } gpioControlHTML += "
    "; } } void WebBuildPwmControl(){ if (NB_ELEMENTS(pwmWebConf) > 0){ pwmControlHTML += "
    " "PWM"; for (uint i = 0 ; i < NB_ELEMENTS(pwmWebConf) ; i++) { pwmControlHTML += "PWM " + String(pwmWebConf[i]) + "
    "; pwmControlHTML += ""; } pwmControlHTML += ""; pwmControlHTML += "
    "; } } void WebSetupServer(int ) { WebBuildGpioControl(); WebBuildPwmControl(); server.on("/", WebHandleRoot); server.on("/setup", WebHandleSetup); server.on("/save", WebHandleSave); server.on("/gpio", WebHandleGpio); server.on("/pwm", WebHandlePWM); server.on("/otamode", WebHandleOTA); server.on("/reboot", WebHandleReboot); server.on("/wifiStatus", WebHandleWifiStatus); server.onNotFound(WebHandleNotFound); server.begin(); SKETCH_DEBUG_PRINTLN("HTTP server started"); } #else void WebHandleRoot(){} void WebHandleSetup(){} void WebHandleGpio(){} void WebHandleSave(){} void WebHandleOTA(){} void WebHandleNotFound(){} void WebSetupServer(int bootmode){} #endif