Miスマート体組成計2の測定データをZeppアプリ経由で外部へ通知できないか

Xiaomi製Miスマート体組成計2 XMTZC05HMを見守り目的で購入した。一人暮らしの高齢者の見守りが目的なので体重測定がなされたときにそれが外部に検知できることが重要(数値自身は基本どうでもよい)。これをOpenScaleというサードパーティ製のアプリそのデータをGoogle FitやMQTTに同期するOpenScale Syncというアプリの組み合わせで実現しようと考えていた。しかし,OpenScale Syncを実際に購入して試してみても,それからMQTTブローカに接続できていない

さて, “Mi BandやMiスマート体組成計のデータをGoogle Fit以外のStrava, Reliveにも無料で同期させる” はMiスマート体組成計2の話を出したときに興味を持った,iPhoneユーザでStravaユーザの友人向けだった。が,OpenScaleを使った方法がうまくいかないという現状の元,この記事を書いたおかげで代わりにZeppアプリを利用する以下のアイディアが思いついた:

  • Google Fitに同期されたときに検知できないか。
  • WeChatには大方測定データがメッセージとして流れるのだろうがこれを取得できないか。

結論から言うと,能力など諸制限によりどちらも現時点では不可能。⇨ 幸いその後OpenScale SyncでMQTTにデータ(といっても体重だけだが)投げられることができたので,とりあえずその路線で進める。

Google Fitとのデータ同期の活用

GoogleはGoogle FitのデータのアクセスのためのAPIを提供している。 “Platform Overview  |  Google Fit  |  Google Developers” にある図がわかりよい。

大きくAndroid機器からのアクセスとWebサービスとしてのアクセスの2通りを用意してある。新しいデータが登録されるたび通知を受けたいわけだから,subscribeできるのが理想的(ポーリングはしたくない)。Android機器ではRecord APIでこれができる。REST APIではこれに相当する機能は用意されていないもよう。

そのためだけにAndroidアプリを作成しなくてはならないのはそういうスキルのない自分にはパッとできない。

WeChatとの連携の活用

node-red-contrib-viseo-wechat (node) – Node-REDI (リポジトリ)でなんとかならないか。これはViseoという会社のボット作成フレームワークの一部らしい。このカスタムノードの設定項目をNode-RED上で見ると, App ID, App secret, App tokenが必要になっている。

これらを取得するにはどうするか?”access token – How do you obtain a WeChat access_token certificate from api.wechat.com? – Stack Overflow” に「中の人」によると思われる解答がある。要はWeChat Open Platformの一部であるWeChat Official Accounts Platformでservice accountを取得しろ,と。

しかし,実際WeChatの公式アカウントを取得しようとすると,まず中国本土在住であることが求められる(図1)。”china mainland” 以外の選択肢はない。仮に中国本土在住だとして進めても, “Identity card number” の情報であったりSMSでの認証が求められたり,と事実上諦めざるを得ない(図2)。

以下を見るとやはり公式アカウント取得は大変そう。特に海外公式アカウントは,現在取得できるのかもわからないが,$99/年の費用が発生するのであればいずれにせよ利用は考えられない。Line公式アカウントは無料で始められるのでそんなものだと思っていたが,それが当たり前ではないのか。

以下雑多な情報。

Development Overview of the Weixin Official Accounts Platform | Weixin public doc” — 以下がわからない。”Weixin” = “WeChat”?

The Weixin Official Accounts Platform is used to develop services for Weixin Official Accounts. To develop services for mobile apps, websites on PC, and Official Accounts third-party platforms (that provide services for Official Account operators from all walks of life), access Weixin Open Platform.

ちなみに,チャットボット分野のYoctol.AIBottender · A framework for building conversational user interfacesFOSSで,これは同社のMessaging-APIs: Messaging APIs for multi-platformに基づいている。この中のMessaging-API-WeChatを利用するのにもappId, appSecretが必要。

 

Mi BandやMiスマート体組成計のデータをGoogle Fit以外のStrava, Reliveにも無料で同期させる

この記事の内容はもともと “Amazfit Band 5はサードパーティアプリで見守りに使えるか” の一部だったが独立させた。

以下Androidでしか確認してないが,おそらくはiPhone等iOS機器でも同様であろう。

XiaomiのMi BandMiスマート体組成計のデータをGoogle Fit以外のStrava, Reliveにも無料で同期させることが可能。これにはAmazfitのZeppアプリを利用する。Miブランドのヘルスケア製品の管理はMi Fitアプリで,Amazfitブランドのヘルスケア製品の管理はZeppアプリで,というのが定番なのだが,Miブランドの製品の管理にあえてZeppアプリを使用する,というのがこの話のキモ

これが可能なのは以下の事情による:

  • XiaomiのMiブランドで売られているMi BandやMiスマート体組成計も,Huami(中国外ではAmazfit)がOEM提供している。そのためそれぞれが提供しているモバイルアプリも中身は大いに共通している。アプリ自身のアカウント管理も実は分けられてない。
  • データを同期するサービスとしてMi FitではGoogle Fitしか選べないのに対し,ZeppではStrava, ReLiveにも同期できる(図)。

これをやるには,Miブランドの製品を一旦Mi Fitアプリで登録し,その後(Mi Fitアプリの削除がこの段階で必要かも)Zeppアプリでログインする。このとき,Mi Fitアプリのログインに使用したアカウントを使う。下図にあるように,Zeppではそれ用にアカウントを作成する以外に,既存のサードパーティアカウントも利用できるのでそうする。アプリ画面では “Sign in with a third-party account” は小さい文字でしかも薄い色でしか表示されてないので見落としがち。

このアカウントとしては,自分が見た範囲の資料(“Zepp App does not sync with Mi Body Composition Scale 2 : amazfit” など)では,Mi Fitアプリを使用するために作成したMiアカウントを使うのが前提になっている。しかしMi Fitアプリもサードパーティアカウントの使用ができるので,新たにアカウントを作成したくなければGoogle アカウントなどを使うことも可。ただし,既にMiアカウントでMi Fitにデータの蓄積がありそれを引き継ぎたければMiアカウントを使用する必要がある。

