MESH ボタンを 1.2.5 にアップデートして obniz とつなぐメモ
obniz Advent Calendar 2022 の 6 日目の記事です。
MESH ボタンを 1.2.5 にアップデートして obniz とつなぐメモです。
obniz と連携できる MESH バージョンをどこで把握したか

まず、やってみようと思い立ったときは MESH を Android アプリからつないでみると 1.1.5 でした。
MESH が obniz と連携するには MESH 内のソフトウェアバージョンを 1.2.5 にアップデートする必要があります。
MESH_100BU | JS Parts Library | obniz
1.2.5 の言及は obniz のところが分かりやすかったです。
MESH のドキュメントでもこちらを参考にしました。
MESH のバージョンアップしてみる
Android アプリ側から MESH のバージョンアップをしてみます。
MESHブロックのソフトウェアアップデート方法 がこちらにあったので参考にして進めました。

こちらのリンクをクリックしてアップデートします。

アップデート開始ボタンをクリックします。

進行します。

しばらく待つと完了します。だいたい 3 分くらいかかったと思います。
今回はうまく行きましたが MESHブロックのソフトウェアアップデートに失敗した時の対処方法 というドキュメントがあるように失敗する可能性もあるようで、ドキドキして対応しました。
ドキュメントながめてたら MESHブロックソフトウェアを一括アップデートする方法 があるようで、たくさん MESH 持っている方でしたら、こちらもアリかもしれませんね。
とはいいつつ、Bluetooth を複数つなげるとアップデータの転送が不安定になる可能性もありますし一つ一つ丁寧やりたかったので、今回は個別対応にしました。
重要ポイント:MESH と アプリのペアリングを外す

設定できたら Android 側で MESH ペアリングを外しましょう。これをしないと、Android アプリに専有されて obniz から探せません。
obniz で動かしたプログラム
ということで MESH の準備はできました。MESH を起動して待ちます。
obniz で動かしたプログラムはこちらです。パーツライブラリにある MESH_100BU のサンプルをベースにつながりました!
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://unpkg.com/obniz@3.24.0/obniz.js" crossorigin="anonymous"></script>
</head>
<body>
<div id="obniz-debug"></div>
<script>
const obniz = new Obniz("OBNIZ_ID_HERE");
const MESH_100BU = Obniz.getPartsClass('MESH_100BU');
obniz.onconnect = async function () {
await obniz.ble.initWait();
obniz.ble.scan.onfind = async function(peripheral){
if (!MESH_100BU.isMESHblock(peripheral)) {
return;
}
console.log('found');
// Create an instance
const buttonBlock = new MESH_100BU(peripheral);
// Connect to the Button block
await buttonBlock.connectWait();
console.log(`connected: ${buttonBlock.peripheral.localName}`);
let count = 0;
const GOAL = 10;
// Single Pressed Event
buttonBlock.onSinglePressed = (() => {
++ count;
console.log('Single pressed, 1 count added; count = ' + count);
if (count === GOAL) { console.log('YOU WIN !!');}
});
// Double Pressed Event
buttonBlock.onDoublePressed = (() => {
count += 2;
console.log('Double pressed, 2 counts added; count = ' + count);
if (count === GOAL) { console.log('YOU WIN !!');}
});
// Long Pressed Event
buttonBlock.onLongPressed = (() => {
count = 0;
console.log('Long pressed, count has been reset; count = ' + count);
});
};
await obniz.ble.scan.startWait();
}
</script>
</body>
</html>
実際このように動きました!
やったー! #obniz で無事 #MESH ボタンが動いたので細かなポイントを obniz アドベントカレンダーに書く予定ですー。 pic.twitter.com/VX5p3wyMIk
— Tanaka Seigo (@1ft_seabass) December 2, 2022
ハマりポイント
2022 年 12 月の情報です。
パーツライブラリにある MESH_100BU は参考にはなったのですが、そのままだと足りない部分がありました。
このあたりは、上記のコードでは解決済みです。
どうやったかというと BLE でつなぐ Central: スキャン のナレッジにあるような await obniz.ble.initWait(); や await obniz.ble.scan.startWait(); という、接続時に必要なメソッドを加えてやるとうまく動作しました。
パーツライブラリの説明は、BLE がつながっている前提で書かれていて、あとは onfind で見つかったら MESH_100BU ライブラリでつないでください、というニュアンスのようです。
最初、つながらなくて obniz や MESH の故障も疑いましたが、全然そんなことなかったのでホッとしました。
ひとまず、つながったので、いろいろ組み合わせてみます!