Für die Einbindung von BLE-Devices, z.B. Thermometer oder BLE-Tags für die Anwesenheitserkennung, erfolgt im Smarthome meist über zusätzliche Hardware, die Bluetooth-Signale empfangen und verarbeiten kann.

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:

  1. Die BLE-Devices senden regelmäßig die Zustandsinformationen als „Broadcast“ per bluetooth low energy
  2. Das eingebaute Bluetooth-Modul im ESP32 empfängt und interpretiert diese Daten
  3. Der ESP32 ist im WLAN angemeldet und sendet an den konfigurierten MQTT-Server alle empfangenen Sensor-Daten
  4. 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:

ESP32 als MQTT Gateway für BLE Devices mit ioBroker

ESP32 als MQTT Gateway für BLE Devices mit ioBroker

Was ist also zu tun?


  1. Im ersten Schritt müssen wir den ESP32 vorbereiten und OpenMQTTGateway mithilfe des Flash-Tools flashen. Hierzu benötigen wir vier Dateien:
    1. boot_app0.bin
    2. bootloader_dio_80m.bin (oder hierüber suchen, wenn Link veraltet: https://github.com/espressif/arduino-esp32/raw/)
    3. esp32dev-ble-firmware.bin (oder hierüber suchen, wenn Link veraltet: https://github.com/1technophile/OpenMQTTGateway/releases/download/)
    4. esp32dev-ble-partitions.bin (oder hierüber suchen, wenn Link veraltet: https://github.com/1technophile/OpenMQTTGateway/releases/download/)
  2. 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:
    ESP32 Downloadtool für OpenMQTTGateway

    ESP32 Downloadtool für OpenMQTTGateway




    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.

  3. Mit Start flashen wir die angegeben files in den Speicher des ESP32 Boards.
  4. 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
    OpenMQTTGateway WLAN verbinden

    OpenMQTTGateway WLAN verbinden

  5. 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:
    OpenMQTTGateway erster Aufruf Konfiguration

    OpenMQTTGateway erster Aufruf Konfiguration



    OpenMQTTGateway WLAN einrichten

    OpenMQTTGateway WLAN einrichten

  6. 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:
    ioBroker MQTT Server Adapter Einstellungen

    ioBroker MQTT Server Adapter Einstellungen

  7. 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).
    OpenMQTTGateway Datenpunkt

    OpenMQTTGateway Datenpunkt




    In diesem Datenpunkt sind im json-Objekt alle Informationen des BLE-Devices abgelegt, in unserem Fall u.a. Temperatur und Luftfeuchte.

  8. 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:
    ioBroker Blockly für MQTT json

    ioBroker Blockly für MQTT json

    Die im Blockly hinterlegte Funktion haben wir am Ende der Seite als Codeblock eingefügt.

  9. 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";