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
  Hilfe bei async-mqtt-client für ESP32 amshh 7 299 12.11.2020 09:19
Letzter Beitrag: amithlon
  DHT11 Daten via MQTT an Raspi senden Hanibal_Smith 5 319 10.11.2020 16:24
Letzter Beitrag: biologist
  Probleme bei der Kombination Firebase/HTTPS client devnull69 13 542 05.11.2020 16:47
Letzter Beitrag: Tommy56
  Hygrometer mit Datenlogger trotz Deepsleep mkuester 49 2.256 04.11.2020 20:33
Letzter Beitrag: hotsystems
  MQTT Connect schleife looped crazysky 1 319 29.10.2020 15:21
Letzter Beitrag: crazysky
  ESP8266 DeepSleep Reset unterscheiden N1d45 14 1.255 05.10.2020 05:01
Letzter Beitrag: N1d45
  ESP8266 - MQTT Probleme mit SSL decrypt tenor 8 990 22.09.2020 19:33
Letzter Beitrag: tenor
  remoteIP() mit Client.h? miq19 6 772 11.09.2020 10:21
Letzter Beitrag: miq19
  ESP8266+PubSubClient und MQTT/ioBroker Arduino4Fun 10 6.843 08.09.2020 10:22
Letzter Beitrag: biologist
  i2c LCD Display am Wemos D1 Mini mit mqtt klappt nach modifikation nicht raspido 5 1.130 15.06.2020 22:19
Letzter Beitrag: stw

Gehe zu:


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