Xiaomi製Miスマート体組成計2 XMTZC05HMを見守り目的で購入

Xiaomi製Miスマート体組成計2 XMTZC05HMを見守り目的で購入

一人暮らしの老人の見守りに対するアプローチ” で一人暮らしの高齢者の見守りのための1手段としてXiaomi Miスマート体組成計2なんかがいいかもしれない,とした。アマゾンのタイムセール祭り中に確か約3,500円で購入。保証期間は1年間。電池は単4を4本使用。英文マニュアル

上記記事中「AliExpressで買えばいくらかは安くなる」と書いたが,実はXiaomiはグローバルには体重だけ計測できるMi Smart Scale 2と,Mi Body Composition Scale 2(リンク先はオーストラリア市場向け)を出しており,後者が日本市場での「Miスマート体組成計2」に相当する。先の記事を書いたときには,ここを理解していなかった。

わかった上でAliExpressで再度調べてみると,今回の購入価格よりは特に安くは買えないことがわかった…というか,自分の調べた範囲ではむしろ高い。もっとも,見守りが目的で計測することそのものが真の目的ではないので体重計測だけできればよかったとも言える。まぁご本人は結構こういう数値にこだわりがあるようだから,いい選択をしたのだと思おう。

Zeppアプリを利用して通知?

Mi BandやMiスマート体組成計のデータをGoogle Fit以外のStrava, Reliveにも無料で同期させる” に書いたようにXiaomi Miスマート体組成計2はAmazfitの管理Zeppアプリでも管理できる。Zeppアプリを通じて,Google Fit, Strava, Reliveにデータ同期できる。ここから新たに体重が測定されたことが検知できないか。WeChatとも連携できるようだが,これはおおかた測定結果を自動的にチャットメッセージで送ることができるとかいった機能だろう。node-red-contrib-viseo-wechat (node) – Node-REDでなんとかならないか。⇨ この可能性は別途追求してみたが,自分の能力ではパッとどうかできるようではなかった

OpenScaleアプリをOpenScale Syncアプリと組み合わせて使用

Mi Scaleのプロトコルは既に解析されておりOpenScale: Open-source weight and body metrics tracker, with support for Bluetooth scalesというMi Fitの代替アプリがあるだけでなく,そのデータをGoogle FitやMQTTに同期するOpenScale Syncというアプリが存在する。

Frequently Asked Questions (FAQ) · oliexdev/openScale Wiki” にはこうある:

What are the differences between the openScale pro/light and the f-droid version?

The openScale pro supports Bluetooth scales and the light version doesn’t. But if you don’t want to pay for the pro version, you could test or use the f-droid version, because the pro and f-droid version are identical.

F-Droid版OpenScaleとOpenScale Syncを組み合わせるのが一番安く上がる。OpenScale SyncもFOSSで無料で手に入る,と思い込んでいたがそうではなかった。OpenScale SyncでMQTTブローカに送られるデータ種別はなんと体重のみ,トピックは決め打ちで自由度が低い(複数人のデータを同じブローカにpublishしたいときに区別できない),といったことを考えると470円というお値段は正直高く感じる…がしかたないか。

ちなみに,OpenScale SyncはWger Workout Managerというサービスにも同期できるようなのだが,Wgerはこれだけの機能を持っていて完全無料?Android版アプリFOSSで自分でサーバをホストすることも可能なようだがパブリックなものも用意されている?REST APIも用意されておりいろいろ使い良さそう。

OpenScaleが対応しているBLE体重計・体組成計のリストでは “Xiaomi Mi scale v2” とだけ書いてあり,これがMiスマート体組成計2のことだと思いこんでいた。実はXiaomiがスマート体重計も出していることを知って, “Xiaomi Mi scale v2” がスマート体重計2の方のことを指していて,スマート体組成計2には対応していないことを危惧したが,実際に試してみると簡単に連動した。

ただ,今のところOpenScale SyncでMosquittoのテスト用ブローカに接続できない(図)。理由はわからない。⇨ わかった。URIのスキームは “mqtt” かと思いきや “tcp” でなければならない。そのように変更するとちゃんとMQTTブローカに接続できた。体組成計で測定した後その結果が(体重だけだが)MQTTブローカに通知されることも確認した。

その後,MQTTブローカにOpenScale SyncがPublishされた値を,自動的に若干手を入れてた後別のトピックでpublishするようにした

Amazfit Band, Mi Band用NotifyアプリはMiスマート体組成計2にも対応しているが外部通知には使えない

実はこのMiスマート体組成計2の使用者として想定している方にはAmazfit Band 5もご用意してある。これはHuami製だがXiaomiとは結びつきが強く,Mi Smart BandもHuami製。そのため,工夫するとAmazfit BandもMi Smart BandもXiaomiのMi Fitアプリ,AmazfitのZeppアプリのどちらでも管理できるらしい。しかも,Miスマート体組成計2も,Mi Fitアプリはもちろんのこと,手順を踏めばZeppアプリでも管理できるらしい。

そういうこともあってXiaomiの体組成計を選んだのだが,Amazfit Band 5の管理には見守り目的でサードパーティアプリNotifyを使うことが決定している。実は,公式サイトでは全く触れられていないが,Notifyは以下の情報によると,実はXiaomiの体重計にも対応しているもよう。

  • Mi Scale – Search” — 体重計を登録済みのMi Fitアプリから体重計のMACアドレスを知る方法
  • Mi Scale – Search” (上と同じタイトルだが別文書)— BLEスキャナを使って体重計のMACアドレスを取得する方法

しかし,残念ながらブロードキャスト・インテント中に体重計に関したものは一切ない。なのでこれを利用して外部に体重計が使用されたことを通知することはできない。あればこれで目的が達成できたのだが…。また,ここで「体重計」と書いて「体組成計」と書かなかったのは意図的で,手元の体組成計2に対応しているかどうかはわからない。

