Aus Linux-Magazin 04/2018

Zimmergenaue Ortung mit Bluetooth-Beacons

© Florin Rosu, Fotolia

Der Ortungsdienst GPS stößt in der Heimautomatisierung recht bald an seine Grenzen. Welche Möglichkeiten Indoor-Positioning-Systeme bieten und wie Linux-Nutzer die unsichtbaren Geister über Blutooth für ihre Zwecke einspannen, schildert Heimautomatisierer Gunnar Beutner in diesem Artikel.

Ein Mitteleuropäer kommt an einem kalten Wintertag nach Hause, es ist bereits mollig warm, das Licht geht automatisch an, aus den Boxen ertönt sein aktueller Lieblingssong. Dieses Szenario lässt sich heute bereits ohne große Umstände umsetzen. Home Assistant ([1], [2]) bietet zum Beispiel Komponenten an, um die Anwesenheit der Bewohner mit Hilfe verschiedener Quellen festzustellen. Dazu gehört auch eine GPS-Ortung per Mobiltelefon. In Verbindung mit Automationsregeln ergeben sich damit einige interessante Anwendungsfälle für die Heizungs- und Lichtsteuerung.

Die klassischen Lichtschalter lassen sich mit dieser Lösung aber nicht ersetzen, da GPS leider ungeeignet ist, um Automationsregeln für einzelne Zimmer zu entwickeln. Damit dies funktioniert, müsste der Benutzer nicht nur stets sein Smartphone in der Hosentasche herumtragen. Auch die Signalqualität von GPS ist innerhalb von Gebäuden oft zu schlecht, um eine reaktionsschnelle Ortung zu ermöglichen, und selbst im Freien vergleichsweise ungenau. Das macht es schwierig bis unmöglich, den Wechsel zwischen einzelnen Zimmern zu erkennen.

Kommerzielle Lösungen und deren Probleme

Unter dem Sammelbegriff Indoor Positioning Systems vermarkten kommerzielle Anbieter Systeme, die eine Lösung für genau dieses Problem versprechen. Dabei verwenden sie im Regelfall eine Reihe von Sensoren, die Signale von tragbaren Radio-Beacons empfangen. Deren Position berechnen sie dann anhand der Signalstärke oder der Zeitdifferenz der empfangenen Signale. Die allermeisten Systeme sind jedoch proprietär und – ausgehend von den Vertriebs-Webseiten – nicht für den Erwerb durch Privatanwender vorgesehen.

Das vielversprechendste stellt die Firma Decawave her, es nennt sich DWM1000 [3] und reklamiert für sich eine Erkennungsgenauigkeit von bis zu 10 Zentimetern in Innenräumen. Leider scheint es unmöglich zu sein, Hersteller-unabhängige Informationen über die Alltagstauglichkeit zu finden.

Bluetooth als Alternative

Für meine eigene Heimautomatisierung hatte ich mich daher zunächst für Bluetooth-Detektoren der Marke Happy Bubbles [4] sowie Bluetooth-Beacons entschieden und in jedem Zimmer jeweils einen Sensor platziert. Diese verfügen über eine quelloffene Firmware und bringen auch die benötigte Software mit, um die Messwerte der einzelnen Detektoren zusammenzufassen und so die zimmergenaue Position der Bluetooth-Beacons zu bestimmen.

Im Praxiseinsatz ergaben sich leider einige Probleme. So hatte die Firmware des auf den Sensoren eingesetzten Bluetooth-Moduls einen Bug, der dafür sorgte, dass der Happy-Bubbles-Detektor abstürzte, wenn er zu viele Bluetooth-Signale in einem bestimmten Zeitintervall empfing. Zwar behebt die neueste Hardware-Revision das Problem, doch lassen sich ältere Module nur schwer aktualisieren.

Noch problematischer ist aber, dass die Signalstärke der Bluetooth-Signale generell schwankt, auch wenn sich der Benutzer überhaupt nicht bewegt. So kann es passieren, dass das Bluetooth-Beacon zwar ohne irgendwelche Störfaktoren unweit des Sensors liegt, dieser jedoch bei einigen Messungen meldet, es wäre sehr weit entfernt. Das führt dann dazu, dass die Software fälschlicherweise einen Übergang in einen anderen Raum erkennt und das Licht ausschaltet.

