67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
from miflora.miflora_poller import MiFloraPoller
|
|
from btlewrap.bluepy import BluepyBackend
|
|
from miflora import miflora_scanner
|
|
from miflora.miflora_poller import (MI_BATTERY, MI_CONDUCTIVITY, MI_LIGHT, MI_MOISTURE, MI_TEMPERATURE)
|
|
import time
|
|
import paho.mqtt.client as mqtt
|
|
import json
|
|
|
|
devices = []
|
|
this_client = "test_client"
|
|
|
|
def poll_miflora(address):
|
|
poller = MiFloraPoller(address, BluepyBackend)
|
|
|
|
miflora_device = {}
|
|
miflora_device["name"] = poller.name()
|
|
miflora_device["conductivity"] = poller.parameter_value(MI_CONDUCTIVITY)
|
|
miflora_device["moisture"] = poller.parameter_value(MI_MOISTURE)
|
|
miflora_device["temperature"] = poller.parameter_value(MI_TEMPERATURE)
|
|
miflora_device["light"] = poller.parameter_value(MI_LIGHT)
|
|
miflora_device["battery"] = poller.parameter_value(MI_BATTERY)
|
|
|
|
return miflora_device
|
|
|
|
def on_connect(client, userdata, flags, rc):
|
|
print("Connected with result code "+str(rc))
|
|
|
|
client.subscribe("dev/mqtt-miflora/device-configuration")
|
|
|
|
def on_message(client, userdata, msg):
|
|
devices_all = json.loads(msg.payload.decode("utf-8"))
|
|
try:
|
|
for device in devices_all["devices"]:
|
|
try:
|
|
if device["client"] == this_client:
|
|
devices.append(device)
|
|
except KeyError as err:
|
|
print("Skipping device. Key not found: '{0}'".format(err))
|
|
except Exception as err:
|
|
print("Error decoding json configuration: {0}".format(err))
|
|
|
|
if __name__ == "__main__":
|
|
sleep_minutes = 1
|
|
backend = BluepyBackend
|
|
|
|
#devices = miflora_scanner.scan(BluepyBackend, 10)
|
|
|
|
client = mqtt.Client()
|
|
client.on_connect = on_connect
|
|
client.on_message = on_message
|
|
client.connect("chimaera", 1883, 60)
|
|
|
|
client.loop_start()
|
|
|
|
while True:
|
|
if len(devices) == 0:
|
|
time.sleep(1)
|
|
else:
|
|
for device in devices:
|
|
polled_dev = poll_miflora(device["mac"])
|
|
print("MIFlora {0}, -- {1}".format(device["name"], polled_dev))
|
|
time.sleep(sleep_minutes * 60)
|
|
|
|
client.loop_stop()
|
|
|
|
|