Update bt_exporter.py

This commit is contained in:
House of Vanity
2023-10-30 22:51:07 +02:00
committed by GitHub
parent 7b176cb4a9
commit 33edeeb361

View File

@ -1,29 +1,25 @@
"""Xiaomi Mi Temperature and Humidity Monitor 2 (LYWSD03MMC) prom exporter""" """Xiaomi Mi Temperature and Humidity Monitor 2 (LYWSD03MMC) prom exporter"""
import os
import time import time
import requests
import binascii
import argparse import argparse
from time import sleep
from prometheus_client import start_http_server, Gauge, Enum from prometheus_client import start_http_server, Gauge, Enum
from bluepy import btle from bluepy import btle
class XiaoMiTemp(btle.DefaultDelegate): class XiaoMiTemp(btle.DefaultDelegate):
def __init__(self,mac,location, temp, humid, batt): def __init__(self, mac, location, temp, humid, batt):
btle.DefaultDelegate.__init__(self) btle.DefaultDelegate.__init__(self)
self.mac=mac self.mac = mac
self.loc=location self.loc = location
self.temp = temp self.temp = temp
self.humid = humid self.humid = humid
self.batt = batt self.batt = batt
def handleNotification(self, cHandle, data): def handleNotification(self, cHandle, data):
databytes=bytearray(data) databytes = bytearray(data)
self.temp.labels(self.mac, self.loc).set(int.from_bytes(databytes[0:2],"little")/100) self.temp.labels(self.mac, self.loc).set(int.from_bytes(databytes[0:2], "little") / 100)
self.humid.labels(self.mac, self.loc).set(int.from_bytes(databytes[2:3],"little")) self.humid.labels(self.mac, self.loc).set(int.from_bytes(databytes[2:3], "little"))
self.batt.labels(self.mac, self.loc).set(int.from_bytes(databytes[3:5],"little")/1000) self.batt.labels(self.mac, self.loc).set(int.from_bytes(databytes[3:5], "little") / 1000)
class AppMetrics: class AppMetrics:
@ -44,8 +40,8 @@ class AppMetrics:
def fetch(self): def fetch(self):
for mac, location in self.devices: for mac, location in self.devices:
p = btle.Peripheral( ) p = btle.Peripheral()
p.setDelegate( XiaoMiTemp(mac, location, self.temperature, self.humidity, self.battery) ) p.setDelegate(XiaoMiTemp(mac, location, self.temperature, self.humidity, self.battery))
# BLE performs very poorly, constant errors are not uncommon # BLE performs very poorly, constant errors are not uncommon
for attempt in range(10): for attempt in range(10):
@ -58,24 +54,25 @@ class AppMetrics:
finally: finally:
p.disconnect() p.disconnect()
def main(): def main():
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Xiaomi Mi Temperature and Humidity Monitor 2 (LYWSD03MMC) prom exporter") description="Xiaomi Mi Temperature and Humidity Monitor 2 (LYWSD03MMC) prom exporter")
parser.add_argument( parser.add_argument(
'--device', '--device',
action='append', action='append',
required=True, required=True,
help="BLE Device in 'MAC;location' format") help="BLE Device in 'MAC;location' format")
parser.add_argument( parser.add_argument(
'--polling-interval', '--polling-interval',
default=180, default=180,
type=int, type=int,
help='Polling interval in seconds') help='Polling interval in seconds')
parser.add_argument( parser.add_argument(
'--port', '--port',
default=9877, default=9877,
type=int, type=int,
help='Exporter port') help='Exporter port')
args = parser.parse_args() args = parser.parse_args()
@ -90,5 +87,6 @@ def main():
start_http_server(exporter_port) start_http_server(exporter_port)
app_metrics.run_metrics_loop() app_metrics.run_metrics_loop()
if __name__ == "__main__": if __name__ == "__main__":
main() main()