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!

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.

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
  ESP8266+PubSubClient und MQTT/ioBroker Arduino4Fun 10 5.412 08.09.2020 10:22
Letzter Beitrag: biologist
  i2c LCD Display am Wemos D1 Mini mit mqtt klappt nach modifikation nicht raspido 5 859 15.06.2020 22:19
Letzter Beitrag: stw
  MQTT Subcribe funktioniert nicht crazysky 13 1.510 20.04.2020 17:39
Letzter Beitrag: Tommy56
  ESP8266 + SSD1306 + BME280 + MQTT crazysky 11 1.968 05.04.2020 06:05
Letzter Beitrag: N1d45
  ESP8266 und MQTT Jakohoho 2 1.017 20.03.2020 16:29
Letzter Beitrag: N1d45
  DeepSleep und MQTT Probleme N1d45 9 2.160 28.02.2020 18:03
Letzter Beitrag: N1d45
  MQTT DHT22 0816_Saft 2 950 11.02.2020 13:57
Letzter Beitrag: biologist
  MQTT / RSL problem am Wemos D1 Mini myreal84 7 1.354 19.01.2020 13:42
Letzter Beitrag: Fips
  MQTT Client mit Client Zertifikaten und Benutzer/Passwort klappt nicht Mausbiber 10 3.227 11.08.2019 22:28
Letzter Beitrag: Mausbiber
  ESP32 MQTT Ausfall nach 201 Minuten Jan Hirt 9 4.026 06.08.2019 18:31
Letzter Beitrag: Tommy56

Gehe zu:


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