【obniz 2019】 新デバイスと新機能：obniz Board 1Y と obniz-noble（2019/12/18）

この記事は 「[obniz Advent Calendar 2019 - Qiita](https://qiita.com/advent-calendar/2019/obniz)」の 18日目の記事です。

## はじめに

ちょうど「アドベントカレンダーの登録日の前日」というタイミングで、このようなリリースが行われていました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">本日のニュース<br> - obniz Board 1Y発売開始しました！<br> - obniz.js 3 リリース<br> - obniz-noble リリース<br> - obnizOS 3 リリース<br><br>詳しくはこちらで<a href="https://t.co/CB8wViVlzw">https://t.co/CB8wViVlzw</a></p>&mdash; obniz japan (@obniz_jp) <a href="https://twitter.com/obniz_jp/status/1206837282386235392?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

新デバイス「[obniz Board 1Y（ワンワイ）]( https://obniz.io/ja/doc/obniz_board_1y )」がかなり気になりつつ、それ以外の話で気になったのがこちら。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">試してみたい。<br><br>●obniz/obniz-noble: A Node.js BLE (Bluetooth Low Energy) central module<br>　<a href="https://t.co/BEu2253KyM">https://t.co/BEu2253KyM</a><a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/o2Yk6CPG3t">https://t.co/o2Yk6CPG3t</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1206854690903748608?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[Node.js の BLE (Bluetooth Low Energy) central module である noble](https://github.com/noble/noble) をフォークして作られたという、[obniz-noble](https://github.com/obniz/obniz-noble)です。

あと、obniz Board 1Y は情報を見て即ポチり、「翌日（12/18） ＝ カレンダーの担当日」には受領できました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> の新デバイス、ゲット！<br>旧デバイスを下に並べた写真を撮ってみました。 <a href="https://t.co/3x86sMdBxo">pic.twitter.com/3x86sMdBxo</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1207217325365059586?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

アドベントカレンダーの担当日の前日にこれらがリリースされ、obniz Board 1Y を担当日に受領できたという状況。

**これはアドベントカレンダー用のネタとなるよう CambrianRobotics さんが合わせてくれたに違いない！（絶対違うｗ）**
ということで、タイトルにもある通り「obniz Board 1Y」と「obniz-noble関連」に関する記事を書こうと思います。

事前に考えてたネタを前日に丸ごと捨てて、内容を差し替えましたw

## obniz Board 1Y について見てみる

### 旧来のデバイスとの違い

ここでは、旧来の「[obniz Board](https://obniz.io/ja/doc/obniz_board/hw_overview)」と、新デバイスである「[obniz Board 1Y](https://obniz.io/ja/doc/obniz_board_1y)」との違いをいくつかピックアップしてみます。

公式の [obniz関連の日本語ブログ](https://blog.obniz.io/ja/)での[新商品に関する記事](https://blog.obniz.io/ja/news/obniz-board-1y-2/)に記載があるので、そこからの情報抜粋となります。

#### スリープ機能
まずは、事前に予告されていたスリープ機能です。
以下、公式の記事からの部分的な抜粋です。

> **– スリープ機能搭載、単3電池で1年間動作**
obniz Board 1Y の最大の特徴は、指定した時間やきっかけまで動作を停止する「スリープ機能」を追加し、低消費電力状態で待機できるようになった点です。
「定期的な温度計測やカメラ撮影」「人を検知したときだけ起動して通知」など、アクション時にのみ起動することで、電池のみで１年以上の稼働を維持することができるようになります（稼働期間は起動頻度に依存します）。
サーバーレスイベントなどと組み合わせれば、電池のみで様々なアプリケーションが開発可能となります。

同記事内の情報によると、動作時間の話は「アルカリ乾電池3本で6時間ごと30秒の稼働で1年」という計算のようです。
また、「分単位での時間経過か、IO0 の ON→OFF または OFF→ON の変化」の2つを動作のきっかけにできるようです。

#### 新旧デバイスのその他の比較

上記の公式情報に、新旧比較の変更点のみが記載された表があるため、それを引用します。
個人的に気になる部分は赤い線でマーキングしています。

<img width="742" alt="【予告】12_17_新商品_「obniz_Board_1Y」の販売を開始_–_blog_obniz_io.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d0ffee20-ef6d-6fcf-18a9-a739f3fc008b.jpeg">

該当する箇所の1つは、既に引用して記載したスリープ機能、そしてもう1つはコネクタです。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">（写真だとわかりにくそうだけど）<br>新旧のコネクタの違い。 <a href="https://t.co/QRo7llaH3x">pic.twitter.com/QRo7llaH3x</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1207225975949234177?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

個人的には、いろいろ持ち歩いているデバイス・ガジェットの接続のために、利用する可能性のあるコネクタのケーブルは全種類（現状は、microUSB、USB TypeC、Lightning）を常時持ち歩いているため、新旧のどちらのコネクタでも困ることはないのですが、最近のデバイス・ガジェットは USB TypeC が圧倒的に多いので、これから先のことを考えると嬉しい変更です。

## obniz 3.0.0 関連

表題には入っていないですが、この記事を書いている途中で情報がでてきたので、少しだけ「obniz 3.0.0」について前のバージョンとの差分を見てみます。

●obniz 2.x.x→obniz 3.0.0移行方法 – blog.obniz.io
　https://blog.obniz.io/ja/blog/obniz-2-x-x%e2%86%92obniz-3-0-0%e7%a7%bb%e8%a1%8c%e6%96%b9%e6%b3%95/

まず、上記の冒頭部分を引用してみます。

> **obniz.js / obnizOS 3.0.0にはいろいろな新機能があります。**
> ・起動画面がかっこよくなる！
・BLEがより使いやすく！
・(1Yのみ)Sleep機能が使えるように！
これらの新機能を使うにはファームウェアとプログラムのアップデート両方が必要です。

BLE関連の実装をしていない場合は、プログラムの変更は以下の内容のみで良さそうです（あと、ファームのアップデートもお忘れ無く）。

> **読み込むobniz.jsのバージョン変更**
HTMLタグ内の`obniz@2.X.X`のところを`obniz@3.0.0`に変更します
▼ 変更前
`<script src="https://unpkg.com/obniz@2.0.3/obniz.js" crossorigin="anonymous"></script>`
▼ 変更後
`<script src="https://unpkg.com/obniz@3.0.0/obniz.js" crossorigin="anonymous"></script>`

## obniz-noble 関連

### noble を試す

obniz-noble についても「これは、試して記事にせねば！」と思いつつ、その前に noble で動作する何かを試そうと思いました（そして、うまくいったものの noble を使った部分を obniz-noble に置き換えれば良いかなと）。
そして、noble 関連の情報を色々と調べていく中で、フォークされたバージョンや他に下記の「[noble-mac](https://github.com/Timeular/noble-mac)」というのを見つけて、「noble」ではなくこの noble-mac を試してみることにしました。
　●Timeular/noble-mac: Noble MacOS bindings using the official CoreBluetooth API
　　https://github.com/Timeular/noble-mac
上記の説明文には以下の記載があり、プロトコル周りの問題で noble は新しいOSでエラーがでるようになったようで、その問題に対応したものっぽいです。

> **Noble (Node.js Bluetooth LE) for MacOS**
> The mac bindings in the noble repository use a XPC connection and an undocumented protocol to communicate directly with the bluetooth daemon. This is error prone, as the protocol needs to be reverse engineered by sniffing the communication between a regular program which uses the official CoreBluetooth API and the bluetooth daemon. Since the protocol is not public Apple can change it at anytime (For now every new OSX release changed the protocol).
>
This package provides the same functionality as the regular noble mac bindings using the official CoreBluetooth API.

さらに、以下のような記載もあって、下記のプロジェクトに統合されていくとのことで、今後はこちらを使っていくのが良いかもしれません。
> Note: this project was integrated in [@abandonware/noble](https://github.com/abandonware/noble) and is no longer actively maintained

とりあえず、簡単なプログラムを実行させてエラーがでない状態にするところまで、あれこれ対応して確認しました。

### obniz-noble のリポジトリを見てみる

そして、obniz-noble の話へ進んでいきます。

[obniz-noble の GitHub](https://github.com/obniz/obniz-noble) の情報を見てみました。
exampleフォルダの直下は、このような感じ（※ 12/17 20時ごろ）。
<img width="498" alt="obniz-noble_examples_at_master_·_obniz_obniz-noble.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/788da89c-3799-ada7-6206-4efe5fd49f0a.jpeg">
「pizza」というフォルダが気になったので、開いてみました。
フォルダの中身などはこのような感じで、どうやら、2台の PC を準備して、peripheral側（[bleno のサンプル](https://github.com/noble/bleno/tree/master/examples/pizza)を利用）と central側（[obniz-noble のサンプル](https://github.com/obniz/obniz-noble/tree/master/examples)を利用） を用意すると、試せるサンプルのようでした。
<img width="996" alt="obniz-noble_examples_pizza_at_master_·_obniz_obniz-noble.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f3988baa-9235-e8f5-0f3c-a49876fb1887.jpeg">

### 試す方針

とりあえず、noble が使われている既存の作品を調べて、その中からどれか 1つを noble を使って動かした後に、noble を obniz-noble に置き換えて動かす流れにしようと思いました。
候補にしたのは下記の作品で、micro:bit との連携ネタを探った形です。

- [Node.js + nobleを使ってMicrobitのセンサー情報を読み取る](https://www.usagi1975.com/040320181903/)
- [micro:bitのBLEのA・BボタンイベントをNode.js nobleで取得してみるメモ – 1ft-seabass.jp.MEMO](https://www.1ft-seabass.jp/memo/2018/02/19/microbit-ble-a-b-button-catch-nodejs-noble/)
- [micro:bitのBLE LEDサービスにNode.js nobleでWOMBAT!と文字を送るメモ – 1ft-seabass.jp.MEMO](https://www.1ft-seabass.jp/memo/2018/02/20/microbit-ble-led-matrix-nodejs-noble/)

この中の1つを試して、その結果を記事に書きたかったのですが、時間切れよりここまで！

## 公式の作例

[Facebook の obniz のユーザコミュニティ](https://www.facebook.com/groups/515801048886860/)で、[「こんな公式の作例があるよ！」と情報が出ていた](https://www.facebook.com/groups/515801048886860/permalink/802630250203937/)ので掲載。

- [スリープ機能搭載 obniz board 1Y を使った省電力な開閉検知デバイス（slack連携） – blog.obniz.io](https://blog.obniz.io/ja/make/obniz-board-1y-open-close-detection/)
- [obniz Board 1Yで省電力な温度ロガーを作成 – blog.obniz.io](https://blog.obniz.io/ja/make/obniz-board-1y-temperature-logger/)
- [obniz Board 1Yのスリープ機能を使った省電力な水やりデバイス – blog.obniz.io](https://blog.obniz.io/ja/make/obniz-board-1y-automatic-watering-system/)

## おわりに

今回やりきれなかった内容を試しつつ、さらに、新しく実装されたスリープ機能を活用した作例なども作ってみたいです！