結局のところ,既製のアプリ等で外部通知を行いたいなら,OpenScaleアプリとOpenScale Syncアプリの組み合わせに頼るしかない。もしそうなのであればOpenScaleが対応しているBLE体重計・体組成計の中からもっと安いのを選んでも良かった。体重等の計測そのものが真の目的ではなく,計測項目が少なかったり,計測精度が多少悪くても問題はないのだから。

Android TV Amigo7xJPでは利用できない他の方法

Accessing Xiaomi BLE Sensors from Node-RED” に述べたようにAndroid上ではBluetoothスタックとして定番のBlueZではなく,BlueDroidを採用している。そのため,Termuxをインストールしてサーバとしての利用を企んでいるAndroidTV準拠ストリーミング・メディア・プレーヤAmigo 7xJPではBlueZの使用を前提にしているソフトウェアはことごとく動かないはず(素直にラズパイの類を用意するほうが速かったか…)。

各種ホームコントロールシステム(Node-REDも含めて)との連携については “Xiaomi Smart Scale with Domoticz, NodeRed, Raspberry and Google Fit – LPRP.fr” 参照。ただこの記事によれば,体組成計との交信できるのは1~2m程度,ということ。Amigo 7xJPはこの高齢者のご自宅の居間に設置することになるので,その情報が正しければおそらくは浴室のそばに置かれるであろう体組成計とはBLE通信できないであろう。だとすると,いずれにせよ常時携帯するAndroid端末に依存するか,近くに専用のESP32機を用意するなどするしかなかった。

ESPHome

Xiaomi Miscale2 Sensors — ESPHome” によればESPHomeでしっかりサポートされているもよう。

TermuxをAndroidTV準拠ストリーミング・メディア・プレーヤAmigo 7xJPで

AndroidTV準拠ストリーミング・メディア・プレーヤAmigo 7xJPTermuxをインストールして各種サーバを走らせてやろうという話。

常時起動状態を確保

リモコンで表面上電源を切った状態では実際には電源は落ちておらず,現にGoogle Castのキャスティングを他のスマホなどからすることができる。なのでいわば「根本から」電源を絶たれでもしない限りサーバとして使うことに支障はまったくない。Wake-On-LANでなんとかなるか,スマートプラグを利用して外からコントロールするか,などとちょっと考えたがそんな必要は全くなかった(当たり前?)。

ただし,テストしていると少なくともアプリレベルでは固まってしまうことがある。現在は完全に電源を落として入れ直すことで再起動させて問題を解消させている。ところが最終的にAmigo 7xJPは他人様のお宅に収まって,そのときには私が簡単に手動で再起動させることはできなくなる。そこでそういう状況になっても遠隔で強制的に再起動できるよう,保険の意味でスマートプラグを介して電源供給しておくようにするのは賢明なことかもしれない

固まるアプリは具体的には今のところホームアプリ(ランチャーアプリ)。NewPipeアプリでYouTubeビデオを再生して,ホーム画面に戻ることで再生をバックグラウンドで継続させる。その一定時間後,スクリーンセーバのフォトフレームアプリが起動する。その後リモコンのホームボタンを押すと,真っ黒な画面になってうんともすんともいわなくなる,といった具合。 ⇦ “Termux環境下でアプリを強制終了” で限定的に対処。

さらに,起動時にmicroSDカードを認識しなかったことが一度あった。理由は全く不明。ひょっとして暑かったから?

Termux関係のアプリのインストール法

Google Play StoreにあるTermuxアプリには以下のような注釈が付けられている。したがって,Termux本体含め関係アプリは全てF-Droid から入手する必要がある

NOTE: Updates over Google Play is currently halted due to technical reasons. In the meantime, see https://github.com/termux/termux-app#installation for alternative installation sources.

Termux Google Play – Termux Wiki” にもう少し詳しい背景の説明あり。

Termux:APIはアプリをインストールするだけではダメで,以下のようにtermux-apiをインストールする必要がある。

pkg install termux-api

最初Play Store版をインストールして起動してみたところ, “unable to install the bootstrap packages” というエラーが出た。 “termux was unable to install the bootstrap packages” when I open Termux · Issue #1761 · termux/termux-packages · GitHub” にあるように内部ストレージに移動することで解消。これはうかつなことに「どんなアプリも強制的に外部ストレージにインストールできるようにする」という開発者オプションをオンにしていたせいかもしれない。

サービスが自動起動しない

Remote Access – Termux Wiki” を参照にOpenSSHをインストール。使用ポートはSSH標準の22ではなく8022ユーザ名は user でOK。

Termux:Bootアプリをインストールししかるべき設定をすることで,Amigo 7xJPの起動時にsshdが自動起動して欲しい。しかし何をどうしてもうまくいかない。Termux-servicesを使う方法は試していない。

Not executing script at boot · Issue #5 · termux/termux-boot · GitHub” なんか見ると同じ問題に苦しんでいる人は多そうだ。ここの投稿の中で,デーモンが勝手に殺されている自動起動スクリプトではnohupの使用が有効nohup のマニュアル),電力消費の最適化を外す,の3投稿が本質的のように思えた。

それぞれに対応した対策を全てやってみたがうまく行かない。で数時間潰した後,Termux:Bootアプリがなぜか外部ストレージにインストールされていたことに気づいて,それを内部ストレージに移したら(図)sshdが自動起動するようになった。上に述べたように外部ストレージのインストールを強制的に可能にしてた結果なのだろうか。それをオフにした後,Termux:Bootアプリをアンインストールして,その後再度インストールしたはずなのに…。

ちなみにこの後Termux:Bootアプリを外部ストレージに移すことはできなくなった。つまりTermux:Bootアプリ自身は「内部ストレージにインストール必須」と指定してたってことか。Termuxでのストレージの扱い全般については “Internal and external storage – Termux Wiki” 参照。

これで自動起動問題にはケリがついたかと言うと残念ながらそうではなく,後でインストールしたNode-REDの自動起動にはまだ成功していない。