Verstärkt wird dieser Effekt, wenn der Besitzer ungünstig zum Sensor sitzt und so die Signale abschirmt. Der menschliche Körper besteht überwiegend aus Wasser, das Radiowellen auf der 2,4-GHz-Frequenz sehr gut absorbiert. Wer im Weg sitzt, um den wird es wieder dunkel.

Eine eigene Sensorplattform

Um diese Probleme in den Griff zu bekommen, musste ein neuer Lösungsansatz her. Als Grundlage hierfür sollte der ESP32 [5] die Hardwareplattform bereitstellen. Für gerade mal 10 Euro bietet dieser Microcontroller zwei integrierte 240-MHz-Prozessorkerne sowie 512 KByte Arbeitsspeicher. Außerdem verfügt er über ein 2,4-GHz-Radio-Modul, über das er mit anderen WLAN- und Bluetooth-Geräten kommuniziert.

Die Stromversorgung erfolgt über einen Micro-USB-Port, der zugleich als virtuelle serielle Schnittstelle dient, um eigene Programme in den Flashspeicher des Microcontrollers zu schreiben und ihre Ausgabe nachzuverfolgen.

Auf dem ESP32-Chip lässt sich Linux aber nicht installieren. Dafür gibt es vom Hersteller Espressif ein quelloffenes SDK namens IoT Development Framework (ESP-IDF, [6]), das auch unter Linux läuft [7]. Es setzt auf das Echtzeitbetriebssystem Free RTOS [8] sowie einer Reihe weiterer Open-Source-Projekte auf, um dem versierten Hobbyentwickler für seine Projekte einen einfachen Zugriff auf die verbaute Hardware zu ermöglichen. So muss der sich nicht im Detail mit allzu vielen plattformspezifischen Details beschäftigen.

Über diverse GPIO-Pins kann ich externe Komponenten anschließen, etwa Temperatursensoren, LEDs oder – wie für dieses Projekt relevant – weitere Bluetooth-Module. Mein Ziel war es, in jedem Zimmer jeweils ein ESP32 zu installieren und dessen integriertes Bluetooth-Modul zu verwenden, um die Signalstärke der empfangenen Bluetooth-Beacons zu messen. Zusätzlich möchte ich an jeden ESP32 noch zwei weitere Bluetooth-Module vom Typ HM-10 anschließen (Abbildung 1) und diese strategisch in den Zimmern verteilen, um einen idealen Empfang der Bluetooth-Signale zu ermöglichen.

Abbildung 1: Der ESP32-Mikroprozessors (links) wurde zu Testzwecken auf einer Steckplatine mit einem HM-10-Bluetooth-Modul verbunden.

Abbildung 1: Der ESP32-Mikroprozessors (links) wurde zu Testzwecken auf einer Steckplatine mit einem HM-10-Bluetooth-Modul verbunden.

Die Bluetooth-Module anzuschließen macht vier Verbindungen notwendig: Masse, Versorgungsspannung (3,3 Volt, die ein auf dem ESP32 integrierter Spannungswandler bereitstellt) sowie jeweils eine Sende- und Empfangsleitung für die bidirektionale Kommunikation.

Die für den ESP32 entwickelte Firmware [9] kommuniziert dabei über eine serielle Schnittstelle mit den HM-10-Modulen. Letztere bieten ihre gesamte Funktionalität über AT-Befehle an, die einige vielleicht noch von Analog-Modems kennen (Abbildung 2). So aktiviert der Befehl »AT+DISI?« den Empfangsmodus, woraufhin das HM-10-Modul eine Liste erkannter Bluetooth-Beacons inklusive deren Signalstärke zurückliefert.

Abbildung 2: Die Firmware gibt auf der seriellen Konsole diverse Log-Einträge aus: In diesem Auszug erscheinen die Scan-Ergebnisse von einem der Bluetooth-Module.

Abbildung 2: Die Firmware gibt auf der seriellen Konsole diverse Log-Einträge aus: In diesem Auszug erscheinen die Scan-Ergebnisse von einem der Bluetooth-Module.

