В общем выбрал MQTT, тем более в HA он интегрируется, но, столкнулся с такой проблемой: после соединения c сервером и подписке на топик esp сразу не получает значение его, только если устройство (выключатель) не выключить и включить (и наоборот), только тогда брокер шлет значение топика. Как побороть эту проблему?:
#include <ESP8266WiFi.h>
const char* wifi_ssid = "***";
const char* wifi_pass = "***";
#define led LED_BUILTIN
#include <PubSubClient.h>
#define mqtt_server "192.168.0.27"
#define mqtt_port 1883
#define mqtt_login "mqtt_user"
#define mqtt_pass "mqtt_user"
// MQTT топик
#define LED_TOPIC "home/living_room/TV_on" /* 1=on, 0=off */
//**********Функция обработки входящих сообщений******
void callback(char* topic, byte* payload, unsigned int length) {
// Печать информации о полученном сообщений
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload);
}
Serial.println();
if (strcmp(topic, LED_TOPIC) == 0) {
// Определяем поведение MCU при различных значениях сообщения (payload)
if ((char)payload[0] == '0') {
digitalWrite(led, HIGH); // led имеет подтягивающий резистор, HIGH = OFF, LOW = ON
}
if ((char)payload[0] == '1') {
digitalWrite(led, LOW);
}
}
}
//*********************************************
void setup_wifi();
void reconnect();
void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT); // Установка led как порт вывода
digitalWrite(led, HIGH); // led имеет подтягивающий резистор, HIGH = OFF, LOW = ON
delay(10);
WiFi.begin(wifi_ssid, wifi_pass);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
void setup_wifi() {
Serial.println();
Serial.print(F("Connecting"));
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println(F("."));
WiFi.printDiag(Serial);
}
randomSeed(micros());
Serial.println("");
Serial.println(F("WiFi connected"));
Serial.println(F("IP address: "));
Serial.println(WiFi.localIP());
}
// Функция установления подключения к MQTT брокеру
void reconnect() {
while (!client.connected()) {
Serial.println(F("Attempting MQTT connection..."));
Serial.print(F("Client ID:"));
Serial.print(clientId);
Serial.print(F(" "));
Serial.print(mqtt_login);
Serial.print(F(" "));
Serial.print(mqtt_pass);
Serial.print(F(" "));
if (client.connect(clientId.c_str(), mqtt_login, mqtt_pass)) {
Serial.println(F("connected"));
// Подписка на сообщения в топике
client.subscribe(LED_TOPIC,1);
} else {
Serial.print(F("failed, rc="));
Serial.print(client.state());
Serial.println(F("try again in 5 seconds"));
delay(5000);
}
}
}