概要
少し前、授業で生徒が寝てしまうのは換気が不十分だからだというツイートが話題になりました。
換気が不十分だと二酸化炭素濃度が上がり、思考が鈍くなったり、眠気に襲われるそうです。
これからの寒い時期、換気も不十分になりやすいです。
気づかないうちに生産性が下がるのはエンジニアとして避けたいことです。
このため、いい感じに二酸化炭素濃度を測りたいと思いました。
実はこれをやろうとしたのは一年前くらいなのですが、挫折していました…。
ですが、つい先日なんとかLT発表という締切を自分に課してかろうじて達成できました。
そんな記録です。
先行事例の調査
こちらの方の記事が参考になりました。
どうやらAmazonで一万円ぐらいで買えるCO2-miniが良さそうです。
CO2-miniの値を取得するライブラリは ruby, python, perl, C, Node.js...
いろいろありました。
しかしながら、Golang版はどうやら見当たらない様子。
せっかくなら作りたいと思いました。
ライブラリ選定
先述の記事にある通り、このCO2-miniというデバイスを扱うにはHIDAPIを利用したほうが良いようです。
Golangでそれに該当する簡単に扱えるものとして
https://github.com/zserge/hid
を選択しました。選定の理由としては
Simple HID driver for Go (pure golang, no dependencies, no cgo)
という説明書きが良さそうだったからです。
USB周りは各言語様々なライブラリが必要だったりとハマりやすいと思います。
そういった点をGolangで解決できたらいいなという目論見もありました。
できあがったもの
こちらです。
ライブラリのサンプルコードと参考にした記事をほぼそのまま流用しています。
感想
出来上がったものが存外シンプルになって少し驚きました。
他の言語のものを移植したことはなかったのですが、ちゃんとできてよかったです。
一方でちょっと反省点もあります。
元の参考にさせていただいたrubyのコードがこんな感じなのですが
result = (0..7).map{|i| (0x100 + phase3[i] - ctmp[i]) & 0xff }
Golangでそのまま0x100で計算すると怒られてしまうので誤魔化しています。
res[i] = (0xFF + b[i] - ctmp[i] + 0x01) & 0xFF
とりあえずやってみる、完璧ではないけれど完成させるという目標は達成できたかなと思います。
今後の予定
現在Mackerelに値を通知してグラフ化するコードを書いています。
またGoogle Homeにもいい感じに通知したいなと考えています。
Google Homeへの通知にはGolang版があります。
そちらを使って全部Golangで通すということができれば面白いかなと思っています。