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 --- oliver/lr_stripes/src/main.cpp | 208 ++++++++++++++++++++++------------------- 1 file changed, 112 insertions(+), 96 deletions(-) (limited to 'oliver/lr_stripes/src/main.cpp') 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