Die Scan-Ergebnisse leitet ein »OK+ DISIS« ein. Jedes einzelne Ergebnis beginnt mit »OK+DISC« und enthält neben der Bluetooth-MAC-Adresse (zum Beispiel »cfa16a361b93«) die Signalstärke (etwa »-66dBm«). Sind alle Ergebnisse übermittelt, erhält der ESP32 eine Zeile mit dem Inhalt »OK+DISCE«. Die markiert das Empfangsende und den Anfang für den nächsten Scan-Vorgang.

Um die Sensordaten zu verarbeiten, muss eine Anwendung sie zunächst zentral sammeln. Dazu dient das Message-Bus-Protokoll MQTT [10], das in der IoT-Sphäre große Popularität genießt. Am zentralen MQTT-Broker melden sich beliebig viele MQTT-Clients an und tauschen über Publish-Subscribe-Nachrichten aus. Jede Nachricht verfügt über ein Thema (Topic), das bestimmt, welche Clients die Nachricht erhalten. Die ESP32-Module veröffentlichen ihre Sensorergebnisse sekündlich mit dem Topic »happy-bubbles/ble/Hostname/raw/MAC«. »Hostname« steht für den Namen des ESP32-Sensors, »MAC« für die Bluetooth-MAC-Adresse des Beacon.

Der Name des Topic hat in meinem Fall historische Bedeutung, da ich mein Sensornetzwerk graduell von Happy-Bubbles-Sensoren auf eigene Hardware umgestellt habe. Ein MQTT-Client wie MQTT.fx (Abbildung 3, [11]), der auf Eclipse Paho basiert, findet heraus, welche Nachrichten über den MQTT-Broker wandern. Für Linux gibt es RPM- und Deb-Pakete zur Version 1.6.0 [12].

Abbildung 3: MQTT.fx zeigt die Nachrichten an, die der MQTT-Broker von den Sensoren erhält.

Abbildung 3: MQTT.fx zeigt die Nachrichten an, die der MQTT-Broker von den Sensoren erhält.

Hat der MQTT-Broker alle Sensorergebnisse gesammelt, wertet eine weitere Softwarekomponente diese aus. Vom Happy-Bubbles-Projekt gibt es hierfür glücklicherweise bereits eine Anwendung. Der in Go geschriebene Bluetooth Beacon Presence Detection Server (Presence, [13]) meldet sich als MQTT-Client beim MQTT-Broker an und empfängt von diesem die Sensordaten.

Anhand der Signalstärke trifft Presence die Entscheidung, in welchem Zimmer sich die Beacons der einzelnen Benutzer am wahrscheinlichsten befinden (Abbildung 4) und veröffentlicht seine eigenen Ergebnisse wiederum per MQTT.

Abbildung 4: Die Zimmerkarte zeigt an, wo sich das Bluetooth-Beacon befindet. Je kleiner der Kreis um den Sensor ist, desto näher ist das Beacon am Betrachter.

Abbildung 4: Die Zimmerkarte zeigt an, wo sich das Bluetooth-Beacon befindet. Je kleiner der Kreis um den Sensor ist, desto näher ist das Beacon am Betrachter.

Der MQTT-Broker schickt die zimmergenaue Position der Bewohner dann in Echtzeit an die Heimautomatisierungs-Software Home Assistant [1]. Ein Template-Sensor errechnet daraus für jedes Zimmer einen der folgenden Zustände:

  • Mindestens eine Person befindet sich im Zimmer.
  • Niemand ist im Zimmer (aber in einem der anderen).
  • Niemand ist zu Hause.

Als Regel für Home Assistant sieht das dann so aus wie in Listing 1.

Listing 1

Jemand zu Hause?

01 sensor:
02   - platform: template
03     sensors:
04       presence_kitchen:
05         entity_id:
06           - sensor.location_gunnar
07           - sensor.location_lisa
08         friendly_name: Presence Kitchen
09         value_template: >-
10           {%- if is_state("sensor.location_lisa", "Kitchen") or is_state("sensor.location_gunnar", "Kitchen") %}
11             Here
12           {% elif not is_state("sensor.location_lisa", "Away") or not is_state("sensor.location_gunnar", "Away") %}
13             Home
14           {% else %}
15             Away
16           {%- endif %}

