NEWS
Daten abonnieren über den mqtt_adapter
-
Hallo zusammen,
ich versuche seit ein paar Zeiten mit einem Esp32 Board auf Daten von meinem Broker zuzugreifen und auf dem Serial Monitor anzuzeigen aber irgendwie geht es bisher nicht. Hat jemand eine Idee was sich verbessern muss beziehungsweise komplett falsh ist ???#include <Arduino.h> #include <LiquidCrystal.h> #include <Adafruit_Sensor.h> #include <Wifi.h> # include <PubSubClient.h> // Lcd initialisierung LiquidCrystal lcd(22,21,5,18,23,19); // Encoder int Clk= 33; int Data= 25; int SwBut = 25; int menu =1 ; static int LastState ; // wifi Daten const char* ssid = "bbbbbb" ; const char* password = "bur" ; WiFiClient WifiClient ; // MQTT Broker_Daten const char* mqttServer = "192.168.0.220" ; PubSubClient mqttClient( WifiClient) ; // Topic für mqtt //Topic char FlameSate[] ="flameState"; char Bewegung[]= "Bewegung" ; byte* payload; //Verbindung mit dem Broker herstellen void mqttConnect() { Serial.print("Verbindung zum MQTT_Server"); Serial.print( mqttServer); while(!mqttClient.connected()) { Serial.print("."); if (mqttClient.connect("ES")) { Serial.print("MQTT-VErbunden"); } else { Serial.print("Fehlgeschlagen, rc="); Serial.print(mqttClient.state()); Serial.println("erneuter Versuch in 5 Sec"); delay(5000); } mqttClient.subscribe(Bewegung); } } //Callback Nachrichten-Empfang (Subscribe) void callback( char* topic, byte* message, unsigned int length) { Serial.print("topic: ") ; Serial.print(topic) ; String str ; for (int i =0 ; i< length ; i++) { str += (char)message[i]; } Serial.print( "Nachrichtenempfang für topic: "); Serial.print(topic); Serial.print("Nachricht :"); Serial.println(str); } /*void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.println(topic); Serial.print("Payload: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); if (strcmp(topic, FlameSate) == 0) { if (strcmp((char*)payload, "OK") == 0) { lcd.clear(); lcd.setCursor(0, 0); lcd.println("OK Feuer"); lcd.display(); } } else if (strcmp(topic, Bewegung) == 0) { if (strcmp((char*)payload, "OK") == 0) { lcd.clear(); lcd.setCursor(0, 0); lcd.println("OK Bewegung"); lcd.display(); } } } */ void setup() { lcd.begin(16, 2); // Wifi Verbindung Serial.begin(115200); Serial.println(); Serial.print("Verbingsaufbaun zu") ; Serial.print(ssid); WiFi.begin(ssid,password); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.print(""); Serial.println("Wifi connected"); Serial.print("IP Add:"); Serial.print(WiFi.localIP()); // Verbindung mit MQTT-Server mqttClient.setServer(mqttServer, 1883); mqttClient.setCallback(callback); mqttConnect(); } void loop() { if (!mqttClient.connected()) { mqttConnect(); } ///mqttClient.subscribe(FlameSate) ; lcd.display(); mqttClient.loop(); }
-
Nimm mal deine wifi Daten aus dem Script. Sonst hast du Besucher
-
@tt-tom haha danke habe es total vergessen
-
@gillian45 sagte in Daten abonnieren über den mqtt_adapter:
aber irgendwie geht es bisher nicht.
Was geht denn konkret nicht? Wird keine Wifi Verbindung aufgebaut? Keine MQTT Verbindung? Funktioniert die Subscription nicht?
-
@marc-berg
Die Wifi_Verbindung und MQTT_Verbindung functionieren einwandfrei aber subscribe eher nicht. Ich empfänge leider keine Daten auf mein Serial.monitor. Und ich weiß nicht, ob ich falsh abonniert habe. -
@gillian45
Hm, ich überblicke gerade nicht das ganzen Code, aber bist du sicher, dass das Topic, dass du suscribst korrekt ist? Funktioniert der Gegentest mit einem MQTT Client?Ob das Topic richtig ist, kann man ja nicht aus diesem Code ablesen.
-
@marc-berg Also publish funktionniert irgendwie sehr gut und zwar mit den gleichen Topic Namen.
Hier kannst du es nochmal sehen# include <Arduino.h> #include <Adafruit_Sensor.h> # include <WiFi.h> # include <PubSubClient.h> // wifi Daten const char* ssid = "bubub" ; const char* password = "bueer" ; WiFiClient WifiClient ; // MQTT Broker_Daten const char* mqttServer = "192.168.0.220" ; // Broker-passwort PubSubClient mqttClient( WifiClient) ; //Topic char FlameSate[] ="flameState"; char Bewegung[]= "Bewegung" ; int pirSensor= 27 ; int ledPin = 32 ; // für meinen Bewegungsmelder int flamePin = 34; //Verbindung mit dem Broker herstellen void mqttConnect() { Serial.print("Verbindung zum MQTT_Server"); Serial.print( mqttServer); while(!mqttClient.connected()) { Serial.print("."); if (mqttClient.connect("ES")) { Serial.print("MQTT-VErbunden"); } else { Serial.print("Fehlgeschlagen "); Serial.print(mqttClient.state()); Serial.println("erneuter Versuch in 5 Sec"); delay(5000); } } mqttClient.subscribe("test/esp32"); } void setup() { pinMode(flamePin, INPUT); // Setze Flammensensor als Eingang pinMode(ledPin, OUTPUT); // Setze LED als Ausgang Serial.begin(115200); Serial.println(); Serial.print("Verbingsaufbaun zu") ; Serial.print(ssid); WiFi.begin(ssid,password); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.print(""); Serial.println("Wifi connected"); Serial.print("IP Add:"); Serial.print(WiFi.localIP()); // Verbindung mit MQTT-Server mqttClient.setServer(mqttServer, 1883); //mqttClient.setCallback(callback); mqttConnect(); } void loop() { // Wenn der Flammensensor eine Flamme erkennt, schalte die LED ein /* if (flameValue > 100) { // Der Schwellenwert von 100 muss möglicherweise angepasst werden digitalWrite(ledPin, HIGH); // Schalte LED ein } else { digitalWrite(ledPin, LOW); // Schalte LED aus } */ if(!mqttClient.connected()) { mqttConnect(); } mqttClient.loop(); int flameValue = analogRead(flamePin); // Lese analoge Spannung vom Flammensensor if(flameValue > 100) { Serial.print("Achtung Fire, Feuerwehr Anrufen !!!"); mqttClient.publish(FlameSate, "OK"); } else { Serial.print("Sicher, Kein Feuer !"); mqttClient.publish(FlameSate, "Nein"); } int pirSensorValue = digitalRead(pirSensor); if(pirSensorValue== HIGH) { digitalWrite(ledPin, HIGH) ; Serial.print("Bewegung erkannt"); mqttClient.publish(Bewegung, "OK"); delay(1000) ; } else { digitalWrite(ledPin, LOW); Serial.print("Keine Bewegung"); mqttClient.publish(Bewegung, "Nein"); delay(1000) ; } delay(200); }
-
Das sieht in meinem Code recht ähnlich aus, nur dass ich nach dem Subscribe noch folgende beide Zeilen eingefügt habe.
client.subscribe(waitfor_topic); delay(200); client.loop();
Kann sein, dass ich das deshalb gemacht habe, weil es sonst Timing-Probleme gab. Ist schon ein paar Jahre her.
-
@marc-berg Ich versuche es mal, meinst du ich sollte in function
void mqttConnect()
direct nach dem Subscribe direkt die Beide Zeilen einfügen ?
-
@gillian45 sagte in Daten abonnieren über den mqtt_adapter:
@marc-berg Ich versuche es mal, meinst du ich sollte in function
void mqttConnect()
direct nach dem Subscribe direkt die Beide Zeilen einfügen ?
ja, das "client.loop()" wird ja sowieso empfohlen, um die Nachrichten zu verarbeiten. Es kann nichts schaden.
-
@marc-berg es hat leider nichts getan , hast du damals dein MQTT_Broker in IoBroker installiert ?? Ich habe vielleicht etwas nicht richtig konfiguriert oder soll ich mir einfach ein anderes Software suchen
-
@gillian45 sagte in Daten abonnieren über den mqtt_adapter:
@marc-berg es hat leider nichts getan , hast du damals dein MQTT_Broker in IoBroker installiert ?? Ich habe vielleicht etwas nicht richtig konfiguriert oder soll ich mir einfach ein anderes Software suchen
Darum würde ich das Ganze mit "MQTT Explorer" oder einem anderen Client nachstellen und prüfen, ob die Subscription grundsätzlich funktioniert.
Nur um sicherzugehen: die Callback-Funktion wird nur ausgeführt, wenn sich am Broker ein Wert ändert bzw. neu published wird. Das ist hoffentlich klar? -
hi Ich habe mal den alten Code raus gesucht. Das ganze stammt aus diesem Thread.
Vielleicht hilft dir das weiter. Den kompletten Code findest du im Thread.
// MQTT Funktion // ************* void reconnectToMQTT() { if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); 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", "0"); mqttClient.subscribe("Huehnertuer/Innen/Tuer"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } // MQTT Callback void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); Serial.print("Message arrived ["); Serial.print(strTopic); Serial.print("----"); Serial.print(strPayload); Serial.print("] "); Serial.println(); if (strTopic == "Huehnertuer/Innen/Tuer") { // Tuer schliessen if (strPayload == "false") { Serial.println("Tuer schliesst über IoBroker"); TuerSteuerung(SCHLIESSEN); } // Tuer öffnen if (strPayload == "true") { Serial.println("Tuer oeffnet über IoBroker"); TuerSteuerung(OEFFNEN); } } }
der teil aus dem loop
// MQTT Broker mqttClient.loop(); if (!mqttClient.connected()) { reconnectToMQTT(); }
der aus dem setup
// MQTT Brocker // Mit ioBroker Mqtt verbinden mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback);
zusätzlich empfehle ich dir eine eigne Instanz auf zu machen vom MQTT-Brocker.