Я пытаюсь вызвать действие, используя вывод функции обратного вызова в моем коде.По сути, у меня будет датчик двери на «reedTopic», который должен сообщить «ВЫКЛ», прежде чем разрешить отправку полезной нагрузки для «темы».Полезная нагрузка "topic" - это переключатель для устройства открывания гаражных ворот, поэтому данные из "topic" всегда будут оставаться неизменными.
Цель заключается в том, чтобы подключенный к моей машине esp8266-01 подключался кбеспроводной сети, он обнаружит состояние «reedTopic» и, если он не равен «OFF», не вызовет полезную нагрузку «theme».
Я хочу полностью настроить эту автоматизацию в коде ине нужно полагаться на дополнительное программное обеспечение, такое как Node-Red или HomeAssistant, для выполнения этой работы.
Я также почти уверен, что не до конца понимаю функцию обратного вызова и то, как она должна использоваться,особенно в этом случае.Я все еще немного новичок в Arduino, так что это действительно мой первый проект.Я также почти уверен, что там есть какой-то мусорный код, так как большая часть кода была собрана из примеров в Arduino IDE для обработчика pubsubclient.
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
const char* ssid = "******";
const char* password = "******";
const char* host = "CarPresence";
const char* update_path = "/";
const char* update_username = "*****";
const char* update_password = "*****";
char* topic = "cmnd/GarageDoor/POWER";
const char* willTopic = "cmnd/GarageDoor/POWER";
char* reedTopic = "cmnd/GarageDoor/POWER2";
char* server = "192.168.1.138";
byte willQoS = 1;
const char* willMessage = "1";
boolean willRetain = false;
boolean retained = true;
ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;
WiFiClient wifiClient;
PubSubClient client(server, 1883, wifiClient);
void callback(char* reedTopic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(reedTopic);
Serial.print("] ");
for (int i=0;i<length;i++) {
Serial.print((char)payload[i]);
}
if (strcmp((char* )reedTopic, "OFF") == 0) {
client.connect("CarPresence", willTopic, willQoS, willRetain, willMessage);
client.publish(topic, "The Garage door is CLOSED... Opening...");
client.publish(topic, "1");
while (WiFi.status() == WL_CONNECTED) {
delay(5000);
client.println(reedTopic);
client.publish(topic, "Ah ah ah ah staying alive staying alive...");
}
}
if (strcmp((char* )reedTopic, "ON") == 0) {
client.publish(topic, "The Garage door is OPEN... Aborting...");
while (WiFi.status() == WL_CONNECTED) {
delay(5000);
client.println(reedTopic);
client.publish(topic, "Dying... I'm dying...");
}
}
Serial.println();
}
String macToStr(const uint8_t* mac)
{
String result;
for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);
if (i < 5)
result += ':';
}
return result;
}
void setup() {
Serial.begin(115200);
delay(10);
client.setCallback(callback);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
client.connect("CarPresence");
client.subscribe(topic);
client.subscribe(reedTopic, retained);
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
httpUpdater.setup(&httpServer, update_path, update_username, update_password);
httpServer.begin();
Serial.printf("HTTPUpdateServer ready! Open http://%s%s in your browser and login with username '%s' and password '%s'\n", host, update_path, update_username, update_password);
// Generate client name based on MAC address and last 8 bits of microsecond counter
String clientName = "CarPresence";
Serial.print("Connecting to ");
Serial.print(server);
Serial.print(" as ");
Serial.println(clientName);
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker");
Serial.print("Topics are: ");
Serial.println(topic);
Serial.println(reedTopic);
if (client.publish(topic, "Hello from ESP8266")) {
Serial.println("Publish ok");
}
else {
Serial.println("Publish failed");
}
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
}
void loop() {
httpServer.handleClient();
client.setCallback(callback);
while (WiFi.status() != WL_CONNECTED) {
delay(5000);
Serial.print(".");
}
}
По большей части код работает.Самая большая проблема - это утверждение IF о обратной связи reedTopic.Код проносится мимо него и выполняет полезную нагрузку темы без второго взгляда.