enebular x obnizで換気状況を可視化してみる


これは[enebular Advent Calendar 2020](https://qiita.com/advent-calendar/2020/enebular) 8日目の記事です

今年はnode RED のobnizノードがパワーアップしたので、それを使ってちょっとしたものを作ってみました。


### 作ったもの

![スクリーンショット 2020-12-01 20.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/3a3f8444-c6fd-ad03-8196-0fb3d1d82c97.png)


- 部屋の内側と、ベランダに温度計をおいて気温差分を計測
- 部屋の中で二酸化炭素濃度を計測して、ベストな換気タイミングを確認


空気が悪くなってきたなとおもったら、二酸化炭素濃度を確認して、そのあと温度差を見ることで **気合を入れてから** 窓を開けることができます。


冬の窓を開けるには気合が必要ですからね。



### きっかけ

コロナで換気が重要だ！ってことで最近二酸化炭素濃度を計測しましょうみたいな話をよく聞くようになりました。
せっかくなので作ってみよう！と思って作ってみました。



### 作ったハードウェア

- 家の中用
![スクリーンショット 2020-12-08 16.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/c01d4276-33bf-10cf-ff78-2928c403e6ea.png)

温度センサをobnizに挿して、二酸化炭素センサをobnizの横においています。
二酸化炭素センサはBLE通信のため、物理的な接続はしていません、

obnizパーツライブラリにあるこれらをチョイス
[Loggta CO2](https://obniz.com/ja/sdk/parts/LogttaCO2/README.md)
[LM35DZ](https://obniz.com/ja/sdk/parts/LM35DZ/README.md)

- ベランダ用
![スクリーンショット 2020-12-08 16.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/6fc7408d-a29a-355f-86f5-86dc376feb1d.png)

ベランダでは電源が取れなかったのでモバイルバッテリーで代用しています。

温度センサは室内用と同じで良かったんですが、２個めが手元になかったのでこちらをチョイス
[Keyestudio_TemperatureSensor](https://obniz.com/ja/sdk/parts/Keyestudio_TemperatureSensor/README.md)


電子基板がベランダにあるってだけで違和感抜群ですね笑


### プログラム
enebular上のノードはこんな感じです。
![スクリーンショット 2020-12-01 18.17.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/daccfe61-9e9f-2d06-cfae-b54996a03718.png)


一番上がCO2に関するもの、
2段目が室内用の温度センサに関するもの、
一番下はベランダの温度センサに関するものです。

obnizノードの使い方は[こちらの記事](https://qiita.com/wicket/items/e150e78cd787da03493e)に任せるとします。

ここではこのプログラムの書きます。

まず、外のプログラムから書くと、初期化処理で温度センサを初期化しています

![スクリーンショット 2020-12-08 17.00.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/124e46f2-3fc4-f407-01a8-87aea61d3659.png)


obniz-functionノードの中ではパーツライブラリのgetWaitのみを使用しています。
![スクリーンショット 2020-12-08 17.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/15dca043-288c-21bd-5f91-7b01f6592846.png)


時間のタイミング等も書いていませんが、それはinjectionノードの役割として、そちらで設定しています。

![スクリーンショット 2020-12-08 17.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/7d112880-7424-d309-d677-c649abc62f6e.png)

これで温度のグラフ化ができるので、同じように室内用温度センサも作ります。


さて、室内二酸化炭素のセンサも同じようにwiredして・・・と書きたかったのですが、BLE系のセンサはBLEスキャンをしないとパーツライブラリが使えないという制約がありますので、全てfunctionノードの中でやることにしました。

こんなかんじですね
![スクリーンショット 2020-12-08 17.04.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/c1d0ae7b-09db-2a0b-001b-005c2f90b139.png)



```javascript

node.send({debug:"start"})
  //対策
  if(obnizParts.block === true){
    return {debug:"none"};
  }
  obnizParts.block = true;

  try {

    node.send({debug:"loop"})
    const LOGTTA_CO2 = obniz.constructor.getPartsClass("Logtta_CO2");
    
    

    if (!obnizParts.targetPeripheral) {
      node.send({debug:"scan start"})
      let periherals = await obniz.ble.scan.startAllWait();
        node.send({debug:"scan finish"})
      
      let logttaCo2 = periherals.find(e => LOGTTA_CO2.isDevice(e));
      if (!logttaCo2) {
        node.send({debug:"not found"})
        obnizParts.block = false;
        return;
      }
      obnizParts.targetPeripheral =  new LOGTTA_CO2(logttaCo2);
      obnizParts.targetPeripheral.ondisconnect = (reason) => {
        node.send({debug:"disconnect"})
      };
      
     
     node.send({debug:"found"})
    }

    if (!obnizParts.targetPeripheral._peripheral.connected) {
        
      node.send({debug:"connecting"})
      await obnizParts.targetPeripheral.connectWait();
      
      node.send({debug:"connected"})
    }

    const co2 = await obnizParts.targetPeripheral.getWait();
      node.send({debug:`CO2 ${co2}ppm`})
      node.send({payload:co2, topic:"co2"})
  } catch (err) {
    node.send({debug:{msg:"err",err: err.message}})
  }


  obnizParts.block = false;

```

所々にある `node.send({debug:"start"})` はデバッグ用の出力です。
switchノードを経由してデバッグコンソールに出力しています。


BLEデバイスは、検索して、つないで、やっとデータが取れる　というステップを踏むため、
上記のように長くなっています。
ただ、２回目は検索しなくていいよねとか、既につないでいたらつなぐ処理もいらないよね　みたいなことがあるので、状態を確認して、必要であれば検索／接続をする　という形にしています。



### できた

というわけでできました。

だいたい1000ppmぐらいが換気の目安らしいので、この状態はまだ大丈夫ですね
![スクリーンショット 2020-12-01 18.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/a9e3799c-9e3f-d9b6-0695-63c9b3156e36.png)


でもまぁ試しにと窓を開けるとがくんと下がります
![スクリーンショット 2020-12-01 20.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/ac4dba3a-d484-27bf-792b-7b2e77d7e4af.png)



二酸化炭素濃度も温度も下がってますが、温度の下がり具合に対して二酸化炭素の下がり具合が素早いですね。
もしかしたら、３分とか、５分とか、少しの時間だけ窓を開けるってことをすれば換気できるけど温度は変わらない！というぬくぬくした換気ができるかもしれませんね！