Ich habe ein Problem mit einem Hausautomationsprojekt von mir. Ich kaufte ein nodeMCU v3 von den aliexpress, dass ich meine Vorhänge mit steuern möchte.Broker Nachrichten, die mit NodeMCU wieder
Dies ist der Code, den ich darauf verwende. Ich benutze die Arduino IDE, um diesen Code in den NodeMCU zu schieben.
#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);
}
}
Der Plan war, einen Raspberry Pi mit openHAB als Controller zu haben. Ich habe mehrere Anleitungen verwendet, um mosquitto und openHAB einzurichten und ich bekomme immer das gleiche Ergebnis.
Also das ist, was passiert: der NodeMCU verbindet sich mit meinem Wifi und veröffentlicht sowohl die Regen-und Foto-Werte. Ich kann sie in der openHAB GUI ohne Probleme lesen.
Wenn ich die Aktivierungstaste in openHAB drücke, um BLINDSUP oder BLINDSDOWN zu veröffentlichen, kommt die Nachricht ohne irgendwelche Probleme an und ich kann die Nachricht auf meinem Moskito-Terminal sehen. Jetzt beginnt das unerwartete Ergebnis. Dieselbe Nachricht wird mehrmals an meine nodeMCU gesendet, ohne dass sie im Moskito-Terminal erscheint.
Ich habe versucht, herauszufinden, warum sie so handeln würde, und ich denke, es liegt daran, dass die Zeile:
if (!client.connected()) {
falsch ist und die nodeMCU schließt wieder und bekommt die gleiche Botschaft irgendwie. Aber es ist immer die erste Nachricht. Wenn ich BLINDSUP und dann BLINDSDOWN sende, wird BLINDSUP nur für immer registriert.
Ich habe wirklich keine Ideen, wie das zu beheben und würde mich über jede Hilfe freuen, danke.
URL zum nodeMCU, ob das hilft sowieso: nodeMCU