なお,電力消費の最適化の対象から外すには,設定メニューAppsSpecial app accessEnergy optimization でアプリごとにトグルできる。アプリの自動起動を許可・不許可する設定は見つけられていない。

Bluetoothをサポートしていない

驚いたことにTermuxはBLEをはじめBluetoothを全くサポートしていない

その他サーバのインストール

Install Home Assistant, Mosquitto broker and Node-Red on android – Share your Projects! – Home Assistant Community” には自分でやりたいこととかなり重複なる内容。

Node-RED

Running on Android : Node-RED” に従いNode-REDのインストール。Android専用で,Androidに特化したカスタムノードつきのNode-RED処理系RedMobileがあるというのは知っていたし,そちらの方がTermuxのNode-REDより軽いという人がいるというのも知っていたが,以下の理由でTermux版を選んだ:

ただ,なぜか自動起動が成功していない。Sshdはできたのに…。まだこの問題は解決できていない。⇐ 下に引用したコメントを参照し自動起動スクリプトを変えたら成功。ただしtermux-fix-shebang コマンドはアーギュメントのファイル内容を直接変えてしまうので,1度だけ実行すればよく,自動起動スクリプトの中で何度も実行する必要はない。 “Differences from Linux – Termux Wiki” によれば最近のTermuxでは, Termux-execのおかげで,特にtermux-fix-shebang コマンドを実行する必要はないように読めるのだがそうではないのだろうか。

Node-REDのFAQに “Starting Node-RED on boot : Node-RED” があるが,これもしっかり理解し試していない。もっとも,sshできるのなら,それで接続してからそのターミナルからNode-REDを起動するのは,手作業とはいえ,Amigo 7xJPで極めて不便な文字入力をしながらやることに比べれば格段に楽。

Install Home Assistant, Mosquitto broker and Node-Red on android – Share your Projects! – Home Assistant Community” に以下のコメントがある(イタリックは私):

Now for your problem of starting node-red i found that you can use Termux:Boot. Add this in your start-sshd file and reboot phone.

termux-wake-lock # seems fine
termux-fix-shebang $(which node-red)
node-red --node-args="--max-old-space-size=128"
sshd

pm2 startup don’t work on android. pm2 resurrect restores applications saved with pm2 save but only when you open termux. Use Termux:Boot to solve your problem. Than you don’t need to open Termux UI.

少なくとも “Starting Node-RED on boot : Node-RED” で勧められていたpm2が使えないとわかっただけでも意味がある。

Securing Node-RED : Node-RED” もやらないと。以前Oracleの無料VPSサービスでNode-REDを使えるようにしたときの記録が参考になるかも。 “Settings.js Termux in android – General – Node-RED Forum” によれば settings.js があるべきなのは/data/data/com.termux/files/home/.node-red.

Node-REDを使って実現したいことの例

その他今後試してみたいサーバ

TermuxはBluetoothを直接サポートしない

AndroidTV準拠ストリーミング・メディア・プレーヤAmigo 7xJPはどうせ電源入れっぱなしになるのだから(リモコンで電源を落としたように見えても),サーバとして利用してやれ,という魂胆で調べてるうちに知ったこと: TermuxはBluetoothを直接サポートしない。

Device file missing from /dev/input/ for bluetooth device : termux” の答えには以下がある:

Pi is likely using the BlueZ stack, Android uses BlueDroid stack and they do differ.

Android BlueDroid (1): Overview of BlueDroid – Programmer Sought” にBlueZとBlueDroidとの関係が記載されている。Androidでもバージョン4.1まではBlueZを採用していたとのこと。

Termux:API – Termux Wiki” の中にもBluetooth関係の機能は全く見当たらない。

BlueZ for Androidは存在するが6年前ほどで開発は止まっておりAndroid 5までしかサポートしない。

ただし,Termux-API-BluetoothがBluetoothサポートを追加してくれるよう。アプリの形でも配布されている。

Taskerの類でもなぜかBLEのサポートは限定的。AutomateでもBluetooth関連のブロックは用意されているが,BLEに関してはよくてスキャンするだけ。これだけで,例えばiTagの物をなくすことを防止する機能なんかは,ITag or bluetooth beacon のように実現できるが,それ以上のことはできないのだろう。

swankdave/Basic-Ble-Writer: Plugin for Tasker that allows the user to write arbitrary binary arrays to Bluetooth Low Energy Devicesは存在し,出どころしらずのAPKがApkpure.comで入手はできる

本物(?)のiTagは安定動作

老人などが突然体の自由が思うようにきかなくなったときに助けを呼べるようにするために,iTag BLEトラッカーを非常ボタンとして流用することを考えた。しかし問題があった。iTagの電源を落としたり,あるいは接続相手のスマホの電源を落とした後,再度立ち上げ直した際,めったに自動的に再接続してくれなかった。

そこを不安に感じて代替機器について調べると同時に,それまで使っていた個体の問題である可能性もあると考えてiTagを追加で注文した。自分がそれまで持っていた1台のiTagはいわゆる「パチもん」のMLE-15であることはわかっていて(advertizeするときの情報から),それ自身に問題がある可能性があると思っていたから。

パッと見の違いはないが(写真),挙動に関して決定的な違いが1点。それはスマホと接続が切れてから,MLE-15が一定の時間後自動でシャットオフするのに対し,iTagはしないようであること。無駄な電力消費を抑えるという観点からは当然MLE-15の挙動の方が正解で,iTagがこの点異なるのは驚き。用途によってはこのiTagの挙動は望ましくないだろう。しかし今自分がしようとしていることからするとこのiTagの挙動は決定的に都合がいい

本質的に憂慮すべき事態ではないのに接続が長時間切れてしまうことは起こりうるが,その間にiTagが自動的に落ちてしまうと,その後接続が回復できる状況になったときにも自動的に再接続されえない。自動的にiTagが落ちてしまうと,人間が手動でiTagの電源を入れ直すというステップが必要になり,技術的素養のない素人さんが確実にそれをやってくれるようにするには相当な配慮が必要になる。ちなみに,「本質的に憂慮すべき事態」であるかないかはiTagには判別できないので,そのときにもアラームは鳴るのは構わないどころかそれが望ましい挙動。ただ勝手にシャットオフされるのは困る。

