Contents
Zu tun, Stand 14.März 2021:
- Installation ESP auf Breadboard. Stabilisieren.
- Handy-App für die Anzeige des Dachfensterstatus (oder zuerst mal eine PC-App, weil das einfacher ist?)
- Feuchtigkeitssensor integrieren/Status übermitteln –> Alarm in Handy-App ermöglichen
- Motor integrieren, der Dachfenster zu zieht, sobald Feuchte festgestellt wird
- Akku-Betrieb ermöglichen
- Schlafmodus ermöglichen
Hauptgrundlage:
Beschrieben in CT-Artikel 1/2. ct.de/yg7t (Libraries), Beispiel-Code
MQTT:
Leit-Artikel: https://www.heise.de/developer/artikel/Kommunikation-ueber-MQTT-3238975.html
MQTT Client
Anstatt die vom CT Heft speziell angefertigte Bootcamp library ist es besser die besser dokumentierte EspMQTTClient zu benutzen.
(Mit bootcamp ist es mir nicht gelungen auf den MQTT-Broker zu verbinden und auch nicht, irgendwelche Logs anzuzeigen.)
EspMQTTClient lässt sich in der Arduino IDE einfach mit 1,2 klicks über Tools > „Manage libraries …“ installieren. Danach kann der Sketch (Programm) SimpleMqttClient benutzt werden um die Interaktion des ESP mit dem MQTT broker auszutesten. Das Programm kann über „File“ > „Examples“ > „Examples from custiom libraries“ geholt werden.
MQTT Broker
Mosquitto-MQTT-Broker auf lokalem Rechner. Benötigte nur Download von Mosquitto-Download-Site. Nach Ausführen der Windows-Installation-Prozedur wird der Server gestartet mit Kommando:
mosquitto -c C:\tmp\mosquitto.conf -v
Damit der broker auch von aussen sichtbar ist, muss das mitgegebene mosquitto.conf file die Zeile
listener 1883 0.0.0.0
enthalten.
Zugreifbarkeit des MQTT Brokers prüfen:
Um die vom ESP32 an den MQTT-Broker gesendeten Messges anzusehen habe ich mit MQTT.fx einen lokalen standalone MQTT-Client installiert.
Einfacher ist es (wie im README.md) der Mosqitto-Installation vorgeschlagen
Den server laufen zu lassen:
mosquitto -c C:\tmp\mosquitto.conf -v
Dann auf ein (anwartschaftliches) Topic zu registrieren:
mosquitto_sub -t 'test/topic' -v
Diese Konsole geöffnet lassen.
Dann da auch was rein zu schreiben:
mosquitto_pub -t 'test/topic' -m 'hello world'
Die geschriebene Message sollte nun in der Konsole wo man das Abonnent definiert hat ausgelistet werden.
Remote-Zugreifbarkeit testen
Mit von aussen sichtbarer IP:
mosquitto_sub -h 192.168.178.50 -t 'test/topic' -v
Respektive:
mosquitto_pub -h 192.168.178.50 -t 'test/topic' -m 'hello world'
Eventuell muss die Windows Firewall für 1883 geöffnet werden. Zuvor testen!
Probleme mit der MQTT Interaktion – Broker ist nicht (für den ESP) erreichbar
Per Default werden durch den Mosquitto start zwei Netzwerk-Zugriffs-Definitionen erzeugt, welche duch netstat -an dann so angezeigt werden.
C:\Program Files\mosquitto>netstat -an | find /I "1883" TCP 127.0.0.1:1883 0.0.0.0:0 ABHÖREN TCP [::1]:1883 [::]:0 ABHÖREN
Remotemässig kann aber nur zugegriffen werden, wenn netstat -an diese anzeigt:
C:\Program Files\mosquitto>netstat -an | find /I "1883" TCP 0.0.0.0:1883 0.0.0.0:0 ABHÖREN TCP 192.168.178.46:1883 192.168.178.35:59784 WARTEND
–> Erklärung des outputs von netstat -an.
Wenn der MQTT-Broker über diese „öffentliche“ addresse angesprochen wird, so wird von Mosquitto automatisch auch Zugriff mit Passwort verlangt.
Wie man ein Passwortfile anlegt um dann zeight dieser Artikel: http://www.steves-internet-guide.com/mqtt-username-password-example/
Das Passwortfile wird im mosquitto.conf file als
password_file C:\tmp\mosquitto.pw
referenziert. Selbstredend muss mosqitto dann mit der Option -c <pfad_zum_conf_file> gestartet werden.
1. Sketch
Ein erster sehr simpler Sketch, der die Schalterwerte aus 3V und Pin33 ausliest und an den MQTT-Broker sendet.
#include "EspMQTTClient.h" static const int SensorPin = 33; int sensorValue = 0; uint16_t statusPacketIdSub = 0; EspMQTTClient client( "FRITZ!Box 7490", "Schlaraffenland46", "192.168.178.50", // MQTT Broker server ip "esp", // Can be omitted if not needed "geheim", // Can be omitted if not needed "ESP32HPS", // Client name that uniquely identify your device 1883 // The MQTT port, default to 1883. this line can be omitted ); void setup() { Serial.begin(115200); pinMode(SensorPin, INPUT); sensorValue = digitalRead(SensorPin); // Optionnal functionnalities of EspMQTTClient : client.enableDebuggingMessages(); // Enable debugging messages sent to serial output // client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. // These can be overrited with enableHTTPWebUpdater("user", "password"). client.enableLastWillMessage("TestClient/lastwill", "I am going offline"); // You can activate the retain flag by setting the third parameter to true } // This function is called once everything is connected (Wifi and MQTT) // WARNING : YOU MUST IMPLEMENT IT IF YOU USE EspMQTTClient void onConnectionEstablished() { do { delay(1000); int sensorValue = digitalRead(SensorPin); if (sensorValue == 0) { Serial.println("Sending: Dachfenster is offen!"); client.publish("dachfenster", "offen"); // You can activate the retain flag by setting the third parameter to true } else { Serial.println("Sending: Dachfenster ist zu"); client.publish("dachfenster", "closed"); // You can activate the retain flag by setting the third parameter to true } } while (true); } void loop() { client.loop(); }
Ist das Programm mal auf den ESP geladen kann dessen USB-Kabel vom PC ausgesteckt werden und z.B. an einen USB-Ladestecker angeschlossen werden.
Das Programm sollte dabei neu gestartet werden und neu beginnen Meldungen an den MQTT-Server zu senden.
Diese Version verbraucht noch ziemlich viel Strom, das das das Schlafengehen (nicht wie im CT Heft beispielcode) implementiert ist.
2. MQTT Client starten
c:\Programme\mosquitto>mosquitto -c c:\tmp\mosquitto.conf -v 1616246619: mosquitto version 2.0.9 starting 1616246619: Config loaded from c:\tmp\mosquitto.conf. 1616246619: Opening ipv4 listen socket on port 1883. 1616246619: mosquitto version 2.0.9 running 1616246631: New connection from 192.168.178.35:54203 on port 1883. 1616246631: New client connected from 192.168.178.35:54203 as ESP32HPS (p2, c1, k15, u'esp'). 1616246631: Will message specified (18 bytes) (r0, q0). 1616246631: TestClient/lastwill 1616246631: Sending CONNACK to ESP32HPS (0, 0) 1616246632: Received PUBLISH from ESP32HPS (d0, q0, r0, m0, 'dachfenster', ... (5 bytes)) 1616246633: Received PUBLISH from ESP32HPS (d0, q0, r0, m0, 'dachfenster', ... (5 bytes)) 1616246634: Received PUBLISH from ESP32HPS (d0, q0, r0, m0, 'dachfenster', ... (5 bytes))
Für Erklärungen siehe oben!
3. Den Abonnenten auf die ‚Dachfenster‘-Meldugen starten:
c:\Programme\mosquitto>mosquitto_sub -h 192.168.178.50 -t dachfenster -u esp -P geheim -v dachfenster offen dachfenster offen dachfenster offen dachfenster offen dachfenster offen