Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 22 additions & 13 deletions meater.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,14 @@ def convertAmbient(array):

@staticmethod
def toCelsius(value):
if value is None:
return None
return (float(value)+8.0)/16.0

@staticmethod
def toFahrenheit(value):
if value is None:
return None
return ((MeaterProbe.toCelsius(value)*9)/5)+32.0

def getTip(self):
Expand All @@ -35,25 +39,25 @@ def getTipF(self):

def getTipC(self):
return MeaterProbe.toCelsius(self._tip)

def getAmbientF(self):
return MeaterProbe.toFahrenheit(self._ambient)

def getAmbient(self):
return self._ambient

def getAmbientC(self):
return MeaterProbe.toCelsius(self._ambient)

def getBattery(self):
return self._battery

def getAddress(self):
return self._addr

def getID(self):
return self._id

def getFirmware(self):
return self._firmware

Expand All @@ -66,11 +70,16 @@ def readCharacteristic(self, c):
def update(self):
tempBytes = self.readCharacteristic(31)
batteryBytes = self.readCharacteristic(35)
self._tip = MeaterProbe.bytesToInt(tempBytes[0], tempBytes[1])
self._ambient = MeaterProbe.convertAmbient(tempBytes)
self._battery = MeaterProbe.bytesToInt(batteryBytes[0], batteryBytes[1])*10
(self._firmware, self._id) = str(self.readCharacteristic(22)).split("_")
self._lastUpdate = time.time()
if len(tempBytes) > 0:
self._tip = MeaterProbe.bytesToInt(tempBytes[0], tempBytes[1])
self._ambient = MeaterProbe.convertAmbient(tempBytes)
self._battery = MeaterProbe.bytesToInt(batteryBytes[0], batteryBytes[1])*10
(self._firmware, self._id) = self.readCharacteristic(22).decode().split('_')
self._lastUpdate = time.time()
else:
self._tip = self._ambient = self._battery = self._firmware = self._id = self._lastUpdate = None

def __str__(self):
return "%s %s probe: %s tip: %fF/%fC ambient: %fF/%fC battery: %d%% age: %ds" % (self.getAddress(), self.getFirmware(), self.getID(), self.getTipF(), self.getTipC(), self.getAmbientF(), self.getAmbientC(), self.getBattery(), time.time() - self._lastUpdate)
if self._lastUpdate is not None:
return "%s %s probe: %s tip: %fF/%fC ambient: %fF/%fC battery: %d%% age: %ds" % (self.getAddress(), self.getFirmware(), self.getID(), self.getTipF(), self.getTipC(), self.getAmbientF(), self.getAmbientC(), self.getBattery(), time.time() - self._lastUpdate)
return "No data yet."
49 changes: 35 additions & 14 deletions readMeater.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,45 @@
#!/usr/bin/python
#!/usr/bin/env python3
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
# Find the meater address with hcitool lescan (label MEATER).
# run readMeater.py <address>
# python ./readMeater.py D0:D9:4F:83:E8:EB

import time
from bluepy import btle
import sys
import json
import time
import pickle
import binascii
import click
import paho.mqtt.client as mqtt

from meater import MeaterProbe

print "Connecting..."
devs = [MeaterProbe(addr) for addr in sys.argv[1:]]
print "Connected"

while True:
for dev in devs:
dev.update()
print dev
time.sleep(1)
@click.command()
@click.option("--device", '-d', multiple=True, help="bluetooth id of Meater")
@click.option("--mosquitto-server", '-m', help="url of mosquitto server to send results to.")
def main(device, mosquitto_server):
if mosquitto_server is not None:
print(f"Connecting to mosquitto server: {mosquitto_server}...")
client = mqtt.Client("Meater")
client.connect(mosquitto_server)

print("Connecting...")
devs = [MeaterProbe(addr) for addr in device]
print("Connected")


while True:
for dev in devs:
dev.update()
print(dev)
if mosquitto_server is not None:
client.publish("meater", json.dumps({
'tip_C' : dev.getTipC(),
'ambient_C' : dev.getAmbientC(),
'battery' : dev.getBattery(),
'bluetooth_address' : dev.getAddress(),
'id' : dev.getID(),
'firmware' : dev.getFirmware(),
}))
time.sleep(1)

if __name__ == '__main__':
main()