INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
wert an client schicken während Deepsleep mqtt & ibroker
02.11.2020, 11:24
Beitrag #1
wert an client schicken während Deepsleep mqtt & ibroker
Hi,

ich bin neu hier im Forum und neu in Sachen Mqtt, und habe eine Frage deepsleep betreffend.
Mein Wemos liegt im "deepsleep" und wacht alle 30 min auf und verbindet mit Iobroker mittles Mqtt und überträgt seine Daten.
Jetzt würde ich gerne einen Ausgang auf dem Wemos schalten. Es gibt ein inTopic was er subscribt hat mit 1 und 0, und wenn der Chip normal läuft (ohne deepsleep) dann geht das auch, aber wenn er aufwacht bemerkt er es nicht.
Wie händelt man sowas im normalerweise mit mqtt?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.11.2020, 21:13
Beitrag #2
RE: wert an client schicken während Deepsleep mqtt & ibroker
Moin Stevensen,
könntest Du mal bitte Deinen Sketch für den ESP posten (SSID und Password rauslöschen)?
Ich weiss, dass es beim Publishen häufig zu dem Effekt kommt, dass die allererste Meldung nach dem Connecten nicht rausgeht. Vielleicht gibts da einen ähnlichen Effekt beim Subscriben (könnte man eventuell durch ein delay() zwischen connect und subscribe lösen...).
Ich vermute allerdings eher, dass es an Deinen MQTT-Broker Einstellungen in IOBroker liegt. Hast du bei "Set retain flag" einen Haken gesetzt?
Grüße Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.11.2020, 17:04
Beitrag #3
RE: wert an client schicken während Deepsleep mqtt & ibroker
(02.11.2020 21:13)nbk83 schrieb:  Moin Stevensen,
könntest Du mal bitte Deinen Sketch für den ESP posten (SSID und Password rauslöschen)?
Ich weiss, dass es beim Publishen häufig zu dem Effekt kommt, dass die allererste Meldung nach dem Connecten nicht rausgeht. Vielleicht gibts da einen ähnlichen Effekt beim Subscriben (könnte man eventuell durch ein delay() zwischen connect und subscribe lösen...).
Ich vermute allerdings eher, dass es an Deinen MQTT-Broker Einstellungen in IOBroker liegt. Hast du bei "Set retain flag" einen Haken gesetzt?
Grüße Jan

Vielen Dank für die Antwort!
Bin unterwegs und gucke heute Abend nach der IOBroker-Einstellung und melde mich dann bald wieder hier.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.11.2020, 17:47
Beitrag #4
RE: wert an client schicken während Deepsleep mqtt & ibroker
Hallo,

retain wird vom Publisher der Message als Flag für genau diese Message mitgegeben.
Der Brokererledigt das dann nur, wenn also eine Message als retain gekennzeichnet ankommt wir sie vom Broker zwischengespeichert und wenn ein Client sich für diesen Topic anmeldet, bekommt er diese Nachrichten sofort zugestellt.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.11.2020, 21:07
Beitrag #5
RE: wert an client schicken während Deepsleep mqtt & ibroker
Moin Michael,
danke für deinen Input. Bin auf die Rückmeldung vom TO gespannt, da ich selbst demnächst wohl auch auf diese Problematik treffen werde.
Gruß Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.11.2020, 14:43 (Dieser Beitrag wurde zuletzt bearbeitet: 04.11.2020 14:44 von biologist.)
Beitrag #6
RE: wert an client schicken während Deepsleep mqtt & ibroker
Retain kann hier auf jeden Fall benutzt werden. Man darf das allerdings auch nicht vergessen, wenn man retained messages setzt. Oder anders gesagt: Wenn ein Kanal retained ist und mehrere Teilnehmer in diesen Kanal reinschreiben, dann sollten das alle retained tun. Denn sonst kann es zu seltsamen Effekten kommen.

Ich nutze das in der Form auf jeden Fall auch. Habe eine Steuerung für die Gartenbewässerung, an der auch Temperatursensoren angebracht sind. Wenn der ESP32 im Deepsleep ist, dann wacht er nach fünf Minuten auf. Er schickt dann die Daten der Sensoren per MQTT und prüft dann den Zustand eines Topics. Dieses legt fest, ob der ESP wieder in Deepsleep gehen soll (und dann in 5min wieder aufwachen) oder wachbleiben. Ohne retained hatte ich hier auch das Problem, dass der ESP das nicht mitbekommen hat, wenn er in Deepsleep war. Mit ist es jedoch kein Problem.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.11.2020, 15:35
Beitrag #7
RE: wert an client schicken während Deepsleep mqtt & ibroker
Hallo,

