2016-07-26 2 views
0

J'ai un problème avec un projet de domotique. J'ai acheté un nodeMCU v3 d'aliexpress avec lequel je veux contrôler mes stores.Messages de courtier qui se répète avec nodeMCU

C'est le code que j'utilise dessus. J'utilise l'IDE Arduino pour pousser ce code dans le 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); 
    } 
} 

Le plan était d'avoir un Raspberry Pi avec openHAB comme contrôleur. J'ai utilisé plusieurs guides pour configurer mosquitto et openHAB et j'ai toujours le même résultat.

Voici donc ce qui se passe: le nodeMCU se connecte à mon Wifi et publie les valeurs de pluie et de photo. Je peux les lire dans l'interface graphique openHAB sans problèmes. Lorsque j'appuie sur le bouton d'activation dans openHAB pour publier BLINDSUP ou BLINDSDOWN, les messages arrivent sans aucun problème et je peux voir le message sur mon terminal mosquitto. C'est maintenant que le résultat inattendu commence à se produire. Le même message est livré plusieurs fois à mon nodeMCU sans qu'il apparaisse dans le terminal mosquitto.

J'ai essayé de savoir pourquoi il agirait de cette façon et je pense qu'il est parce que la ligne:

if (!client.connected()) { 

est faux et le nodeMCU reconnecte et obtient le même message en quelque sorte. Mais c'est toujours le premier message. Si j'envoie BLINDSUP puis BLINDSDOWN, il enregistrera uniquement BLINDSUP pour toujours. Je suis vraiment à court d'idées pour résoudre ce problème et j'apprécierais toute aide, merci.

URL du nodeMCU si cela aide de toute façon: nodeMCU

Répondre

0

Essayez de vous connecter au courtier MQTT par une session propre. Vous avez probablement publié le sujet avec l'indicateur de conservation défini sur true.

Si vous aimez cela, le courtier livrera le dernier message conservé lorsque nodeMCU se connecte au courtier et s'abonne à la rubrique conservée.