pitrix/mqtt.h

66 lines
2.0 KiB
C

PubSubClient mqtt_client(wifi);
long mqtt_last_reconnect_attempt = 0;
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
if(strcmp(topic, MQTT_TOPIC_MODE)==0) {
for (int i=0; i<NUM_EFFECTS; i++) {
EffectEntry* e = &effects[i];
if (strcmp(e->name, (char*)payload)==0) {
//Serial.printf("Effect found in mqtt_callback: %p\n", (void *)&e->effect);
current_effect = e->effect;
clear();
return;
}
}
} else if (strcmp(topic, MQTT_TOPIC_BRIGHTNESS)==0) {
long new_value = atol((char *) payload);
if (new_value > 0 && new_value <= 255) {
config_brightness = new_value;
FastLED.setBrightness(config_brightness);
}
} else if (strcmp(topic, MQTT_TOPIC_EFFECT_CYCLE_TIME)==0) {
long new_value = atol((char *) payload);
if (new_value > 0) {
config_effect_cycle_time = new_value;
}
} else if (strcmp(topic, MQTT_TOPIC_REBOOT)==0) {
ESP.restart();
}
}
boolean mqtt_connect() {
char client_id[30];
snprintf(client_id, 30, HOSTNAME, ESP.getChipId());
LOG("MQTT * Connecting to MQTT server with client id "); LOGln(client_id);
if (mqtt_client.connect(client_id, MQTT_USER, MQTT_PASS)) {
LOGln("MQTT * Connected.");
mqtt_client.subscribe(MQTT_TOPIC_MODE);
mqtt_client.subscribe(MQTT_TOPIC_BRIGHTNESS);
mqtt_client.subscribe(MQTT_TOPIC_EFFECT_CYCLE_TIME);
mqtt_client.subscribe(MQTT_TOPIC_REBOOT);
mqtt_client.publish(MQTT_TOPIC_STATUS, "ONLINE");
}
return mqtt_client.connected();
}
void mqtt_setup() {
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();
}
}