Raspberry Pi: Xiaomi Sensor Daten in Google Spreadsheet schreiben


Xiaomi Sensor per Bluetooth in ein Spreadsheet auslesen

In dieser Anleitung erkläre ich euch, wie man mit einem Raspberry Pi Zero die Sensoren für Temperatur und Luftfeuchtigkeit von Xiaomi über Bluetooth ausliest und direkt mit Hilfe der Google Drive API in ein Google Spreadsheet schreibt.

Raspberry Pi trifft Xiaomi Sensor

Wegen den Temperaturen auf unserem Dachboden hatte ich mir die Xiaomi Mijia Bluetooth Thermometer günstig gekauft. Diese lassen sich per Mobiltelefon jederzeit auslesen. Leider speichert der Xiaomi-Sensor die Daten nicht fortlaufend lokal ab. Die Folge ist eine fehlende Historie der Daten. Mit einem Raspberry Pi Zero unter 30 € kann der Sensor minütlich über Bluetooth Low Energy ausgelesen werden.

Die Daten werden in Echtzeit über die API in das Spreadsheet übertragen
Die Daten werden in Echtzeit über die API in das Spreadsheet übertragen

Die gewonnenen Daten wollte ich intuitiv in Elastic Search auf dem Pi oder in eine MySQL-Datenbank auf meinem Webserver schreiben. Jedoch war zu faul, diese Daten wieder auszulesen und dann ein Frontend dafür zu schreiben. Fertige Lösungen wie Grafana oder ioBroker waren mir zu Aufwendig für diesen einen Anwendungsfall. Ich glaube weniger an die Datensicherheit einer microSD Karte und vertraute mehr auf die Speicherung direkt der Cloud. Da kam mir die Idee mit dem Google Spreadsheet von Google Drive. Es existiert eine Google Drive API über die man Werte über das Internet in ein Google Spreadsheet lesen und schreiben kann.

Benötigte Hardware

Benötigte Software

  1. Raspberry Pi OS Lite (Betriebssystem für den Pi)
  2. etcher (Tool zum Schreiben von SD Karten)
  3. Die Shell (beim Mac dabei) oder PuTTY für Windows.
  4. Einen Google Account

Schritte zur Umsetzung

Schritt 1: Raspberry Pi OS lite installieren

Raspberry Pi OS ist das Betriebssystem für den Raspberry Pi. Wir brauchen nur die lite Version ohne Desktopumgebung weil wir nur per SSH und Wifi auf den Pi verbinden wollen. Mit etcher.io schreiben wir das Raspian Lite Image auf die SD-Karte. Diese Stecken wir aber noch nicht in den Pi.

Schritt 2: SSH und Wifi aktivieren

Nach dem erfolgreichen Schreiben ziehen wir die Karte wieder ab und schieben sie wieder rein weil wir nun zwei Dateien darauf erstellen: ssh und wpa_supplicant.conf. Unter MacOS geht es einfach über die Shell. Unter Windows nimmt man den Editor seiner Wahl.

touch ssh /Volumes/boot/ssh
vi /Volumes/boot/wpa_supplicant.conf 

Datei wpa_supplicant.conf in der Boot-Partition enthält folgenden Inhalt:

country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
       ssid="wlan-bezeichnung"
       psk="passwort"
       key_mgmt=WPA-PSK
}

Damit verbindet sich der Pi beim Starten mit dem WLAN und wir kommen per Kommandozeile auf den Pi.

Schritt 3: Per SSH verbinden

Unter Windows verwendet man Putty und unter MacOS macht man es direkt auf der Shell. Die IP-Adresse des Pis findet man über den Router heraus. Das Passwort lautet „raspberry“.

ssh pi@192.168.178.66

Nun sollte man mit dem Befehl „sudo raspi-config“ folgende Dinge tun:

  1. Das Passwort ändern (Change User Password)
  2. Die Zeitzone konfigurieren (Localisation Options > Change Timezone)
  3. SSH den Zugriff dauerhaft aktivieren (Interfacing Options > SSH)