Andere Automatisierungsregeln greifen nun auf diesen Zustand zu und steuern in Abhängigkeit etwa die Heizung an, sodass die Temperatur in der Küche auf 21 Grad Celsius steigt, wenn sich jemand dort aufhält. Hält sich jemand anderswo in der Wohnung auf, reduziert Home Assistant die Temperatur auf 17 Grad. Die Regeln dafür zeigt Listing 2.

Listing 2

Standortabhängig heizen

01 automation:
02   - alias: Heating Kitchen
03     trigger:
04       platform: time
05       minutes: '/5'
06       seconds: 00
07     action:
08       service: climate.set_temperature
09       entity_id: climate.kitchen
10       data_template:
11         temperature: >-
12           {%- if is_state("sensor.presence_kitchen", "Here") %}
13             21
14           {% elif is_state("sensor.presence_kitchen", "Home") %}
15             17
16           {% else %}
17             12
18           {%- endif %}

Für die Beleuchtungssteuerung startet Home Assistant beim Verlassen eines Zimmers einen Timer, der nach Ablauf von fünf Minuten das Licht ausschaltet. Betritt in dieser Zeit jemand das Zimmer, stoppt der Timer vorzeitig (Listing 3).

Listing 3

Beleuchtungssteuerung

01 automation Kitchen:
02   - alias: Kitchen Light (on)
03     trigger:
04        platform: state
05        entity_id: sensor.presence_kitchen
06        to: Here
07     action:
08       - service: homeassistant.turn_on
09         entity_id: light.kitchen
10       - service: timer.cancel
11         entity_id: timer.kitchen_light
12   - alias: Kitchen Light (left room)
13     trigger:
14        platform: state
15        entity_id: sensor.presence_kitchen
16     condition:
17       condition: template
18       value_template: '{{ not is_state ("sensor.presence_kitchen", "Here") }}'
19     action:
20        service: timer.start
21        entity_id: timer.kitchen_light
22   - alias: Kitchen Light (off)
23     trigger:
24        platform: event
25        event_type: timer.finished
26        event_data:
27           entity_id: timer.kitchen_light
28     action:
29        service: homeassistant.turn_off
30        entity_id: light.kitchen

Fazit

Bei mir haben sich die Bluetooth-Beacons in der Praxis so weit bewährt, als dass sie fast immer problemlos funktionieren und die Wohnung für die Benutzer noch ein bisschen komfortabler machen.

Gerade bei der Heimautomatisierung fällt allerdings auch jeder winzige Fehler deutlich unangenehmer auf als dies vielleicht bei anderen Softwareproblemen der Fall wäre. Geht zum Beispiel das Licht aufgrund einer Ungenauigkeit aus, sitzt der Heimautomatisierer plötzlich im Dunklen.

Auf der anderen Seite stellt sich schon bald ein Gewöhnungseffekt ein, sodass ich in anderen Wohnungen erwartungsvoll auf die Lampen starre und selbst Alexa nicht zu Hilfe eilt.

Infos

  1. Home Assistant: https://home-assistant.io
  2. Mehr zum Thema: Gunnar Beutner, “Zentral regiert”: Linux-Magazin 07/17, S. 26
  3. DWM1000-Module: https://www.decawave.com/products/dwm1000-module
  4. Happy-Bubbles-Detektoren: https://www.happybubbles.tech/presence/detector
  5. ESP32: https://en.wikipedia.org/wiki/ESP32
  6. ESP-IDF: https://github.com/espressif/esp-idf
  7. ESP-IDF-SDK unter Linux: https://esp-idf.readthedocs.io/en/latest/get-started/linux-setup.html
  8. Free RTOS: https://freertos.org
  9. BLE-Detektor: https://github.com/gunnarbeutner/ble-detector
  10. Rainer Poisel, “Volks-Schalter”: Linux-Magazin 07/17, S. 30
  11. MQTT.fx: http://mqttfx.org
  12. MQTT.fx 1.6.0 für Linux: http://www.jensd.de/apps/mqttfx/1.6.0/
  13. Presence-Server: https://github.com/happy-bubbles/presence

Der Autor

Gunnar Beutner entwickelt seit 1994 leidenschaftlich Software. Bei der Netways GmbH hat er dabei Icinga 2 als sein Lieblingsprojekt gefunden.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben