Ein mögliches Szenario ist der Einsatz eines ESP32-Boards, auf dem OpenMQTTGateway als „Betriebssystem“ läuft. Das Board ist mit einem Preis deutlich unter 10€ sehr günstig und verfügt über einen Micro-USB-Port, der das Flashen des Speichers besonders einfach macht. Das Prinzip ist leicht erklärt:
- Die BLE-Devices senden regelmäßig die Zustandsinformationen als „Broadcast“ per bluetooth low energy
- Das eingebaute Bluetooth-Modul im ESP32 empfängt und interpretiert diese Daten
- Der ESP32 ist im WLAN angemeldet und sendet an den konfigurierten MQTT-Server alle empfangenen Sensor-Daten
- Der in der ioBroker-Instanz aktive MQTT-Server empfängt die MQTT-messages und legt die entsprechenden Datenpunkte an
In der Theorie hört sich das alles sehr einfach an, im Detail sind einige Punkte zu beachten.
- Wird zum Beispiel ein Mijia Thermometer LYWSD03MMC verwendet, müssen wir zunächst eine modifizierte Firmware installieren, weil das OpenMQTTGateway die im Original verschlüsselten messages nicht auslesen kann.
- Die messages im MQTT Server werden als json-Objekte in einem ioBroker-Datenpunkt abgelegt, um z.B. die aktuelle Temperatur auszulesen, muss das json-Objekt interpretiert und die Daten in neuen Datenpunkten für z.B. Temperatur, Luftfeuchte und Batterie gespeichert werden.
Folgende Grafik beschreibt das Setup:
Was ist also zu tun?
- Im ersten Schritt müssen wir den ESP32 vorbereiten und OpenMQTTGateway mithilfe des Flash-Tools flashen. Hierzu benötigen wir vier Dateien:
- boot_app0.bin
- bootloader_dio_80m.bin (oder hierüber suchen, wenn Link veraltet: https://github.com/espressif/arduino-esp32/raw/)
- esp32dev-ble-firmware.bin (oder hierüber suchen, wenn Link veraltet: https://github.com/1technophile/OpenMQTTGateway/releases/download/)
- esp32dev-ble-partitions.bin (oder hierüber suchen, wenn Link veraltet: https://github.com/1technophile/OpenMQTTGateway/releases/download/)
- Nachdem wir die Dateien downgeloaded haben, starten wir das Flashtool, beim Start wählen wir Developer Mode und ESP32 DownloadTool aus. Die Dateien werden wie folgt im Tool definiert:
Wir schließen das Board per USB am Rechner an und löschen mit ERASE zunächst den Speicher, sollten Fehlermeldungen kommen, einfach nochmals versuchen, zwischendurch den Boot-Taster auf dem Board drücken. - Mit Start flashen wir die angegeben files in den Speicher des ESP32 Boards.
- Nach erfolgreichem Flashen startet das ESP32-Board neu und wir können uns mit dem WLAN des OpenMQTTGateways verbinden, das WLAN-Passwort ist auf „your_password“ gesetzt
- Nach erfolgreichem Connect zum WLAN öffnet sich die Konfigurations-Seite des ESP32 OpenMQTTGateways, wir setzen die Informationen für das bevorzugte WLAN und konfigurieren die MQTT-Einstellungen:
- Der MQTT-Server wird über den MQTT-Server/Client-Adapter in ioBroker installiert, folgende Konfiguration muss den Einstellungen im ESP32 OpenMQTTGateway, insbesondere der Port, entsprechen:
- Sobald die Verbindung über den MQTT-Server hergestellt ist, legt der Adapter automatisch alle Datenpunkte der empfangenen BLE-Devices an, in unserem Fall der Temperatursensor von Mijia (Wir haben diesen über https://atc1441.github.io/TelinkFlasher.html mit der angepassten Firmware geflasht).
In diesem Datenpunkt sind im json-Objekt alle Informationen des BLE-Devices abgelegt, in unserem Fall u.a. Temperatur und Luftfeuchte. - Im nächsten Schritt lesen wir mit einem Blockly das json-Objekt bei Aktualisierung aus, splitten das json-Objekt auf und speichern die Werte in eigenen Datenpunkten:
Die im Blockly hinterlegte Funktion haben wir am Ende der Seite als Codeblock eingefügt.
- Ab sofort werden die json-Datenpunkte automatisch ausgelesen und in den neuen Datenpunkten bei Aktualisierung gespeichert. Dieser Schritt ist für alle neuen json-Datenpunkte zu wiederholen.
Alternativ können wir statt dem OpenMQTTGateway auch Tasmota auf das ESP32-Board flashen, Vorteil dieser Lösung ist, dass die Datenpunkte automatisch korrekt durch den ioBroker-Adapter Sonoff angelegt werden.
//Datenpunkt mit MQTT-Informationen im json-Format auslesen json = (function () { try {return JSON.parse(getState("mqtt.0.home.OpenMQTTGateway.BTtoMQTT.A4C138E4874A").val);} catch(e) {return {};}})(); //json auslesen und Datenpunkte für Temperatur, Luftfeuchte und Batterie setState("javascript.0.BS32.BLE.ATC030212.Temperatur", getAttr(json, 'tempc')); setState("javascript.0.BS32.BLE.ATC030212.Luftfeuchte", getAttr(json, 'hum')); setState("javascript.0.BS32.BLE.ATC030212.Batterie", getAttr(json, 'batt')); //Log Ausgabe als return der Funktion return "MQTT ATC030212 aktualisiert";
Hallo, sehr gute Anleitung.
Bisher keine andere gefunden, die sich mit dem Thema beschäftigt.
Hatte es nun zunächst mit dem OPENMQTT hinbekommen, aber mit dem Blockly war es problematisch nun für jedes DEVICES die Objekte anlegen zu lassen, andernfalls hat der BLE zwar gesendet aber konnte das Objekt nicht finden.
Du meintest mit TASMOTA läuft das dann Automatisch rein korrekt ?
Bei mir schreibt er in MQTT es immer über tele/tasmota_34361C/SENSOR und überschreibt diese direkt wieder :(
Kann man hier einstellen, dass er die Werte ins separate Objekte ablegt ? oder ist hier auch JAVA Script notwendig ?
Wenn ja, kann man diese umbauen, dass man die Device AXXXXX einmalig oben als Variable reimkopiert und die Datenpunkte von alleine angelegt werden ?
Gruß
Was heißt überschreibt direkt wieder? Mit Tasmota und Sonoff sollte die Objektstruktur wie folgt aussehen:
Hallo Florian, ich versuche es gerade mit Tasmota aber habe auch das Problem das beim Sonoff Adapter die Datenpunkte einfach überschrieben werden bei mehreren BLE Devices und so sie einzelne Auswertung nicht so eonfach ist. Die Objektstruktur so wie Dein Screenprint bekomme ich so nicht hin. Hast Du da noch irgendwelche Rules in Tasmota laufen?
Hi Daniel, was genau heißt denn überschrieben? Wenn jedes Device seinen eigenen Namen bzw. Kennung hat sollte sich da nichts überschreiben. Der Sonoff-Adapter geht m.E. auch nicht pauschal mit allen BLE-Devices, welche BLE-Devices sind es denn?
@Matze ich hab gerade genau das selbe Problem. Bei 2 Tags die ich „empfange“ überschreibt es mir die Werte immer wieder so dass ich die Tags nicht einzeln auswerten kann. Wie hast DU das hinbekommen?
Hallo. Leider ist der Link zum Download der Datei bootloader_dio_80m.bin nicht mehr gültig.
Im Netz werde ich da auch nicht wirklich fündig.
Wäre super wenn du diese aktualisieren könntest.
DANKE
Danke für den Hinweis, Link ist aktualisiert!
Super Artikel!
Wie würde denn eine Anwesenheitserkennung mit OpenMQTTGateway im iobroker aussehen ?
Die gefundenen BLE Geräte kommen ja nicht ständig im Payload mit. Ich habe nur einen Zeitstempel pro Device, aber kein aktives „True/False“. Also im Empfangbereich oder nicht.
Hallo Florian,
danke für die gute Beschreibung. Die Links scheinen sich geändert zu haben, aber die Dateien konnte ich dennoch finden.
Ich habe das OpenMQTTGateway erfolgreich einrichten können und auch das Flashen der XIAOMI Sensoren hat funktioniert.
Die Verbindung zum ioBroker steht scheinbar auch.
Mir ist nicht klar, wie ich die Sensoren mit dem Gateway verbinde. Kannst Du mir hier bitte auf die Sprünge helfen?
Danke Andreas
Hallo Andreas, die Sensoren können nur mit der Original-Firmware mit dem Gateway (muss natürlich bluetooth-fähig sein) verbunden werden. Hierzu einfach in der Mi Home APP über „Gerät hinzufügen“ die Sensoren auswählen und die Devices werden aufgenommen.
Viele Grüße
Florian
Hallo vielen Dank erstmal für den super Artikel,
ich bin sehr neu im ganzen iot und programmier Thema und hätte eine Frage zu der Anleitung. Ich habe alle Einstellung im MQTT Adapter übernommen und mich über den WiFi Manager angemeldet, allerdings scheint danach irgendwas mit der Verbindung zu iobroker nicht zu funktionieren, da die Instanz gelb bleibt und ich auch unter Objekte mein ESP32 nicht sehen kann. Vielleicht kann mir ja hier jemand einen Tipp geben was ich übersehen habe.
Vielen Dank schonmal im voraus.
IP und Port korrekt konfiguriert?
IP ist in dem Fall nur die von Punkten unterteilte Nummer richtig?
Habe beides auf jeden Fall oft überprüft
Der MQTT-Adapter läuft auch korrekt? Empfängt der Adapter bereits von anderen Geräten Daten und ist grün?
Mion zusammen,
ich benutze den MQTT Adapter jetzt auch schon einige Zeit und es läuft eigentlich auch alles sehr gut.
Der Adapter legt für jedes neues Bluetoth Gerät neue Objekte an. Da ich an einer Hauptstraße wohne fürht das pro Woche zu mehreren tausend einträgen. Wenn ich dann den Objektbaum dann öffne führt das dann zu Abstürzen des kompletten Systems, da es sich schnell um 10-20 tausend einträge handelt, die jeden noch so modernen browser überfordern. Daher lösche ich den Ordner von Zeit zu Zeit einfach händisch.
Aber bin ich der einzige, der dieses Problem hat? Mach ich da grundzätzlich was verkehrt oder gibt es da eine elegantere Möglichkeit? Bin leider noch Anfänger und bin für jeden Tipp dankbar!
Gruß
Hannes
Hallo, so geht es mit auch.
Wie funktioniert das mit dem Flower Sensor?
Ich habe jetzt alles soweit gemacht. Die Bluetooth Geräte werden im IoBroker angezeigt. Dort befinden sich jedoch nur „ID“s. Muss der Flower Sensor auch mit einer custom Firmware geflashed werden?
Hallo
Vielen Dank für die Anleitung. Ich bin wohl der einzige der das Flashen nicht hinbekommt.
Muss ich den AZDelivery ESP32 NodeMCU Module vorher in den Boot modus bringen. Ich habe im Netz verschiedene Dinge gesehen aber nichts hat geklappt.
Nach den einstellungen startet das Programm und im Terminal sehe ich lauter punkte die wansdern. Einen Fortschritt im downloadtool sehe ich nicht.
Was könnte ich falsch machen
danke Fränki
Hallo.
vielen Dank für den Beitrag. wo bekomme ich denn die beiden Dateien unter 3 und 4 genannte? Wen ich diese Downloade, dann bekomme ich einen ZIP Ordner. Sorry ich bin hier nicht stark in der Materie.
Vielen Dank für eine Rückmeldung
Der Link zum Bootloader ist abgelaufen.
Haben wir mittlerweile aktualisiert.
Der Link zur Bootloader-Datei ist leider nicht mehr gültig.