natürlich muß man da jeweils bedenken, wann man von welchen Client was "retain" schickt.
Die Nachrichten können sehr anhänglich sein wenn sie erstmal beim Broker sind. Gelöscht bekommt man sie, wenn man eine Message unter dem Topic mit leerem payload schickt.
Sonst geht schnell mal mitten in der Nacht das Licht an, weil man da eine "On"-Message mit retain-Flag gesendet hatte und der Client der Lampe mal eben einen reconnect im WLAN und MOTT-Broker macht...

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 16:16
Beitrag #8
RE: wert an client schicken während Deepsleep mqtt & ibroker
Vielen Dank für die Beteiligung und Antworten.

Ich habe nachgeschaut im iobroker war das "Set retain flag" nicht gesetzt. Hab' ich geändert half aber nichts.

hier mal mein Sktech, bitte kein Shitstorm hab's aus Samples von MQTT zusammen gebastelt, und habe MQTT noch nicht verstanden.
Z.B. Reconnect brauche ich ja eigentlich nicht oder ?
Also wenn ich es in der Loop, also ohne Deepsleep laufen lassen gehts und die LED blinkt dann wenn ich Wemos_inTopic von 0 auf 1 wechsle. Mit Tiefschlaf nicht.

Code:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>  // Adafruit Bibliothek einbinden

// Update these with values suitable for your network.

const char* ssid = "t-online.12123123";  
const char* password = "212DSDAd23%";
const char* mqtt_server = "174.168.178.33";

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;

#define MSG_BUFFER_SIZE    (50)
char msg[MSG_BUFFER_SIZE];


float value = 0.0;
String myString;
String message;

Adafruit_BMP085 bmp;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

Wire.begin();

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

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

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {


  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }

String message;
  for (int x = 0; x < length; x++) {
    message = message + (char)payload[x];  //Convert *byte to String
  }
  
  //payload[length + 1] = '\0';
  Serial.println();
  value = message.toInt();
  Serial.print("Value= ");
  Serial.println(value);
  value ++;
  
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    for (int i=0;i<5;i++ ){
      digitalWrite(BUILTIN_LED, LOW);
      delay(200);
      digitalWrite(BUILTIN_LED, HIGH);
      delay(200);
      }
  }
  else
  {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.println("RECONNECT !!!! ");
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");          
      client.subscribe("Wemos_inTopic");
    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
   pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  digitalWrite(BUILTIN_LED, LOW);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  pinMode(D7, OUTPUT);
  digitalWrite(D7, HIGH);   // Switch BMP085 on

// Sensor initialisieren
if (!bmp.begin()) {
  Serial.println("Keinen gültigen BMP085 Sensor gefunden!");
  while (true) {}
}


}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();

Serial.print("Temperatur: ");
// readTemperature() Temperatur °C auslesen und anzeigen
Serial.print(bmp.readTemperature());
Serial.print(" ");  // Hier müssen wir ein wenig tricksen
Serial.write(176);  // um das °-Zeichen korrekt darzustellen
Serial.println("C");

Serial.print("Luftdruck: "); // readPressure() Luftdruck in Pa auslesen und anzeigen
Serial.print(bmp.readPressure());
Serial.println(" Pa");

    value = bmp.readTemperature();
    snprintf (msg, MSG_BUFFER_SIZE,"%.1f", value );
    Serial.print("Publish message: ");
    Serial.println(msg);
    // orig client.publish("Wemos_outTopic", msg);
    client.publish("Wemos>>Tempa", msg);
    value = bmp.readPressure();
    value = value / 100.0f;
    snprintf (msg, MSG_BUFFER_SIZE,"%.2f", value );
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("Wemos>>Pressure", msg);

  delay(1000);

digitalWrite(D7, LOW); // BMP85 ausschalten

// 30 min
ESP.deepSleep(30 * 60 * 1000000);


delay(100);
  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden SoerenKaiser99 23 496 10.05.2021 21:25
Letzter Beitrag: SoerenKaiser99
Star Deepsleep Led noch immer aktiv crazysky 6 226 03.05.2021 13:56
Letzter Beitrag: hotsystems
  Client(ESP8266) und Webserver(ESP32) Dahabcon 14 963 25.04.2021 20:32
Letzter Beitrag: Tommy56
  Einer RGB-LED am ESP Werte aus MQTT zuweisen. Manny 2 403 15.04.2021 16:50
Letzter Beitrag: Manny
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 23 4.296 09.04.2021 16:15
Letzter Beitrag: amshh
  BUILTIN_LED vom ESP mit MQTT und NodeRed schalten. Manny 7 742 22.03.2021 18:24
Letzter Beitrag: Manny
  ESP32 / DeepSleep / Akkulaufzeit ? Steinspiel 23 2.420 27.02.2021 20:20
Letzter Beitrag: Steinspiel
  ESP32 Mail Client stefan.hild@t-online.de 20 1.893 06.02.2021 22:16
Letzter Beitrag: Corvus
  MQTT Topic abbonieren? Steinspiel 32 2.958 21.01.2021 22:50
Letzter Beitrag: Tommy56
  Esp8266 - Client, immer wieder ... rev.antun 37 2.793 19.01.2021 23:09
Letzter Beitrag: rev.antun

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste