CFW Xiaomi hőmérséklet és páratartalom mérőre

írta: sonar, 3 hónapja

Ezen bejegyzésem apropóját a Hackaday-en megjelent blog bejegyzés inspirálta.

Aki nem ismerné még a Xiaomi ezen termékét annak röviden pár szóban leírom.
Egy kicsi LCD kijelzővel rendelkező hőmérséklet és páratartalom mérő eszközről van szó, ami BlueTooth-on keresztül kommunikál.

A kép bármennyire is azt sugallja, hogy jól mutat a nappaliban, de ez nem így van. Valójában nagyon pici eszközről van szó. Nappaliba én az e-inkes változatot javaslom, ha valaki ilyesmit szeretne.

Specifikációk:
Battery: 1db CR2032
Wireless Connection: Bluetooth 4.2 BLE
Hőmérséklet tartomány: 0C-tól +60C-ig
Páratartalom tartomány: 0% - 99%
Méret: (L x W x H): 4.30 x 4.30 x 1.25 cm
Súly: 0.0200 kg

Miért akar az ember egy működő dolgot megberhelni?
Egyrészt mert ezáltal jobban kézben lehet tartani az információt (legalábbis azt gondoljuk) és jobban személyre lehet szabni az eszköz működését és megnyílik a lehetőség, hogy a gyári app-on kívűl mással is hozzáférjünk az adatokhoz.
Ez jelen esetben annyit tesz, hogy
- a kizárólagos Celsius kijelzést meg tudjuk változtatni Farenheitre (ez nálunk nem feltétlen igény)
- van lehetőség offset állítására. (Kollégákkal 4 darabot rendeltünk. A hőmérséklet 1 fokon belül, a pára tartalom meg 5%-on belül szórt. Otthoni viszonylatban ezt egész jónak mondanám)
- frissítési gyakoriságot lehet változtatni. (A gyári érték azt hiszem 5 sec). Aaron leírása alapján én úgy értelmezem, hogy milyen gyakran olvassa ki a szenzor adatokat. De ettől függetlenül folyamatosan küldi a BLE csomagokat. De ezáltal lehet növelni az elem élettartamát
- a példa programok segítségével akár magunk is írhatunk applikációkat amik tudnak kapcsolódni a kütyühöz

Nos akkor nézzük, hogy mi is kell ahhoz CustomFW-t töltsünk rá.
Első sorban ajánlom a fejlesztő Aaron Christophel Youtube videóját megtekintésre: 4$ Xiaomi thermometer custom firmware LYWSD03MMC BLE TLSR8251

Ahogy a videóban is én is egy mobil okos telefon segítségével flasheltem meg a kis eszközt.
#1 - Töltsd le a ATC_Thermometer.bin -t
#2 - Nyisd meg TelinkFlasher.htm-t
#3 - Connect gomb (BT és a helyek legyen bekapcsolva)

Ha sikeres volt a Connect akkor a bekeretezett részben a hőmérőnkre vonatkozó adatokat olvashatunk.

#4 - Válasszuk ki az #1-es pontban letöltött ATC_Thermometer.bin -t
#5 - A Start Flashing gomb megnyomására elindul a flashelés. A 3-sal jelölt keretben követhetjük, hogy hol tart a folyamat.

#6 - Nálam ~70 másodpercig tartott a flashelés. Utána elem kivétellel újraindítottam és az ATC_ kezdetű eszköz már CFW-s ketyere.

Ha már itt tartunk akkor nézzük meg, hogy python segítségével hogyan tudjuk a szenzor adatokat kiolvasni.
Először is telepítsük a szükséges csomagokat. (Én Linux Mint 20-at használok)
sudo apt install bluetooth libbluetooth-dev
sudo python3 -m pip install pybluez
Töltsük le a bluetooth_utils.py-t és tegyük a munkakönyvtárunkba.
Python példakód:
#!/usr/bin/env python3
import sys
from datetime import datetime
import bluetooth._bluetooth as bluez

from bluetooth_utils import (toggle_device, enable_le_scan,
parse_le_advertising_events,
disable_le_scan, raw_packet_to_str)

# Use 0 for hci0
dev_id = 0
toggle_device(dev_id, True)

try:
sock = bluez.hci_open_dev(dev_id)
except:
print("Cannot open bluetooth device %i" % dev_id)
raise

# Set filter to "True" to see only one packet per device
enable_le_scan(sock, filter_duplicates=False)

try:
def le_advertise_packet_handler(mac, adv_type, data, rssi):
data_str = raw_packet_to_str(data)
# Check for ATC preamble
if data_str[6:10] == '1a18':
temp = int(data_str[22:26], 16) / 10
hum = int(data_str[26:28], 16)
batt = int(data_str[28:30], 16)
print("%s - Device: %s Temp: %sc Humidity: %s%% Batt: %s%%" % \
(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), mac, temp, hum, batt))

# Called on new LE packet
parse_le_advertising_events(sock,
handler=le_advertise_packet_handler,
debug=False)
# Scan until Ctrl-C
except KeyboardInterrupt:
disable_le_scan(sock)