ただ,この新しいiTagは接続してなければいずれ勝手に電源が落ちるわけではないので,自分でも使ってないiTagは気をつけて電源を落とすようにしなければならない。外から電源が入っているかどうかは視覚では判別できず,ボタンを押してそれに対するフィードバック音があるかどうかで判断するしかない。iTagの想定している使い方の一つが,「非常ボタンが必要になるかもしれないあらゆる場所にばらまいておく」であり,この場合電源は通常入れていない。非常時に使用するには電源を入れることになるが,用が済んだ後には電源を落としたことを確認しなくてはならない。これを怠って電池を枯渇させてしまうと,せっかく苦労してセットアップしたのに生死が関わるような肝心なときに使えない,という最悪の結果になる

「本質的に憂慮すべき事態」の一例が,スマホの側の自動的再起動。最終的にはHuawei Nova Lite 3を中核にしてこのシステムを構築するつもりだが,OSの機能で夜中に自動的に電源を落とし,その後電源を入れるように設定している。その2つの時刻が最低15分開いていることが要件とされているので,上で20分スマホが再接続できる状況にならなくても,その後そうなればiTagが再接続することを確認した。

自分がテストしてみると,新しく入手したiTagはスマホとの接続が切れてから以下のような振る舞いをする。

  1. 0:30までLEDの点滅とビープ音(約30秒
  2. ビープ音は止まり1:30までLEDの点滅が継続(約1分
  3. LEDは消灯する。その後も最低20分間は自動シャットオフしたりせず,ボタンを押すと2.のフェーズに戻る。

その他MLE-15と新しいiTagを細かく観察すると以下のような違いがある:

  • ビープ音: MLE-15に比べると全般的に白・銀のiTagの方がこころなしか小さく音程も微妙に低い。金iTagは逆に音量も大きく音程も微妙に高い。また,オンにしたときのビープ音が,白・銀iTagが「ピッ,ピッ」という感じなのに対して,MLE-15は「ピー,ピー」という感じ。
  • LED: bondせずadvertizeしている状態では,iTagは白・銀・金のどれもLEDが点滅するのに対してMLE-15は全くLEDが点灯しない。
  • 電池格納庫: CR2032ボタン電池を格納するところの作りは明らかに違う(写真)。iTag(左)はMLE-15(右)にはない電池固定用バンパーがある。

ビープ音の音程・音量以外にも,特に起動時のビープ音のパターンが明らかに違うのでMLE-15は別物と判断していいだろう。残りの白・金・銀iTagについては,中身は同じだが購入時から入っていた電池のヘタリ具合の差がビープ音の音量や音程の差になっているのかもしれない。

iTagとの交信を担わせるつもりのオープンソースの iTracing2 (Wiki) の使用法にも前進があった。Issueとして報告したことであるが,以下のように実行すると格段に安定して再接続するようになった。

  • フォアグラウンド実行(デフォルトの挙動)
  • スマホの起動完了時にアプリ起動

フォアグラウンド実行が必要かどうか判断するだけの技術的知識は持ち合わせていないが,テストした範囲ではバックグラウンド実行では必ずしもiTagが再接続してくれなかった。MLE-15も再接続しやすくなったように思うがiTagの安定さにはかなわない。

上記のスマホ起動完了時というのはBOOT_COMPLETEDブロードキャストインテントが流れるときだが,なんとなく思うより結構後なのでそこに注意(起動し始めて数分後?)。さらに,iTagが安定して再接続するようになったといっても,その電源を入れるなりスマホに接続するとは限らず(そういう場合もあるのだが),2~3分かかることもある。

上記のようにiTracing2を走らせることによって,iTagとはかなり高い確率で再接続できるようになった。ただし残念ながら100%ではない。常時接続されているはずのiTagと一定期間再接続しない場合は,iTracing2アプリをフォアグラウンドに持ってくるなどしたほうがいいかもしれない。

Amazfit Band 5のセンサーデータをクラウドから取得するのは困難そう

Huamiのロゴ

Huamiのロゴ

Amazfit Band 5自分専用の写真アルバム)が見守り目的に使えるか考えている。サードパーティアプリの有償機能を使うことでそれを実現する目処は立った。しかし公式アプリはZeppがクラウドにデータをアップロードするのと並行して,Notify for Mi Band / Amazfit / Zeppで自分がやりたいことのために別のサーバにアップロードすることになり,無駄がある。特にスマホでこれら処理が行われるため電池消費が心配だ。

Notifyは本家アプリと併存させることも単独実行もできる。単独実行させればこの問題は軽減できるのだが,これをお使いになる方には日本語UIが必須だ。NotifyのUI日本語化は非常に限定的でこれでは何が何やらわからないだろう。本家のUIは秀逸であることもあり,これだけでもう本家アプリを使わないという選択肢はない。

Notifyには,それを使っていろいろしようとする私には大いに意味があっても,使用者ご本人には不要でむしろ見えてほしくない機能も多い。なんとNotifyにはご丁寧に, “Simple Mode” という表示項目を減らすモード, “Notify Lite Mode” という機能を減らすモードまで用意してあり,その準備のよさには感服する。上に述べた理由でやはりNotifyの単独利用は考えられない。

さて,発想を変え,Notifyアプリを利用するのではなく,ZeppがHuamiのサーバにアップロードしたデータを直接アクセスできたら,この問題はなくなる。

実はこれは本質的にはできそう。HuamiはHuami Open Platformを開発者に提供している。しかしどうもこれの敷居は高そう。要はHuamiは「ガチな」コンパニオンサービス/アプリの開発者しか想定していないようなのだ。

Development Process” を見ると開発過程でHuamiから何度も許可を得る必要があるように見える。 “Home · huamitech/rest-api Wiki · GitHub” でも以下のように断っている。

Data cooperation currently only supports corporate users, not individual users; if you are a PhD for scientific research purposes, you need to apply in the name of the school.

2. App Registration – huamitech/rest-api Wiki” に説明のある必要とされる情報は,不可能ではないとはいえ個人開発者が個人使用目的にはなかなか用意するのは面倒そうなものが多い。 “Account Sign-up and Authentication” を見ると, “individual developer” としての登録も可能なようなので,個人開発者が絶対ダメというわけでもなさそうなんだが…。

Real-time Data Access Guide” は “Currently, only data such as the real-time heart rate, real-time steps, and real-time calories can be pushed.” と断っているがそれで別に構わない。むしろ問題なのは “5. Subscriptions – huamitech/rest-api Wiki” の “Subscription notification is available to invited partners only.” の注意書き。これは致命的。一番欲しいのはセミ・リアルタイムの心拍数や歩数のデータなのでこれが得られないのなら意味がない。

ちなみに,要は「ホビイストお断り」ということなので,Node.jsやNode-RED向けのライブラリは作られてないようだ。

Amazfit Band 5はサードパーティアプリで見守りに使えるか

使用するアプリを選ぶことでAmazfit Band 5自分専用の写真アルバム)が見守り目的に使えるか考える。Amazfit Band 5に限らず同じHuami製のXiaomi Mi (Smart) Band 5やそれ以前のバージョンのバンドでも基本同じことが当てはまるはず。AmazfitやMiブランドのスマートウォッチ(バンドではなく)にもかなり共通するはずだが,ハードウェアが貧弱なバンドのほうが制約が強い。

