Python通过蓝牙获取米家温湿度计2的数据

引言

最近入手了一个米家温湿度计2,今天介绍一下如何使用Python获取它的数据。

实验过程

我们使用到了python的bluepy模块,用以连接蓝牙设备。

温度、湿度和电压数据获得

我们可以直接通过蓝牙直接获取温度、湿度和电压的数据,得到的为bytes格式:

temp=int.from_bytes(data[0:2],byteorder='little',signed=True)/100
humidity=int.from_bytes(data[2:3],byteorder='little')
voltage=int.from_bytes(data[3:5],byteorder='little') / 1000

电池电量百分比显示

由于设备并没有提供电池电量百分比数据,我们可以自己进行计算,公式如下:
在这里插入图片描述

米家温湿度计使用的是一个CR2032纽扣电池,首次开机测得的电池电压为3.261V(不同的设备不同,可结合自己的情况),在网上查到CR2032纽扣电池的放电曲线如下:
Python通过蓝牙获取米家温湿度计2的数据_第1张图片
Python通过蓝牙获取米家温湿度计2的数据_第2张图片
由图中可以得到,电池放电的截止电压约为2V,所以我们可以得到纽扣电池的电量百分比:

battery = round((voltage - 2) / (3.261 - 2) * 100, 2)

由此我们便得到了所有的数据

完整代码

from bluepy import btle
from dataclasses import dataclass

mac = "A4:C1:38:BE:C9:D5"

@dataclass
class Result:
    temperature: float
    humidity: int
    voltage: float
    battery: int = 0

class Measure(btle.DefaultDelegate):
    def __init__(self, params):
        btle.DefaultDelegate.__init__(self)
    
    def handleNotification(self, cHandle, data):
        try:
            result = Result(0,0,0,0)
            temp=int.from_bytes(data[0:2],byteorder='little',signed=True)/100
            humidity=int.from_bytes(data[2:3],byteorder='little')
            voltage=int.from_bytes(data[3:5],byteorder='little') / 1000
            battery = round((voltage - 2) / (3.261 - 2) * 100, 2)
            result.temperature = temp
            result.humidity = humidity
            result.voltage = voltage
            result.battery = battery
            print(result)
        except Exception as e:
            print(e)


def connect():
    p = btle.Peripheral(mac)
    p.writeCharacteristic(0x0038, b'\x01\x00', True) 
    p.writeCharacteristic(0x0046, b'\xf4\x01\x00', True)
    p.withDelegate(Measure("mijia"))
    return p

p = connect()

if p.waitForNotifications(3000):
    p.disconnect()

下面是我自己运营的微信小程序“但行趣事”和公众号“是雯子吖”,更多的技术文章以及视频我会放到小程序和公众号当中,有志同道合的小伙伴也可以在小程序(联系客服按钮)或者公众号(直接留言)当中联系我们

但行趣事小程序
Python通过蓝牙获取米家温湿度计2的数据_第3张图片是雯子吖公众号

你可能感兴趣的:(python小栈,python)