WiFi Manager For Blynk Local server

Okay, I see now - nice idea!

Pete.

2 Likes

Yeah !! Exactly !! Even it will block the hardware buttons too !!

Oops !! My bad !! I was wrong on setting a flag ! Before once the device reboots the flag is reset to 0 !! So doesnt make sense !!
Sorry !!!

1 Like

I believe (if I am understanding @Madhukesh correctly) I have done something like this for a project I did to monitor/control a device. So it is possible. I donā€™t have time to strip the code of all the parts specific to my project, or add in the stuff for local server (i use Blynk server), but I am happy to post to see if it may help.

You have to trigger the wifimanger from a button, and it must be triggered upon first boot to add the initial credentials.

I will leave out libraries, and variable declartions, as it seem there is enough understanding about this in this topic.


//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}

BLYNK_CONNECTED() {
  Serial.println("Connected");

  ReCnctCount = 0;

}

void checkBLYNK(){
  if (Blynk.connected()) {  // If connected run as normal
    //Blynk.run();
  } else {
      //Serial.println("Config WiFi and Blynk Token if you have not already done so");  
      ReCnctFlag = 0;  // Reset reconnection Flag
      ReCnctCount++;  // Increment reconnection Counter
      Serial.print("Attempting reconnection #");
      Serial.println(ReCnctCount);
      Blynk.connect(666);  // Try to reconnect to the server
      Serial.println("Done Attempting ");
      if (Blynk.connected()) {  // If connected run as normal     
        Serial.println("BLYNK RE-Connected");
  }
  }
}

void checkWifiButton(){
  
  if (digitalRead(TRIGGER_PIN) == LOW)
  {

   Serial.println("Reconfiguring WIFI and BLYNK Token");
   
  //clean FS, for testing
  //SPIFFS.format();

  //read configuration from FS json
  Serial.println("mounting FS...");

  if (SPIFFS.begin()) {
    //Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        //Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
         Serial.println("\nparsed json");

          //strcpy(mqtt_server, json["mqtt_server"]);
          //strcpy(mqtt_port, json["mqtt_port"]);
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");
        }
      }
    }
  } else {
   Serial.println("failed to mount FS");
  }
  //end read



  // The extra parameters to be configured (can be either global or just in the setup)
  // After connecting, parameter.getValue() will get you the configured value
  // id/name placeholder/prompt default length
  //WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40);
  //WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 6);
  WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 33);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);

  //set static ip -
  //wifiManager.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
  
  //add all your parameters here
  //wifiManager.addParameter(&custom_mqtt_server);
  //wifiManager.addParameter(&custom_mqtt_port);
  wifiManager.addParameter(&custom_blynk_token);

  //reset settings - for testing
  wifiManager.resetSettings();

  //set minimu quality of signal so it ignores AP's under that quality
  //defaults to 8%
  //wifiManager.setMinimumSignalQuality();
  
  //sets timeout until configuration portal gets turned off
  //useful to make it all retry or go to sleep
  //in seconds
  wifiManager.setTimeout(120);

  //fetches ssid and pass and tries to connect
  //if it does not connect it starts an access point with the specified name
  //here  "AutoConnectAP"
  //and goes into a blocking loop awaiting configuration
  if (!wifiManager.startConfigPortal("WIFI", "pass")) {
    Serial.println("failed to connect and hit timeout");
   //delay(3000);
    //reset and try again, or maybe put it to deep sleep
   // ESP.reset();
    //delay(5000);
  }

  //if you get here you have connected to the WiFi
  Serial.println("connected...yeey :)");

  //read updated parameters
  //strcpy(mqtt_server, custom_mqtt_server.getValue());
  //strcpy(mqtt_port, custom_mqtt_port.getValue());
  strcpy(blynk_token, custom_blynk_token.getValue());

  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    //json["mqtt_server"] = mqtt_server;
    //json["mqtt_port"] = mqtt_port;
    json["blynk_token"] = blynk_token;

    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }

    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

  Serial.println("local ip");
  Serial.println(WiFi.localIP());

  Blynk.config(blynk_token);
  bool result = Blynk.connect();