心拍数計アプリは使用できるが効果は限定的

そう設定すれば,Amazfit Band 5が取得する心拍数データは他のBLE心拍数計アプリからもアクセスできるように設定できる。心拍数計アプリでその心拍数データを何らかの手段で外部に送信できるものがあれば限定的に見守り目的に使えるが,後で述べるサードパーティ製アプリでは他のセンサーデータも扱えるのでそちらを利用する。

Gadgetbridgeは見守りにはほぼ役に立たない

オープンソースのサードパーティアプリのGadgetbridge for Androidは基本的にはXiaomiなどの自分の個人データが保存されるのを嫌う人たち向けに作られたアプリであり,見守り目的のために必須のデータを他に同期するといった機能はない。

Gadgetbridgeアプリで定期的にデータのエキスポートができるようだから,そこから必要データを抽出してどこかのサーバーにあげるようにしたらよいのだろう。”Mi-Band steps on node-RED Dashboard – servo-server” では実際にGadgetbridge for Androidに定期的にエキスポートさせたデータをNode-REDに移している。

そもそも,使用にauth keyを取得する必要があり面倒Root化済み端末が使えるのなら手間ではない。非Root化端末でもPythonスクリプトでauth keyは得られるらしい。← 以下のNotifyの項でより簡単な方法を紹介する。

Notify for Mi Band/Amazfit/Zepp等のサードパーティアプリ

Notify for Mi Band/Amazfit/Zepp

Notify for Mi Band / Amazfit / Zeppはサードパーティアプリで,驚くばかりの追加機能を数多く用意している。自分がやりたいことを実現するには有償機能が必要(現時点で360円)。実は極めて似通ったアプリTools & Amazfitのことを先に知った。 これについては後で述べる

Mi FitアプリないしZeppアプリと併用という形での運用も,これら公式アプリなしでの単独使用にも対応しているという少し不思議なアプリ。単独使用するためには,Gadgetbridge同様 auth keyの取得が必要だが,Free My Bandサイトにて様々な簡便な方法が提供されている。”How To Use Mi Band 5 Without The Mi Fit App | TechWiser” にFree My Hand由来の改変済みMi Fitアプリを使ってauth keyを取得する方法が出ている。

Best Mi Band 5 Tips & Tricks – YouTube” は一般的なイントロビデオ。訛りがきつくて聴き取りづらいが…。

あまりに機能が豊富でいたし方ない面もあるが,アプリの設定メニューは実に複雑でどこに何があるかがなかなかわからない。また,アプリ名を単に “Notify” と表現していることも多いようなのだが,一般名詞として使っているのかアプリ名の固有名詞として使っているのかわからないことが多く,なおのこと混乱する。

アプリ内からヘルプとして表示されるページがWeb上でもアクセスできる。ファイル名が出てるだけなのでわかりづらいが。FAQを含むフォーラムが用意はされているが,検索機能がないのが致命的。また今ひとつ活気がない感じ。その意味ではサポートに不安が残る。

受動的見守り

さて,一人暮らしの老人の見守りに対するアプローチは一般的に以下の2段構えだ:

  • 受動的手段: 各種センサーで被見守り者の様子をモニターする。
  • 能動的手段: 被見守り者自身に何かがおかしいという自覚があったときにすぐさま,確実に外部に助けを求められるようにする。

Amazfit Band 5を着用した人を見守りするのに活用するとするなら,受動的手段の方は,バンドから得られる各種センサーデータを,こちらが思うような処理ができるように例えばMQTTブローカに送るなどができればいい。このアプリからのデータ取得は,ブロードキャスト・インテントを受け取ることでできる(以下参照)。

これはもちろんTaskerのような自動化アプリでもできるが,これだけではNotifyが特にTaskerのプラグインとして動作することを要求するわけではない(ただし後で述べるようにNotifyはTaskerのプラグインとしても動作するため,Taskerの類からアクションを起こすことができる)。だが,Notifyでは「Tasker拡張機能」としてくくりられており,これは有償のPro機能。右画面にあるように,Notifyアプリが心拍数データを受け取れるように設定する必要あり。

LlamaLabのAutomateアプリを使ってテストしてみたところ,心拍数データは受け取れている。AutomateはTaskerプラグインが使えるので,Taskerプラグインとしても動作するMQTT Clientアプリなどと組み合わせれば,MQTTブローカに値を送ることができる。

