Pflanzen Monitoring und openHAB
Wie ich ja schon neulich geschrieben hatte, habe ich mir so ein MiFlora IoT Teil mal testweise bestellt. Es kam wie es kommen sollte, alles tut wie es soll also mussten ein paar mehr her :-).
Im selben Onlineshop geordert, waren die Teile zwar dieses Mal nicht so fix da, wie beim ersten Test, aber sie kamen. Was mir allerdings dieses Mal auffiel: Sie sind nicht als Europa-Version (mit Mac C4:7C:8D:62:* startend) sondern als China-Version (mit Mac C4:7C:8D:63:* startend) gekommen. Das hat insbesondere Zur Folge, dass die iOS App die Teile zwar findet, sie aber nicht einbindet, weil sie nicht für den europäischen Markt gedacht sind. Im Web gibt es zwar Anleitungen, wie man das mit einem China-Proxy dennoch einbinden kann aber ich will die Teile ja nicht mit meinem Handy auslesen. Das soll ja bitte schön mit der Hausautomatisierung, d.h. in diesem Fall mit einem Raspberry PI passieren.
Um zunächst die per Bluetooth verfügbarem MiFloras zu finden, bedient man sich auf dem PI dem Befehl „hcitool“:
sudo hcitool lescan
Die „Flower …“ Geräte sind dann die, deren MAC Adresse man sich merken muss. Hierbei empfiehlt es sich auch, bei mehreren nicht gleich alle zu aktivieren, sondern schrittweise, d.h. Stück für Stück durchzugehen. Dann weiß man auch welche Pflanze man vor sich hat ;-)
Um das eigentliche Auslesen zu machen, habe ich mir zunächst das Projekt miflora von GitHub geklont. Das das Projekt auf Python 3 basiert und hinterher noch das pip3 benötigt wird, mach ein
apt-get install python3-pip
alles notwendige, damit grundsätzlich alles da ist. Hiernach installiert man sich noch die Bluetooth LE wrapper mit
pip3 install btlewrap
und einem ersten Test mit dem Tool steht nichts mehr im Wege:
Da ich die Werte aber nicht in der Shell weiter verwenden möchte, sondern in meiner openHAB Installation verwenden und sehen möchte, musste ich noch ein wenig an der demo.py „schrauben“, um direkt von dort aus die REST API von openHAB zu bedienen. Hierzu habe ich einfach die demo.py kopiert und als poll.py erweitert. Dabei gibt es zunächst eine neue Methode:
def post(args): """Poll data from the sensor.""" backend = _get_backend(args) poller = MiFloraPoller(args.mac, backend) print("Getting data from Mi Flora") print("MAC Adress: "+args.mac) ""translate MAC into openHAB prefix name = args.mac name = name.replace(":", "") print("openHAB Name: "+name) url = 'http://openhab:8080/rest/items/' requests.put(url+name+'_FW/state', data=format(poller.firmware_version())) requests.put(url+name+'_TEMP/state', data=format(poller.parameter_value(MI_TEMPERATURE))) requests.put(url+name+'_HUMI/state', data=format(poller.parameter_value(MI_MOISTURE))) requests.put(url+name+'_LIGHT/state', data=format(poller.parameter_value(MI_LIGHT))) requests.put(url+name+'_CONDUCT/state', data=format(poller.parameter_value(MI_CONDUCTIVITY))) requests.put(url+name+'_BATT/state', data=format(poller.parameter_value(MI_BATTERY)))
Und in der main muss man dann natürlich auch noch die neue Methode „hinterlegen“:
parser_poll = subparsers.add_parser('post', help='post data from a sensor') parser_poll.add_argument('mac', type=valid_miflora_mac) parser_poll.set_defaults(func=post)
Wie man dem Coding entnehmen kann ist das ganze „generisch“ aufgebaut. Die Idee dahinter ist die, dass ich ja meine Sensoren alle eh mit der MAC Adresse in dem Python-Script anspreche. Damit ich hier keine „Übersetzung“ pflegen muss um die geeigneten openHAB Namen zu hinterlegen, habe ich einfach festgelegt, dass die Items in openHAB alle den Präfix der Mac-Adresse ohne Doppelpunkte haben. Die Messpunkte vermerke ich dann identisch mit einem entsprechenden Suffix, d.h. „_HUMI“ für die Feuchtigkeit.
Beispiel:
Group gC47C8D621C3A "C4:7C:8D:62:1C:3A" <none> (gMiFlora) String C47C8D621C3A_FW "Firmware [%s]" (gC47C8D621C3A) Number C47C8D621C3A_TEMP "Temperatur [%.1f °C]" (gC47C8D621C3A) Number C47C8D621C3A_HUMI "Feuchtigkeit [%.2f]" (gC47C8D621C3A) Number C47C8D621C3A_LIGHT "Licht [%.2f]" (gC47C8D621C3A) Number C47C8D621C3A_CONDUCT "Conductivity [%.2f]" (gC47C8D621C3A) Number C47C8D621C3A_BATT "Batterie [%.2f]" (gC47C8D621C3A)
Somit kann ich auch einfach in einem Shell-Script die Aufrufe hinzufügen und das dann in die Crontab auf dem PI einbinden und dem „massenhaften“ Pflanzen-Monitoring steht nichts mehr im Wege.