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
Pushbutton mit ESP und MQTT
09.01.2020, 00:31
Beitrag #1
Pushbutton mit ESP und MQTT
Moin,

ich bin gerade dabei einen Pushbutton bzw. Dashbutton mit einem ESP-01 zu bauen.

Ich habe nun folgendes zusammengebaut:

Code:
//**********************************************************************
// INCLUDE
//**********************************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <WiFiClient.h>

//**********************************************************************
// DEFINE
//**********************************************************************
#define LED 2               // GPIO2 - Onboard LED

//**********************************************************************
// PARAMETER
//**********************************************************************
// Wifi
const char* host = "dashbutton-sz-light";
const char* ssid = "Headquarter";
const char* password = "XXXXXXXXX";
// MQTT
const char* mqtt_server = "10.80.1.24";
const char* mqtt_clientId = "dashbutton-sz-light";
const char* outTopicMsg = "dashbutton-sz/light/state";
const char* outTopicVCC = "dashbutton-sz/light/vcc";
const char* outTopicCon = "dashbutton-sz/light/connect";
// Hardware
int ledState = HIGH;                // ledState used to set the LED
unsigned long previousMillis = 0;   // will store last time LED was updated
const long interval = 500;          // interval at which to blink (milliseconds)
long sendtime = 0;                  // sendtime
char msg[50];                       // message for mqtt publish
//int mqtt_state = 3;

//**********************************************************************
// SETUP
//**********************************************************************
ADC_MODE (ADC_VCC);                 // VCC Read

WiFiClient espClient;
PubSubClient client(espClient);

void setup(){
  pinMode(LED, OUTPUT);                   // Onboard LED on ESP-08S as Output                            
  sendtime = millis();                    
  Serial.begin(115200);  

// Setup Wifi
  setup_wifi();

// Setup MQTT
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

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

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

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.println("Attempting MQTT connection...");
    // Client ID connected
    if (client.connect(mqtt_clientId)) {
      Serial.print(mqtt_clientId);
      Serial.println(" connected");
      // Once connected, publish an announcement...
      client.publish(outTopicCon, "connected");
      // ... and resubscribe
      client.subscribe(outTopicMsg);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
   String s = String((char*)payload);
   int mqtt_state = s.toInt();
   Serial.print("Actual State is: ");
   Serial.println(mqtt_state);
   // Read the VCC from Battery
   float vcc = ESP.getVcc() / 1000.0;
   vcc = vcc - 0.12;     // correction value from VCC
   dtostrf(vcc, sizeof(vcc), 2, msg);
   Serial.print("VCC: ");
   Serial.print(msg);
   Serial.println("V");
   Serial.print("Publishing VCC State to the MQTT Broker now.");
   client.publish(outTopicVCC, msg);
   //Set State and publish
   Serial.print("Setting State and publishing it to the MQTT Broker now. ");
   if (mqtt_state ==  0) {
      Serial.print("State is OFF. Turning ON. ");
      mqtt_state = 1;
      Serial.print("State is now: ");
      Serial.println(mqtt_state);
      sendtime = millis() - sendtime;
      Serial.print("Sendtime: ");
      Serial.print(sendtime);
      Serial.println("ms");
      Serial.print("Finished. Going to sleep now.");
      //ESP.deepSleep(0, WAKE_RFCAL);
   } else if (mqtt_state == 1) {
      Serial.print("State is ON. Turning OFF. ");
      mqtt_state = 0;
      Serial.print("State is now:");
      Serial.println(mqtt_state);
      sendtime = millis() - sendtime;
      Serial.print("Sendtime: ");
      Serial.print(sendtime);
      Serial.println("ms");
      Serial.print("Finished. Going to sleep now.");
      //ESP.deepSleep(0, WAKE_RFCAL);
   } else {
      Serial.print("ERROR: No vaild Value found. ");
      Serial.print("Finished with ERRORS. Going to sleep now.");
      //ESP.deepSleep(0, WAKE_RFCAL);
   }
}

//**********************************************************************
// LOOP
//**********************************************************************
void loop(){

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

  delay(500);
}

Zwei Probleme:
1) Die Callback Funktion wird nur ausgelöst. Wenn eine MQTT Nachricht in das Topic eingeht.
Wie kann ich die Funktion im loop aufrufen, dass er einfach das Topic ausliest. Es hat ja irgendein Wert, was mein Broker gespeichert hat.