ただ,10分間隔で心拍数を取得するようになっているのに,実際その間隔でデータが取れてるかは確信がない。また,ちゃんとバンドを着用しているのに,”0″ と通知されることもある。通常の使用中にバンドを着用していない時間帯も発生するので(風呂中,水仕事中,充電中,など)そういったことも考慮に入れなければならないが,幸い豊富なイベントを受け取ることができるので,きちんとプログラムすれば様々なパターンに対応できよう。

とはいえいろいろやればやるほど電池使用量が増えるのは確実でそれは不安要素。

能動的見守り

「能動的見守り」と便宜上読んでいるのは,何か非常事態になったときに,ご本人が自力で簡便かつ確実に外部に助けを求められるような状態にしておくこと(ちなみに「能動的」は見守られる側の視点からの形容なのに,「見守り」という見守る側の視点の言葉と組み合わせるのは賢明ではなかった)。

Amazfit Band 5でこれを行う方法として考えられるのは,画面操作,ないしはジェスチャー操作でSOS発信がなされるようにすること。Notifyにはこれから述べるようにこれらを可能にする機能はあるのだが,今想定している目的には使い物にはならないと結論づけた。理由は以下。

Notifyを使って画面操作でSOS発信を行うには,「ボタン」操作を利用することになる。さらに詳しくは,①音楽プレーヤ画面のボタンを使用するか,②「Amazfitボタン」を使用するかのどちらか。①はまず音楽プレーヤ画面を表示させる必要があるが,これ自身に画面のスワイプ操作が必要な上,恐ろしく小さく表示されるボタンを正確に操作することが非常時に期待できるとはとても思えない。

Amazofit Band 5の場合は,「Amazfitボタン」なるものはなく,音楽プレーヤ画面に入るのと出るのとで「Amazfitボタン」の押し下げをシミュレートする,ということのよう。やはりスワイプ操作を何回もやることになる。ヘルプで表示される以下のビデオ “miband 4 button 1 notify – YouTube” の意味がしばらく理解できなかったが,わかってみるとそういうことのよう。

ジェスチャー操作といっても,少なくともAmazfit Band 5では結局「バンドを巻いた腕を持ち上げる」の1種類にしか対応していない。通常これは画面を点灯させるのに使われるのと,これにSOS発信をマップして,なんかの拍子にうかつにそれが起動されてしまうのは怖いのとで,それを2回以上続けてやった場合に起動するようにするのが常識的判断だろう。実際そう設定して試してみたところ,タイミングが微妙すぎてとても安定して思うように動作させられるように思えなかった。平時ですらそうなのだから非常時にはなおのこと。

なお,ジェスチャー操作なんだが,Notifyではこれはボタン操作の一部として扱われており,設定もその一環として行われるのに注意。また,この持ち上げジェスチャーに機能をマップするには,ボタンモードがパフォーマンスモードになっている必要がある(図)。

設定画面で直接2回持ち上げジェスチャーが行われた際のアクションを指定できる(下図)。この設定項目はボタンモードがパフォーマンスモードになっていないと表示すらされない。ここらへんのUIの設計は正直悪い。

持ち上げジェスチャーが行われたことをブロードキャスト・インテントとして受け取ることもできるはずなのだが,自分が試してみた範囲ではついぞ成功しなかった。

(下に続く)

接続されたスマホの紛失防止機能

Amazfitウォッチには接続されたスマホの紛失防止機能があるようなのだが,Amazfit Band 5にはこの設定はできないようだ。非力なので削られたか。

Notifyはバンドが接続されたスマホの紛失防止機能があることになっている。これがAmazfit Band 5で使えるのか現在わからないが(有償機能なため),使えれば外出時スマホを持ち出すことを防ぐことに使える。iTag BLEトラッカーをそういう目的に使うことは考えたし実際そのようにするつもりだが,それに加えてAmafit Band 5も合わせて使えればなおよい。この機能のオン・オフを外部からインテントで操作できる

⇐その後ライセンスを(再)購入して試そうとしたら,電力消費が激しいとの注意が。現在最終的には一人暮らしのご老人を守るための複数の目的のためにiTag BLEトラッカーをモニターするためiTracing2というアプリを常時起動しているが,それだけでも電池消費が激しくなったと感じている。Notifyも常時起動させる必要があり,確かに追加の電力消費は大きな問題になりそう

外部からNotifyにアクションを起こさせる

Tasker integration” の前半にある外部から起動できるNotifyの機能は,実はインテントをNotify向けに発信することで実行するもので,特にTaskerに限った話ではない。Taskerから送信する場合のヘルプ

では,Taskerプラグインとしてできるアクションはないのかというとそうではなく,ちゃんと用意されている。しかしそれを包括的に説明する独立したヘルプが用意されていない。自分が確認した範囲では以下がある:

  • Heart monitor
  • Incoming call
  • Incoming call stop
  • Measure heart
  • Notify
  • Picture
  • Restore default w…
  • Start workout
  • Stop workout
  • Switch mode

これら全てを詳細に調べたわけではないが,notifyとpictureは有用かもしれない。こちらはどちらもNotifyがバンドに画像を送りつけることができること(画像サイズ等に対する制約)に依存している。想定している使用者は高齢者なので,Amazfit Band 5に表示される文字は一般に小さすぎて読んでもらえることはあまり期待できない。しかし,大きい文字のごく短い句を画像にして送るようにすればずっと読みやすく,実際に読んでもらえることが期待できる。

アクションnotifyは細かに設定できる。3枚の設定画像のスクリーンショット参照。

その後テストしたところ,notifyでは画像が2~3秒表示された後,文字メッセージを表示する画面に切り替わってしまう…。これではあまり有用ではないか…。Pictureは待受画面を変えてしまうのでこれではその後の使用に支障が出るだろう。

スマート体重計

Notifyはスマート体重計もサポートしているようだが,取得したデータをブロードキャストしてくれたりはしないもよう。

