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


これはenebular Advent Calendar 2020 8日目の記事です

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

作ったもの

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

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

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

きっかけ

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

作ったハードウェア

  • 家の中用

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

obnizパーツライブラリにあるこれらをチョイス
Loggta CO2
LM35DZ

  • ベランダ用

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

温度センサは室内用と同じで良かったんですが、2個めが手元になかったのでこちらをチョイス
Keyestudio_TemperatureSensor

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

プログラム

enebular上のノードはこんな感じです。

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

obnizノードの使い方はこちらの記事に任せるとします。

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

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

obniz-functionノードの中ではパーツライブラリのgetWaitのみを使用しています。

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

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

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

こんなかんじですね


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

できた

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

だいたい1000ppmぐらいが換気の目安らしいので、この状態はまだ大丈夫ですね

でもまぁ試しにと窓を開けるとがくんと下がります

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