NEWS
GPIO Status Wemos d1 mini an iobroker senden
-
Ich noch mal.
Kann man eigentlich einen Schalter, hier die Endschalter, gleichzeitig auf die Eingänger zweier Wemos legen?
-
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Da ESP nicht wirklich gut Steppermotoren ansprechen kann
Wie kommt's? Die esphome stepper component ist dir aber bekannt?
wie kann ich auf sehr einfache Weise den GPIO Status an iobroker senden?
mit esphome reicht dafür dieser Vierzeiler hier wenn dein esphome node mittels api mit der Zentrale spricht:
binary_sensor: - platform: gpio pin: 3 name: "Tür"
viel einfacher wird es wohl nicht mehr werden
-
Ich hatte mich ein wenig mit esphome beschäftig. Ich habe aber im Moment nicht wirklich die Zeit dafür mich dort einzulesen und die Dinge zu probieren.
-
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
nicht wirklich die Zeit dafür mich dort einzulesen und die Dinge zu probieren.
kommt vor
Da ESP nicht wirklich gut Steppermotoren ansprechen kann
Aber dann ist wohl weniger das Problem das esp(home?) nicht gut Steppermotoren ansprechen kann sondern eher das du nicht wirklich gut mit esphome "umgehen" kannst?
Für Leute mit Programmierkenntnissen wirkt der "no code approach" von esphome zu beginn manchmal "komplexer" als für Leute die nicht programmieren können Allerdings kannst du esphome natürlich auch mit lambda füttern, wenn gewünscht
-
Zurück zu meiner Frage.
Ich habe jetzt das mit eingefügt
// Schaltzustände übermitteln if(digitalRead(pinTuerZu)){ client.publish("Hühnertür/Innen/Tür zu", "1"); } else { client.publish("Hühnertür/Innen/Tür zu", "0"); } if(digitalRead(pinTuerAuf)){ client.publish("Hühnertür/Innen/Tür auf", "1"); } else { client.publish("Hühnertür/Innen/Tür auf", "0"); } if(digitalRead(pinTasterStopp)){ client.publish("Hühnertür/Innen/Stop", "1"); } else { client.publish("Hühnertür/Innen/Stop", "0"); }
und
// MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); }
Unter ioBroker erscheinen die Daten, leider werden die Änderungen aber nicht angezeigt.
Wo habe ich den Fehler?
Hier noch mal der komplette Code
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); #ifndef STASSID #define STASSID "---" #define STAPSK "------" #endif ESP8266WebServer server(80); #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> const char* ssid = STASSID; const char* password = STAPSK; const char* mqtt_server = "192.168.--.--"; const int mqtt_port = 1886; const char* mqtt_user = "----"; const char* mqtt_password = "---------"; char* clientId = "Hühnerklappe"; //WiFiServer server(80); AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); //} ////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } break; case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); } break; case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } break; case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); } break; } // Schaltzustände übermitteln if(digitalRead(pinTuerZu)){ client.publish("Hühnertür/Innen/Tür zu", "1"); } else { client.publish("Hühnertür/Innen/Tür zu", "0"); } if(digitalRead(pinTuerAuf)){ client.publish("Hühnertür/Innen/Tür auf", "1"); } else { client.publish("Hühnertür/Innen/Tür auf", "0"); } if(digitalRead(pinTasterStopp)){ client.publish("Hühnertür/Innen/Stop", "1"); } else { client.publish("Hühnertür/Innen/Stop", "0"); } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } }
-
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
client.publish("Hühnertür/Innen/Tür zu", "1");
Meine Arduino-Kenntnisse sind zwar paar Tage alt, aber in den ioB-Objekten sind normalerweise keine Sonder- und Leerzeichen erlaubt. Ev. kann er deswegen nicht publishen.
client.publish("Huehnertuer/Innen/Tuer_zu", "1");
-
@sborg
Nö, keine Änderung.Muß da nicht eine wie auch immer "Zeitschleife" rein? Also das alle z.B. zwei Minuten geschaut wird ob sich etwas verändert hat?
-
So, habe es jetzt ein wenig verändert.
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); #ifndef STASSID #define STASSID "---" #define STAPSK "-------------" #endif ESP8266WebServer server(80); #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> const char* ssid = STASSID; const char* password = STAPSK; char* clientId = "Huehnerklappe"; const char* mqtt_server = "192.168.--.--"; const int mqtt_port = 1886; const char* mqtt_user = "-----"; const char* mqtt_password = "------"; //WiFiServer server(80); AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); //} ////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "1"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "1"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } }
Wenn ich jetzt per Taster alles ansteuere, oder per Browser funktioniert es.
ABER
Wenn ich ein paar Minuten warte reagiert ioBroker nicht mehr. Ich muß erst dem Wemos D1 mini resetten.
Was mache ich da noch falsch?
-
@beowolf "falsch" sehe ich so ad hoc nichts, aber es kann sein, dass die MQTT-Verbindung abbricht und er dann seitens des ESPs den MQTT-Adapter mit Anfragen "überfährt".
Du verbindest einmalig zum MQTT beim hochfahren/booten des ESP, danach prüfst du aber nie wieder ob die Verbindung überhaupt noch steht
void MQTTreconnect() { if (!mqtt_client.connected()) { Serial.print("\nConnect to MQTT-Broker... "); // Connect and publish / subscribe if (mqtt_client.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.println("connected"); //Subscribe in Topics //mqtt_client.subscribe(_topic_); } else { // If weren't connected, we wait for 5 seconds and try again Serial.print("Failed, rc="); Serial.print(mqtt_client.state()); Serial.println(" try again in 5 seconds..."); delay(5000); } } }
-
Ich benötige noch mal einen Tipp
Das Programm sieht jetzt so aus.
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> WiFiClient espClient; PubSubClient mqttClient(espClient); #ifndef STASSID #define STASSID "----" #define STAPSK "-----" #endif #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs ESP8266WebServer server(80); const char* ssid = STASSID; const char* password = STAPSK; char* mqtt_client_id = "Huehnerklappe"; const char* mqtt_server = "192.168.----"; const int mqtt_port = 1886; const char* mqtt_user = "----"; const char* mqtt_password = "---------"; const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Verbinden mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////////////////////////// // Anfang Update über Wlan /////////////////////////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); /////////////////////////////////////////// // Ende Update über Wlan /////////////////////////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); // Mit ioBroker Mqtt verbinden server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); mqttClient.loop(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer/Innen"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } }
Soweit funktioniert auch alles.
Was sich jetzt natürlich anbietet ist, das die http-Kommandos durch mqtt-Befehle ersetzt werden könnten.
Ich habe da auch schon rumprobiert, aber ich verstehe es einfach nicht.
Was muß ich unter ioBroker machen?
Ich hatte dieses hier schon mal eingefügt:
void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "Tuer") { if(strPayload == "false") Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } }
und weiter unten dieses hier
void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); }
Ich komme da aber nicht weiter.
Eine einfache Anleitung wäre event. nicht schlecht.
Grüße
-
@beowolf Erwähnte ich schon, dass meine Arduino-Tage schon etwas her sind?
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
Eine einfache Anleitung wäre event. nicht schlecht.
...und der ist mal so richtig gut. "Einfach" ...
IMO bist du aber fast am Ziel. Du hast zwar den "callback" definiert, "hörst" aber nirgends auf ihn. Sprich der ioB schickt dir den MQTT-Request, der ESP reagiert aber gar nicht drauf.
void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer");
ändern/hinzufügen
void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("Huehnertuer");
-
So richtig geht das noch nicht.
Ich habe unter ioBroker das eingestellt:
Bei den Objekten dieses hier.
Im Programm dieses hier:
// MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("mqtt.0.Huehnertuer.Innen.Tuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } } void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "mqtt.0.Huehnertuer.Innen.Tuer") { if(strPayload == "false") // Tuer schliessen Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") // Tuer öffnen Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } }
-
Bin zwar auch nicht, der Nerd, aber wenn du den Pin für schließen setzt. Musst du ihn nicht wieder zurück setzen und dann den Pin für das öffnen? Sonst stehen doch beide an oder sehe ich das falsch?
-
Bis jetzt kann ich noch nicht einmal eine Reaktion am Wemos feststellen. Beide Eingänge sind normalerweise auf "high". Für die manuelle Steuerung sind vor Ort zwei Taster die die Eingänge jeweils auf "low" tasten.
Selbst wenn ich sie per mqtt auf "low" setzte und sie dort bleiben, sollte ja eine Reaktion folgen.
Ich bin mir nicht sicher ob ich den Datenpunkt unter ioBroker so richtig erzeugt habe, sodas der Wemos das mitbekommt.
Ich habe auch noch kein Beispiel im Netz gefunden, in dem es genau beschrieben wird wie das Zusammenspiel läuft.
Also - mache unter ioBroker genau das und frage so und so ab.
-
@beowolf
Ich versuche es mal auf meinem Elektronik board die Tage mal nachzubauen. Dann teste ich dein Programm mal parallel.
Gruß Tom -
@Beowolf Kannst du das aktuelle script mal posten, damit ich's laden kann.
-
Das ist der aktuelle Code
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> WiFiClient espClient; PubSubClient mqttClient(espClient); #ifndef STASSID #define STASSID "----" #define STAPSK "------------" #endif #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs ESP8266WebServer server(80); const char* ssid = STASSID; const char* password = STAPSK; char* mqtt_client_id = "Huehnerklappe"; const char* mqtt_server = "192.168.---------"; const int mqtt_port = 1886; const char* mqtt_user = "----------"; const char* mqtt_password = "----------------"; const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = 61000; const unsigned int TuerbewegungAuf = -61000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR AccelStepper stepperauf(1, D3, D4); //Pins für den Steppermotor STEP , DIR Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Verbinden mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////////////////////////// // Anfang Update über Wlan /////////////////////////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); /////////////////////////////////////////// // Ende Update über Wlan /////////////////////////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); // Mit ioBroker Mqtt verbinden server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepperauf.setMaxSpeed(6000); stepper.setAcceleration(1500); stepperauf.setAcceleration(6000); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); mqttClient.loop(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); stepperauf.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepperauf.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepperauf.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("mqtt.0.Huehnertuer.Innen.Tuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } } void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "mqtt.0.Huehnertuer.Innen.Tuer") { if(strPayload == "false") // Tuer schliessen Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") // Tuer öffnen Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } }
Danke für die Hilfe
-
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
mqtt.0.Huehnertuer.Innen.Tuer
Deine Subscribes/strTopics sind noch falsch. Weder der Adaptername noch die Instanz dürfen da hinein, außerdem ist die "Punktnotation" nach ioB-Standard bei MQTT falsch
zB:
mqttClient.subscribe("Huehnertuer/Innen/Tuer");
Ich würde mir im Serial-Monitor auch mal den MQTT-Request ausgeben lassen, da sieht man ob überhaupt was beim ESP ankommt. Hier mal der "callback" eines alten Sketches von mir (inkl. der Ausgabe per Serial-Monitor):
void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] : "); String Topic = String(topic); char msg[length+1]; for (unsigned int i=0;i<length;i++) { Serial.print((char)payload[i]); msg[i] = (char)payload[i]; } msg[length] = '\0'; Serial.println(); //Zirkulation? if (strcmp(topic,"cmnd/HeizCon/WW-Zirkulation")==0) { if(strcmp(msg,"true")==0) { digitalWrite(STATUS_LED, LOW); //Low=On delay(3000); digitalWrite(STATUS_LED, HIGH); mqtt_client.publish(Topic.c_str(), "false", true); //clear WWZ_state } } } //############################################################################
-
@sborg sagte in GPIO Status Wemos d1 mini an iobroker senden:
außerdem ist die "Punktnotation" nach ioB-Standard bei MQTT falsch
Was meinst du damit?
-
@beowolf Das Ordner und der Datenpunkt mittels "Punkt" getrennt werden:
falsch
Huehnertuer.Innen.Tuer
bei MQTT richtig
Huehnertuer/Innen/Tuer