Mi Scaleのプロトコルは既に解析されておりOpenScale: Open-source weight and body metrics tracker, with support for Bluetooth scalesというMi Fitの代替アプリがあるだけでなく,そのデータをGoogle FitやMQTTに同期するOpenScale Syncというアプリが存在する。こちらを利用するようにしたほうが楽かもしれない。⇐ 実際に購入して試してみたがうまくいかない

特定Googleアカウントからのインストール

このアプリはいつも自分が使っているのとは違うGoogleアカウントからインストールする必要があったが,そのためには “google play store – Change Gmail account to make in-app purchase? – Android Enthusiasts Stack Exchange” を参照。ポイントは,Play Storeアプリから直接インストールするのではなく,そのWeb画面から,希望するGoogleアカウントにログインしている状態であることを確認の上,遠隔でインストールする。

Tools & Amazfit

実はNotify for Mi Band / Amazfit / Zeppと極めて似通ったターゲットと機能を持つ380円の有償アプリTools & Amazfitがあり,こちらのことを先に知った。どちらが優れているか気になるところだが,”Amazfit Tools or Notify and Fitness? : amazfit” によればAmazfit Toolsの作者は “douche” でPlay Storeのレビューに対してコメントもひどい,と。自分も見てみたが,そこまでひどいとは思わなかったものの,明らかな上から目線で対応しており,決してプロフェッショナルな態度とは思えない。それはいいとしても,GadgetBridge.orgに対して根拠のないDMCA違反の申し立てをしたというのはいただけない。これを知るまではTools & Amazfitで行こうかと考えていたが,これで考えを変えた。

この項の残りの部分はメモのままで整理していない。

Tools & AmazfitGoogle Play Family Libraryに対応している。 “Do you support Amazfit Band 5? | Amazfit Tools” によればAmazfit Band 5がフルにサポートされているだけでなく,ジェスチャーでTaskerと連携することも可能なよう。Plugins (Tasker, Automagic, …) | Amazfit Tools あまり大したことできない。

Amazfitブランドのものにしか対応していないのかと思いきや,同様で同じく380円の同じ著者によるTools & Mi Bandもある。どちらのアプリとも “This application works very well with original Zepp / Mi Fit application” としているので,一方のアプリだけ入手すればMi BandともAmazfit Bandともに対応するのか?サポートサイトは完全に同じでそうだと思われる。

Video Tutorials for Amazfit Tools | Amazfit Tools

クラウドからの取得

本稿ではAmazfit Band 5に接続されたスマホのアプリでセンサーデータを得る方法を探ったが,そうではなく,Huamiのサーバから直接センサーデータを取得することも検討してみた。結論としては技術的には可能でも実際には困難そう。

 

 

Accessing Xiaomi BLE Sensors from Node-RED

Postscript: I researched all this partially in the hope of using one of these on Node-RED running on Android, but it turned out that Android does not use BlueZ, so anything that relies on it cannot be used on Android, including node-red-contrib-xiaomi-ble.

However, node-red-contrib-mihome can still be used, because it accesses Xiaomi’s server for data, not by directly connecting with the thermo/hygrometer by BLE.


Stumbled on the following custom nodes of Node-RED for Xiaomi’s BLE thermometers/hygrometers LYWSD03MMC and MiFlora flower/plant monitors that I already own,  while researching on those for Xiaomi Mi/Amazfit healthcare devices.

I also found some custom nodes that assume the use of a gateway. I do not use one, so they do not apply to me.

I am actually surprised to see the support for LYWSD03MMC. I could not have ESPHome on an ESP32 board connect to LYWSD03MMC because of encryption. “LYWSD03MMC only returning battery (sometimes) · Issue #32 · eschava/node-red-contrib-xiaomi-ble · GitHub” gives me the impression that Node-RED can read from LYWSD03MMC only when it is paired with it. A user recommends installing custom firmware to LYWSD03MMC anyway. Another uses a Bash script from “Using bash and gatttool to get readings from Xiaomi Mijia LYWSD03MMC Temperature Humidity sensor – d0wn.”

I thought the ESP32 platform was a good fit for accessing these devices because both ble and wifi are built in, and purchased a TTGo T-Display, unto which I intsalled ESPHome and is already picking up readings and posting them to a MQTT broker. However, at the place where AndroidTV-based media player Amigo 7xJP is eventually going to be (which is not my place), I can just use this Amigo 7xJP as a Node-RED server and use those custom nodes above.

Plays on Words in the Names of Dragon Ball Characters

For a comprehensive list of the articles I have written for foreign people living or traveling in Japan, see this article.


As a Japanese person, I could not be happier whenever content from the Japanese culture is appreciated overseas. One prominent example would be Dragon Ball. It’s known outside Japan primarily as an anime franchise, but it started out as comics (manga) series by Akira Toriyama.

I will let you in on a secret. Each character’s name in the franchise is often a play on words, but that’s lost in translation because it only makes sense to a Japanese speaker. When you know this backstory, you will enjoy the franchise even better. “Origins of character names” explains it well.

I will give you an example. During the original comic series’ run, this mysterious sword-wielding Sayan character called Trunks showed up out of nowhere — well, from the future, as it turned out. A friend of mine could instantly tell he was someone related to Bulma, and he was later proven correct. I totally did not see that, and I was amazed at his astute observation. He deduced this because he knew the character naming rule the author Akira Toriyama had set for himself.

In Japanese, we say “trunks” for boxer shorts. “Bulma” or “buruma” is supposed to mean bloomers, but the Japanese version seems quite different form the original; the Japanese “buruma”s are tight-fitting brief-style shorts for women. It was common in Japan in the past for school girls to wear them while exercising, but they disappeared in the early 90s because they were deemed too sexual. In this blog article, former Olympian Motoko Obayashi shows herself clad in typical exercise clothes (including a pair of buruma for girls) before the eventual demise of burumas.

“Trunks” and “Buruma” are both names for types of pants in Japanese. It was this fact that led my friend to predict — correctly — that characters Trunks and Bulma are related somehow.