0

I’m having some problem with a home automation project of mine. I bought a nodeMCU v3 from aliexpress that i want to control my blinds with.

This is the code I’m using on it. I use the Arduino IDE to push this code in to the nodeMCU.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SimpleTimer.h>

// MQTT Server
const char* ssid = "****";
const char* password = "****";
const char* mqtt_server = "****";


char message_buff[100];
int photoValue = 0;
int rainValue = 0;
int photo = A0;
int rain = D6;
int relayUp = D7;
int relayDown= D8;
long interval = 10000;
long previousMillis = 0;

WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}

void setup() {

  pinMode(photo, INPUT);
  pinMode(rain, INPUT);
  pinMode(relayUp, OUTPUT);
  pinMode(relayDown, OUTPUT);

  digitalWrite(relayUp ,LOW);
  digitalWrite(relayDown, LOW);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    if (client.connect("ESP8266Client")) {
      client.subscribe("home/relayBlinds");
    } else {
      delay(5000);
    }
  }
}

void loop() {

  if (!client.connected())  {
    // Connect (or reconnect) to mqtt broker on the openhab server
    reconnect();
    }
// Read Photo- and Rain-sensors  
  photoValue = analogRead(photo);
  rainValue = analogRead(rain);

  // publish Temperature reading every 10 seconds
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis  > interval) {
    previousMillis = currentMillis; 

    // publish Photo
    String pubStringPhoto = String(photoValue);
    pubStringPhoto.toCharArray(message_buff, pubStringPhoto.length()+1);
    client.publish("home/photo", message_buff);

    // publish Rain
    String pubStringRain = String(rainValue);
    pubStringRain.toCharArray(message_buff, pubStringRain.length()+1);
    client.publish("home/rain", message_buff);
  }
  client.loop();
}


void callback(char* topic, byte* payload, unsigned int length) {
 // MQTT inbound Messaging 
int i = 0;

  // create character buffer with ending null terminator (string)
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0';

  String msgString = String(message_buff);

  if (msgString == "BLINDSUP") {
    digitalWrite(relayUp ,HIGH);
    delay(5000);
    digitalWrite(relayUp ,LOW);
  } else if (msgString == "BLINDSDOWN") {
    digitalWrite(relayDown ,HIGH);
   delay(5000);
    digitalWrite(relayDown ,LOW);
  } 
}

The plan was to have a Raspberry Pi with openHAB as a controller. I have used several guides to setup mosquitto and openHAB and i always get the same result.

So this is what happens: the nodeMCU connects to my Wifi and publishes both the rain and photo values. I can read them in the openHAB GUI without problems.

When i press the activation button in openHAB to publish BLINDSUP or BLINDSDOWN the messages arrives without any problems and i can see the message on my mosquitto terminal. Now is when the unexpected result starts happening. The same message gets delivered multiple times to my nodeMCU without it showing up in the mosquitto terminal.

I have been trying to find out why it would act this way and I think it is because the line:

if (!client.connected())  {

is false and the nodeMCU reconnects and gets the same message somehow. But it is always the first message. If I send BLINDSUP and then BLINDSDOWN it will only register BLINDSUP forever.

I'm really out of ideas how to fix this and would appreciate any help, thanks.

URL to the nodeMCU if that helps anyhow: nodeMCU

Keshan De Silva
  • 839
  • 1
  • 11
  • 25
KriBern
  • 1
  • 1

1 Answers1

0

Try connecting to MQTT broker with a clean session. Probably you published the topic with the retain flag set to true.

If you do like this, the broker will deliver the last retained message when the nodeMCU connects to the broker and subscribes to the retained topic.

SebastianK
  • 712
  • 4
  • 19