NEWS
Verbindung mit dem Mqtt_Server via iobroker
-
Hiii zusammen !!!!!
Ich habe vor ein paar Tagen mit ioBroker angefangen. Ich habe den ioBroker auf ein Virtuelles Linux-Rechner installiert und habe da den mqtt_Adapter als Broker konfiguriert. Daneben wollte ich mit einem Microcontroller auf dem mqtt_server zugreifen aber leider klappt es nocht nicht. Ich habe wie folgt mein Server konfiguriert. Hat jemand schon Erfahrung damit ?? Vielleicht liegt es bei der mqtt_server IP_Address ? Ich habe ja schon Vieles versucht ohne Erfolg.Allerdings könnt ihr euch noch mein kleines Code anschauen
#include <Arduino.h> # include <WiFi.h> # include <PubSubClient.h> /*#include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #define LED_PIN 12 #define DHTPIN 32 #define DHTTYPE DHT11 */ const char* ssid = "WiFI_ID" ; const char* password = "Wifi_passwd" ; WiFiClient WifiClient ; // MQTT Broker_Daten const char* mqttServer = "10.0.2.15" ; // Broker_Ip add PubSubClient mqttClient( WifiClient) ; long ZeitAlt = -9999; //Callback Nachrichten-Empfang (Subscribe) void callback( char* topic, byte* message, unsigned int length) { 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); } //Verbindung mit dem Broker herstellen void mqttConnect() { Serial.print("Verbindung zum MQTT_Server"); Serial.print( mqttServer); while(!mqttClient.connected()) { Serial.print("."); if (mqttClient.connect("ESP32Client")) { Serial.print("MQTT-VErbunden"); } else { Serial.print("Fehlgeschlagen, rc="); Serial.print(mqttClient.state()); Serial.println("erneuter Versuch in 5 Sec"); delay(5000); } } mqttClient.subscribe("test/esp32"); } void setup() { // put your setup code here, to run once: 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() { // put your main code here, to run repeatedly: if(!mqttClient.connected()) { mqttConnect(); } mqttClient.loop(); if(millis()-ZeitAlt> 3000) { char txtString[20]; ZeitAlt= millis(); sprintf( txtString, "Zeitstempel %", millis()/1000); Serial.println(String("Versand MQTT-NAchricht:") + txtString); mqttClient.publish("test/esp32", txtString); } delay(200); }
MOD-EDIT: Code in code-tags gesetzt!
-
@gillian45 sagte in Verbindung mit dem Mqtt_Server via iobroker:
if(millis()-ZeitAlt> 3000)
nach einem kurzen Blick auf den Code, wie soll die Bedingung "if(millis()-ZeitAlt> 3000)" jemals erreicht werden?
Ziehe am besten den "publish" block mit in Setup, ohne Bedingung. Damit der code so einfach wie möglich ist und man ein paar Fehlerquellen ausschließen kann.
-
@gillian45
Was macht Dein ESP32?
Kann man das evtl. auch mit Tasmoty erreichen? Würde Dir das Leben deutlich einfacher machen. -
@gillian45 Wenn man sich allein im stillen Kämmerlein mit all den tollen Dingen befasst, ist es am besten erst mal mit fertigen Beispielen das eine oder andere zu erproben, wobei ich hier im Forum aber auch schon sehr gute Unterstützung gefunden habe
Der Vorschlag von Codierknecht sich erst mal mit "Tasmota" auf dem ESP xxxx zu beschäftigen ist sicher nicht der schlechteste! Es ist einfach fantastisch wieviele Möglichkeiten man plötzlich hat in relativ kurzer Zeit und mit vergleichbar wenig Aufwand sich viele Sensoren und mehr im Smarthome realsieren lassen. Die MQTT Anbindung an den ioBroker ist darin schon enthalten und somit hat man relativ schnell auch in diesem Punkt ein Erfolgserlebnis.
Ist zwar wieder eine Baustelle mehr aber es lohnt sich weil vieles damit sehr viel einfacher wird und die Erfolgserlebnisse nicht lange auf sich warten lassen, so war es zumindest bei mir
Man sollte allerdings darauf achten, dass das ioBrokersystem in allen Punkten aktuell ist, habe wochenlang mit dem Mqtt-Adapter experimentiert und es lief nie so richtig bis ich mich endlich mal entschlossen habe alles auf den aktuellen Stand zu bringen und kaum macht man es richtig, schon funtioniert es -
@myiobroker sagte in Verbindung mit dem Mqtt_Server via iobroker:
bis ich mich endlich mal entschlossen habe alles auf den aktuellen Stand zu bringen
Das predige ich immer wieder und wieder. Und dann kommen da immer die erzkonservativen Anhänger der 'Never-change-a-running-System'-Sekte mit ihren versumpften Systemen aus der frühen Kreidezeit an.
'Als ich das neulich (vor 3 Jahren...) gemacht hab hat mir der böse Programmierer da alles gelöscht'
-
@codierknecht
Okay vielen Dank für deinen Vorschlag. Das ist nämlich eine Projektaufgabe von der Hochschule deswegen muss ich es leider nur so machen. Allerdings werde ich mir mal Tasmota anschauen, ob es mir dabei hilft alles besser zu verstehen ?? Weiß ich nicht .... -
@gillian45 wenn ich deinen Code kurz überfliege vermisse ich die genaue definition wohin sich MQTT verbinden soll.
Wobei den Quellcode den gängigen Beispielen ähnlich sieht.
Hier: https://docs.arduino.cc/tutorials/uno-wifi-rev2/uno-wifi-r2-mqtt-device-to-device wird aber auch der Server und Port mit angegeben:if (!mqttClient.connect(broker, port)) {
das fehlt bei dir ganz, zumindest den
mqttserver
müsstest du doch mitgeben -
@gillian45 Ich wollte damit auch nicht sagen, dass man das Programmieren sein lassen und sich auf vorgefertigte Lösungen beschränken soll, zumal es bei dir wohl so vorgegeben ist. Mir hat es im langjährigen technischen Service oft geholfen Fehler durch ein Ausschlußverfahren zu finden wenn ich mir nicht sicher war auf welcher Seite das Problem liegt. Für ESP32 und 8266 gibt es viele Codebeispiele die zum testen taugen ob die eine oder andere Grundfunktion gegeben ist. Habe dazu neben den üblichen "Bastel-"Quellen und in der Arduino-Programmierumgebung selbst (Samples) viele Beispiele gefunden aber inzwischen auch mit Chat-GPT gute Erfahrung gemacht. Man muss das "Problem" möglichst "genau" beschreiben und die Antworten natürlich kritisch bewerten, kann dann aber fast wie im Dialog das Thema "verfeinern". Manchmal liegt es ja nur an der Syntax wie man einen Wert bekommt oder verändern kann
Wenn es damit klappt, weiß man zumindest wo man nicht weiter suchen muss und kann ggf. auch aus diesen Codeschnipseln etwas für den eigenen Code mitnehmen.
Vielleicht nicht immer die sauberste Sache wenn man ein Konzept beibehalten möchte/muss oder es gar vorgegeben ist, aber bestimmt besser als am Ende die Verbindungsleitungen im Verdacht zu haben was allerdings bei USB-Kabeln, aber auch bei den einfachen Steckbrettern/ -brücken durchaus eine Rolle spielen kann -
Um mich meinem Vorredner anzuschließen:
Ich baue mir immer "Prototypen" beim Programmieren.
Ja, da gibt es das große Hauptprogramm das ich entwickle - und dann brauche ich etwas was xyz tut.Da baue ich mir dann ein Miniprogramm was nur genau das tut. Wenn ich gerade schlau bin verwende ich dort dann schon passende Variablen- und Funktionsnamen.
Und wenn der Prototyp / das Testprogramm das tut was es soll kommt es in das Hauptprogramm.
Beim letzten Kundenprojekt (Überwachung von Fahrplananzeigen) gibt es das Programm/Skript was das alles macht. Und ein duzend Einzelprogramme die einen Teilaspekt abbilden.
In allen Programmen baue ich von Anfang an ein umfangreiches Debugging ein.
Das starte ich entweder über eine Variable gleich am Anfang - wenn die aufTrue
ist wird alles ausgegeben, bzw. über einen Kommandozeileparameter (ich schreibe oft solche Programme).Grund ist das das Debugging während der Entwicklung und später bei Fehlersuchen cool ist, aber sonst nur stört.
So kann ich es nach belieben Ein- und ausschalten.
Im Quellcode nutze ich eine Funktion dafür welche mit dem entsprechenden Text aufgerufen wird.
Die Funktion prüft erst ob die Variable aufTrue
steht und gibt dann den Text aus (oder eben nicht).
So muss ich das nicht dauernd im weiteren Verlauf prüfen sondern haue einfach fast jede 2 Zeile eine Meldung raus. -
@bananajoe @MyioBroker Danke auf jeden Fall für all eure Tipps, die werde ich mir im Kopf behalten. Ich habe mein Problem mittlerweile schon lösen können.
-
@gillian45 sagte in Verbindung mit dem Mqtt_Server via iobroker:
Ich habe mein Problem mittlerweile schon lösen können.
Dann lass uns mal teilhaben wie genau ?!
-
@djmarc75 Naja dadurch dass mein Board und mein Broker nicht im selben Netz waren haben sie sich nicht verbinden können. Warum ??? weiß ich noch nicht. Mir würde einfach vorgeschlagen mein Virtual_machine auf "Bridged mode" umzustellen damit die Beide im selben Netz läufen und das war's.