if (result != true)
{
  Serial.println("BLYNK Connection Fail");
  Serial.println(blynk_token);

}
else
{
  //Serial.println("BLYNK Connected");
  
}
}
}



void setup() {
   // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println();

  pinMode(TRIGGER_PIN, INPUT_PULLUP);
 

  
 timer.setInterval(30056, checkBLYNK);
 timer.setInterval(413L, checkWifiButton);
 
  //clean FS, for testing
  //SPIFFS.format();

  //read configuration from FS json
  //Serial.println("mounting FS...");

  if (SPIFFS.begin()) {
    //Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
     // Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        //Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          //Serial.println("\nparsed json");

          //strcpy(mqtt_server, json["mqtt_server"]);
          //strcpy(mqtt_port, json["mqtt_port"]);
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          //Serial.println("failed to load json config");
        }
      }
    }
  } else {
    //Serial.println("failed to mount FS");
  }
  //end read



  // The extra parameters to be configured (can be either global or just in the setup)
  // After connecting, parameter.getValue() will get you the configured value
  // id/name placeholder/prompt default length
  WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 33);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);

  //set static ip
  //wifiManager.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
  
  //add all your parameters here

  wifiManager.addParameter(&custom_blynk_token);


  //read updated parameters
  //strcpy(mqtt_server, custom_mqtt_server.getValue());
  //strcpy(mqtt_port, custom_mqtt_port.getValue());
  strcpy(blynk_token, custom_blynk_token.getValue());

  //save the custom parameters to FS
  if (shouldSaveConfig) {
    //Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    //json["mqtt_server"] = mqtt_server;
    //json["mqtt_port"] = mqtt_port;
    json["blynk_token"] = blynk_token;

    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      //Serial.println("failed to open config file for writing");
    }

    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }
    
   while (WiFi.status() != WL_CONNECTED) {
       int mytimeout = 5;
    delay(500);
    Serial.print(".");
    if((millis() / 1000) > mytimeout ){ // try for less than 6 seconds to connect to WiFi router
      Serial.println(" ");
      break;
    }
   }

   if(WiFi.status() == WL_CONNECTED){  
    //if you get here you have connected to the WiFi
   Serial.println(" ");
   Serial.println("connected to WiFi!! yay :)");
   Serial.println("IP address: ");
   Serial.println(WiFi.localIP()); 
 
 
  Blynk.config(blynk_token);
  bool result = Blynk.connect();

  if (result != true)
  {
  Serial.println("BLYNK Connection Fail");
  Serial.println(blynk_token);
  //wifiManager.resetSettings();
  //ESP.reset();
  //delay (5000);
  }
  else
  {
  Serial.println("BLYNK Connected!! Yay again");
  }
 }
 else if (WiFi.status() != WL_CONNECTED){
  Serial.println("WiFi Connection Fail");
 }

 
 
 
 }

void loop() {

 timer.run();
  if (Blynk.connected()) {  // If connected run as normal
    Blynk.run();
  }

  

}
2 Likes

Once the device is booted and connected and later if the router goes down, then no issues !!
serial monitor :point_down:

Initializing the Credential's File
Mounting the Credential's
Reading config file
Opened config file
{"server":"192.168.0.103","port":"8080","auth":"f1750966c7c94490b3e7xxxxxxxxx"}
parsed json
*WM: Adding parameter
*WM: server
*WM: Adding parameter
*WM: port
*WM: Adding parameter
*WM: blynk
*WM: 
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Using last saved values, should be faster
*WM: Connection result: 
*WM: 3
*WM: IP Address:
*WM: 192.168.0.106
Connected
Blynk Successfully Connected
Starting reconnection timer in 10 seconds...
Attempting reconnection #1
Starting reconnection timer in 10 seconds...
Attempting reconnection #2
Starting reconnection timer in 10 seconds...
Attempting reconnection #3
Connected

Blynk will take over and try to reconnect !! But if both device and router will be down it will take two or three attempts to connect that is roughly 180 odd secā€¦ and i want to eliminate that !

This is helpful if the device wants to be ever reconfigured !!
I will give this a try ! But i have no pins empty on my nodemcu !! i will have to make few changes and try thisā€¦ I will keep you updated on what i upto !!