代码拉取完成,页面将自动刷新
#!/usr/bin/python3.5
from mitemp.mitemp_bt.mitemp_bt_poller import MiTempBtPoller
from mitemp.mitemp_bt.mitemp_bt_poller import MI_TEMPERATURE, MI_HUMIDITY, MI_BATTERY
from btlewrap.bluepy import BluepyBackend
from bluepy.btle import BTLEException
import paho.mqtt.client as mqtt
import traceback
import configparser
import os
import json
import datetime
workdir = os.path.dirname(os.path.realpath(__file__))
config = configparser.ConfigParser()
config.read("{0}/devices.ini".format(workdir))
devices = config.sections()
# Init MQTT
mqtt_config = configparser.ConfigParser()
mqtt_config.read("{0}/mqtt.ini".format(workdir))
mqtt_broker_cfg = mqtt_config["broker"]
try:
mqtt_client = mqtt.Client(mqtt_broker_cfg.get("client"))
mqtt_username = mqtt_broker_cfg.get("username")
mqtt_password = mqtt_broker_cfg.get("password")
if mqtt_username:
mqtt_client.username_pw_set(mqtt_username, mqtt_password)
mqtt_client.connect(host=mqtt_broker_cfg.get("host"), port=mqtt_broker_cfg.getint("port"))
except Exception as ex:
print("Cannot connect to MQTT: {0}".format(str(ex)))
exit(1)
# Averages
averages = configparser.ConfigParser()
averages.read("{0}/averages.ini".format(workdir))
for device in devices:
mac = config[device].get("device_mac")
poller = MiTempBtPoller(mac, BluepyBackend, ble_timeout=config[device].getint("timeout", 10))
try:
temperature = poller.parameter_value(MI_TEMPERATURE)
humidity = poller.parameter_value(MI_HUMIDITY)
battery = poller.parameter_value(MI_BATTERY)
data = json.dumps({
"temperature": temperature,
"humidity": humidity,
"battery": battery
})
# Check averages
avg = []
average_count = config[device].getint("average")
if average_count:
if mac in averages.sections():
avg = json.loads(averages[mac]["avg"])
# Add average
avg.insert(0, data)
# Strip data
avg = avg[0:average_count]
# Calc averages
temperature = 0
humidity = 0
battery = 0
for a in avg:
al = json.loads(a)
temperature += al["temperature"]
humidity += al["humidity"]
battery += al["battery"]
temperature = round(temperature / len(avg), 1)
humidity = round(humidity / len(avg), 1)
battery = round(battery / len(avg), 1)
# Convert averages
averages[mac] = {}
averages[mac]["avg"] = json.dumps(avg)
# Rewrite data
data = json.dumps({
"temperature": temperature,
"humidity": humidity,
"battery": battery,
"average": len(avg)
})
print(datetime.datetime.now(), device, " : ", data)
mqtt_client.publish(config[device].get("topic"), data, retain=config[device].getboolean("retain", False))
mqtt_client.publish(config[device].get("availability_topic"), "online")
except BTLEException as e:
mqtt_client.publish(config[device].get("availability_topic"), "offline")
print("Error connecting to device {0}: {1}".format(device, str(e)))
except Exception as e:
mqtt_client.publish(config[device].get("availability_topic"), "offline")
print("Error polling device {0}. Device might be unreachable or offline.".format(device))
# print(traceback.print_exc())
with open("{0}/averages.ini".format(workdir), "w") as averages_file:
averages.write(averages_file)
mqtt_client.disconnect()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。