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