Skip to content
This repository has been archived by the owner on Jul 12, 2024. It is now read-only.

[v2] ESPConnect v2 Proposal #23

Closed
wants to merge 1 commit into from

Conversation

mathieucarbou
Copy link

@mathieucarbou mathieucarbou commented Dec 14, 2023

Note: the logo is only in my local fork - not in this PR. This PR has the default ESpConnect logo of course.

Here is the code rewrite of ESPConnect I did and which I am using.

  • Supports staying in AP Mode
  • Display WiFi signal
  • Supports Async mode (loop) and blocking mode (like old behaviour)
  • ESP32 only - I wont' even work on a 8266 variant - don't ask me ;-)
  • ESPConnect network stack can be reconfigured live with ESPConnect.end() followed by ESPConnect.begin()

Debug

-D ESPCONNECT_DEBUG

Usage

Add: -D ESPCONNECT_V2

See API doc for more info.

  ESPConnect.setAutoRestart(false);  // true to switch back to old behaviour
  ESPConnect.setBlocking(false); // true to switch back to old behaviour

  ESPConnect.setCaptivePortalTimeout(Config.getInt(KEY_CAPTURE_PORTAL_TIMEOUT));
  ESPConnect.setWiFiConnectTimeout(Config.getInt(KEY_WIFI_CONNECTION_TIMEOUT));

  // using this being() method will use auto-load and auto-save internal code for apMode flag and wifi creds
  ESPConnect.begin(&Mycila::HTTPd.server,
                   Config.get(KEY_HOSTNAME),
                   AppInfo.name + "-" + AppInfo.id,
                   Config.get(KEY_ADMIN_PASSWORD));

    // using this being() method WON'T use auto-load and auto-save internal code for apMode flag and wifi creds: up to the user to handle saving (that's what I am using)
  ESPConnect.begin(&HTTPd.server,
                   Config.get(KEY_HOSTNAME),
                   AppInfo.name + "-" + AppInfo.id,
                   Config.get(KEY_ADMIN_PASSWORD),
                   {Config.get(KEY_WIFI_SSID), Config.get(KEY_WIFI_PASSWORD), Mycila::Config.getBool(KEY_AP_MODE_ENABLE)});

If using aync (non-blocking) mode, you need to call loop()

Events

You can listen to events like that. If not using auto restart, you need to listen to events to decide what to fo when reaching a final state!

Example:

  ESPConnect.listen([&](ESPConnectState previous, ESPConnectState state) {
    Mycila::Logger.debug(TAG, "NetworkState: %s => %s", ESPConnect.getStateName(previous), ESPConnect.getStateName(state));

    switch (state) {
    case ESPConnectState::STA_CONNECTED:
      Mycila::Logger.info(TAG, "Connected to WiFi %s with IP address %s", ESPConnect.getWiFiSSID().c_str(), ESPConnect.getIPAddress().toString().c_str());
      break;

    case ESPConnectState::AP_CONNECTED:
      Mycila::Logger.info(TAG, "Access Point %s started with IP address %s", ESPConnect.getWiFiSSID().c_str(), ESPConnect.getIPAddress().toString().c_str());
      break;

    case ESPConnectState::STA_DISCONNECTED:
      Mycila::Logger.warn(TAG, "Disconnected from WiFi %s", ESPConnect.getWiFiSSIDConfigured().c_str());
      _events.push(AppEvent::NETWORK_DISCONNECTED);
      break;

    case ESPConnectState::NETWORK_DISABLED:
      Mycila::Logger.info(TAG, "Disable Network...");
      break;

    case ESPConnectState::STA_CONNECTING:
      Mycila::Logger.info(TAG, "Connecting to WiFi %s (timeout: %u seconds)...", ESPConnect.getWiFiSSIDConfigured().c_str(), ESPConnect.getWiFiConnectTimeout());
      break;

    case ESPConnectState::AP_CONNECTING:
      Mycila::Logger.info(TAG, "Starting Access Point %s...", ESPConnect.getAccessPointSSID().c_str());
      break;

    case ESPConnectState::PORTAL_STARTING:
      Mycila::Logger.info(TAG, "Starting Captive Portal %s for %u seconds...", ESPConnect.getAccessPointSSID().c_str(), ESPConnect.getCaptivePortalTimeout());
      break;

    case ESPConnectState::PORTAL_STARTED:
      Mycila::Logger.info(TAG, "Captive Portal started at %s with IP address %s", ESPConnect.getWiFiSSID().c_str(), ESPConnect.getIPAddress().toString().c_str());
      break;

    case ESPConnectState::PORTAL_COMPLETE: {
      bool ap = ESPConnect.isAPMode();
      if (ap) {
        Mycila::Logger.info(TAG, "Captive Portal: Access Point configured");
        // SAVE CONFIG
        Mycila::Config.setBool(KEY_AP_MODE_ENABLE, true);
      } else {
        Mycila::Logger.info(TAG, "Captive Portal: WiFi configured");
        // SAVE CONFIG
        Mycila::Config.setBool(KEY_AP_MODE_ENABLE, false);
        Mycila::Config.set(KEY_WIFI_SSID, ESPConnect.getWiFiSSIDConfigured());
        Mycila::Config.set(KEY_WIFI_PASSWORD, ESPConnect.getWiFiPassword());
      }
      // TRIGGER ESP RESTART
      _restartThrottle.setEnable(true);
      break;
    }

    case ESPConnectState::PORTAL_TIMEOUT:
      Mycila::Logger.warn(TAG, "Captive Portal: timed out.");
      // TRIGGER ESP RESTART    
      _restartThrottle.setEnable(true);
      break;

    case ESPConnectState::STA_TIMEOUT:
      Mycila::Logger.error(TAG, "Unable to connect to SSID: %s", ESPConnect.getWiFiSSIDConfigured().c_str());
      break;

    case ESPConnectState::STA_RECONNECTING:
      Mycila::Logger.info(TAG, "Trying to reconnect to WiFi %s", ESPConnect.getWiFiSSIDConfigured().c_str());
      break;

    default:
      break;
    }
  });

@mathieucarbou mathieucarbou changed the title ESPConnect v2 Proposal [v2] ESPConnect v2 Proposal Dec 14, 2023
@mathieucarbou
Copy link
Author

MycilaESPConnect fork is available in platformio registry and Arduino lib manager.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
1 participant