Example #1
0
/**
 * Setup handlers for each plugin and sensor
 * Structure is /api/<plugin>/<sensor>
 */
void registerPlugins()
{
  Plugin::each([](Plugin* plugin) {
    DEBUG_MSG(SERVER, "register plugin: %s\n", plugin->getName().c_str());

    // register one handler per sensor
    String baseUri = "/api/" + plugin->getName() + "/";
    for (int8_t sensor=0; sensor<plugin->getSensors(); sensor++) {
      String uri = String(baseUri);
      char addr_c[20];
      plugin->getAddr(addr_c, sensor);
      uri += addr_c;
      DEBUG_MSG(SERVER, "register sensor: %s\n", uri.c_str());

      g_server.addHandler(new PluginRequestHandler(uri.c_str(), plugin, sensor));
    }
  });
}
//------------------------------------------
void WebDS18B20Buses::InitWebServer(AsyncWebServer &server) {

  server.on("/getList", HTTP_GET, [this](AsyncWebServerRequest * request) {

    //check DS18B20Buses is initialized
    if (!_initialized) {
      request->send(400, F("text/html"), F("Buses not Initialized"));
      return;
    }

    //check bus param is there
    if (!request->hasParam(F("bus"))) {
      request->send(400, F("text/html"), F("Missing parameter"));
      return;
    }
    //convert busNumber
    int busNumber = request->getParam(F("bus"))->value().toInt();
    //check value found
    if ((busNumber == 0 && request->getParam(F("bus"))->value() != "0") || busNumber >= _nbOfBuses) {
      request->send(400, F("text/html"), F("Incorrect bus number"));
      return;
    }

#if ESP01_PLATFORM
    Serial.flush();
    delay(5);
    Serial.end();
#endif

    //list OneWire Temperature sensors
    request->send(200, F("text/json"), DS18B20Bus(_owBusesPins[busNumber][0], _owBusesPins[busNumber][1]).GetRomCodeListJSON());

#if ESP01_PLATFORM
    Serial.begin(SERIAL_SPEED);
#endif
  });

  server.on("/getTemp", HTTP_GET, [this](AsyncWebServerRequest * request) {

    //check DS18B20Buses is initialized
    if (!_initialized) {
      request->send(400, F("text/html"), F("Buses not Initialized"));
      return;
    }

    //check bus param
    if (!request->hasParam(F("bus"))) {
      request->send(400, F("text/html"), F("Missing parameter"));
      return;
    }
    //convert busNumber
    int busNumber = request->getParam(F("bus"))->value().toInt();
    //check value found
    if ((busNumber == 0 && request->getParam(F("bus"))->value() != "0") || busNumber >= _nbOfBuses) {
      request->send(400, F("text/html"), F("Incorrect bus number"));
      return;
    }


    //check ROMCode param
    if (!request->hasParam(F("ROMCode"))) {
      request->send(400, F("text/html"), F("Missing ROMCode"));
      return;
    }

    const char* ROMCodeA = request->getParam(F("ROMCode"))->value().c_str();

    if (!isROMCodeString(ROMCodeA)) {
      request->send(400, F("text/html"), F("Incorrect ROMCode"));
      return;
    }

    //Parse ROMCode
    byte romCode[8];
    for (byte i = 0; i < 8; i++) {
      romCode[i] = (AsciiToHex(ROMCodeA[i * 2]) * 0x10) + AsciiToHex(ROMCodeA[(i * 2) + 1]);
    }

#if ESP01_PLATFORM
    Serial.flush();
    delay(5);
    Serial.end();
#endif

    //Read Temperature
    String temperatureJSON = DS18B20Bus(_owBusesPins[busNumber][0], _owBusesPins[busNumber][1]).GetTempJSON(romCode);

    if (temperatureJSON.length() > 0) request->send(200, F("text/json"), temperatureJSON);
    else request->send(500, F("text/html"), F("Read sensor failed"));

#if ESP01_PLATFORM
    Serial.begin(SERIAL_SPEED);
#endif
  });

  server.on("/gs1", HTTP_GET, [this](AsyncWebServerRequest * request) {
    request->send(200, F("text/json"), GetStatus());
  });
}
Example #3
0
/**
 * Initialize web server and add requests
 */
void webserver_start()
{
  // not found
  g_server.onNotFound(handleNotFound);

#ifdef CAPTIVE_PORTAL
  // handle captive requests
  g_server.addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER);
#endif

  // CDN
  g_server.on("/js/jquery-2.1.4.min.js", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->redirect(F("http://code.jquery.com/jquery-2.1.4.min.js"));
  }).setFilter(ON_STA_FILTER);
  g_server.on("/css/foundation.min.css", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->redirect(F("http://cdnjs.cloudflare.com/ajax/libs/foundation/6.2.3/foundation.min.css"));
  }).setFilter(ON_STA_FILTER);

  // GET
  g_server.on("/api/status", HTTP_GET, handleGetStatus);
  g_server.on("/api/plugins", HTTP_GET, handleGetPlugins);
  g_server.on("/api/scan", HTTP_GET, handleWifiScan);

  // POST
  g_server.on("/settings", HTTP_POST, handleSettings);
  g_server.on("/restart", HTTP_POST, [](AsyncWebServerRequest *request) {
    // AsyncWebServerResponse *response = request->beginResponse(302);
    // response->addHeader("Location", net_hostname + ".local");
    // request->send(response);

    request->send(200, F(CONTENT_TYPE_HTML), F("<!DOCTYPE html><html><head><meta http-equiv=\"refresh\" content=\"5; url=/\"></head><body>Restarting...<br/><img src=\"/img/loading.gif\"></body></html>"));
    requestRestart();
  });

  // make sure config.json is not served!
  g_server.on("/config.json", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send(400);
  });

  // catch-all
  g_server.serveStatic("/", SPIFFS, "/", CACHE_HEADER).setDefaultFile("index.html");

  // sensor api
  registerPlugins();

#ifdef SPIFFS_EDITOR
  g_server.addHandler(new SPIFFSEditor());
#endif

#ifdef BROWSER_EVENTS
  g_server.addHandler(&g_events);
#endif

  // start server
  g_server.begin();
}