MESH ボタンを 1.2.5 にアップデートして obniz とつなぐメモ

obniz Advent Calendar 2022 の 6 日目の記事です。

MESH ボタンを 1.2.5 にアップデートして obniz とつなぐメモです。

obniz と連携できる MESH バージョンをどこで把握したか

image

まず、やってみようと思い立ったときは 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ブロックのソフトウェアアップデート方法 がこちらにあったので参考にして進めました。

image

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

image

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

image

進行します。

image

しばらく待つと完了します。だいたい 3 分くらいかかったと思います。

今回はうまく行きましたが MESHブロックのソフトウェアアップデートに失敗した時の対処方法 というドキュメントがあるように失敗する可能性もあるようで、ドキドキして対応しました。

ドキュメントながめてたら MESHブロックソフトウェアを一括アップデートする方法 があるようで、たくさん MESH 持っている方でしたら、こちらもアリかもしれませんね。

とはいいつつ、Bluetooth を複数つなげるとアップデータの転送が不安定になる可能性もありますし一つ一つ丁寧やりたかったので、今回は個別対応にしました。

重要ポイント:MESH と アプリのペアリングを外す

image

設定できたら 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>

実際このように動きました!

ハマりポイント

2022 年 12 月の情報です。

パーツライブラリにある MESH_100BU は参考にはなったのですが、そのままだと足りない部分がありました。

このあたりは、上記のコードでは解決済みです。

どうやったかというと BLE でつなぐ Central: スキャン のナレッジにあるような await obniz.ble.initWait();await obniz.ble.scan.startWait(); という、接続時に必要なメソッドを加えてやるとうまく動作しました。

パーツライブラリの説明は、BLE がつながっている前提で書かれていて、あとは onfind で見つかったら MESH_100BU ライブラリでつないでください、というニュアンスのようです。

最初、つながらなくて obniz や MESH の故障も疑いましたが、全然そんなことなかったのでホッとしました。

ひとまず、つながったので、いろいろ組み合わせてみます!