problem with button and mqtt after restart gateway
-
Hello everyone.
I am a beginner
Based on the sketch from this forum, I wrote my own with control the switches, one button and a temperature sensor.
If it i turn led on/off from HA, the state is written in eeprom and mqtt . However, if you control it with the button, state changes in HA (everything seems ok) but after restarting the gateway, the state is correct for a while (read from epreom I think), but after establishing the connection to the broker, led is switch to state is as the last one in HA (by clik).// Enable debug prints to serial monitor //#define MY_DEBUG // Use a bit lower baudrate for serial prints on ESP8266 than default in MyConfig.h #define MY_BAUD_RATE 9600 // Enables and select radio type (if attached) //#define MY_RADIO_RF24 //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 #define MY_GATEWAY_MQTT_CLIENT #define MY_GATEWAY_ESP8266 // Set this node's subscribe and publish topic prefix #define MY_MQTT_PUBLISH_TOPIC_PREFIX "mygateway1-out" #define MY_MQTT_SUBSCRIBE_TOPIC_PREFIX "mygateway1-in" // Set MQTT client id #define MY_MQTT_CLIENT_ID "mysensors-1" // Enable these if your MQTT broker requires username/password #define MY_MQTT_USER "***" #define MY_MQTT_PASSWORD "***" // Set WIFI SSID and password #define MY_WIFI_SSID "***" #define MY_WIFI_PASSWORD "***" // Set the hostname for the WiFi Client. This is the hostname // passed to the DHCP server if not static. #define MY_HOSTNAME "ESP8266_MQTT_GW" // Enable MY_IP_ADDRESS here if you want a static ip address (no DHCP) //#define MY_IP_ADDRESS 192,168,178,87 // If using static ip you can define Gateway and Subnet address as well //#define MY_IP_GATEWAY_ADDRESS 192,168,178,1 //#define MY_IP_SUBNET_ADDRESS 255,255,255,0 // MQTT broker ip address. #define MY_CONTROLLER_IP_ADDRESS 192, 168, 1, 100 //MQTT broker if using URL instead of ip address. // #define MY_CONTROLLER_URL_ADDRESS "test.mosquitto.org" // The MQTT broker port to to open #define MY_PORT 1883 // Enable inclusion mode //#define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway //#define MY_INCLUSION_BUTTON_FEATURE // Set inclusion mode duration (in seconds) //#define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button //#define MY_INCLUSION_MODE_BUTTON_PIN D1 // Set blinking period //#define MY_DEFAULT_LED_BLINK_PERIOD 300 // Flash leds on rx/tx/err //#define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin //#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin //#define MY_DEFAULT_TX_LED_PIN 16 // the PCB, on board LED #include <MySensors.h> #include <SPI.h> #include <Bounce2.h> #include <DHT.h> // Set this to the pin you connected the DHT's data pin to #define DHT_DATA_PIN D5 #define DHTTYPE DHT11 // typ czujnika (DHT11). Jesli posiadamy DHT22 wybieramy DHT22 // Set this offset if the sensor has a permanent small offset to the real temperatures #define SENSOR_TEMP_OFFSET 0 // Sleep time between sensor updates (in milliseconds) // Must be >1000ms for DHT22 and >2000ms for DHT11 static const uint64_t UPDATE_INTERVAL = 60000; // Force sending an update of the temperature after n sensor reads, so a controller showing the // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that // the value didn't change since; // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms] static const uint8_t FORCE_UPDATE_N_READS = 10; #define CHILD_ID_HUM 3 #define CHILD_ID_TEMP 4 #define CHILD_ID_LIGHT 5 float lastTemp; float lastHum; uint8_t nNoUpdatesTemp; uint8_t nNoUpdatesHum; bool metric = true; //czyjnik światła int lastodczytanaWartosc = 0; DHT dht(DHT_DATA_PIN, DHTTYPE); #define RELAY_ON 0 // switch around for ACTIVE LOW / ACTIVE HIGH relay #define RELAY_OFF 1 #define noRelays 3 //2-4 #define noButtons 1 const int relayPin[] = {D2,D3,D6}; // switch around pins to your desire const int buttonPin[] = {D1}; // switch around pins to your desire class Relay // relay class, store all relevant data (equivalent to struct) { public: int buttonPin; // physical pin number of button int relayPin; // physical pin number of relay int value; boolean relayState; // relay status (also stored in EEPROM) }; Relay Relays[noRelays]; Bounce debouncer[noRelays]; MyMessage msg[noRelays]; MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); MyMessage msgIlu(CHILD_ID_LIGHT, V_LIGHT_LEVEL); void setup(){ sendHeartbeat(); wait(100); dht.begin(); // Initialize Relays for (int i = 0; i < noRelays; i++){ // Relays[i].buttonPin = buttonPin[i]; // assign physical pins Relays[i].relayPin = relayPin[i]; msg[i].sensor = i; // initialize messages msg[i].type = V_LIGHT; // pinMode(Relays[i].buttonPin, INPUT_PULLUP); // wait(100); pinMode(Relays[i].relayPin, OUTPUT); Relays[i].relayState = loadState(i); // retrieve last values from EEPROM digitalWrite(Relays[i].relayPin, Relays[i].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly send(msg[i].set(Relays[i].relayState? true : false)); // make controller aware of last status wait(50); //debouncer[i] = Bounce(); // initialize debouncer //debouncer[i].attach(buttonPin[i]); //debouncer[i].interval(20); //wait(50); } // Initialize Button for (int i = 0; i < noButtons; i++){ Relays[i].buttonPin = buttonPin[i]; // assign physical pins //msg[i].sensor = i; // initialize messages //msg[i].type = V_LIGHT; pinMode(Relays[i].buttonPin, INPUT_PULLUP); wait(100); //pinMode(Relays[i].relayPin, OUTPUT); //Relays[i].relayState = loadState(i); // retrieve last values from EEPROM //digitalWrite(Relays[i].relayPin, Relays[i].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly //send(msg[i].set(Relays[i].relayState? true : false)); // make controller aware of last status //wait(50); debouncer[i] = Bounce(); // initialize debouncer debouncer[i].attach(buttonPin[i]); debouncer[i].interval(20); wait(50); } } void presentation() { sendSketchInfo("MultiRelayButton", "1.0"); wait(100); for (int i = 0; i < noRelays; i++){ present(i, S_LIGHT); // present sensor to gateway } // Register all sensors to gw (they will be created as child devices) present(CHILD_ID_HUM, S_HUM); present(CHILD_ID_TEMP, S_TEMP); wait(100); present(CHILD_ID_LIGHT, S_LIGHT_LEVEL); wait(100); } void loop() { // pomiar światła int odczytanaWartosc = analogRead(A0); if (odczytanaWartosc != lastodczytanaWartosc) { send(msgIlu.set(odczytanaWartosc)); lastodczytanaWartosc = odczytanaWartosc; } sleep(30000); // Get temperature from DHT library float temperature = dht.readTemperature(); if (isnan(temperature)) { Serial.println("Failed reading temperature from DHT!"); } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) { // Only send temperature if it changed since the last measurement or if we didn't send an update for n times lastTemp = temperature; // Reset no updates counter nNoUpdatesTemp = 0; send(msgTemp.set(temperature, 1)); #ifdef MY_DEBUG Serial.print("T: "); Serial.println(temperature); #endif } else { // Increase no update counter if the temperature stayed the same nNoUpdatesTemp++; } // Get humidity from DHT library float humidity = dht.readHumidity(); if (isnan(humidity)) { Serial.println("Failed reading humidity from DHT"); } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) { // Only send humidity if it changed since the last measurement or if we didn't send an update for n times lastHum = humidity; // Reset no updates counter nNoUpdatesHum = 0; send(msgHum.set(humidity, 1)); #ifdef MY_DEBUG Serial.print("H: "); Serial.println(humidity); #endif } else { // Increase no update counter if the humidity stayed the same nNoUpdatesHum++; } // Sleep for a while to save energy sleep(UPDATE_INTERVAL); // relay&button for (byte i = 0; i < noRelays; i++) { if (debouncer[i].update()) { Relays[i].value= debouncer[i].read(); if(Relays[i].value == LOW){ saveState(i, !loadState(i)); digitalWrite(Relays[i].relayPin, loadState(i)?RELAY_ON:RELAY_OFF); send(msg[i].set(loadState(i))); //send(msg[i].set(Relays[i].relayState? true : false)); // save sensor state in EEPROM (location == sensor number) //saveState( i, Relays[i].relayState ); } } wait(20); }} // process incoming message void receive(const MyMessage &message){ if (message.type == V_LIGHT){ if (message.sensor <noRelays){ // check if message is valid for relays..... previous line [[[ if (message.sensor <=noRelays){ ]]] Relays[message.sensor].relayState = message.getBool(); digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number) } } wait(20); }
What am I doing wrong?
please help
-
This post is deleted!