From a517cd8db485faaf0e63122798ddd266371cb36e Mon Sep 17 00:00:00 2001 From: manuel Date: Fri, 25 Dec 2020 23:37:33 +0100 Subject: Improve and harmonize code --- linz/oekofen_thermo/platformio.ini | 1 + linz/oekofen_thermo/src/main.cpp | 158 +++++++++++++++++++++++++--- oliver/dr_desk/platformio.ini | 1 + oliver/dr_desk/src/main.cpp | 172 +++++++++++++++--------------- oliver/lr_stripes/platformio.ini | 1 + oliver/lr_stripes/src/main.cpp | 208 ++++++++++++++++++++----------------- 6 files changed, 349 insertions(+), 192 deletions(-) diff --git a/linz/oekofen_thermo/platformio.ini b/linz/oekofen_thermo/platformio.ini index 2c7b00e..625bc4f 100644 --- a/linz/oekofen_thermo/platformio.ini +++ b/linz/oekofen_thermo/platformio.ini @@ -11,6 +11,7 @@ [env:d1_mini] platform = espressif8266 board = d1_mini +lib_deps = WiFiManager, PubSubClient framework = arduino monitor_speed = 115200 upload_speed = 115200 diff --git a/linz/oekofen_thermo/src/main.cpp b/linz/oekofen_thermo/src/main.cpp index 5713a0b..084a305 100644 --- a/linz/oekofen_thermo/src/main.cpp +++ b/linz/oekofen_thermo/src/main.cpp @@ -2,14 +2,48 @@ #include #include -#include "MCP42010.h" +#include +#include + +#include "secrets.h" + +#define MQTT_BROKER "192.168.0.6" +#define MQTT_BROKER_PORT 1883 +//#define MQTT_USERNAME "" +//#define MQTT_PASSWORD "" +#define MQTT_BASE "home/oekofen" + +// fw update +// - increment number + build +// - scp .pio/build/$ENV/firmware.bin manuel@mausz.at:public_html/coding/.firmware/oekofen.bin +// - reboot device or send "fwupdate" to mqtt_topic_cmd +// - fw update state is published in mqtt_topic_state +#define FIRMWARE_VERSION 1 +//#define FIRMWARE_URL "" + +#define _STR(s) #s +#define STR(s) _STR(s) + +const String mqtt_clientId = "OekoFen-" + String(ESP.getChipId()) + + "/v" + STR(FIRMWARE_VERSION); +const char* mqtt_topic_ping = MQTT_BASE "/ping"; +const char* mqtt_topic_cmd = MQTT_BASE "/command"; +const String mqtt_topic_state = String(MQTT_BASE) + "/" + String(ESP.getChipId()); + +bool mqttLoop(); +void mqttCallback(char *topic, byte *payload, unsigned int length); +void checkFirmwareUpdate(); + +WiFiClient wifi_client; +PubSubClient mqtt(wifi_client); ESP8266WebServer http_service(80); -MCP42010 msp42010(D8); void setup() { Serial.begin(115200); - msp42010.setup(); + analogWriteFreq(8000); + pinMode(D3, OUTPUT); + pinMode(LED_BUILTIN, OUTPUT); WiFiManager wifiManager; wifiManager.setConfigPortalTimeout(600); @@ -22,25 +56,119 @@ void setup() { ESP.restart(); } + yield(); + checkFirmwareUpdate(); + yield(); + + mqtt.setServer(MQTT_BROKER, MQTT_BROKER_PORT); + mqtt.setCallback(mqttCallback); + http_service.on("/", HTTP_GET, []() { - uint8_t val = random(0, 255); - //msp42010.setPot(MCP42010::P0, val); - msp42010.setPot(MCP42010::P1, val); - http_service.send(200, PSTR("text/plain"), String(val)); + http_service.send_P(200, PSTR("text/plain"), PSTR("I'm an oekofen fake thermostat")); + }); + http_service.on("/set", HTTP_POST, []() { + if (!http_service.hasArg("value")) { + http_service.send_P(400, PSTR("text/plain"), PSTR("Bad Request")); + return; + } + + int val = http_service.arg("value").toInt(); + int pwm_val = constrain(val, 0, 1023); + analogWrite(D3, pwm_val); + http_service.send(200, "text/plain", String(pwm_val)); }); http_service.begin(); Serial.println("Setup done"); } -void loop() { - //http_service.handleClient(); - if (Serial.available() > 0) +bool mqttLoop() +{ + if (!mqtt.connected()) { - while (Serial.read() >= 0) {} - uint8_t val = random(0, 255); - //msp42010.setPot(MCP42010::P0, val); - msp42010.setPot(MCP42010::P1, val); - Serial.println(val, DEC); + Serial.printf_P(PSTR("Connecting to MQTT\n")); + if (!mqtt.connect(mqtt_clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD)) + return false; + + Serial.printf_P(PSTR("MQTT connected\n")); + mqtt.publish(mqtt_topic_ping, mqtt_clientId.c_str()); + mqtt.subscribe(mqtt_topic_ping); + mqtt.subscribe(mqtt_topic_cmd); } + + yield(); + mqtt.loop(); + return true; +} + +void mqttCallback(char *topic, byte *payload, unsigned int length) +{ + char c_payload[length + 1]; + memcpy(c_payload, payload, length); + c_payload[length] = '\0'; + + if (!strcmp(topic, mqtt_topic_ping)) + { + if (!strcmp(c_payload, "ping")) + mqtt.publish(mqtt_topic_ping, mqtt_clientId.c_str()); + return; + } + else if (!strcmp(topic, mqtt_topic_cmd)) + { + if (!strcmp(c_payload, "TODO")) + { + return; + } + else if (!strcmp(c_payload, "fwupdate")) + { + checkFirmwareUpdate(); + return; + } + else if (!strcmp(c_payload, "reset")) + { + Serial.printf_P(PSTR("Resetting\n")); + ESP.reset(); + return; + } + } + + Serial.printf_P(PSTR("Unhandled MQTT message: [%s] %s\n"), topic, c_payload); +} + +void checkFirmwareUpdate() +{ + BearSSL::WiFiClientSecure update_client; + update_client.setInsecure(); + + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate running"); + ESPhttpUpdate.setLedPin(LED_BUILTIN, HIGH); + ESPhttpUpdate.rebootOnUpdate(true); + t_httpUpdate_return ret = ESPhttpUpdate.update(update_client, FIRMWARE_URL, STR(FIRMWARE_VERSION)); + switch(ret) + { + case HTTP_UPDATE_FAILED: + { + Serial.printf_P(PSTR("HTTP_UPDATE_FAILED Error (%d): %s\n"), + ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str()); + String tmp = String("fwupdate error: ") + ESPhttpUpdate.getLastErrorString(); + mqtt.publish(mqtt_topic_state.c_str(), tmp.c_str()); + } + break; + + case HTTP_UPDATE_NO_UPDATES: + Serial.printf_P(PSTR("HTTP_UPDATE_NO_UPDATES\n")); + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate noupdates"); + break; + + case HTTP_UPDATE_OK: + Serial.printf_P(PSTR("HTTP_UPDATE_OK\n")); + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate ok"); + break; + } +} + +void loop() { + http_service.handleClient(); + if (!mqttLoop()) + delay(5000); } diff --git a/oliver/dr_desk/platformio.ini b/oliver/dr_desk/platformio.ini index c6d35d4..e5c54f1 100644 --- a/oliver/dr_desk/platformio.ini +++ b/oliver/dr_desk/platformio.ini @@ -13,6 +13,7 @@ default_envs = nodemcuv2 [env:nodemcuv2] platform = espressif8266 board = nodemcuv2 +lib_deps = WiFiManager, PubSubClient, FastLED framework = arduino monitor_speed = 115200 upload_speed = 115200 diff --git a/oliver/dr_desk/src/main.cpp b/oliver/dr_desk/src/main.cpp index 6f31b76..8791c80 100644 --- a/oliver/dr_desk/src/main.cpp +++ b/oliver/dr_desk/src/main.cpp @@ -1,22 +1,17 @@ #include #include -#include #include #include +#include #include -#include "secrets.h" -#define _STR(s) #s -#define STR(s) _STR(s) - -const char* mqtt_server = "192.168.1.2"; //MQTT Server IP, your home MQTT server eg Mosquitto on RPi, or some public MQTT -const int mqtt_port = 1883; //MQTT Server PORT, default is 1883 but can be anything. - -const char* mqtt_pingall_sub = "home/pingall"; -const char* mqtt_pingall_pub = "home/pingall/response"; +#include "secrets.h" -#define MQTT_BASE "home/diningroom/desk" -const char* mqtt_device_boot = MQTT_BASE "/device"; +#define MQTT_BROKER "192.168.1.5" +#define MQTT_BROKER_PORT 1883 +//#define MQTT_USERNAME "" +//#define MQTT_PASSWORD "" +#define MQTT_BASE "home/diningroom/desk" const char* mqtt_mode_sub = MQTT_BASE; const char* mqtt_mode_pub = MQTT_BASE "/status"; @@ -33,16 +28,25 @@ const char* mqtt_brightness_pub = MQTT_BASE "/brightness/status"; #define RGB_COLOR_ORDER GRB #define NUM(a) (sizeof(a) / sizeof(*a)) -#define FIRMWARE_VERSION 1 -//#define FIRMWARE_URL "" +// fw update +// - increment number + build +// - scp .pio/build/$ENV/firmware.bin manuel@mausz.at:public_html/coding/.firmware/olidrdesk.bin +// - reboot device or send "fwupdate" to mqtt_topic_cmd +// - fw update state is published in mqtt_topic_state +#define FIRMWARE_VERSION 1 +//#define FIRMWARE_URL "" -WiFiClient espClient; -PubSubClient client(espClient); -char convBuffer[10]; -CRGB leds[RGB_NUM_LEDS]; +#define _STR(s) #s +#define STR(s) _STR(s) -void callback(char *topic, uint8_t *payload, unsigned int length); -void blink(); +const String mqtt_clientId = "DrDesk-" + String(ESP.getChipId()) + + "/v" + STR(FIRMWARE_VERSION); +const char* mqtt_topic_ping = MQTT_BASE "/ping"; +const char* mqtt_topic_cmd = MQTT_BASE "/command"; +const String mqtt_topic_state = String(MQTT_BASE) + "/" + String(ESP.getChipId()); + +bool mqttLoop(); +void mqttCallback(char *topic, byte *payload, unsigned int length); void checkFirmwareUpdate(); void switchMode(struct mode *mode); @@ -52,6 +56,11 @@ void modeRainbow(); void modeRainbowFast(); void modeStrobo(); +WiFiClient wifi_client; +PubSubClient mqtt(wifi_client); +char convBuffer[10]; +CRGB leds[RGB_NUM_LEDS]; + struct mode { const char *name; void (*func)(); @@ -92,7 +101,9 @@ void setup() WiFiManager wifiManager; wifiManager.setConfigPortalTimeout(600); Serial.printf_P(PSTR("Setting up WiFi\n")); - if (!wifiManager.autoConnect("ESP8266_DR_DESK")) { + WiFi.hostname("drdesk"); + if (!wifiManager.autoConnect("ESP8266_DR_DESK")) + { Serial.printf_P(PSTR("Failed to connect and hit timeout\n")); delay(5000); ESP.restart(); @@ -102,63 +113,71 @@ void setup() checkFirmwareUpdate(); yield(); - client.setServer(mqtt_server, mqtt_port); - client.setCallback(callback); + mqtt.setServer(MQTT_BROKER, MQTT_BROKER_PORT); + mqtt.setCallback(mqttCallback); digitalWrite(LED_BUILTIN, HIGH); //Turn off led as default } -void reconnect() +bool mqttLoop() { - // Loop until we're reconnected - while (!client.connected()) + if (!mqtt.connected()) { - // Create a random client ID - String clientId = "ESP8266Client-"; - clientId += String(random(0xffff), HEX); + Serial.printf_P(PSTR("Connecting to MQTT\n")); + if (!mqtt.connect(mqtt_clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD)) + return false; + + Serial.printf_P(PSTR("MQTT connected\n")); + mqtt.publish(mqtt_topic_ping, mqtt_clientId.c_str()); + mqtt.subscribe(mqtt_topic_ping); + mqtt.subscribe(mqtt_topic_cmd); + + // publish states + Serial.println(mqtt_mode_sub); + mqtt.subscribe(mqtt_mode_sub); + mqtt.publish(mqtt_mode_pub, set.mode->name, true); + + Serial.println(mqtt_color_sub); + mqtt.subscribe(mqtt_color_sub); + itoa(set.color, convBuffer, 10); + mqtt.publish(mqtt_color_pub, convBuffer, true); - // Attempt to connect - if (client.connect(clientId.c_str())) - { - // Once connected, publish an announcement... - client.publish(mqtt_device_boot, "connected"); - // ... and resubscribe - client.subscribe(mqtt_pingall_sub); - - // publish states - Serial.println(mqtt_mode_sub); - client.subscribe(mqtt_mode_sub); - client.publish(mqtt_mode_pub, set.mode->name, true); - - Serial.println(mqtt_color_sub); - client.subscribe(mqtt_color_sub); - itoa(set.color, convBuffer, 10); - client.publish(mqtt_color_pub, convBuffer, true); - - Serial.println(mqtt_brightness_sub); - client.subscribe(mqtt_brightness_sub); - itoa(map(set.brightness, 0, 255, 0, 100), convBuffer, 10); - client.publish(mqtt_brightness_pub, convBuffer, true); - } - else - { - // Wait 5 seconds before retrying - delay(5000); - } + Serial.println(mqtt_brightness_sub); + mqtt.subscribe(mqtt_brightness_sub); + itoa(map(set.brightness, 0, 255, 0, 100), convBuffer, 10); + mqtt.publish(mqtt_brightness_pub, convBuffer, true); } + + yield(); + mqtt.loop(); + return true; } -void callback(char *topic, uint8_t *payload, unsigned int length) +void mqttCallback(char *topic, byte *payload, unsigned int length) { - uint8_t c_payload[length]; + char c_payload[length + 1]; memcpy(c_payload, payload, length); c_payload[length] = '\0'; - if (strcmp(topic, mqtt_pingall_sub) == 0) + if (!strcmp(topic, mqtt_topic_ping)) + { + if (!strcmp(c_payload, "ping")) + mqtt.publish(mqtt_topic_ping, mqtt_clientId.c_str()); + return; + } + else if (!strcmp(topic, mqtt_topic_cmd)) { - blink(); - client.publish(mqtt_pingall_pub, - "{\"diningroom_desk\":\"connected\"}"); + if (!strcmp(c_payload, "fwupdate")) + { + checkFirmwareUpdate(); + return; + } + else if (!strcmp(c_payload, "reset")) + { + Serial.printf_P(PSTR("Resetting\n")); + ESP.reset(); + return; + } } else if (strcmp(topic, mqtt_mode_sub) == 0) { @@ -179,25 +198,17 @@ void callback(char *topic, uint8_t *payload, unsigned int length) set.color = atoi((char *)c_payload); current.idle = false; itoa(set.color, convBuffer, 10); - client.publish(mqtt_color_pub, convBuffer, true); + mqtt.publish(mqtt_color_pub, convBuffer, true); } else if (strcmp(topic, mqtt_brightness_sub) == 0) { set.brightness = map(atoi((char *)c_payload), 0, 100, 0, 255); current.idle = false; itoa(map(set.brightness, 0, 255, 0, 100), convBuffer, 10); - client.publish(mqtt_brightness_pub, convBuffer, true); + mqtt.publish(mqtt_brightness_pub, convBuffer, true); } } -void blink() -{ - //Blink on received MQTT message - digitalWrite(LED_BUILTIN, LOW); - delay(25); - digitalWrite(LED_BUILTIN, HIGH); -} - void calcBrightness() { #define FADE_STEP 10 @@ -217,7 +228,7 @@ void switchMode(struct mode *mode) Serial.println(mode->name); set.mode = mode; current.idle = false; - client.publish(mqtt_mode_pub, set.mode->name, true); + mqtt.publish(mqtt_mode_pub, set.mode->name, true); } void modeOff() @@ -270,7 +281,7 @@ void checkFirmwareUpdate() BearSSL::WiFiClientSecure update_client; update_client.setInsecure(); - client.publish(mqtt_device_boot, "fwupdate running"); + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate running"); ESPhttpUpdate.setLedPin(LED_BUILTIN, HIGH); ESPhttpUpdate.rebootOnUpdate(true); t_httpUpdate_return ret = ESPhttpUpdate.update(update_client, FIRMWARE_URL, STR(FIRMWARE_VERSION)); @@ -281,27 +292,26 @@ void checkFirmwareUpdate() Serial.printf_P(PSTR("HTTP_UPDATE_FAILED Error (%d): %s\n"), ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str()); String tmp = String("fwupdate error: ") + ESPhttpUpdate.getLastErrorString(); - client.publish(mqtt_device_boot, tmp.c_str()); + mqtt.publish(mqtt_topic_state.c_str(), tmp.c_str()); } break; case HTTP_UPDATE_NO_UPDATES: Serial.printf_P(PSTR("HTTP_UPDATE_NO_UPDATES\n")); - client.publish(mqtt_device_boot, "fwupdate noupdates"); + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate noupdates"); break; case HTTP_UPDATE_OK: Serial.printf_P(PSTR("HTTP_UPDATE_OK\n")); - client.publish(mqtt_device_boot, "fwupdate ok"); + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate ok"); break; } } void loop() { - if (!client.connected()) - reconnect(); - client.loop(); + if (!mqttLoop()) + delay(5000); EVERY_N_MILLISECONDS(100) { diff --git a/oliver/lr_stripes/platformio.ini b/oliver/lr_stripes/platformio.ini index c6d35d4..06b3430 100644 --- a/oliver/lr_stripes/platformio.ini +++ b/oliver/lr_stripes/platformio.ini @@ -13,6 +13,7 @@ default_envs = nodemcuv2 [env:nodemcuv2] platform = espressif8266 board = nodemcuv2 +lib_deps = WiFiManager, PubSubClient, Bounce2 framework = arduino monitor_speed = 115200 upload_speed = 115200 diff --git a/oliver/lr_stripes/src/main.cpp b/oliver/lr_stripes/src/main.cpp index b55a198..3fe2238 100644 --- a/oliver/lr_stripes/src/main.cpp +++ b/oliver/lr_stripes/src/main.cpp @@ -1,21 +1,18 @@ #include #include -#include #include #include +#include #include -#define _STR(s) #s -#define STR(s) _STR(s) +#include "secrets.h" -const char* mqtt_server = "192.168.1.2"; //MQTT Server IP, your home MQTT server eg Mosquitto on RPi, or some public MQTT -const int mqtt_port = 1883; //MQTT Server PORT, default is 1883 but can be anything. +#define MQTT_BROKER "192.168.1.5" +#define MQTT_BROKER_PORT 1883 +//#define MQTT_USERNAME "" +//#define MQTT_PASSWORD "" +#define MQTT_BASE "home/livingroom/ledstripe" -const char* mqtt_pingall_sub = "home/pingall"; -const char* mqtt_pingall_pub = "home/pingall/response"; - -#define MQTT_BASE "home/livingroom/ledstripe" -const char* mqtt_device_boot = MQTT_BASE "/device"; enum sensor_type : uint8_t { @@ -77,19 +74,37 @@ struct sensor_t sensors[] = { #define DIMMER_FADE_DELAY 40 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim) -WiFiClient espClient; -PubSubClient client(espClient); -char convBuffer[10]; +// fw update +// - increment number + build +// - scp .pio/build/$ENV/firmware.bin manuel@mausz.at:public_html/coding/.firmware/olilrstripes.bin +// - reboot device or send "fwupdate" to mqtt_topic_cmd +// - fw update state is published in mqtt_topic_state +#define FIRMWARE_VERSION 1 +//#define FIRMWARE_URL "" + +#define _STR(s) #s +#define STR(s) _STR(s) + +const String mqtt_clientId = "LrStripes-" + String(ESP.getChipId()) + + "/v" + STR(FIRMWARE_VERSION); +const char* mqtt_topic_ping = MQTT_BASE "/ping"; +const char* mqtt_topic_cmd = MQTT_BASE "/command"; +const String mqtt_topic_state = String(MQTT_BASE) + "/" + String(ESP.getChipId()); + +bool mqttLoop(); +void mqttCallback(char *topic, byte *payload, unsigned int length); +void checkFirmwareUpdate(); -void callback(char* topic, byte* payload, unsigned int length); -void blink(); bool relayRead(struct sensor_t *sensor); void relayWrite(struct sensor_t *sensor, bool state, bool send_update=false); void flipRelay(struct sensor_t *sensor, bool send_update=false); void checkButtons(void); inline uint8_t pwmValue(uint8_t level); void fadeDimmer(struct sensor_t *sensor, uint8_t level, bool send_update=false); -void checkFirmwareUpdate(); + +WiFiClient wifi_client; +PubSubClient mqtt(wifi_client); +char convBuffer[10]; void setup() { @@ -134,7 +149,9 @@ void setup() WiFiManager wifiManager; wifiManager.setConfigPortalTimeout(600); Serial.printf_P(PSTR("Setting up WiFi\n")); - if (!wifiManager.autoConnect("ESP8266_LR_STRIPES")) { + WiFi.hostname("lrstripes"); + if (!wifiManager.autoConnect("ESP8266_LR_STRIPES")) + { Serial.printf_P(PSTR("Failed to connect and hit timeout\n")); delay(5000); ESP.restart(); @@ -144,110 +161,101 @@ void setup() checkFirmwareUpdate(); yield(); - client.setServer(mqtt_server, mqtt_port); - client.setCallback(callback); + mqtt.setServer(MQTT_BROKER, MQTT_BROKER_PORT); + mqtt.setCallback(mqttCallback); digitalWrite(LED_BUILTIN, HIGH); //Turn off led as default } -void reconnect() +bool mqttLoop() { - // Loop until we're reconnected - while (!client.connected()) + if (!mqtt.connected()) { - // Create a random client ID - String clientId = "ESP8266Client-"; - clientId += String(random(0xffff), HEX); + Serial.printf_P(PSTR("Connecting to MQTT\n")); + if (!mqtt.connect(mqtt_clientId.c_str(), MQTT_USERNAME, MQTT_PASSWORD)) + return false; - // Attempt to connect - if (client.connect(clientId.c_str())) + Serial.printf_P(PSTR("MQTT connected\n")); + mqtt.publish(mqtt_topic_ping, mqtt_clientId.c_str()); + mqtt.subscribe(mqtt_topic_ping); + mqtt.subscribe(mqtt_topic_cmd); + + // publish states + for (uint8_t i = 0; i < NUM(sensors); i++) { - // Once connected, publish an announcement... - client.publish(mqtt_device_boot, "connected"); - // ... and resubscribe - client.subscribe(mqtt_pingall_sub); + struct sensor_t *sensor = &sensors[i]; + if (sensor->type & SENSOR_RELAY) + { + Serial.println(sensor->relay.mqtt_sub); + mqtt.subscribe(sensor->relay.mqtt_sub); + mqtt.publish(sensor->relay.mqtt_pub, relayRead(sensor) ? "1" : "0", + true); + } - // publish states - for (uint8_t i = 0; i < NUM(sensors); i++) + if (sensor->type & SENSOR_DIMMER) { - struct sensor_t *sensor = &sensors[i]; - if (sensor->type & SENSOR_RELAY) - { - Serial.println(sensor->relay.mqtt_sub); - client.subscribe(sensor->relay.mqtt_sub); - client.publish(sensor->relay.mqtt_pub, relayRead(sensor) ? "1" : "0", - true); - } - - if (sensor->type & SENSOR_DIMMER) - { - Serial.println(sensor->dimmer.mqtt_sub); - client.subscribe(sensor->dimmer.mqtt_sub); - itoa(sensor->dimmer.level, convBuffer, 10); - client.publish(sensor->dimmer.mqtt_pub, convBuffer, true); - } + Serial.println(sensor->dimmer.mqtt_sub); + mqtt.subscribe(sensor->dimmer.mqtt_sub); + itoa(sensor->dimmer.level, convBuffer, 10); + mqtt.publish(sensor->dimmer.mqtt_pub, convBuffer, true); } } - else - { - // Wait 5 seconds before retrying - delay(5000); - } } + + yield(); + mqtt.loop(); + return true; } -void callback(char* topic, byte* payload, unsigned int length) +void mqttCallback(char *topic, byte *payload, unsigned int length) { - char c_payload[length]; + char c_payload[length + 1]; memcpy(c_payload, payload, length); c_payload[length] = '\0'; - if (strcmp(topic, mqtt_pingall_sub) == 0) + if (!strcmp(topic, mqtt_topic_ping)) { - blink(); - client.publish(mqtt_pingall_pub, - "{\"livingroom_ledstrip\":\"connected\"}"); + if (!strcmp(c_payload, "ping")) + mqtt.publish(mqtt_topic_ping, mqtt_clientId.c_str()); return; } - - for (uint8_t i = 0; i < NUM(sensors); i++) + else if (!strcmp(topic, mqtt_topic_cmd)) { - struct sensor_t *sensor = &sensors[i]; - if (sensor->type & SENSOR_RELAY - && length > 0 - && strcmp(topic, sensor->relay.mqtt_sub) == 0) + if (!strcmp(c_payload, "fwupdate")) { - blink(); - relayWrite(sensor, payload[0] == '1', true); + checkFirmwareUpdate(); return; } - - if (sensor->type & SENSOR_DIMMER - && length > 0 - && strcmp(topic, sensor->dimmer.mqtt_sub) == 0) + else if (!strcmp(c_payload, "reset")) { - blink(); - uint8_t level = atoi((char *)payload); - fadeDimmer(sensor, (level > 100) ? 100 : level, true); + Serial.printf_P(PSTR("Resetting\n")); + ESP.reset(); return; } } -} - -void blink() -{ - //Blink on received MQTT message - digitalWrite(LED_BUILTIN, LOW); - delay(25); - digitalWrite(LED_BUILTIN, HIGH); -} + else + { + for (uint8_t i = 0; i < NUM(sensors); i++) + { + struct sensor_t *sensor = &sensors[i]; + if (sensor->type & SENSOR_RELAY + && length > 0 + && strcmp(topic, sensor->relay.mqtt_sub) == 0) + { + relayWrite(sensor, payload[0] == '1', true); + return; + } -void loop() -{ - if (!client.connected()) - reconnect(); - client.loop(); - checkButtons(); + if (sensor->type & SENSOR_DIMMER + && length > 0 + && strcmp(topic, sensor->dimmer.mqtt_sub) == 0) + { + uint8_t level = atoi((char *)payload); + fadeDimmer(sensor, (level > 100) ? 100 : level, true); + return; + } + } + } } bool relayRead(struct sensor_t *sensor) @@ -277,7 +285,7 @@ void relayWrite(struct sensor_t *sensor, bool state, bool send_update) #endif if (send_update) - client.publish(sensor->relay.mqtt_pub, state ? "1" : "0", true); + mqtt.publish(sensor->relay.mqtt_pub, state ? "1" : "0", true); } void flipRelay(struct sensor_t *sensor, bool send_update) @@ -356,7 +364,7 @@ void fadeDimmer(struct sensor_t *sensor, uint8_t level, bool send_update) if (send_update) { itoa(level, convBuffer, 10); - client.publish(sensor->dimmer.mqtt_pub, convBuffer, true); + mqtt.publish(sensor->dimmer.mqtt_pub, convBuffer, true); } } @@ -365,7 +373,7 @@ void checkFirmwareUpdate() BearSSL::WiFiClientSecure update_client; update_client.setInsecure(); - client.publish(mqtt_device_boot, "fwupdate running"); + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate running"); ESPhttpUpdate.setLedPin(LED_BUILTIN, HIGH); ESPhttpUpdate.rebootOnUpdate(true); t_httpUpdate_return ret = ESPhttpUpdate.update(update_client, FIRMWARE_URL, STR(FIRMWARE_VERSION)); @@ -376,18 +384,26 @@ void checkFirmwareUpdate() Serial.printf_P(PSTR("HTTP_UPDATE_FAILED Error (%d): %s\n"), ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str()); String tmp = String("fwupdate error: ") + ESPhttpUpdate.getLastErrorString(); - client.publish(mqtt_device_boot, tmp.c_str()); + mqtt.publish(mqtt_topic_state.c_str(), tmp.c_str()); } break; case HTTP_UPDATE_NO_UPDATES: Serial.printf_P(PSTR("HTTP_UPDATE_NO_UPDATES\n")); - client.publish(mqtt_device_boot, "fwupdate noupdates"); + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate noupdates"); break; case HTTP_UPDATE_OK: Serial.printf_P(PSTR("HTTP_UPDATE_OK\n")); - client.publish(mqtt_device_boot, "fwupdate ok"); + mqtt.publish(mqtt_topic_state.c_str(), "fwupdate ok"); break; } } + +void loop() +{ + if (!mqttLoop()) + delay(5000); + + checkButtons(); +} -- cgit v1.2.3