2) Der Wert in mqtt_state wird am anfang korrekt gespeichert. Dieser hat z.B. den Wert 0. Den schicke aktuell Manuell raus. Wenn ich nun die 1 an das Topic sende, dann kommt eine 13 raus. Wenn ich dann wieder eine 0 sende kommt eine 3. Wenn ich aber 00 oder 01 sende, dann passt es... Hier mal die Serial Console:

Code:
00:26:24.270 -> SDK:2.2.2-dev(38a443e)/Core:2.6.2=20602000/lwIP:STABLE-2_1_2_RELEASE/glue:1.2-16-ge23a07e/BearSSL:89454af
00:26:24.270 -> wifi evt: 2
00:26:24.270 ->
00:26:24.270 -> Connecting to Headquarter
00:26:24.410 -> scandone
00:26:24.879 -> .....scandone
00:26:28.197 -> state: 0 -> 2 (b0)
00:26:28.197 -> .state: 2 -> 3 (0)
00:26:28.244 -> state: 3 -> 5 (10)
00:26:28.244 -> add 0
00:26:28.244 -> aid 8
00:26:28.244 -> cnt
00:26:28.244 ->
00:26:28.244 -> connected with Headquarter, channel 1
00:26:28.244 -> dhcp client start...
00:26:28.244 -> wifi evt: 0
00:26:28.244 -> ip:10.80.1.249,mask:255.255.255.0,gw:10.80.1.1
00:26:28.244 -> wifi evt: 3
00:26:28.713 -> .
00:26:28.713 -> WiFi connected
00:26:28.713 -> IP address:
00:26:28.713 -> 10.80.1.249
00:26:28.713 -> Attempting MQTT connection...
00:26:28.713 -> [hostByName] Host: 10.80.1.24 is a IP!
00:26:28.713 -> :ref 1
00:26:28.713 -> wifi evt: 7
00:26:28.760 -> wifi evt: 7
00:26:28.760 -> :wr 33 0
00:26:28.760 -> :wrc 33 33 0
00:26:28.760 -> :ack 33
00:26:28.760 -> :rn 4
00:26:28.760 -> :c0 1, 4
00:26:28.760 -> dashbutton-sz-light connected
00:26:28.760 -> :wr 40 0
00:26:28.760 -> :wrc 40 40 0
00:26:28.760 -> :wr 32 0
00:26:28.760 -> :wrc 32 32 0
00:26:28.806 -> wifi evt: 7
00:26:28.854 -> :ack 40
00:26:28.854 -> :ack 32
00:26:28.854 -> :rn 5
00:26:29.275 -> :c0 1, 5
00:26:29.369 -> wifi evt: 7
00:26:29.369 -> wifi evt: 7
00:26:29.416 -> wifi evt: 7
00:26:29.463 -> wifi evt: 7
00:26:29.510 -> wifi evt: 7
00:26:43.799 -> :wr 2 0
00:26:43.799 -> :wrc 2 2 0
00:26:43.799 -> :ack 2
00:26:43.799 -> :rn 2
00:26:44.267 -> :c0 1, 2
00:26:51.429 -> :rn 30
00:26:51.804 -> :c0 1, 30
00:26:51.804 -> Actual State is: 0
00:26:51.804 -> VCC: 3.39V
00:26:51.804 -> Publishing VCC State to the MQTT Broker now.:wr 31 0
00:26:51.804 -> :wrc 31 31 0
00:26:51.804 -> Setting State and publishing it to the MQTT Broker now. State is OFF. Turning ON. State is now: 1
00:26:51.804 -> Sendtime: 27516ms
00:26:51.804 -> Finished. Going to sleep now.:ack 31
00:27:01.416 -> :rn 30
00:27:01.791 -> :c0 1, 30
00:27:01.791 -> Actual State is: 13
00:27:01.791 -> VCC: 3.39V
00:27:01.791 -> Publishing VCC State to the MQTT Broker now.:wr 31 0
00:27:01.791 -> :wrc 31 31 0
00:27:01.791 -> Setting State and publishing it to the MQTT Broker now. ERROR: No vaild Value found. Finished with ERRORS. Going to sleep now.:ack 31
00:27:15.291 -> wifi evt: 7
00:27:15.338 -> wifi evt: 7
00:27:16.792 -> :wr 2 0
00:27:16.792 -> :wrc 2 2 0
00:27:16.839 -> :ack 2
00:27:16.839 -> :rn 2
00:27:17.307 -> :c0 1, 2
00:27:22.891 -> :rn 30
00:27:23.313 -> :c0 1, 30
00:27:23.313 -> Actual State is: 3
00:27:23.313 -> VCC: 3.39V
00:27:23.313 -> Publishing VCC State to the MQTT Broker now.:wr 31 0
00:27:23.313 -> :wrc 31 31 0
00:27:23.313 -> Setting State and publishing it to the MQTT Broker now. ERROR: No vaild Value found. Finished with ERRORS. Going to sleep now.:ack 31
00:27:28.723 -> wifi evt: 7
00:27:28.723 -> wifi evt: 7
00:27:28.817 -> wifi evt: 7
00:27:28.911 -> wifi evt: 7
00:27:38.314 -> :wr 2 0
00:27:38.314 -> :wrc 2 2 0
00:27:38.314 -> :ack 2
00:27:38.314 -> :rn 2
00:27:38.817 -> :c0 1, 2
00:27:53.320 -> :wr 2 0
00:27:53.320 -> :wrc 2 2 0
00:27:53.320 -> :ack 2
00:27:53.320 -> :rn 2
00:27:53.841 -> :c0 1, 2
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.01.2020, 06:53
Beitrag #2
RE: Pushbutton mit ESP und MQTT
bin zwar auch neu in der Materie aber das liest sich nach einen C bzw C++ Fehler.

