<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[problem with button and mqtt after restart gateway]]></title><description><![CDATA[<p dir="auto">Hello everyone.</p>
<p dir="auto">I am a beginner ;)<br />
Based on the sketch from this forum, I wrote my own with control the switches, one button and a temperature sensor.<br />
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).</p>
<pre><code>// 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 &lt;MySensors.h&gt;
#include &lt;SPI.h&gt;
#include &lt;Bounce2.h&gt;
#include &lt;DHT.h&gt;

// 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 &gt;1000ms for DHT22 and &gt;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 &lt; 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 &lt; 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 &lt; 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&amp;button
    for (byte i = 0; i &lt; 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 &amp;message){        
   if (message.type == V_LIGHT){ 
   if (message.sensor &lt;noRelays){            // check if message is valid for relays..... previous line  &lsqb;&lsqb;[ if (message.sensor &lt;=noRelays){ &rsqb;&rsqb;]
   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);
}
</code></pre>
<p dir="auto">What am I doing wrong? :D<br />
please help</p>
]]></description><link>https://forum.mysensors.org/topic/11825/problem-with-button-and-mqtt-after-restart-gateway</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Jul 2026 16:21:05 GMT</lastBuildDate><atom:link href="https://forum.mysensors.org/topic/11825.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Oct 2021 14:52:02 GMT</pubDate><ttl>60</ttl></channel></rss>