sudo raspi-config

Nach der Vorbereitung kann der Spaß beginnen.

Schritt 4: Software installieren

Zuerst aktualisieren wir die Sourcen und installieren git. Nun klonen wir mein GitHub-Repository mit den vorkonfigurierten Dateien und installieren Python mit den Abhängigkeiten und machen die Dateien ausführbar.

sudo apt-get update
sudo apt-get install git python3-pip libglib2.0-dev
cd 
git clone https://github.com/mtoensing/mi2sheet.git
sudo pip3 install gspread oauth2client bluepy
pip3 install --upgrade pyasn1-modules
cd mi2sheet
chmod +x mi2sheet.py pollandwrite.sh 

Schritt 5: BD_ADDR des Sensors suchen

Wir suchen per Bluetooth den Xiaomi Sensor der sich in der Nähe des Pis befinden sollte mit folgendem Befehl:

sudo blescan 

Scanning for devices...
Device (new): 4c:66:a8:ab:c3:9c (public), -81 dBm 
	Flags: <06>
	Complete 16b Services: <0002332-0000-1000-8000-00805f9b34fb,0000180a-0000-1000-8000-00805f9b34fb>
	16b Service Data: <ffffc09c0c3547cc>
	Complete Local Name: 'MJ_HT_V1'

Wir suchen nach einem Gerät mit dem Namen „MJ_HT_V1“. Die Bluetooth Device Address sieht ungefähr so aus und ist wichtig für die nächsten Schritte: 4c:66:a8:ab:c3:9c

Schritt 6: Testabfrage über Bluetooth

Zum Testen fragen wir nun mal per Bluetooth die Daten ab:

python3 /home/pi/mi2sheet/mi2sheet.py --backend bluepy poll 4c:66:a8:ab:c3:9c

['06/23/2019 22:35:24', '26.2', '47.0', '73']

Sollte ein Fehler erscheinen, dann bitte zuerst die Befehle oben prüfen, selber nachdenken was schief gegangen ist oder in letzter Instanz hier fragen. Wenn alles richtig gelaufen ist, dann erscheint das Array mit dem Datetime, Temperatur, Luftfeuchtigkeit und dem Batterieladestand.

Schritt 7: Google Drive API aktivieren

Nun ebnen wir den Weg in die Google Cloud. Dafür rufen die wie Google API Console im Browser auf. Hier kann man viele Fehler machen die alle damit Enden, dass wir nachher nicht mit dem Python-Script in das Spreadsheet schreiben können. Meldungen wie „Permission denied“ oder „Spreadsheet not found“ sind dann das Ergebnis.

Video: Wie erhalte ich die client_secret.json Datei?
  1. Öffne die Google API Console
  2. Erstelle ein neues Projekt
  3. Aktiviere die API
  4. Suche und aktiviere die Google Drive API
  5. Erzeuge Zugangsdaten (credentials) für den Web Server
  6. Erstelle einen Service Account gib ihm die Project Role namens Editor.
  7. Lade die JSON-Datei runter
  8. Aktiviere zusätzlich die Google Sheets API (nicht vergessen!)
  9. Kopiere die JSON-Datei als „client_secret.json“ in das folgende Verzeichnis auf dem Pi: /home/pi/mi2sheet/

Schritt 8: Erzeuge ein Spreadsheet

Wir erzeugen unter drive.google.com ein Spreadsheet mit dem Namen „sensor-data„. In der JSON-Datei aus Schritt 7 steht unter „client_email“ eine kryptische Adresse wie „mrwrite-460@sensors-344317.iam.gserviceaccount.com“. Diese Adresse laden wir mit Schreibrechten unter „Freigabe“ in das Google Spreadsheet ein.

Unser „Mr. Write“ muss noch eingeladen werden damit er Zugriff hat.

