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纽扣电池的放电曲线如下: 在这里插入图片描述 在这里插入图片描述 由图中可以得到,电池放电的截止电压约为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()

results matching ""

    No results matching ""