This commit is contained in:
174
src/mqtt.cpp
174
src/mqtt.cpp
@ -2,15 +2,15 @@
|
||||
#include "config.h"
|
||||
|
||||
#ifndef MQTT_ENABLE
|
||||
#pragma message "MQTT_ENABLE is false. Skipping MQTT."
|
||||
#pragma message "MQTT_ENABLE is false. Skipping MQTT."
|
||||
#else
|
||||
|
||||
#if defined( ESP8266 )
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#elif defined( ESP32 )
|
||||
#include <WiFi.h>
|
||||
#include <WiFi.h>
|
||||
#else
|
||||
#error "Neither ESP32 nor ESP8266 set..."
|
||||
#error "Neither ESP32 nor ESP8266 set..."
|
||||
#endif
|
||||
#include <PubSubClient.h>
|
||||
#include "EffectEntry.h"
|
||||
@ -26,102 +26,102 @@ uint8_t weather_icon_ids[6] = {0, 0, 0, 0, 0, 0};
|
||||
int8_t weather_temperatures[6] = {0, 0, 0, 0, 0, 0};
|
||||
|
||||
void mqtt_callback(char* complete_topic, byte* pl, unsigned int length) {
|
||||
pl[length] = '\0';
|
||||
char* payload = (char*)pl;
|
||||
LOG("MQTT * Received data for topic "); LOGln(complete_topic);
|
||||
|
||||
if (strncmp(complete_topic, MQTT_TOPIC_WEATHER, strlen(MQTT_TOPIC_WEATHER))==0) {
|
||||
// Weather stuff
|
||||
complete_topic += strlen(MQTT_TOPIC_WEATHER);
|
||||
if (strncmp(complete_topic, "icons/", 6)==0) {
|
||||
complete_topic += 6; // strlen("icons/")=6
|
||||
uint8_t id = complete_topic[0] - '0'; // ID is 1 digit. Substract '0' from it to get it as number.
|
||||
if (id>=6) return;
|
||||
weather_icon_ids[id] = atol(payload);
|
||||
} else if (strncmp(complete_topic, "temperatures/", 13)==0) {
|
||||
complete_topic += 13; // strlen("temperatures/")=13
|
||||
uint8_t id = complete_topic[0] - '0'; // ID is 1 digit. Substract '0' from it to get it as number.
|
||||
if (id>=6) return;
|
||||
weather_temperatures[id] = atol(payload);
|
||||
pl[length] = '\0';
|
||||
char* payload = (char*)pl;
|
||||
LOG("MQTT * Received data for topic "); LOGln(complete_topic);
|
||||
|
||||
if (strncmp(complete_topic, MQTT_TOPIC_WEATHER, strlen(MQTT_TOPIC_WEATHER))==0) {
|
||||
// Weather stuff
|
||||
complete_topic += strlen(MQTT_TOPIC_WEATHER);
|
||||
if (strncmp(complete_topic, "icons/", 6)==0) {
|
||||
complete_topic += 6; // strlen("icons/")=6
|
||||
uint8_t id = complete_topic[0] - '0'; // ID is 1 digit. Substract '0' from it to get it as number.
|
||||
if (id>=6) return;
|
||||
weather_icon_ids[id] = atol(payload);
|
||||
} else if (strncmp(complete_topic, "temperatures/", 13)==0) {
|
||||
complete_topic += 13; // strlen("temperatures/")=13
|
||||
uint8_t id = complete_topic[0] - '0'; // ID is 1 digit. Substract '0' from it to get it as number.
|
||||
if (id>=6) return;
|
||||
weather_temperatures[id] = atol(payload);
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
char* topic = complete_topic + strlen(MQTT_TOPIC); // Strip MQTT_TOPIC from the beginning
|
||||
|
||||
// Here, payload is a char* (but has to be casted).
|
||||
if(strcmp(topic, "mode")==0) {
|
||||
for (int i=0; i<effects->size(); i++) {
|
||||
EffectEntry e = effects->get(i);
|
||||
if (strcmp(e.name, payload)==0) {
|
||||
//Serial.printf("Effect found in mqtt_callback: %p\n", (void *)&e->effect);
|
||||
current_effect->stop();
|
||||
current_effect = e.effect;
|
||||
current_effect->start();
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if (strcmp(topic, "reboot")==0) {
|
||||
ESP.restart();
|
||||
}
|
||||
char* topic = complete_topic + strlen(MQTT_TOPIC); // Strip MQTT_TOPIC from the beginning
|
||||
|
||||
long value = atol(payload);
|
||||
// Here, payload is a char* (but has to be casted).
|
||||
if(strcmp(topic, "mode")==0) {
|
||||
for (int i=0; i<effects->size(); i++) {
|
||||
EffectEntry e = effects->get(i);
|
||||
if (strcmp(e.name, payload)==0) {
|
||||
//Serial.printf("Effect found in mqtt_callback: %p\n", (void *)&e->effect);
|
||||
current_effect->stop();
|
||||
current_effect = e.effect;
|
||||
current_effect->start();
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if (strcmp(topic, "reboot")==0) {
|
||||
ESP.restart();
|
||||
}
|
||||
|
||||
if (strcmp(topic, "brightness")==0 && value > 0 && value <= 255) {
|
||||
FastLED.setBrightness(value);
|
||||
}
|
||||
long value = atol(payload);
|
||||
|
||||
if (strcmp(topic, "brightness")==0 && value > 0 && value <= 255) {
|
||||
FastLED.setBrightness(value);
|
||||
}
|
||||
}
|
||||
|
||||
boolean mqtt_connect() {
|
||||
char client_id[30];
|
||||
int chipid;
|
||||
#if defined( ESP8266 )
|
||||
chipid = ESP.getChipId();
|
||||
#elif defined( ESP32 )
|
||||
chipid = ESP.getEfuseMac() & 0xFFFFFF;
|
||||
#else
|
||||
#error Neither ESP32 nor ESP8266 set.
|
||||
#endif
|
||||
snprintf(client_id, 30, HOSTNAME, chipid);
|
||||
LOG("MQTT * Connecting to MQTT server with client id "); LOGln(client_id);
|
||||
if (mqtt_client.connect(client_id, MQTT_USER, MQTT_PASS, MQTT_TOPIC "status", 0, true, "OFFLINE", true)) {
|
||||
LOGln("MQTT * Connected.");
|
||||
mqtt_client.publish(MQTT_TOPIC "status", "ONLINE");
|
||||
mqtt_client.subscribe(MQTT_TOPIC "+");
|
||||
mqtt_client.subscribe(MQTT_TOPIC_WEATHER "#");
|
||||
}
|
||||
return mqtt_client.connected();
|
||||
char client_id[30];
|
||||
int chipid;
|
||||
#if defined( ESP8266 )
|
||||
chipid = ESP.getChipId();
|
||||
#elif defined( ESP32 )
|
||||
chipid = ESP.getEfuseMac() & 0xFFFFFF;
|
||||
#else
|
||||
#error Neither ESP32 nor ESP8266 set.
|
||||
#endif
|
||||
snprintf(client_id, 30, HOSTNAME, chipid);
|
||||
LOG("MQTT * Connecting to MQTT server with client id "); LOGln(client_id);
|
||||
if (mqtt_client.connect(client_id, MQTT_USER, MQTT_PASS, MQTT_TOPIC "status", 0, true, "OFFLINE", true)) {
|
||||
LOGln("MQTT * Connected.");
|
||||
mqtt_client.publish(MQTT_TOPIC "status", "ONLINE");
|
||||
mqtt_client.subscribe(MQTT_TOPIC "+");
|
||||
mqtt_client.subscribe(MQTT_TOPIC_WEATHER "#");
|
||||
}
|
||||
return mqtt_client.connected();
|
||||
}
|
||||
|
||||
void mqtt_setup() {
|
||||
mqtt_client.setServer(MQTT_SERVER, MQTT_PORT);
|
||||
mqtt_client.setCallback(mqtt_callback);
|
||||
mqtt_last_reconnect_attempt = 0;
|
||||
mqtt_client.setServer(MQTT_SERVER, MQTT_PORT);
|
||||
mqtt_client.setCallback(mqtt_callback);
|
||||
mqtt_last_reconnect_attempt = 0;
|
||||
}
|
||||
|
||||
void mqtt_loop() {
|
||||
if (!mqtt_client.connected()) {
|
||||
long now = millis();
|
||||
if (now - mqtt_last_reconnect_attempt > 5000) {
|
||||
mqtt_last_reconnect_attempt = now;
|
||||
if (mqtt_connect()) {
|
||||
mqtt_last_reconnect_attempt = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mqtt_client.loop();
|
||||
}
|
||||
if (!mqtt_client.connected()) {
|
||||
long now = millis();
|
||||
if (now - mqtt_last_reconnect_attempt > 5000) {
|
||||
mqtt_last_reconnect_attempt = now;
|
||||
if (mqtt_connect()) {
|
||||
mqtt_last_reconnect_attempt = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mqtt_client.loop();
|
||||
}
|
||||
}
|
||||
|
||||
String mqtt_log_str = String();
|
||||
|
||||
void mqtt_publish(const char* topic, int number) {
|
||||
char t[127];
|
||||
sprintf(t, MQTT_TOPIC "%s", topic);
|
||||
char b[32];
|
||||
sprintf(b, "%d", number);
|
||||
mqtt_client.publish(t, b);
|
||||
char t[127];
|
||||
sprintf(t, MQTT_TOPIC "%s", topic);
|
||||
char b[32];
|
||||
sprintf(b, "%d", number);
|
||||
mqtt_client.publish(t, b);
|
||||
}
|
||||
|
||||
void mqtt_log(const char* message) {
|
||||
@ -129,23 +129,23 @@ void mqtt_log(const char* message) {
|
||||
}
|
||||
|
||||
void mqtt_log(int number) {
|
||||
mqtt_log(String(number).c_str());
|
||||
mqtt_log(String(number).c_str());
|
||||
}
|
||||
|
||||
void mqtt_log(long unsigned int number) {
|
||||
mqtt_log(String(number).c_str());
|
||||
mqtt_log(String(number).c_str());
|
||||
}
|
||||
|
||||
void mqtt_log_ln(int number) {
|
||||
mqtt_log_ln(String(number).c_str());
|
||||
mqtt_log_ln(String(number).c_str());
|
||||
}
|
||||
|
||||
void mqtt_log_ln(long unsigned int number) {
|
||||
mqtt_log_ln(String(number).c_str());
|
||||
mqtt_log_ln(String(number).c_str());
|
||||
}
|
||||
|
||||
void mqtt_log_ln(const char* message) {
|
||||
if (mqtt_log_str.length()==0) {
|
||||
if (mqtt_log_str.length()==0) {
|
||||
mqtt_log_send(message);
|
||||
return;
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user