Nodemcu. Самопроизвольное включение нагрузки
- Войдите на сайт для отправки комментариев
Ср, 15/09/2021 - 20:51
Добрый день. В интернетах найден код прошивки nodemcu для связи через mqtt с homeassistant. Данный код взят за основу и используется в нескольких проектах. Косяк в том, что нагрузка начинает самопроизвольно включаться через рандомные промежутки времени. Т.е. сидишь ты в комнате в темноте, бац включился свет. Так и не понял в чем проблема. Призываю коллективный разум. Спасибо.
#include <RBDdimmer.h>
#include <OneButton.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define BUTTON_DOWN 5
#define BUTTON_UP 4
#define USE_SERIAL Serial
#define outputPin 13
#define zerocross 12 // for boards with CHANGEBLE input pins
#define LAMPMAXVALUE 100
dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards
OneButton buttonDown = OneButton(
BUTTON_DOWN, // Input pin for the button
false, // Button is active LOW
false // Enable internal pull-up resistor
);
OneButton buttonUp = OneButton(
BUTTON_UP, // Input pin for the button
false, // Button is active LOW
false // Enable internal pull-up resistor
);
const char *ssid = "admin"; // Имя вайфай точки доступа
const char *pass = "admin"; // Пароль от точки доступа
const char *mqtt_server = "192.168.1.100"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = ""; // Логи от сервер
const char *mqtt_pass = ""; // Пароль от сервера
int mainLamp = 30;
WiFiClient wclient;
PubSubClient client(wclient, mqtt_server, mqtt_port);
void setup() {
USE_SERIAL.begin(9600);
dimmer.begin(NORMAL_MODE, OFF); //dimmer initialisation: name.begin(MODE, STATE)
buttonDown.attachClick(DimmerOff);
buttonUp.attachClick(DimmerOn);
buttonDown.attachDuringLongPress(DimmerDown);
buttonUp.attachDuringLongPress(DimmerUp);
buttonDown.setDebounceTicks(40);
buttonUp.setDebounceTicks(40);
buttonDown.setPressTicks(1000);
buttonUp.setPressTicks(1000);
}
void DimmerOff() {
dimmer.begin(NORMAL_MODE, OFF);
client.publish("Dimmer/light/status", "OFF");
client.publish("Dimmer/light/100/status", "OFF");
client.publish("Dimmer/light/40/status", "OFF");
client.publish("Dimmer/light/60/status", "OFF");
client.publish("Dimmer/light/80/status", "OFF");
}
void DimmerOn() {
String myString;
dimmer.begin(NORMAL_MODE, ON);
dimmer.setPower(mainLamp);
myString = String(mainLamp);
client.publish("Dimmer/light/status", "ON");
client.publish("Dimmer/brightness/status", myString);
}
void DimmerDown() {
String myString;
if (mainLamp > 30)
mainLamp--;
dimmer.setPower(mainLamp);
myString = String(mainLamp);
delay(70);
client.publish("Dimmer/brightness/status", myString);
}
void DimmerUp() {
String myString;
if (mainLamp < LAMPMAXVALUE)
mainLamp++;
dimmer.setPower(mainLamp);
myString = String(mainLamp);
delay(70);
client.publish("Dimmer/brightness/status", myString);
}
void setPowerDimmer (int power){
mainLamp = power;
dimmer.setPower(mainLamp);
}
void loop() {
buttonDown.tick();
buttonUp.tick();
// подключаемся к wi-fi
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
}
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
if (client.connect(MQTT::Connect("ESP8266")
.set_auth(mqtt_user, mqtt_pass))) {
client.set_callback(callback);
client.subscribe("Dimmer/light/switch");
client.subscribe("Dimmer/light/40/set");
client.subscribe("Dimmer/light/60/set");
client.subscribe("Dimmer/light/80/set");
client.subscribe("Dimmer/light/100/set");
client.subscribe("Dimmer/brightness/set");
client.publish("Dimmer/light/status", "OFF");
client.publish("Dimmer/light/40/status", "OFF");
client.publish("Dimmer/light/60/status", "OFF");
client.publish("Dimmer/light/80/status", "OFF");
client.publish("Dimmer/light/100/status", "OFF");
client.publish("Dimmer/brightness/status", "0");
dimmer.begin(NORMAL_MODE, OFF);
}
}
if (client.connected()){
client.loop();
}
}
} // конец основного цикла
void callback(const MQTT::Publish& pub)
{
String payload = pub.payload_string();
String myString;
if(String(pub.topic()) == "Dimmer/light/switch") // проверяем из нужного ли нам топика пришли данные
{
if (payload == "ON"){
DimmerOn();
myString = String(mainLamp);
client.publish("Dimmer/brightness/status", myString);
}
else {
DimmerOff();
client.publish("Dimmer/brightness/status", "0");
}
}
if(String(pub.topic()) == "Dimmer/brightness/set") // проверяем из нужного ли нам топика пришли данные
{
int brightness = payload.toInt();
Serial.println(brightness);
if (brightness > 30){
setPowerDimmer(brightness);
}
else{
setPowerDimmer(30);
client.publish("Dimmer/brightness/status", "30");
}
}
if(String(pub.topic()) == "Dimmer/light/40/set") // проверяем из нужного ли нам топика пришли данные
{
if (payload == "ON"){
client.publish("Dimmer/light/40/status", payload);
client.publish("Dimmer/light/60/status", "OFF");
client.publish("Dimmer/light/80/status", "OFF");
client.publish("Dimmer/light/100/status", "OFF");
mainLamp = 40;
DimmerOn();
}
else {
DimmerOff();
}
}
if(String(pub.topic()) == "Dimmer/light/60/set") // проверяем из нужного ли нам топика пришли данные
{
if (payload == "ON"){
client.publish("Dimmer/light/60/status", payload);
client.publish("Dimmer/light/40/status", "OFF");
client.publish("Dimmer/light/80/status", "OFF");
client.publish("Dimmer/light/100/status", "OFF");
mainLamp = 60;
DimmerOn();
}
else {
DimmerOff();
}
}
if(String(pub.topic()) == "Dimmer/light/80/set") // проверяем из нужного ли нам топика пришли данные
{
if (payload == "ON"){
client.publish("Dimmer/light/80/status", payload);
client.publish("Dimmer/light/40/status", "OFF");
client.publish("Dimmer/light/60/status", "OFF");
client.publish("Dimmer/light/100/status", "OFF");
mainLamp = 80;
DimmerOn();
}
else {
DimmerOff();
}
}
if(String(pub.topic()) == "Dimmer/light/100/set") // проверяем из нужного ли нам топика пришли данные
{
if (payload == "ON"){
client.publish("Dimmer/light/100/status", payload);
client.publish("Dimmer/light/40/status", "OFF");
client.publish("Dimmer/light/60/status", "OFF");
client.publish("Dimmer/light/80/status", "OFF");
mainLamp = 100;
DimmerOn();
}
else {
DimmerOff();
}
}
}
Где схема подключения?!
я же говорю в разных проектах поведение одинаковое. Конкретно в этом диммер с nodemcu. В другом перепрошивал sonoff basic, поведение аналогичное. Дело явно не в схеме, а в коде. Хотя, если вы настаиваете - выложу схему.
Без схемы нет полного понимания. И схему нужно именно от того проекта, где именно приведённый выше код используется.
Хотя, если вы настаиваете - выложу схему.
схема важна не только ради схемы, но и чтоб проверить, насколько ты заинтересован в ответе. Если у тебя попросили схему, а ты отказался - значит вопрос несерьезный, после этого с тобой никто и разговаривать не будет.
А если согласился и нарисовал - значит тест прошел.
Так что если хочешь получить ответ - схему придется рисовать, даже если потом на нее никто и не взглянет:)
Проверяй, что у тебя там в mqtt идет.
Если что-то не то идет в Mqtt все равно код не должен обрабатывать эти запросы. А он, видимо, обрабатывает. Вот и не пойму где косяк. Может я client.set_callback(callback) не там вызываю?