Du liest über das string ende raus:

Code:
void callback(char* topic, byte* payload, unsigned int length) {
   String s = String((char*)payload);

Man darf nicht ein Byte Array einfach son in einen String umwandel da könnte das 0 Byte für das Ende fehlen und das Liest du wild im speicher rum was ja auch zu den Ausgaben passt. Da steht 13 und nicht 1.

wenn du da nur die zahlen 1 bis 0 verwenden willst kann du ein haufen rechnen zeit sparenen wenn du einfach schreibst:

int mqtt_state = payload[0] - 0x30;
Die Zahl 1 ist Hexzeichen 31 und so mit geht es einfacher. Wie gesagt funktioniert nur bei einstelligen Zahlen.

Ich würde ganz Vorne noch eine Prüfung auf length machen.

Zitat:1) Die Callback Funktion wird nur ausgelöst. Wenn eine MQTT Nachricht in das Topic eingeht.
Wie kann ich die Funktion im loop aufrufen, dass er einfach das Topic ausliest. Es hat ja irgendein Wert, was mein Broker gespeichert hat.

Warum will man pollen wenn man doch Events hat ?

Mein Projekt
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.01.2020, 11:53
Beitrag #3
RE: Pushbutton mit ESP und MQTT
(09.01.2020 06:53)DerkleinePunk schrieb:  bin zwar auch neu in der Materie aber das liest sich nach einen C bzw C++ Fehler.

Du liest über das string ende raus:

Code:
void callback(char* topic, byte* payload, unsigned int length) {
   String s = String((char*)payload);

Man darf nicht ein Byte Array einfach son in einen String umwandel da könnte das 0 Byte für das Ende fehlen und das Liest du wild im speicher rum was ja auch zu den Ausgaben passt. Da steht 13 und nicht 1.

wenn du da nur die zahlen 1 bis 0 verwenden willst kann du ein haufen rechnen zeit sparenen wenn du einfach schreibst:

int mqtt_state = payload[0] - 0x30;
Die Zahl 1 ist Hexzeichen 31 und so mit geht es einfacher. Wie gesagt funktioniert nur bei einstelligen Zahlen.

Ich würde ganz Vorne noch eine Prüfung auf length machen.

Ah. Danke! Das werde ich heute abend mal testen.
würdest du mir noch netterweise verraten wie ich die Prüfung auf Lenght mache?

Zitat:1) Die Callback Funktion wird nur ausgelöst. Wenn eine MQTT Nachricht in das Topic eingeht.
Wie kann ich die Funktion im loop aufrufen, dass er einfach das Topic ausliest. Es hat ja irgendein Wert, was mein Broker gespeichert hat.

(09.01.2020 06:53)DerkleinePunk schrieb:  Warum will man pollen wenn man doch Events hat ?

Sorry: Wie bitte? Big Grin

