從小米溫溼度計2(LYWSD03MMC)記錄數據

Posted on Jul 20, 2020

太久沒寫 blog 了,都忘了要怎麼寫了,工具怎麼用都忘了 = = 先讓咱回憶一下~

0x00 背景

之前有過人發過9元購買小米溫度計的消息,咱確實點進去了但沒看懂要怎麼買就放棄了,而且也沒啥用,於是就忘了這件事。直到前幾天(?),咱和朋友去逛了一下小米之家,看見這個溫度計還是比較小巧,而且沒有什麼奇奇怪怪的功能,就純粹的顯示溫度和溼度,於是就想買一只了。但看了看店裏需要39元一個,想了想之前見到9元一個,或許某寶上更便宜點於是回來就在某寶上畫14元購入了一只。
當然咱是不太喜歡市面上的智能家居的,可以說因爲他們都太“智能“,很多都需要聯網而且需要一臺手機來控制。因此某些十分簡單操作就變的需要使用手機,例如查看溫溼度數據,再例如開關燈。與此同時很多設備也不能隨意的獲得它們的傳感器採集的數據(可能走的是自己的協議並且有加密,沒法直接採集並記錄),這些數據在可視化之後還是可以幫助優化一下居住環境的(主要是畫出來的圖會很好康)。但是這次會買這個溫溼度計還是因爲小,漂亮,只有藍牙(不會聯網也就不存在一些擔心的問題)看了一下之前的小米的溫溼度計還是能很方便的獲取信息的,就算這個沒法獲取數據,還能粘牆上看,所以還是挺滿意的。
那先說說這個方形的小溫度計,這東西很簡潔,只顯示溫度和溼度,使用的是 cr2032 電池,據說能用幾年。當然還是小,咱需要的也只有溫度和溼度,基本上不看時間或者時間用別的東西顯示,這就非常的符合要求了,他只做一件事,那就是顯示溫度。 pic1

0x01 獲取數據

嘛,最簡單的當然是用米家app(x 。但很快汝會發現這個圖,它是以一個小時爲一個點,而且不能拖動來看。
所以問題來了,咱們要自己獲取數據。那就先搜一下吧,找到[1] 這個 issue 裏面提到了這個溫度計會使用低功耗廣播,每10min 會發送一次溫溼度數據,這是這個溫度計的默認行爲,也就是說如果利用這個方法來獲取數據的話看起來確實是是一個不錯的選擇,因爲這對電池的損耗幾乎是沒有影響的。恩,打開了 wireshark 看了看確實會發送一些東西。值得注意的是,這些廣播是加密了的,而 key 是要從米家的 app 裏面導出。咱想了一下,如果要通過這個方法,那麼就要從米家的app那獲取 key, 然後再抓。這太麻煩了。爲什麼不直接用 custom-components/sensor.mitemp_bt 這個項目? 嘛,這項目包含的東西有點多懶得配,而且看了一下這個項目是模擬 hcidump 來獲取對應的廣播幀,emmm,感覺不太合適。
那有沒有別的辦法呢,有的,搜索小米的溫度計的時候發現了這樣的一篇[2] (都是俄文,谷歌翻譯能大概看得懂)。在同類的米家溫度計是可以直接利用藍牙連過去然後訂閱獲取數據的,那 LYWSD03MMC 是不是也可以呢,利用這篇東西提到的代碼,咱發現確實是可以的,甚至可以直接拿到,沒有加密。利用這篇文章裏面提到的代碼會拿到了一串東西,而這串的前面兩位是溼度,中間的兩位是電池電壓,後面的是溫度。因此全部的數據都拿到了。
之後選擇後面的方法來獲取數據,咱只需要獲取這個一個溫度計的數據,因此簡單是最重要的,接着如果使用的是抓廣播的方法獲取的話,那麼密度就會限制在了 10min ,而且如果這一次出現了些什麼意外抓不到錯過了,那麼中間的間隔將會變的非常的大。而直接鏈接藍牙用訂閱的方法,這個方法相比起抓廣播會非常的耗電,但可以做到比第一種方法還要高的密度。嘛,最後搜了一下某寶,有充電的電池賣,不貴,用完了買就好了。於是就用第二種方法來存了。

0x02 踩坑

在搞清楚怎麼拿數據之後就簡單了,寫個死循環一直獲取然後隨便找個地方存起來就好了,對吧。但問題就出現在了這個小腳本用到的 bluepy 庫上面。這個庫有點小問題,他會跑飛,具體現象就是 p.disconnect 之後會卡死在那不退出,然後那個進程會把一個核心吃滿。解決方法也簡單,開個進程等一段時間,一段時間之後如果這東西還在的話就把他 kill 了,值得注意的是可能不止在跑的這一個小腳本再用着一個 bluepy。 所以要用 psutil 來找是屬於這個小腳本的 bluepy-helper 然後 kill。這個問題陸陸續續的弄了幾天,咱一開始也沒搞懂要怎麼弄,怎麼會在一段時間之後就沒數據了,後來才發現這個東西跑一半會卡死 ´_>`。

0x03 最後

然後在解決上面的問題之後,這 LYWSD03MMC.py 就是咱現在在用的腳本了,已經跑了好幾天了都沒啥問題。填好溫度計的那個 mac 地址,跑就好了,如果汝有多個溫度計那需要修改一下。之後咱要解決的問題估計就是換到用influxdb 存吧,這個等設備多起來再說了。畫圖?那個隨便拿 matplot 湊合一下就好了。至於用來 24×7 跑這個腳本的機器?那當然是韭菜 n1 盒子了,這個盒子帶了個和樹莓派一樣的藍牙芯片,用起來效果不錯,至於那個的藍牙要怎麼弄就是另外的一篇了。
圖畫出來大概是這樣的: pic0


參考資料以及鏈接

[1] https://github.com/custom-components/sensor.mitemp_bt/issues/7
[2] https://habr.com/ru/post/452558/
[3] https://github.com/MarvelousBlack/LYWSD03MMC_capture/blob/master/LYWSD03MMC.py

comments powered by Disqus