add MQTT and OTA update support #1

Open
burned42 wants to merge 6 commits from add_mqtt into main
2 changed files with 62 additions and 10 deletions
Showing only changes of commit 34bd9746d1 - Show all commits

View File

@ -13,10 +13,11 @@ platform = espressif8266
framework = arduino
monitor_speed = 115200
upload_speed = 500000
upload_protocol = espota
Review

I presume with this change, flashing initially with USB is no longer an option? I.e., this needs to be commented? If so, I'd appreciate a short comment. It's been a really long time since I've used ArduinoOTA.

I presume with this change, flashing initially with USB is no longer an option? I.e., this needs to be commented? If so, I'd appreciate a short comment. It's been a really long time since I've used ArduinoOTA.
Review

I honestly have no idea. I was happy when I got this working with the platform io thingy.

I honestly have no idea. I was happy when I got this working with the platform io thingy.
upload_port = led-marquee-sign.fablab.local

Would it be sufficient just to target the mDNS hostname that by default should be led-marquee-sign.local?

Would it be sufficient just to target the mDNS hostname that by default should be `led-marquee-sign.local`?

IIRC that didn't work when we tried that.

IIRC that didn't work when we tried that.

Works when using just led-marquee-sign :)

Works when using just `led-marquee-sign` :)

That is some odd behavior, but then again, if it works... mDNS is pretty standard with these IoT devices nowadays. For example, WLED also advertises a (user-configurable) hostname. Perhaps PlatformIO applies some magic here.

That is some odd behavior, but then again, if it works... mDNS is pretty standard with these IoT devices nowadays. For example, [WLED](https://kno.wled.ge/) also advertises a (user-configurable) hostname. Perhaps PlatformIO applies some magic here.
# Serial1 (sign data) maps to D4 by default
[env:d1_mini]
board = d1_mini
[env:nodemcuv2]
board = nodemcuv2
lib_deps = adafruit/Adafruit MQTT Library@^2.5.8
lib_ignore = WiFi101

View File

@ -1,6 +1,11 @@
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "credentials.h"
#include "webserver.h"
@ -10,6 +15,16 @@
static ESP8266WiFiMulti wifiMulti;
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;
fmueller marked this conversation as resolved Outdated

Please add a blank line above.

Please add a blank line above.

done 👍

done 👍
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() {
// serial console, for use via USB (also exposed to TXD0/RXD0 GPIOs)
Serial.begin(115200);
@ -20,7 +35,10 @@ void setup() {
Serial1.begin(9600);
// 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());
Serial.println("Connecting to Wi-Fi network...");
while (wifiMulti.run() != WL_CONNECTED) {
delay(1000);
@ -32,16 +50,13 @@ void setup() {
Serial.print(", IP address: ");
Serial.println(WiFi.localIP());
ArduinoOTA.begin();
mqtt.subscribe(&mqtt_subscribe_topic);
// might be handy to have the IP written on the sign
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
configureWebServer();
@ -53,4 +68,40 @@ void setup() {
void loop() {
webServer.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
Review

I'd highly appreciate if you'd avoid the use of inline comments.

I'd highly appreciate if you'd avoid the use of inline comments.
Review

I think I copied the whole function from some code in an example of one of the libraries. Feel free to adjust to your prefered code style.

I think I copied the whole function from some code in an example of one of the libraries. Feel free to adjust to your prefered code style.
Review

Will do. I'll also test the USB flashing locally.

Will do. I'll also test the USB flashing locally.
mqtt.disconnect();
// wait 10s till next try
for (int i = 0; i < 10000; i += 5) {
ArduinoOTA.handle();
fmueller marked this conversation as resolved Outdated

A chance to flash it while it's in the back-off? I'd appreciate a comment explaining this line.

A chance to flash it while it's in the back-off? I'd appreciate a comment explaining this line.

see above, I copied this from an example from one of the used libraries

see above, I copied this from an example from one of the used libraries
delay(5);
}
retries--;
if (retries == 0) {
ESP.restart();
fmueller marked this conversation as resolved
Review

Why not restart right away? I mean, sure, it's not quite necessary to do so, but it wouldn't hurt a lot either. Is there some rate limit?

Why not restart right away? I mean, sure, it's not quite necessary to do so, but it wouldn't hurt a lot either. Is there some rate limit?
Review

see above, I copied this from an example from one of the used libraries

see above, I copied this from an example from one of the used libraries
}
}
}