3

I'm trying to test a two combined examples: OTA and MQTT.

My goal it to check a LastWill when disconnecting an ESP8266 device. Surprisingly, a LWT is not sent to designated topic.

code has not actual meaning but: connecting to WiFi, publishing an online retained message, and running an OTA handle for code fixing:

Why offline is not published?

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>

#ifndef STASSID #define STASSID "XXXXX" #define STAPSK "XXXXXXX" #endif

const char* ssid = STASSID; const char* password = STAPSK; // //const char* ssid = "........"; //const char* password = "........"; const char* mqtt_server = "192.168.3.200";

WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; int value = 0;

void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println();

// Switch on the LED if an 1 was received as first character if ((char)payload[0] == '1') { digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level

}

void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str()),"guy","kupelu9e","Avail",0,true,"offline") { Serial.println("connected"); // Once connected, publish an announcement... client.publish("outTopic", "hello world"); client.publish("Avail", "online",true);

  // ... and resubscribe
  client.subscribe(&quot;inTopic&quot;);
} else {
  Serial.print(&quot;failed, rc=&quot;);
  Serial.print(client.state());
  Serial.println(&quot; try again in 5 seconds&quot;);
  // Wait 5 seconds before retrying
  delay(5000);
}

} }

void setup() { pinMode(BUILTIN_LED, OUTPUT);

Serial.begin(115200); Serial.println("Booting"); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); }

randomSeed(micros());

client.setServer(mqtt_server, 1883); client.setCallback(callback); reconnect(); client.publish("Avail2", "boot");

ArduinoOTA.onStart( { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_SPIFFS type = "filesystem"; }

// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println(&quot;Start updating &quot; + type);

});

ArduinoOTA.onEnd( { Serial.println("\nEnd"); });

ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); });

ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); }

void loop() { ArduinoOTA.handle();

// but actually the LED is on; this is because
// it is active low on the ESP-01)

} else { digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH }

}

void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str()),"guy","kupelu9e","Avail",0,true,"offline") { Serial.println("connected"); // Once connected, publish an announcement... client.publish("outTopic", "hello world"); client.publish("Avail", "online",true);

  // ... and resubscribe
  client.subscribe(&quot;inTopic&quot;);
} else {
  Serial.print(&quot;failed, rc=&quot;);
  Serial.print(client.state());
  Serial.println(&quot; try again in 5 seconds&quot;);
  // Wait 5 seconds before retrying
  delay(5000);
}

} }

void setup() { pinMode(BUILTIN_LED, OUTPUT);

Serial.begin(115200); Serial.println("Booting"); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); }

randomSeed(micros());

client.setServer(mqtt_server, 1883); client.setCallback(callback); reconnect(); client.publish("Avail2", "boot");

ArduinoOTA.onStart( { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_SPIFFS type = "filesystem"; }

// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println(&quot;Start updating &quot; + type);

});

ArduinoOTA.onEnd( { Serial.println("\nEnd"); });

ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); });

ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); }

void loop() { ArduinoOTA.handle();

if (!client.connected()) { reconnect(); } client.loop(); delay(100); }

I'm using a local raspberryPi zero, running mosquitto.

anonymous2
  • 4,872
  • 3
  • 20
  • 48
guyd
  • 851
  • 8
  • 17

0 Answers0