shunnagのアイコン画像
shunnag 2021年05月08日作成 (2021年12月07日更新) © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 2562
shunnag 2021年05月08日作成 (2021年12月07日更新) © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 2562

obniz で Xiaomi BLE 温度湿度計 LYWSD03MMCのデータを受信する

obniz で Xiaomi BLE 温度湿度計 LYWSD03MMCのデータを受信する

はじめに

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: カスタムファームウェアの導入

  1. LYWSD03MMCの電源を入れておきます。
  2. BLEが使えるデバイス上のChromium系ブラウザで、上記の機能アップ版のgithubにアクセスします。
  3. 少し下にスクロールして、 Table of content > Getting Started > Flashing or Updating the Firmware (OTA) をクリックします。
  4. 「Go to the Over-the-air Webupdater Page TelinkMiFlasher.html」から、ファームウェアの書き込みページに行きます。
  5. ページ上部の 「Connect」ボタンを押し、しばらく待つと出てくる「LYWSD03MMC」を選択し、「ペアリング/ペア設定」を押します。
    キャプションを入力できます
  6. しばらく待つと画面が変わります。「Do Activation」ボタンを押して、操作可能な状態にします。
    キャプションを入力できます
  7. Activationが成功すると、ファームウェアの書き込み部分が現れるので、「Custom Firmware ver ???」をクリック。
    キャプションを入力できます
  8. ボタンが「Start Flashing」に変わったら、押して書き込みを開始します。
  9. 終了後、LYWSD03MMCが自動的に再起動するので、その間にChromium系ブラウザをタスクトレイなど常駐系含めすべて終了しておき、Bluetoothを抱え込み次が繋がらないバグを回避します。だめならデバイスごと再起動します。

準備 2: カスタムファームウェアの設定

  1. LYWSD03MMC(カスタムファームウェア)の電源を入れておきます。上記でファームウェアを書き換えた後の初回は、画面が出ても1~2分ほど安定しないことがあるようなので待ちます。
  2. 準備1で使った「Go to the Over-the-air Webupdater Page TelinkMiFlasher.html」に再びアクセスし、同じようにConnectボタンを押します。
  3. カスタムファームウェアを導入したことで、デバイス名が「ATC_??????」(??部はMACアドレスの下部6桁)に変わっているので、探して同じように接続します。この「ATC_??????」をメモしておいてください。
  4. 設定が大量に出てきます、「Advertising type: 」を「Atc1441」に設定します。
    キャプションを入力できます
  5. 必要に応じて、他の設定も変更してください。 RF TX Powerを変更したりintervalを変えることで、電池の消費を少し抑えられます。
  6. Send Configボタンを押して設定を確定させます。
  7. 以上で、平文で温度湿度(とバッテリー残量)がアドバタイズされてくるようになります。

プログラミング

上記の 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のアイコン画像
那須塩原の鋳物屋でいろいろやってます。
ログインしてコメントを投稿する