Das Spreadsheet sollte den folgenden Aufbau für die Daten haben. Die erste Zeile ist die feste Kopfzeile.

TimestampTemperatureHumidityBattery
[leer][leer][leer][leer]

Schritt 9: Per API in das Spreadsheet schreiben

Nun schreiben wir die Daten vom Sensor als Zeile in das Spreadsheet. Wir brauchen die BD_ADDR aus Schritt 5 und den Pfad zur client_secret.json aus Schritt 7 die im Code-Verzeichnis auf dem Pi liegen sollte. Der Parameter „sensor_data“ ist der Name des Spreadsheets. Die numerischen Werte 0 und 2 geben das Worksheet und die Zeile an, in welche die Daten geschrieben werden.

python3 /home/pi/mi2sheet/mi2sheet.py --backend bluepy pollandwrite 4c:66:a8:ab:c3:9c '/home/pi/mi2sheet/client_secret.json' 'sensor-data' 0 2

Der Vorgang dauert bei mir bis zu 31 Sekunden mit Auslesen und über die Google API schreiben. Wenn hier ein Fehler auftaucht, bitte die Punkte aus Schritt 7 kontrollieren.

Schritt 10: cronjob einrichten

Die Datei /home/pi/mi2sheet/pollandwrite.sh sollte mit dem Befehl aus Schritt 9 angepasst werden. Zu guter Letzt sorgen wir dafür, dass der cronjob zu jeder 10 Minuten ausgeführt wird.

crontab -e

Dort wird folgende Zeile ganz am Ende eingetragen.

*/10 * * * * /home/pi/mi2sheet/pollandwrite.sh

Nun wird der Pi die Aufgabe selbst nach einem Neustart erledigen. Im Spreadsheet kann man nun Diagramme einfügen und diese über „File“ -> „Publish to the web“ überall zugänglich machen.

Xiaomi Sensor per Bluetooth in ein Spreadsheet auslesen
Xiaomi Sensor per Bluetooth in ein Spreadsheet auslesen

Alternative: Meross Temperatur und Luftfeuchtigkeitssensor

Ich habe durch meinen Garagentoröffner von Meross den Temperatur- und Luftfeuchtigkeitssensor (kaufen) derselben Firma entdeckt. Dieser kann alles, was in diesem Artikel beschrieben ist: Die historischen Daten speichern und als CSV exportieren. Zusammen mit den Heizungsaktoren von Meross (kaufen) ist das eine günstige Alternative zu Homeatic IP um Heizungen zu steuern. Darüber hinaus ist das System mit ioBroker kompatibel. Ich nutze, um ehrlich zu sein, nur noch diese Hardware ohne den Raspberry Pi, weil es sogar günstiger ist als die hier vorgestellten Sensoren von Xiaomi.

Xiaomi vs. Meross
Xiaomi vs. Meross

Fazit und Ausblick

Innerhalb kürzester Zeit ist es möglich über einen günstigen Raspberry Pi Zero (kaufen) die Temperatur auszulesen und historisch darzustellen. Ohne Apps oder bezahlte Dienste. Diese Anleitung liefert neben der Abfrage von Daten des Xiaomi Thermometers (unter 15 EUR) auch eine Basis für viele weitere Anwendungsfälle, bei denen man Daten von Bluetooth Geräten in Spreadsheets schreiben möchte. Mir war es wichtig diesen Weg für alle einmal aufzuschreiben. Ich habe viel dabei gelernt. Euch viel Spaß mit dem Wissen.

Falls sich jemand fragt, wann die Tabelle voll ist: Ein Google Spreadsheet speichert bis zu 5 Millionen Zellen. Mein Spreadsheet hat 4 Spalten. Da ich 6 Mal in der Stunde eine Zeile schreibe sollte ich über 20 Jahre damit hinkommen.


Beitrag veröffentlicht

in

von

Kommentare