Bevor ein MQTT Befehl versendet wird, muss der aktuelle Status des Topics geprüft werden. Damit er die Lampe entweder ein oder ausschalten muss.
Also muss ich die Callbackfunktion oder von mir aus auch eine andere Funktion im loop aufrufen.
Da mein Ablauf im Callback erst ausgeführt wenn eine Nachricht im Topic ankommt, das ist nicht gewollt, weil dann würde er die Lampe z.B. direkt wieder ausschalten.
Der ESP geht dann in den DeepSleep und kann so keine MQTT Nachrichten empfangen. Durch den Knopfdruck wird er gestartet, da dann keine MQTT Nachricht in das Topic reinkommt, passiert auch nichts.

Da fällt mir beim schreiben ein:
Kann ich im Loop nicht einfach in ein anderes Topic publishen, das Topic wird mit dem callback abgefragt. Nur wie komme ich dann in die Abfrage des richtigen Topics? Ohh das verwirrt so.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.01.2020, 11:53
Beitrag #4
RE: Pushbutton mit ESP und MQTT
@TO: Haben Dir die Antworten nebenan nicht gefallen?

In welchem Forum hättest Du denn jetzt gern die Antworten oder lieber in keinem?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.01.2020, 12:02
Beitrag #5
RE: Pushbutton mit ESP und MQTT
Na danke...
Zwei Foren = Verschiedene Leute = Verschiedene Anworten und Lösungen.
Und die Antwort im anderen Forum war ja klar und deutlich und habe neue Fragen bzw. um neue Hilfe gebeten.
Verstehe gerade ein Problem nicht.

Und DerkleinePunk hat schnell geantwortet und ich weiß nicht ob er in dem anderen Forum geantwortet. Ich bin auf jede Hilfe angewiesen und freue mich. Aber sowas muss nicht sein.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2020, 13:37
Beitrag #6
RE: Pushbutton mit ESP und MQTT
(09.01.2020 12:02)FirstS0ul schrieb:  Na danke...

Verstehe gerade ein Problem nicht.

In den mir bekannten deutschen Foren zum Thema HTML, JavaScript und PHP wirst du bei Crosspostings umgehend zu Recht, gerecht behandelt.
Du bist nicht der Mittelpunkt des Universums!
Die Helfer in den Foren helfen in ihrer Freizeit gerne, aber nur sehr ungern doppelt und dreifach!

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2020, 14:03 (Dieser Beitrag wurde zuletzt bearbeitet: 10.01.2020 14:31 von FirstS0ul.)
Beitrag #7
RE: Pushbutton mit ESP und MQTT
Dann braucht man nicht doppelt antworten. Jeder muss ja nicht in jedem Forum angemeldet sein.
Oh mann...
Egal.

Entweder wir machen jetzt weiter und helfen einander oder wir lassen es ganz. Wollte nur mehr Leute erreichen.

EDIT: Problem 2 wäre gelöst. Danke für den Tipp an DerkleinePunk.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2020, 14:31
Beitrag #8
RE: Pushbutton mit ESP und MQTT
(10.01.2020 14:03)FirstS0ul schrieb:  ... und helfen einander .....

Nach dem du schon Hilfe in beiden Foren erhalten hast, solltest du zunächst deine oben genannten guten Absichten unter Beweiß stellen und deine Hilfe aktiv anderen zukommen lassen.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 22 2.548 08.02.2021 15:34
Letzter Beitrag: ardu_arne
  MQTT Topic abbonieren? Steinspiel 32 2.208 21.01.2021 22:50
Letzter Beitrag: Tommy56
  433MHz-WiFi-MQTT-Sender nbk83 25 1.654 04.01.2021 16:35
Letzter Beitrag: nbk83
  Wo MQTT LogIn Daten einfügen? Steinspiel 10 884 28.12.2020 14:32
Letzter Beitrag: Tommy56
  Sensorausgabe mit MQTT publishen ? Steinspiel 14 1.147 16.12.2020 13:06
Letzter Beitrag: biologist
  Hilfe bei async-mqtt-client für ESP32 amshh 7 792 12.11.2020 09:19
Letzter Beitrag: amithlon
  DHT11 Daten via MQTT an Raspi senden Hanibal_Smith 5 611 10.11.2020 16:24
Letzter Beitrag: biologist
  wert an client schicken während Deepsleep mqtt & ibroker stevensen 13 1.189 06.11.2020 21:07
Letzter Beitrag: nbk83
  MQTT Connect schleife looped crazysky 1 469 29.10.2020 15:21
Letzter Beitrag: crazysky
  ESP8266 - MQTT Probleme mit SSL decrypt tenor 8 1.428 22.09.2020 19:33
Letzter Beitrag: tenor

Gehe zu:


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