Nodemcu. Самопроизвольное включение нагрузки

prosperous
Offline
Зарегистрирован: 15.09.2021

Добрый день. В интернетах найден код прошивки 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();
}
}
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Где схема подключения?!

prosperous
Offline
Зарегистрирован: 15.09.2021

я же говорю в разных проектах поведение одинаковое. Конкретно в этом диммер с nodemcu. В другом перепрошивал sonoff basic, поведение аналогичное. Дело явно не в схеме, а в коде. Хотя, если вы настаиваете - выложу схему.  

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Без схемы нет полного понимания. И схему нужно именно от того проекта, где именно приведённый выше код используется. 

b707
Offline
Зарегистрирован: 26.05.2017

prosperous пишет:

Хотя, если вы настаиваете - выложу схему.  

тут такой обычай...
схема важна не только ради схемы, но и чтоб проверить, насколько ты заинтересован в ответе. Если у тебя попросили схему, а ты отказался - значит вопрос несерьезный, после этого с тобой никто и разговаривать не будет.
А если согласился и нарисовал - значит тест прошел.
Так что если хочешь получить ответ - схему придется рисовать, даже если потом на нее никто и не взглянет:)

rkit
Offline
Зарегистрирован: 23.11.2016

Проверяй, что у тебя там в mqtt идет.

prosperous
Offline
Зарегистрирован: 15.09.2021

prosperous
Offline
Зарегистрирован: 15.09.2021

Если что-то не то идет в Mqtt все равно код не должен обрабатывать эти запросы. А он, видимо, обрабатывает. Вот и не пойму где косяк. Может я client.set_callback(callback) не там вызываю?