32 Antworten zu „Raspberry Pi: Xiaomi Sensor Daten in Google Spreadsheet schreiben“

  1. Avatar von Michael
    Michael

    Hallo,

    ich versuch es heut schon den halben Tag hinzubekommen, aber Schritt 6 funktioniert nicht.

    pi@raspberrypi:~/mi2sheet $ sudo blescan
    Scanning for devices…
    Device (new): 00:44:97:d4:48:31 (random), -42 dBm (not connectable)
    Manufacturer:
    Device (new): a4:c1:38:7d:1d:97 (public), -33 dBm
    Flags:
    16b Service Data:
    Complete Local Name: ‚LYWSD03MMC‘
    pi@raspberrypi:~/mi2sheet $ python3 mi2sheet.py poll a4:c1:38:7d:1d:97
    Traceback (most recent call last):
    File „mi2sheet.py“, line 199, in
    main()
    File „mi2sheet.py“, line 195, in main
    args.func(args)
    File „mi2sheet.py“, line 65, in poll
    battery = format(poller.parameter_value(MI_BATTERY))
    File „/home/pi/mi2sheet/mitemp_bt/mitemp_bt_poller.py“, line 118, in parameter_value
    return self.battery_level()
    File „/home/pi/mi2sheet/mitemp_bt/mitemp_bt_poller.py“, line 81, in battery_level
    self.firmware_version()
    File „/home/pi/mi2sheet/mitemp_bt/mitemp_bt_poller.py“, line 105, in firmware_version
    self.battery = int(ord(res_battery))
    TypeError: ord() expected a character, but string of length 15 found
    pi@raspberrypi:~/mi2sheet $

    Was mache ich falsch? Danke für die Hilfe und ein frohes Fest.

    1. Avatar von Marc
      Marc

      Hi! Ist es wirklich dieses Gerät?
      Da kommt was anderes zurück als erwartet beim Battery Level

    2. Avatar von Michael
      Michael

      Danke für die schnelle Antwort.
      Nein habe ich nicht. Ich habe es übersehen und anscheinend haben sie für jedes Gerät ein anders Protokoll. Sorry.

    3. Avatar von Marc
      Marc

      Du kannst ja probieren das Script anzupassen. Aber ich würde einfach den anderen bestellen und den nehmen. Das funktioniert bei mir seit dem ich den Artikel geschrieben habe zuverlässig mit drei Sensoren.

    4. Avatar von Michael
      Michael

      Dafür fehlt mir die Kompetenz. Mit bluetooth kenne ich mich nicht aus.

  2. Avatar von Ede
    Ede

    Hallo Marc,
    danke und Hochachtung für Deine Anleitung!
    Der „lywsd03mmc“ ist wohl das neuste Modell – er ist darüber hinaus viel günstiger und hat noch einen MEGA-Vorteil: Das Gerät selber hat eine eigene Datenspeicherung! Laut der Seite sind es 3 Monate. Ich kann bestätigen, dass es speichert, habe ihn aber erst sehr kurz. Leider ist die orignal app großer Mist.
    Vielleicht reizt Dich der Hinweis auf die Speicherung, Deinen Code zu erweitern.

    Würde mich freuen!
    Gruß
    Ede

    1. Avatar von Michael
      Michael

      Hallo, die Bewertung der App ist absolut zutreffend. Gruß Michael

    2. Avatar von Marc
      Marc

      Die Speicherung braucht man ja nicht wenn man es über den Pi angreift ;) und der Preis der „dummen“ Sensoren ist eben unschlagbar. Die bekommt man dennoch günstiger als die Neuen.

  3. Avatar von Eric
    Eric

    Hallo Marc,

    vielen Dank für die Anleitung. Das hat super funktioniert.

    Noch ein Hinweis für Raspbian Buster, hier bedarf es noch der Installation von pymysql:
    sudo pip3 install pymysql

    Viele Grüße,
    Eric

  4. Avatar von Krunkel
    Krunkel

    Hallo, diese Billigsensoren, was für Batterien sind denn da drin? Man kann das auf dem Amazon-Bild nicht erkennen, praktisch wären aber welche zum wiederaufladen und weder Knopfzellen noch irgendwelche speziellen. Ich hatte vor damit die gesamte Hausinstallation vorzunehmen (ca. 30 Sensoren!).

    1. Avatar von Marc
      Marc

      Eine Standard-AAA-Batterie =)

    2. Avatar von Krunkel
      Krunkel

      Vielen Dank.
      Richtig bitter ist es, dass wohl Versand jedes Mal anfällt. Somit sind die auch nicht so günstig wie gedacht oder gibt es da eine andere Bezugsquelle? Jedes mal 10,99€ + 7,99€ Versand ist schon heftig.

    3. Avatar von Marc
      Marc

      Wenn ich oben auf den Link im Artikel klicke kann ich mir einen Sensor reinlegen und dann die Anzahl erhöhen und zahle nur einmal Porto. Das sind schon sehr günstige Teile im Verhältnis und die Batterie hält ewig. Ich habe auch insgesamt 3 hier im Einsatz. Bei 30 Stück sind die Lieferkosten ja wohl egal bei dem geringen Preis oder?

    4. Avatar von Krunkel
      Krunkel

      Amazon Prime evtl? Denn bei mir soll ich für jeden Sensor einzeln 7,99€ Versand bezahlen womit ich auf Versandkosten von 240€ komme. Da können die Sensoren natürlich billig sein. Kann es sein dass es an Österreich liegt?

      Dennoch danke für deine Antworten, da muss ich mich mal mehr erkundigen. Es sind auch nur 18 verfügbar, wenn dann kauf ich sie alle zusammen. Muss ich mich mit dem Händler mal auseinander setzen.

  5. Avatar von Krunkel
    Krunkel

    Um mich noch einmal zu melden: Ich habe kein Amazon-Prime und hätte daher immer pro Stück Versand bezahlen müssen. Die Sensoren bekommt man auch günstiger wenn man sie aus dem Ausland importieren lässt. 20 Sensoren kosten dabei 80€.

  6. Avatar von deHolger
    deHolger

    Hallo,
    ein interessanter Beitrag. Ich habe im Schritt 6 das Problem das der raspi zwar versucht den Befehl auszuführen aber auch nach Minuten (10 und mehr) keine Ausgabe von Werten zustande bringt. Woran könnte das liegen ? Ja MAC ist die richtige da ja die MiApp oder andere (Android) darauf zugreifen können.

  7. Avatar von sultan khan
    sultan khan

    hey marc
    Is possible to connect multiple bluetooth adapters to the raspberry pi and do BLESCAN with two or more adapters with single command. Get data from sensors connected to separate bluetooth adapters at the same time to Increasing the range of raspberry pi.

  8. Avatar von sultan khan
    sultan khan

    Hey Marc
    Es ist möglich, mehrere Bluetooth-Adapter mit dem Himbeer-Pi zu verbinden und BLESCAN mit zwei oder mehr Adaptern mit einem einzigen Befehl auszuführen. Holen Sie sich Daten von Sensoren, die gleichzeitig mit separaten Bluetooth-Adaptern verbunden sind, um die Reichweite von Himbeer-Pi zu erhöhen.

  9. Avatar von deHolger
    deHolger

    Hallo Marc,
    das Script funktioniert bei mir gut. Nur kann ich in Google Tabellen kein Diagramm erstellen.
    Die Temperatur scheint eine Formatierung zu haben. Aus 23.4 Grad werden dann beim formatieren als Text 43.944,00
    Wo könnte der Fehler liegen?

  10. Avatar von Heiner
    Heiner

    Hallo marc,
    ich stehe auch vor der Frage von deHolger.
    Ist es die vllt möglich dein Spreadsheet hier lesen freizugeben? Dann könnten wir uns deine Formeln/Formatierung anschauen.

    Vielen Dank für die Anleitung!
    Gruß

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert