h_nari @ 熊本市のブログ。電子工作、プログラミング、ゲーム、TV、 政治、インターネットなどに日々の思い付きを、 うだうだ~と書いていきたい。
このブログにはコメント欄を設けておりません。 記事への御意見、ご質問はtwitter @h_nari宛に お願い致します。


アーカイブ

メタ情報
RSS
Login

XIAOMI 湿度計到着

AliExpressに注文していた XIAOMIの湿度計がやっと届いた。 8月16日に注文していたので5.5週ぐらいで 届いたことになる。 価格は4個で1,229円。1個あたり306円と激安。

コンパクトで可愛いデザイン。 電池の絶縁テープを抜くと すぐに温度と湿度が表示された。 裏蓋を外し内部を確認。 電池はCR2032。 MOYASHI氏のフィラメントケースの ホルダーにバッチリはまって気持ちが良い。

データを取得するプログラム

アプリでアクセスできるらしいのだが、 どうせアプリでは使わないので MOYASHI氏のブログで紹介されている JsBergbau/MiTemperature2: Read the values of the Xiaomi Mi Bluetooth Temperature sensor 2を試す。

Python3.7以上が必要ということで、 自分のLinux機はPython3.5.3だったので ソースをダウンロードし 3.7.9をインストール。 LYWSD03MMC.pyをダウンロードし 動かすと usageが表示された。 これを読んで以下のことがわかった。

  • デバイスのMACアドレスを指定する必要がある
  • -cで回数を指定しないと永遠にデータを表示し続ける
  • -callでデータ取得時に外部プログラムを起動可能
  • データ補正機能が充実。湿度データがあまり信用されていない?

MACアドレスの取得

bluetoothについて詳しくないのだが、 湿度計のMACアドレスは以下のbluetoothctlコマンドを実行し、 scan onと入力することで取得できた。 LYWSD03MMC がXIAOMIの湿度計らしい。

$ bluetoothctl
[NEW] Controller 00:1B:DC:03:9F:EC hslpc24 [default]
[NEW] Device B0:99:28:A4:55:D2 F-PLUG_001BDC039FEC
[bluetooth]# scan on
Discovery started
[NEW] Device 51:64:82:65:03:9D 51-64-82-65-03-9D
[NEW] Device 57:FC:16:D4:63:DB 57-FC-16-D4-63-DB
[NEW] Device A4:C1:38:91:79:3F LYWSD03MMC
[NEW] Device A4:C1:38:79:5E:67 LYWSD03MMC
[NEW] Device A4:C1:38:1F:EB:AB LYWSD03MMC
[NEW] Device A4:C1:38:BC:11:D9 LYWSD03MMC
[CHG] Device 51:64:82:65:03:9D RSSI: -59
[CHG] Device A4:C1:38:79:5E:67 RSSI: -62
[CHG] Device 51:64:82:65:03:9D RSSI: -76
[CHG] Device A4:C1:38:1F:EB:AB RSSI: -71
[bluetooth]# quit
[DEL] Controller 00:1B:DC:03:9F:EC hslpc24 [default]
$

callbackプログラムの引数

-callで与えるプログラムに 渡される引数を確認するため、引数を 表示するだけのプログラムで動かしてみる。

$ cat callback.py
#!/usr/local/bin/python3
import sys
print(sys.argv)
$ python3 ./LYWSD03MMC.py -d A4:C1:38:91:79:3F -c 1 -call callback.py
Trying to connect to A4:C1:38:91:79:3F
Temperature: 28.78
Humidity: 65
Battery voltage: 2.726
1 measurements collected. Exiting in a moment.
/somewhere/callback.py sensorname,temperature,humidity,voltage,timestamp A4:C1:38:91:79:3F 28.78 65 2.726 1601098469
['/somewhere/callback.py', 'sensorname,temperature,humidity,voltage,timestamp', 'A4:C1:38:91:79:3F', '28.78', '65', '2.726', '1601098469']
$

