IoT開発合宿でNefryを触ってみた

この記事は、[NIFTY Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nifty)の19日目の記事です


ニフティのエンジニア2年目の [@5_21maimai](https://qiita.com/5_21maimai) と [@sbyh52moc1](https://qiita.com/sbyh52moc1) です。
入社した去年から、週に1回同期数人で集まって技術勉強会をしたり、開発合宿をしたりしています。（[新入社員の間でRuby勉強会をやっている話](https://qiita.com/alice02/items/b793e60949f27fbedc16)参照）
今年は、1年目エンジニアや3年目の先輩も交えて、会社近くの会議室を借りて行っています。

先日、その勉強会メンバーでIoTがテーマの開発合宿を行いました。
各チーム2～3人でひとつのものを開発するのですが、私たちのチームはNefryというデバイスを使って開発したので、そのことについて2人でまとめていこうと思います。
IoT初挑戦の2人で開発したため、拙い内容ですがご容赦ください。


# Nefryとは？
[Nefry](https://nefry.studio/)とは、手のひらサイズの小さなIoTデバイスです。
Wi-Fiモジュールが標準搭載されているので、Wi-Fiモジュールを追加せずにインターネットに接続できます。
また、ArduinoIDEが使えたり、スイッチやLEDライトが標準でついていたり、ドキュメントが豊富（しかも日本語！）なので、デバイス初挑戦の人でも挑戦しやすいデバイスです。
MilkcocoaやIFTTTなどとも連携可能です！
Nefryv2.0とNefryBTの2つのバージョンが発売されており、NefryBTの方が新しいバージョンです。


# 作ったもの
**雨お知らせくん**
スイッチを押すと、今雨が降っているかどうかをLEDライトで通知してくれます。
玄関に置いて、出かけるときに傘が必要か簡単に調べることができます。

**使ったもの**

- NefryBT
    - 付属のスイッチとLEDライトも使用
    - [Nefryv2.0](https://dotstud.io/shop/nefry-connect-internet/)を最初に購入したが壊してしまったため、急遽別バージョンの[NefryBT](https://dotstud.io/docs/nefrybt/)を使用

- WeatherAPI
    - OpenWeatherMapのAPI「[Current weather data](https://openweathermap.org/current)」を利用

## 実装

NefryはArduinoIDEで開発していきます。
以下、実装内容を[ソースコード](https://github.com/5-21maimai/NotifyRain)から抜粋して紹介します。

### 現在の天気を判定する

[Weather API](https://openweathermap.org/current)から、現在の天気を取得します。
取得したい地域のIDを事前に調べておき、Nefry環境変数として設定しておきます。
ライブラリは `HTTPClient.h` `ArduinoJson.h` を利用しました。

~~~Arduino
  // Nefry環境変数から、地域IDやAPI keyを取得
  String id = Nefry.getStoreStr(0);
  String appid = Nefry.getStoreStr(1);

  String body = "";
  HTTPClient http;

  // APIを叩く
  http.begin(String("http://") + host + url + String("?id=") + id + String("&APPID=") + appid);
  int httpCode = http.GET();
  Nefry.ndelay(100);

  if (httpCode < 0) {
    body = http.errorToString(httpCode);
  } else {
    body = http.getString();
  }
  http.end();

  // jsonデコード
  const int BUFFER_SIZE = JSON_OBJECT_SIZE(50) + JSON_ARRAY_SIZE(1);
  StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
  int len = body.length()+1;
  char* json = new char[len];

  body.toCharArray(json, len);
  JsonObject& root = jsonBuffer.parseObject(json);
  if (!root.success()) {
    Nefry.println("parseObject() failed");
  }

  // 現在の天気を取得
  String weather = root["weather"][0]["main"];
~~~


### NefryのLEDを制御する

天気が雨かどうかによって、NefryのLEDの挙動を変化させます。
Nefry関数を利用することで、簡単に付属のLEDを制御することができます。
フルカラーLEDなので、RGB値で様々な色を指定できます。

~~~Arduino
void turnOnLed(int isRain){
  // 雨かどうかの引数によって、LEDの色が変わる
  if(isRain){
      // isRain = 1(true)の時、青色で点滅
      Nefry.setLed(0,0,255);
      Nefry.ndelay(100);
      Nefry.setLed(0,0,0);
      Nefry.ndelay(100);
    }else{
      // isRain = 0(false)の時、オレンジで点灯
      Nefry.setLed(255,165,0);
      Nefry.ndelay(100);
    }
}
~~~

**雨の時**
![雨.png](https://qiita-image-store.s3.amazonaws.com/0/124956/5e7796f3-321d-7a5c-7301-2f5f73b83965.png)


**晴れの時**
![晴れ.jpeg](https://qiita-image-store.s3.amazonaws.com/0/124956/5a3b9013-89d6-ea7a-2a3f-9223f8d712de.jpeg)




Nefry関数やライブラリが充実しているため、
外部サービスとの連携、LEDや各種センサー等の制御を簡単に実現することができます。
また、上記の通り外部APIも比較的簡単に利用できるため、多くのアイディアをNefryで実現できそうだと感じました。

## 詰まったこと
- Nefryv2.0を壊してしまった
  - オンライン上でバイナリファイルをアップロードする時に接続が切れてしまい、その後電源が入らなくなってしまった
  - 急遽別メンバーのNefryBTを借りることに
- NefryのWi-fi接続がうまくいかない
  - バイナリファイルをNefryに書き込むたびに、Wi-fi接続が切れてしまい、セットアップからやり直さないといけなかった
  - 会議室のWi-fiからテザリングに変更すると安定したが、原因は最後まで謎のまま...
     - 会議室のWi-fi接続数が多すぎた？



# 最後に
IoT初心者でしたが、調べれば割と簡単にAPIを叩いて処理をすることができました。
NefryはGroveセンサの規格に対応しているようなので、今後は人感センサーなどの別のセンサーも使ってみたいです。
明日は [@RPcat](https://qiita.com/RPcat) さんです。お楽しみに！