IoTプラットフォームの「obniz」が IoTブロックの「MESH」に対応したので軽く試してみる【MESH-100BU ボタンブロックでのお試し】

この記事の内容は、以下のプレスリリースにも出てきている、「obniz」の「MESH」対応に関するものです。

●IoTプラットフォーム「obniz」　IoTブロック「MESH(TM)」に対応を開始｜株式会社obnizのプレスリリース
　https://prtimes.jp/main/html/rd/p/000000054.000040376.html

それに関して、まずは以下のボタンブロックとの連携を軽く試してみた、という内容になります。

●MESH-100BU ボタン(Button)ブロック - シンプルなボタンに無限の可能性 ワイヤレスボタン | ソニー
　https://meshprj.com/jp/products/blocks/MESH-100BU.html

## できあがったもの
まず、お試しで作ったものを掲載します。

以下のツイートの動画に出てきている内容です。

https://twitter.com/youtoy/status/1579010537597599745

MESH側で、「ボタンの 1回押し」、「ボタンの 2回押し」、「ボタンの長押し」のそれぞれが行われた際に、obniz側でそれらに応じた表示を行う（obniz のディスプレイに文字を表示する）という簡単なお試しになります。

## 下準備など
では、上記の内容を進めた流れについて書いていきます。

### 自分が所有している MESH
以下のツイートに出てきているとおり、所有している　MESH は「全種類 ＋ [GPIOのブロック](https://meshprj.com/jp/products/blocks/MESH-100GP.html)だけ 2つ目がある」という感じです。

https://twitter.com/youtoy/status/1578970397147803649

いきなり余談ですが、GPIO が 2つある理由は、GPIOブロックと組み合わせて使えるパーツを持っていることが 1つです。

https://twitter.com/youtoy/status/1578973381743235074

### 試すブロックを決める
全種類の MESH　を持っていたので、どれから試すかを少し考えたのですが、なんとなくボタンブロックに決めてみました。

### ブロックのアップデート（※ バージョン 1.2.5 にする必要あり）
ボタンブロック用のプログラムを書いて動作確認をしようとしたのですが、最初は obniz との接続がうまくいきませんでした。

それで、公式の情報などを見ていく中で、その原因が判明しました。どうやら、公式アプリを使ってブロックのバージョンアップをする必要があるようでした。
公式アプリを使い、バージョン「1.2.5」になるようアップデートを行った後の様子は ↓こちらです。

https://twitter.com/youtoy/status/1578980394229121024

## プログラムについて
### もとにしたプログラムや情報
MESH と obniz の連携を試すにあたり、公式ページのパーツライブラリの情報も見てみたりしたのですが、全体のベースにしたのは以下の記事にあるプログラムでした。

●MESH × obniz × kintone連携 - obniz公式ブログ
　https://blog.obniz.com/make/mesh-obniz-kintone

https://twitter.com/youtoy/status/1578982635522883586

この事例では、「kintone へのデータ書き込み」を行っていたり、「MESH の温湿度のブロックを使っている」ということをやっていたりしました。
そこで、以下のパーツライブラリの情報と、上記の記事内のプログラムの内容を組み合わせて、ボタンブロックを使うお試し用のプログラムを作りました。

●MESH_100BU | JS Parts Library | obniz
　https://obniz.com/ja/sdk/parts/MESH_100BU/README.md

### 作成したプログラム
冒頭の動画で示した動作を実現するために作ったプログラムは、以下のとおりです。こちらは Node.js で実行するプログラムになります（※ `npm i obniz` を忘れずに！）。

プログラム内で「【自分の obniz の ID】」と書いている部分は、ご自身の obniz の ID で置きかえてください。

```javascript
const Obniz = require("obniz");

const Config = {
  obnizId: "【自分の obniz の ID】",
};

const obniz = new Obniz(Config.obnizId, { local_connect: false });

obniz.onconnect = async () => {
  log("obniz connected");

  // obniz本体のスイッチを押すと、画面が消えるようにした
  obniz.switch.onchange = function (state) {
    if (state === "push") {
      log("switch push");

      obniz.display.clear();
    }
  };

  await obniz.ble.initWait();

  const MESH_100BU = Obniz.getPartsClass("MESH_100BU");
  obniz.ble.scan.onfind = async (peripheral) => {
    log("name:", peripheral.localName);
    if (!MESH_100BU.isMESHblock(peripheral)) {
      return;
    }
    log("found: MESH_100BU");

    const buttonBlock = new MESH_100BU(peripheral);
    await buttonBlock.connectWait();
    log(`connected: ${buttonBlock.peripheral.localName}`);

    // ボタンブロックでボタンを押した際の処理
    buttonBlock.onSinglePressed = () => {
      output("- Single pressed");
    };

    buttonBlock.onDoublePressed = () => {
      output("- Double pressed");
    };

    buttonBlock.onLongPressed = () => {
      output("- Long pressed");
    };
  };

  await obniz.ble.scan.startWait(
    { localNamePrefix: "MESH-100" },
    { duration: null }
  );
};

const output = (inputString) => {
  obniz.display.clear();
  obniz.display.print("MESH: \n");
  obniz.display.print(inputString);
  log(inputString);
};

const log = (...args) => {
  console.log(new Date(), ...args);
};

const wait = (ms) => {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
};

log("program start");
```

このプログラムを動作させると、以下のようになります。

- obniz本体のボタンを押すと、obniz の画面に表示された文字などが消える
- MESH のボタンプロックのボタン押下（3醜類）により、ディスプレイに以下の文字が表示される
   - ボタン 1回押し： 「MESH: - Single pressed」
   - ボタン 2回押し：  「MESH: - Double pressed」
   - ボタン 長押し： 「MESH: - Long pressed」

上のほうで示した動画のとおり、意図した動作をさせることができました。

## おわりに
とりあえず、obniz が MESH と連携する仕組みは、ボタンブロックを一つの事例にして、簡単に試すことができました。

この後は、obniz と他の MESH のブロックの組み合わせも試していけたらと思います。