Forum: Mikrocontroller und Digitale Elektronik Wemos d1 mini Adafruit Mqtt


von Fl0_ F. (Firma: Alexa) (sntl_yeet)


Lesenswert?

Hi, ich möchte eine led mit adafruit steuern, jedoch macht das ganze 
probleme. Im Wlan verbindet der wemos d1 mini sich und auch Mqtt 
connectet, jedoch klappt nach  MQTT_connect(); nichts in void loop mehr.



#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define WIFI_SSID "FRITZ!Box 7590 SZ"
#define WIFI_PASS "PW"

#define MQTT_SERV "io.adafruit.com"
#define MQTT_PORT 1883
#define MQTT_NAME "sntlyeet"
#define MQTT_PASS "Key"

int led = 0;

WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, MQTT_SERV, MQTT_PORT, MQTT_NAME, 
MQTT_PASS);

Adafruit_MQTT_Subscribe onoff = Adafruit_MQTT_Subscribe(&mqtt, MQTT_NAME 
"/f/ONOF");
Adafruit_MQTT_Publish LightsStatus = Adafruit_MQTT_Publish(&mqtt, 
MQTT_NAME "/f/LightsStatus");


void setup()
{
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);


  //Connect to WiFi
  Serial.print("\n\nConnecting Wifi>");
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  digitalWrite(LED_BUILTIN, LOW);

  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(">");
    delay(50);
  }

  Serial.println("OK!");

  //Subscribe to the onoff topic
  mqtt.subscribe(&onoff);

  pinMode(led, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(led, LOW);

}

void loop()
{
  //Connect/Reconnect to MQTT
  MQTT_connect();

  //Read from our subscription queue until we run out, or
  //wait up to 5 seconds for subscription to update
  Adafruit_MQTT_Subscribe * subscription;
  while ((subscription = mqtt.readSubscription(5000)))
  {
    //If we're in here, a subscription updated...
    if (subscription == &onoff)
    {
      //Print the new value to the serial monitor
      Serial.print("onoff: ");
      Serial.println((char*) onoff.lastread);

      //If the new value is  "ON", turn the light on.
      //Otherwise, turn it off.
      if (!strcmp((char*) onoff.lastread, "ON"))
      {
        //active low logic
        digitalWrite(led, HIGH);
        LightsStatus.publish("ON");
      }
      else if (!strcmp((char*) onoff.lastread, "OFF"))
      {
        digitalWrite(led, LOW);
        LightsStatus.publish("OFF");

      }
      else
      {
        LightsStatus.publish("ERROR");
      }
    }
    else
    {
      //LightsStatus.publish("ERROR");
    }
  }
  //  if (!mqtt.ping())
  //  {
  //    mqtt.disconnect();
  //  }
}


void MQTT_connect()
{

  //  // Stop if already connected
  if (mqtt.connected() && mqtt.ping())
  {
    //    mqtt.disconnect();
    return;
  }

  int8_t ret;

  mqtt.disconnect();

  Serial.print("Connecting to MQTT... ");
  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) // connect will return 0 for 
connected
  {
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
    retries--;
    if (retries == 0)
    {
      ESP.reset();
    }
  }
  Serial.println("MQTT Connected!");
}

von Helmut -. (dc3yc)


Lesenswert?

Was klappt nicht in loop? Etwas genauere Fehlerbeschreibung wäre 
wünschenswert. Womit sendest du das Topic? Und was sendest du?

von Fl0_ F. (Firma: Alexa) (sntl_yeet)


Lesenswert?

es scheint als würde der nicht subscriben können und die Befehle nicht 
auslesen. Im loop funktioniert nach dem Mqtt connect nicht mehr, also es 
kommt weger im serial monitor ein error oder das irgendwas erkannt 
wurde. Durch ifttt wird im feed in adafruit On gepostet -> der esp8266 
soll das ekennen und eine led schalten.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Fl0_ F. schrieb:
> es scheint als würde der nicht subscriben können

Woran hast du das erkannt?

von Fl0_ F. (Firma: Alexa) (sntl_yeet)


Lesenswert?

er connected mit mqtt und danach geht nichts mehr, also er macht nicht 
weiter. Ich denke das liegt daran dass er nicht von den befehlen 
erkennt. Muss ich ports freigeben?

von Stefan F. (Gast)


Lesenswert?

Fl0_ F. schrieb:
> er connected mit mqtt und danach geht nichts mehr, also er macht
> nicht
> weiter. Ich denke das liegt daran dass er nicht von den befehlen
> erkennt.

Klingt jetzt nicht sehr eindeutig. Ich würde das mal mit Wireshark 
untersuchen. Damit bekommst du auch eine eindeutige Antwort auf deine 
Frage:

>  Muss ich ports freigeben?

von Timmo H. (masterfx)


Lesenswert?

Hast du mal die Pubsubclient Lib getestet? Die ist eigentlich 
ausreichend und funzt bei mir seit Monaten problemlos inkl. Deepsleep.

von Fl0_ F. (Firma: Alexa) (sntl_yeet)


Lesenswert?

Nein, leider nicht. Ich werde es die tage mal probieren. Das problem 
ist, dass ich relativ neu bin und wenig ahnung von webhooks, bzw mqtt 
habe. Das mit der led ist halt von Yt und bisschen rumproblieren 
entstanden. Ist es denn möglich diese Library auf Adafruit anzuwenden?

von Fl0_ F. (Firma: Alexa) (sntl_yeet)


Lesenswert?

Sch*** Sch**** Sch***! Ich hatte einen tippfehler drin. Alles war 
richtig! Ich hab statt OnOff "OnOf" geschrieben und desshalb hat er das 
nicht ausgelesen. Trotzdem vielen Dank!

von Stefan F. (Gast)


Lesenswert?

Fl0_ F. schrieb:
> Ich hab statt OnOff "OnOf" geschrieben und desshalb hat er das
> nicht ausgelesen.

Ich freue mich für Dich mit. Wie bist du darauf gekommen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.