突然ですがダイエットしてますか?
私は暴飲暴食をしていたら体重が72キロになってしまいました
このままではやばい、そう思いましたがダイエットは三日坊主になってしまいます
体重計からデータが取れたらダイエットをDXできる?
エンジニアですので何をするにしても効率化や自動化を行ってしまいます
Amazonにて検索して上位に出てきたFit8sという体重計を使います
通信
スマホを経由して体重計がクラウドにデータを上げてくれるのが理想ですね
データを使う側ではAPIを叩くだけだといいのですが、5000円以下の体重計にはその様な機能はありません
Amazonの商品ページを読む限りBluetoothを使ってアプリと通信しているようです
ということはBluetoothが付いているRaspberry piから通信できそうですね
BLE
Bluetoothには2種類あります
Bluetooth ClassicとBLE (Bluetooth low energy)です
前者はイヤフォンなどで音楽をストリームするために使われることが多いようです
後者はIoT機器などで使わる事が多いようです、ボタン電池1個で1年間動かす実例もあるとか
例によって体重計もBLEでした
通信をキャプチャー
humble-explorerという神ツールを使ってBLEの通信をキャプチャーできます
https://github.com/koenvervloesem/humble-explorer
通信を解析する時の鉄則ですが、外から操作できる値を操作してdiffを取るにつきます
何度も体重計をON OFFしていたらdiffがある値を見つけました
どうやらBLEのアドバタイズビーコンに体重がブロードキャストで飛んでくるみたいです
特に認証とか暗号化とかはありません、体重なので重要ではないとの認識なのでしょうね
アドレス
アドレス開始 | 終了 | 用途 |
---|---|---|
10 | 12 | 体重(有効桁2桁です) |
15 | 15 | 安定(値が確定したら1になります) |
体重は有効桁2桁で送られてきますが体重計は1桁です
体重計では四捨五入された値が表示されているようです
雑にデコードすると以下のコードになります
public record WeightData(float Weight, bool Stable);
public static WeightData Parse(IList<byte> bytes)
{
var weightInt = (bytes[10] & 255) | ((bytes[11] & 255) << 8) | ((bytes[12] & 255) << 16);
var stable = bytes[15] == 1;
return new WeightData((float)weightInt / 1000, stable);
}
アプリ化
体重計と通信するコンソールアプリを作りました
Discordと通信したりDBに値をいれたりできます
https://github.com/aijkl/open-weight
Discordに晒す
常時、体重計の値を監視して体重が送られてくるとDiscordの名前を変える機能を実装しました
Scribanというテンプレートエンジンを使って、ニックネームを動的に生成できるようにしました
サーバーごとに元になる名前を変える事ができます
みかん@72キロ
のサーバーもあれば 花子@72キロ
というサーバーも用意できます
{
"token": "",
"guildUsers": [
{
"guildId": 836823009527332884,
"userId": 536802665498411013,
"scribanPattern": "みかん@{{event_data.data.weight}}キロ"
}
],
"intervalMs": 10000,
"errorIntervalMs": 300000
}
DBに入れる
SQlite3に体重とタイムスタンプを記録してみました
データがたまれば解析できそうです
Matlabでグラフも描画してみる
データが1週間分しかないので変動が激しいですね
1か月後ぐらいでデータが十分に集まるはずなので記事を更新します