Node-REDでシェアハウスのお風呂を爆速でハッキングする方法

こんにちわ。
れとるときゃりー([@retoruto_carry](https://twitter.com/retoruto_carry))です。よろしくね。

# なにをしたか
お風呂とリビングが違う階にあって、いちいち空いているか見に行くのがめんどくさかった。
リビングからお風呂の使用状況を確認できるものを作った。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">シェアハウスのお風呂をハッキングしたので見て！ <a href="https://t.co/ZWgN2rfb8V">pic.twitter.com/ZWgN2rfb8V</a></p>&mdash; れとるときゃりー💛webサービス開発で生きていきたい (@retoruto_carry) <a href="https://twitter.com/retoruto_carry/status/1127607157942132737?ref_src=twsrc%5Etfw">2019年5月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[![Image](https://gyazo.com/c7785984f0d6045ed07b9a98bb34d73c/thumb/1000)](https://gyazo.com/c7785984f0d6045ed07b9a98bb34d73c)

# 方針
ESPr developerというarduinoのwifi付きバージョンみたいなものを使う。2000円くらいで買える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156690/fdc5371a-677e-c3d4-dc28-e6e545ebbe0e.png)

同じシェアハウスの住人がいろんなドアにセンサーを設置していて、ElasticsearchのAPIをすでに作ってくれていた（神すぎる）。
[![Image](https://gyazo.com/b9662af735f3398c5eef1363d49ed37c/thumb/1000)](https://gyazo.com/b9662af735f3398c5eef1363d49ed37c)
ただ、スマホでブラウザからしか見れなかったので、このAPIをESPr developerから叩いてLEDを光らせるようにした。

# ESPr Developerのmacでの環境構築
これを参考にした。すんなりうまく行った。
[ESPr Developer (ESP-WROOM-02開発ボード) の開発環境を整えてみる - Androidのメモとか](https://relativelayout.hatenablog.com/entry/2016/08/15/231340)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">espr developerのmacでの環境構築できた<br><br>次はAPIのエンドポイントにアクセスしてみる <a href="https://t.co/qOi1im9kmb">pic.twitter.com/qOi1im9kmb</a></p>&mdash; れとるときゃりー💛webサービス開発で生きていきたい (@retoruto_carry) <a href="https://twitter.com/retoruto_carry/status/1127473850042671104?ref_src=twsrc%5Etfw">2019年5月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# node-redでAPIをブリッジする

httpsのbasic認証でPOSTリクエストを投げて、返ってきたJSONをパースしたい。
これをESPr Developer側で処理しても良いが、いろいろと面倒なので、APIとESPr Developerの間に、もう一つブリッジ用のAPIを立てた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156690/8f4d53a6-57a4-01b3-8024-467cbd194e14.png)


このブリッジ用のAPIのすること

- Basic認証を通して、httpsをhttpにする
- JSONパースして取り出して返す。

ブリッジ用のAPIを立てるのに、node-redを使った。

node-redはnode.jsをブロックを組み合わせるようにプログラミングできるツール。


```bash

npm install -g node-red #インストール
node-red #実行
```

こんな感じに作った。

[![Image](https://gyazo.com/fc4d7925037dbaaf4e94f84c4ede1f50/thumb/1000)](https://gyazo.com/fc4d7925037dbaaf4e94f84c4ede1f50)

詳しく説明していく。

## GETされるときのエントリーポイント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156690/be9d3de1-2884-de29-7c09-9ee781619c28.png)

## ElasticsearchにPOSTするデータを用意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156690/dece4143-e1d6-66c3-b6ec-8a65a0238412.png)

## ElasticsearchにPOST
Basic認証も通している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156690/cfca1e46-5020-f353-4955-82096a7ea88d.png)

## ElasticsearchにPOSTした結果のJSONをパース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156690/8344e963-9cf9-d6e5-620c-317e25a037e0.png)


初めてnode-red使ったけど、超簡単で楽しい。
なんで今まで知らなかったんだろう。

ちなみに後から知ったけど、
`https://<ID>:<PASS>@example.com/api` みたいにしてbasic認証できるっぽい。
参考: https://qiita.com/ngkazu/items/6da021edf177f40e1f26


# WIFIにつないでHTTP GETする
サンプル例のESP8266 -> BasicHttpClientを利用した。ほどんどコピペ。数行変えたくらい。

```c
/**
  * BasicHTTPClient.ino
  *
  *  Created on: 24.05.2015
  *
  */
 
 #include <Arduino.h>
 
 #include <ESP8266WiFi.h>
 #include <ESP8266WiFiMulti.h>
 
 #include <ESP8266HTTPClient.h>
 
 #define USE_SERIAL Serial
 
 ESP8266WiFiMulti WiFiMulti;
 
 String endpoint = "http://127.0.0.1:1880/bath";
 
 int red_led_pin = 4;
 int blue_led_pin = 2;
 
 void setup() {
 
     pinMode(red_led_pin, OUTPUT);
     pinMode(blue_led_pin, OUTPUT);
     
     USE_SERIAL.begin(115200);
    // USE_SERIAL.setDebugOutput(true);
 
     USE_SERIAL.println();
     USE_SERIAL.println();
     USE_SERIAL.println();
 
     for(uint8_t t = 4; t > 0; t--) {
         USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
         USE_SERIAL.flush();
         delay(1000);
     }
 
     WiFi.mode(WIFI_STA);
     WiFiMulti.addAP("SSID", "PASSWORD");
 
 }
 
 void loop() {
     // wait for WiFi connection
     if((WiFiMulti.run() == WL_CONNECTED)) {
 
         HTTPClient http;
 
         USE_SERIAL.print("[HTTP] begin...\n");
         // configure traged server and url
         http.begin(endpoint); //HTTP
 
         USE_SERIAL.print("[HTTP] GET...\n");
         // start connection and send HTTP header
         int httpCode = http.GET();
 
         // httpCode will be negative on error
         if(httpCode > 0) {
             // HTTP header has been send and Server response header has been handled
             USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
 
             // file found at server
             if(httpCode == HTTP_CODE_OK) {
                 String payload = http.getString();
                 USE_SERIAL.println(payload);
                 if (payload == "0") {
                   digitalWrite(blue_led_pin, HIGH);
                   digitalWrite(red_led_pin, LOW);
                 } else if (payload == "1") {
                   digitalWrite(red_led_pin, HIGH);
                   digitalWrite(blue_led_pin, LOW);
                 }
             }
         } else {
             USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
         }
 
         http.end();
     }
 
     delay(20000);
 }
```

[![Image](https://gyazo.com/18b9bc1a1cce030992c44daf11de7080/thumb/1000)](https://gyazo.com/18b9bc1a1cce030992c44daf11de7080)<br>


できた🎉🎉

[![Image](https://gyazo.com/c7785984f0d6045ed07b9a98bb34d73c/thumb/1000)](https://gyazo.com/c7785984f0d6045ed07b9a98bb34d73c)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">シェアハウスのお風呂をハッキングしたので見て！ <a href="https://t.co/ZWgN2rfb8V">pic.twitter.com/ZWgN2rfb8V</a></p>&mdash; れとるときゃりー💛webサービス開発で生きていきたい (@retoruto_carry) <a href="https://twitter.com/retoruto_carry/status/1127607157942132737?ref_src=twsrc%5Etfw">2019年5月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ

node-redを使って、JSONのパースなどの複雑な処理をブリッジ用API側で行ったことで、ESPr Developer側の処理をとても単純なものに落とすことができた。

このようにIoTでは、ネットワーク側の潤沢なリソースを使い、デバイス側の処理を単純なものにすることができる。

あと、node-redは思ったより簡単！楽しい！


# ここまで読んでくれた方へ
ここまで読んでくださりありがとうございます。

いいねやコメント、SNSでの共有等をしてくださると、今後の励みになります。よろしくお願いします。

良かったらツイッター([@retoruto_carry](https://twitter.com/retoruto_carry))もフォローしてね

こっちの記事も書いたので、よかったら読んでください〜
[webサービスの本番サーバーをダウンさせてしまった時に爆速で土下座する方法](https://qiita.com/retoruto_carry/items/09e87f45c0192f0819e9)