sys.argv[1]にパラメータ名のリストが渡され sys.argv[2]以降に値が渡されている。 パラメータはLYWSD03MMC.pyのオプションで変化する場合が あるらしい。

データ記録プログラム

必要な情報が揃ったので、 湿度データを記録するプログラムを作成した。 データの記録はwebサーバのapiにアクセスすることで センサーIDと値が時刻とともにMysqlに保存している。

まず、callback用のプログラム。

$ cat xiaomi_callback.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys, os, urllib.request

sensors = {
    "A4:C1:38:BC:11:D9": 132,    # MAC addr: sensor_id
    "A4:C1:38:1F:EB:AB": 135,
    "A4:C1:38:91:79:3F": 138,
    "A4:C1:38:79:5E:67": 141
}

if len(sys.argv) > 1:
    params = sys.argv[1]
    i = 2
    data = {}
    for param in params.split(','):
        data[param] = sys.argv[i]
        i += 1
    id = data['sensorname']
    sid = sensors[id]
    keys = ['temperature','humidity','voltage'];

    for i in range(3):
        key = keys[i]
        if key in data:
            v = data[key]
            url  = 'http://my_server_addr/dms/api.put?'
            url += 'sensor=%d&value=%s' % (sid+i, v)
            urllib.request.urlopen(url)
else:
    for k in sensors.keys():
        print(k)
$

cronから呼び出すプログラム

nari@hslpc24$ cat xiaomi.sh
#!/bin/bash
DIR="/home/my_program_dir"
for id in  `$DIR/xiaomi_callback.py`; do
    /usr/local/bin/python3 -u $DIR/LYWSD03MMC.py -d $id -c 1 -call xiaomi_callback.py
done
$

このプログラムをcronで10分毎に起動している。

$ crontab -l
...
*/10 *    *   *   *   /home/my_program_dir/xiaomi.sh > /dev/null
...
$

実装

調べたMACアドレスと割り当てたセンサーID(番号)を印刷し、 両面テープでXIAOMI湿度計に貼り付けた。

フィラメント・ケース-3Dプリンタ間は PTFEチューブにいれてフィラメントを送っている。 このチューブには湿気の侵入を防ぐことと 3Dプリンタがフィラメントを引いても ケースが動かないという利点がある。 X-Smartのヘッドはチューブを受け止める 形状になっているが、ENDER3V2はそうなっていないので、 自作の部品を追加し、チューブを受け止めれるようにした。

計測結果

前にも書いたが Mysqlに書き込んだデータは grafanaでグラフ化し ブラウザで見る。 昨晩、湿度計を設置したあとのグラフを以下に示す。

湿度計は今回設置したXIAOMIの4個以外に2個ある。 1つは netatomの室内モジュールについているもので、 もう一つは, sht31モジュールで自作したもの。 XIAOMIの湿度計が、なかなか来ないので 待ちきれず作ってしまった。 sht31は湿度の精度は±2%で高精度ということになっている。 これと比べるとXIAOMIの奴は10%程度高い湿度を示すようである。

XIAOMIの湿度計の設置状況は以下の通り。

  • X-Smart用フィラメントBox(1F設置)
  • Ender3V2用フィラメントBox
  • フィラメント保管Box
  • Ender3V2近く

上3つは密閉ケースで乾燥機が入っている。 ケースに入れた時点で湿度が下がり始め、 蓋を開けたタイミングで湿度が戻る様子が 観測できる。

今後

乾燥剤がどれくらいの期間持つかとか、 本当に湿度絡みのトラブルがなくなるのかとか、 様子を見ていきたい。

余ったXIAOMI湿度計1個は フィラメントBOXをもう1個作って入れる予定。

2020/10/09(金)追記

このプログラムでは問題が発生してしまった。 詳しくは XIAOMI湿度計その後参照。