Bei Aliexpress gabs ein 3er Bundle mi flora (internationale Version) Sensoren für $ 39,-. Die günstigere Variante ist für den chinesischen Markt gedacht und macht wohl Probleme mit der App bez. Lokalisation. Hersteller dieser Sensoren ist die Firma HuaHuaCaCao.
Edit: Beim Xiaomi EU Store gibt’s die Dinger für $10,99. Aber Porto liegt wiederum bei $13 – $16.
Besagte App gibt es für Android und iPhone. (Flower Care).
Einige Ansätze
- FHEM
- https://github.com/barnybug/miflora
- https://github.com/barnybug/ESP32BleMQTT
- https://github.com/marcelrv/miflora
- https://github.com/ThomDietrich/miflora-mqtt-daemon
- https://github.com/janwh/miflora-mqtt-daemon
- https://github.com/ChristianKuehnel/plantgateway
- https://github.com/open-homeautomation/miflora (habe ich parallel laufen – MQTT -> nodered -> Influx -> Grafana)
- ESP32 / miflora – https://github.com/hakan42
Ich wollte diese Daten in Grafana visualisieren und fand mehrere Lösungen (MQTT / NOde Red etc). Letzendlich bin bei der Lösung von Zentrix gelandet.
- http://www.n8chteule.de/zentris-blog/2017/07/16/nit-xiaomi-plant-sensor-2-python-programming/
- https://github.com/Zentris/XaiomiMi-Data-Collector
SQL Server einrichten
Habe ich mit phpmyadmin erledigt. War mir am einfachsten.
SQL Datei von Zentris importieren.
Fertig
User einrichten ‘miflora’@’localhost’ und ‘miflora’@’#’
Python und benötigte Module installieren.
1 2 3 |
sudo apt-get install python3-pip sudo pip3 install paho-mqtt sudo pip3 install influxdb |
Bei der Installation von PyMySQL gab es eine weitere Fehlermeldung.
Geholfen hat die Deinstallation mit:
1 |
sudo apt-get remove python3-pip |
und reinstall mit
1 |
easy_install3 -U pip |
Anschließend ging es fehlerfrei weiter mit
1 |
sudo pip3 install PyMySQL |
Module json und configparser sind wohl in der 3er Version schon dabei.
Skript einrichten
1 |
git clone https://github.com/Zentris/XaiomiMi-Data-Collector.git |
config.cfg angepaßt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
[options] # valid: [INFO|WARNING|DEBUG|ERROR|CRITICAL], default 'INFO' tracelevel = DEBUG pingip = <pinable address into our home network> [XiaomiMiSensors] # currently max 20 sensor possible # Balkon #sens_1 = <mac of first sensor> # Einblatt sens_2 = <mac of second sensor> # and so on... # < CHANGE(!)/Adapt the parameter before you starts!! [influx-vm2-sensors] # IP of our influx server> influxHost = 192.168.178.157 # Port of our influx server> influxPort = 8086 # Admin user of our influx server> influxUser = <our admin user> influxPassword = <our admin password> influxDbName = <our influx db name for the measurement data> influxDbUser = <our influx db user for the measurement data> influxDbPassword = <our influx db password for the measurement data> influxMeasurement = <our influx measurement section name> # < CHANGE(!)/Adapt the parameter before you starts!! [mysql-cubi-Giessensoren] DbHost = <IP of your DB Server> DbUser = <db username> DbPassword = <db passwort for the user> DbName = <database name> DbTableName = <Tablename> |
Skript ausgeführt.
1 |
python3 XiaomiMiReader.py |
Ein paar Schwierigkeiten mit Python3 und pip
1 |
Erster Error bei helper.py Zeile 349 „object has no attribute ‚has_key‘. |
Laut google „Removed. dict.has_key() – use the in operator instead.“ ab Version 3.0.
Habe es versuch es umzuschreiben, aber als nicht Programmierer .. meh… Habe daher die 4 Zeilen auskommentiert um weiter zu gehen.
Edit: Zentris hat kurz danach den Fehler korrigiert.
Log sagt
1 |
XiaomiMiReader::236]: Cubi MySQL database not rechable or other error: ‚dictionary changed size during iteration‘ |
Dann noch einen Error mit crontab.
1 2 |
Aug 8 14:30:02 nodered CRON[9174]: (root) CMD (python3 /home/pi/miflora/XaiomiMi-Data-Collector/Raspi/XiaomiMiReader.py) Aug 8 14:30:08 nodered CRON[9170]: (CRON) info (No MTA installed, discarding output) |
Eintrag im Cronjob geändert. 2>&1 ans Ende der Zeile -> kein Error mehr
1 2 3 |
crontab -e */15 * * * * /usr/bin/python3 /home/pi/miflora/XaiomiMi-Data-Collector/Raspi/XiaomiMiReader.py >/dev/null 2>&1 |
SQL
1 2 3 4 5 6 |
tail XiaomiMiReader.py_201708.log 09.08.2017 12:19:27 [INFO ] [SQLConnector:writeData:101]: incoming data set: {'temperature': 33.1, 'cputmp': 42.236, 'light': 66, 'time': '12:19:26', 'moisture': 0, 'conductivity': 0, 'battery': 100, 'collectorip': '10.0.0.11', 'sensorname': 'Flower care', 'firmwareversion': '3.1.8', 'date': '2017.08.09', 'mac': 'C4:7C:8D:65:68:F3', 'collectormac': 'B8:27:EB:EC:83:B9'} 09.08.2017 12:19:27 [WARNING ] [SQLConnector:writeData:119]: MySQLConnector: Tag 'sensorname' not accepted, ignored and remove from data set 09.08.2017 12:19:27 [ERROR ] [XiaomiMiReader:<module>:236]: MySQL database not rechable or other error: 'dictionary changed size during iteration' 09.08.2017 12:19:27 [INFO ] [XiaomiMiReader:<module>:238]: Measurement ends for sensor mac=C4:7C:8D:65:68:F3 |
Änderung auf der DB getestet
1 |
ALTER TABLE `Sensoren` CHANGE `osversion` `firmwareversion` VARCHAR(20)CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT 'Version des OS auf dem Sensor'; |
Ähnlicher Fehler. Diesmal mit ‘osversion’. Als dieses ebenfalls geändert wurde erschien wieder der Error mit xxx
shebang angepaßt
Immer noch keine Daten in der SQL DB.
SQL Teil habe ich dann mal auskommentiert denn ich habe noch weitere Probleme entdeckt habe.
- die Werte erschienen erst eine Stunde später in der InfluxDB und Grafana
- Das Skript selbst lief. Aber nicht im Cronjob.
Zu Problem 1. Einfache Lösung.
1 |
[222] inflx.writeData(sensorDaten, aTimeShift="+01:00", aTraceOn=True, aTestOnly=False) |
ersetzen durch
1 |
[222] inflx.writeData(sensorDaten, aTimeShift="+02:00", aTraceOn=True, aTestOnly=False) |
Zu Problem 2. Dieser Punkt hat mich etwas länger beschäftigt. Ein anderes Python Skript lief ja wunderbar durch den Cronjob. Ich vermutete es hat damit zu tun, daß weitere Python Skripte als Module geladen werden sollen. Cron sucht im User Home danach und nicht dort wo diese abgelegt worden sind. Daher werden diese nicht gefunden und das Hauptprogramm übermittelt keine Daten.
Lösung – nicht schön aber funktioniert – Python Skrip durch ein .sh Skript ausführen.
1 2 3 |
#!/bin/sh cd /home/pi/miflora/XaiomiMi-Data-Collector/Raspi ./XiaomiMiReader.py |
und noch ausführbar setzen.
1 |
chmod +x miflora_zentris.sh |
Mit env -i Befehl getestet, klappt. Anschließend den Crontab Eintrag noch angepaßt.
1 |
1,16,31,46 * * * * /home/pi/miflora_zentris.sh > /dev/null 2>&1 |
Hier noch ein Screenshot von Influx DB und Grafana
Vielen Dank für diesen tollen Artikel!
Meine Blumen schicken mir jetzt Mails 🙂
Ich würde den Artikel noch darum ergänzen erwähnen, dass man die MACs der Sensoren (welche in der .conf Datei eingetragen werden müssen) über “hcitool lescan” rausbekommt.
Die kann man dann auch direkt benutzen für die Influx Query.
Hallo Felix,
danke für den Hinweis. Möglicherweise habe ich das auch so gemacht. Kann mich jedoch nicht mehr erinnern.
Dieses Jahre plante ich ganz auf den Raspi zu verzichten und dafür einen ESP32 zu nehmen. Jedoch kamen mir andere “Projekte” dazwischen.
Grüße