add MQTT and OTA update support

This commit is contained in:
Bernd Stellwag 2024-09-10 20:37:41 +02:00
parent 3746d1a4d6
commit 34bd9746d1
2 changed files with 62 additions and 10 deletions

View File

@ -13,10 +13,11 @@ platform = espressif8266
framework = arduino framework = arduino
monitor_speed = 115200 monitor_speed = 115200
upload_speed = 500000 upload_speed = 500000
upload_protocol = espota
upload_port = led-marquee-sign.fablab.local
# Serial1 (sign data) maps to D4 by default # Serial1 (sign data) maps to D4 by default
[env:d1_mini] [env:d1_mini]
board = d1_mini board = d1_mini
lib_deps = adafruit/Adafruit MQTT Library@^2.5.8
[env:nodemcuv2] lib_ignore = WiFi101
board = nodemcuv2

View File

@ -1,6 +1,11 @@
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h> #include <ESP8266WiFiMulti.h>
#include <ESP8266mDNS.h> #include <ESP8266mDNS.h>
#include <ESP8266WebServer.h> #include <ESP8266WebServer.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "credentials.h" #include "credentials.h"
#include "webserver.h" #include "webserver.h"
@ -10,6 +15,16 @@
static ESP8266WiFiMulti wifiMulti; static ESP8266WiFiMulti wifiMulti;
static SocketServer socketServer; static SocketServer socketServer;
#define AIO_SERVER credentials::mqtt_hostname.c_str()
#define AIO_SERVERPORT credentials::mqtt_port
#define AIO_USERNAME credentials::mqtt_username.c_str()
#define AIO_KEY credentials::mqtt_password.c_str()
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe mqtt_subscribe_topic = Adafruit_MQTT_Subscribe(&mqtt, "homeassistant/marquee_sign/text");
void MQTT_connect();
void setup() { void setup() {
// serial console, for use via USB (also exposed to TXD0/RXD0 GPIOs) // serial console, for use via USB (also exposed to TXD0/RXD0 GPIOs)
Serial.begin(115200); Serial.begin(115200);
@ -20,7 +35,10 @@ void setup() {
Serial1.begin(9600); Serial1.begin(9600);
// configure WiFi and connect to the network // configure WiFi and connect to the network
WiFi.mode(WIFI_STA);
WiFi.hostname(credentials::mdnsHostname);
wifiMulti.addAP(credentials::ssid.c_str(), credentials::psk.c_str()); wifiMulti.addAP(credentials::ssid.c_str(), credentials::psk.c_str());
Serial.println("Connecting to Wi-Fi network..."); Serial.println("Connecting to Wi-Fi network...");
while (wifiMulti.run() != WL_CONNECTED) { while (wifiMulti.run() != WL_CONNECTED) {
delay(1000); delay(1000);
@ -32,16 +50,13 @@ void setup() {
Serial.print(", IP address: "); Serial.print(", IP address: ");
Serial.println(WiFi.localIP()); Serial.println(WiFi.localIP());
ArduinoOTA.begin();
mqtt.subscribe(&mqtt_subscribe_topic);
// might be handy to have the IP written on the sign // might be handy to have the IP written on the sign
sendTextToSign(WiFi.localIP().toString()); sendTextToSign(WiFi.localIP().toString());
// publish this service using mDNS so that it's easy to find it in the LAN
if (MDNS.begin(credentials::mdnsHostname)) {
Serial.println("mDNS started up successfully");
} else {
Serial.println("Error: failed to start mDNS");
}
// configure HTTP endpoints // configure HTTP endpoints
configureWebServer(); configureWebServer();
@ -53,4 +68,40 @@ void setup() {
void loop() { void loop() {
webServer.handleClient(); webServer.handleClient();
socketServer.handleClient(); socketServer.handleClient();
ArduinoOTA.handle();
MQTT_connect();
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
const char* signText = (char *)mqtt_subscribe_topic.lastread;
sendTextToSign(signText);
}
}
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
uint8_t retries = 6;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
mqtt.disconnect();
// wait 10s till next try
for (int i = 0; i < 10000; i += 5) {
ArduinoOTA.handle();
delay(5);
}
retries--;
if (retries == 0) {
ESP.restart();
}
}
} }