はじめに
obniz IoTコンテスト用に温度と湿度を取得する必要があったものの、貴重なIOを消費したくなく、また、BLEで動作確認済みの他のデバイスが少々高価だったため、比較的低価格で手に入る"Xiaomi BLE 温度湿度計 LYWSD03MMC"をobniz.jsで読めるようにしました。
標準ファームウェアのLYWSD03MMCでは温度湿度データを簡単にとることができないので、カスタムファームウェアを導入します。
つかうもの
- obniz Boardなどのobniz.jsが動くもの
- Xiaomi BLE 温度湿度計 LYWSD03MMC
- BLEが扱えるPCやMac上でのGoogle Chrome (または最近のMicrosoft EdgeやOperaなどのChromiumベースのBluetooth,BLEが扱えるWebブラウザ)
参考にさせていただいたサイト
1ft-seabass.jp.MEMO 「EnOcean STM 550B マルチセンサーモジュール(BLE) を obniz の BLE で取得するメモ」 seigo様
obnizで動くプログラムはほぼ、この記事を丸ごとコピーしてアドバタイズフォーマットに合わせて改変しただけです。
ATCNETZ.de Custom Firmware für das 4€ Xiaomi Thermometer LYWSD03MMC , ( github ATC_MiThermometer )
LYWSD03MMC用のカスタムファームウェア
github pvvx/ATC_MiThermometer
上記カスタムファームウェアの機能アップ版
準備
準備 1: カスタムファームウェアの導入
- LYWSD03MMCの電源を入れておきます。
- BLEが使えるデバイス上のChromium系ブラウザで、上記の機能アップ版のgithubにアクセスします。
- 少し下にスクロールして、 Table of content > Getting Started > Flashing or Updating the Firmware (OTA) をクリックします。
- 「Go to the Over-the-air Webupdater Page TelinkMiFlasher.html」から、ファームウェアの書き込みページに行きます。
- ページ上部の 「Connect」ボタンを押し、しばらく待つと出てくる「LYWSD03MMC」を選択し、「ペアリング/ペア設定」を押します。
- しばらく待つと画面が変わります。「Do Activation」ボタンを押して、操作可能な状態にします。
- Activationが成功すると、ファームウェアの書き込み部分が現れるので、「Custom Firmware ver ???」をクリック。
- ボタンが「Start Flashing」に変わったら、押して書き込みを開始します。
- 終了後、LYWSD03MMCが自動的に再起動するので、その間にChromium系ブラウザをタスクトレイなど常駐系含めすべて終了しておき、Bluetoothを抱え込み次が繋がらないバグを回避します。だめならデバイスごと再起動します。
準備 2: カスタムファームウェアの設定
- LYWSD03MMC(カスタムファームウェア)の電源を入れておきます。上記でファームウェアを書き換えた後の初回は、画面が出ても1~2分ほど安定しないことがあるようなので待ちます。
- 準備1で使った「Go to the Over-the-air Webupdater Page TelinkMiFlasher.html」に再びアクセスし、同じようにConnectボタンを押します。
- カスタムファームウェアを導入したことで、デバイス名が「ATC_??????」(??部はMACアドレスの下部6桁)に変わっているので、探して同じように接続します。この「ATC_??????」をメモしておいてください。
- 設定が大量に出てきます、「Advertising type: 」を「Atc1441」に設定します。
- 必要に応じて、他の設定も変更してください。 RF TX Powerを変更したりintervalを変えることで、電池の消費を少し抑えられます。
- Send Configボタンを押して設定を確定させます。
- 以上で、平文で温度湿度(とバッテリー残量)がアドバタイズされてくるようになります。
プログラミング
上記の 1ft-seabass.jp.MEMO 「EnOcean STM 550B マルチセンサーモジュール(BLE) を obniz の BLE で取得するメモ」 seigo様 を参考にさせていただき、以下のようにプログラムを入力します。
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script
src="https://code.jquery.com/jquery-3.3.1.js"
integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz@3.14/obniz.js"
crossorigin="anonymous"
></script>
</head>
<body>
<div class="container">
<div><h2>Xiaomi 温湿度計 LYWSD03MMC(BLE)</h2></div>
<div>
<h3>[raw advertise data]</h3>
<div id="valueLYWSD03MMC">--</div>
<h3>[raw advertise data 16進数]</h3>
<div id="valueLYWSD03MMC2">--</div>
<h3>[Temperature]</h3>
<div id="temperature">--</div>
<h3>[Humidity]</h3>
<div id="humidity">--</div>
<h3>[Battery]</h3>
<div id="battery">--</div>
</div>
</div>
<script>
let loopCount = 0;
const settings = {
duration: null,
};
var obniz = new Obniz("OBNIZ_ID_HERE"); //Obniz IDをここに
obniz.onconnect = async function () {
obniz.display.print("obniz BLE");
obniz.display.print(" ↑ ↓");
obniz.display.print("LYWSD03MMC");
await obniz.ble.initWait();
var target = {
localName: "ATC_000000", // カスタムファームウェア導入後のデバイス名 ATC_??????をここに
};
var setting = {
duration: 60, // 60 sec
duplicate: true, // allow duplicate
};
obniz.ble.scan.onfind = async function (peripheral) {
console.log("LYWSD03MMC connect!" + new Date().getTime());
// 通常のアドバタイズデータ
const adv_data = peripheral.adv_data;
// 読解用。アドバタイズデータを16進法で表記することで Manufacturer ID の 0x03DA といった値が分かりやすくなります。
const adv_data16 = adv_data.map(function (value) {
return value.toString(16);
});
$("#valueLYWSD03MMC").text(adv_data.toString());
$("#valueLYWSD03MMC2").text(adv_data16.toString());
// 温度センサー
const temperature = Math.round(adv_data[10] * 256 + adv_data[11]) / 10;
$("#temperature").text(temperature);
// 湿度センサー
const humidity = adv_data[12];
$("#humidity").text(humidity);
// バッテリー(パーセント)
const battery = adv_data[13];
$("#battery").text(battery);
// データを受信するたびに再スキャン
// 再スキャンは endWait を走らせると onfinish が発動するのでそこで再開させる
await obniz.ble.scan.clearAdvertisementFilter();
await obniz.ble.scan.endWait();
};
obniz.ble.scan.onfinish = async function (peripherals, error) {
loopCount++;
console.log("scan timeout! [" + loopCount + "]");
// 再スキャンは endWait を走らせると onfinish が発動するのでそこで再開させる
await obniz.ble.scan.startWait(target, setting);
};
// 初回スタート
await obniz.ble.scan.startWait(target, setting);
};
</script>
</body>
</html>
実行
これで無事にXiaomi BLE 温度湿度計 LYWSD03MMCから温度と湿度を取得することができました。
これをもとに、データを送信してグラフを書いたり、温度や湿度をトリガーにして色々なデバイスを動かしていきます。
投稿者の人気記事
-
shunnag
さんが
2021/05/08
に
編集
をしました。
(メッセージ: 初版)
-
shunnag
さんが
2021/05/08
に
編集
をしました。
(メッセージ: 調整)
-
shunnag
さんが
2021/05/08
に
編集
をしました。
-
shunnag
さんが
2021/05/08
に
編集
をしました。
(メッセージ: Type修正)
-
shunnag
さんが
2021/12/07
に
編集
をしました。
-
shunnag
さんが
2021/12/07
に
編集
をしました。
ログインしてコメントを投稿する