部屋のCO2濃度が上昇したら自動で換気扇をつける
ちょっとやりたくなったので表題のIoT的な仕組みを作ってみました。
経緯
この記事を読んだのがきっかけです。
半分以上は家で作業しているので部屋のCO2濃度のせいで作業効率が落ちるのは嫌なのでひとまず計測してみました。
結果16畳ほどある部屋でも1人で何時間か作業すると1000ppm程度までは上がってしまい、定期的に窓の開け閉めをしていましたがそれも面倒になって自動化に至りました。
構成
(webhook) Raspberry pi -----> IFTTT-------> Smart plug ----> 換気扇 | ↑ | (usb) | (「換気扇をつけて」) | | CO2測定器 Google Home
換気扇がコンセントの電源のON/OFFで操作できるという少し特殊な部屋なのでこの構成で良いのですが、スイッチのON/OFFが必要な場合はSmart plugの代わりに「Switch Bot」のような商品が必要でそれだったらやってなかっただろうなと思います。
やったこと
買ったCO2測定器は下記です。
カスタム (CUSTOM) CO2モニター CO2-mini
- 出版社/メーカー: カスタム
- メディア: Tools & Hardware
- この商品を含むブログを見る
こういう機器は安物を選んでもキャリブレーションとかがちゃんとできておらず不正確な情報を得られてしまうので慎重に選びたいところ。
前に尊敬するRailsの作者でもあるDHHがco2meter.comは大丈夫と行っていたのでそこのOEMであるらしい上記製品を購入しました。
Consumer warning: Do not trust the VOC and CO2 readings from @myfoobot devices. Here are three of them placed in the same room. Real CO2 as measured by a https://t.co/V1Rjw0qxtv device is 519ppm. Garbage. pic.twitter.com/IrRoWb9fOL
— DHH (@dhh) 2017年11月9日
情報取得するために常に動いているサーバーが欲しいが自宅には常時稼働のデバイスはなかったのでRaspberry pi 3 Model Bを購入。最近はこういう商品でAmazonでの発送元が代理店の場合ちゃんとしているところか調べるのが面倒なのでヨドバシを利用してます。
https://www.yodobashi.com/product/100000001003490456/
2AのUSB電源(2.5Aが本当は必要)とディスプレイとHDMIケーブルとキーボードは必要でしたが家にあったので購入したのはRaspberry piだけですみました。
設定は下記サイトを参考にしたら問題なく完了。
次にSmart PlugはIFTTT対応必要なのですが中国製のものばかりで少し怪しかったのですが、それ以外を探すのも面倒なので下記を購入しました。
Google Home対応しているのでGoogleの審査は入っていて怪しい動作はしないはずと信じていますが、ちょと怖いような気もします。気にする場合はamazon.comで良いのを選んで購入するのが良いかも。
届いてセットアップしてみたところ、アプリはちゃんとしていて動作は問題ありませんでした。
そしてIFTTTで下記を設定します。
- IF "Webhook" Then "Meross (Turn on)"
- IF "Webhook" Then "Meross (Turn off)"
簡単ですね。
最後にRaspberry piからwebhookを飛ばすだけです。usbデバイスから情報を取得するのはroot権限だと楽なのでrootで作業しちゃいます。
まずは必要なライブラリのインストール
apt-get install libudev-dev libusb-1.0-0-dev pip install hidapi co2meter
下記のスクリプトを /root/co2d.py とかで配置。スクリプトの内容としては毎分値を取得して1000を上回ったらつけて600を下回ったら止めています。pythonあんまり得意じゃないのでコードは適当。
#!/usr/bin/env python import co2meter as co2 import time import os import sys from datetime import datetime def main(): mon = co2.CO2monitor() triggered = False while True: try: current = mon.read_data_raw()[1] print(current) if current >= 1000 and not triggered and datetime.now().hour >= 8 and datetime.now().hour < 23: print('CO2 value is over 1000ppm!') os.system('curl https://maker.ifttt.com/trigger/co2-over/with/key/hogehoge') triggered = True if current <= 600 and triggered: print('CO2 value is under 750ppm:)') os.system('curl https://maker.ifttt.com/trigger/co2-under/with/key/fugafuga') triggered = False except Exception as inst: print(type(inst)) print(inst.args) print(inst) sys.stdout.flush() time.sleep(60) def fork(): pid = os.fork() if pid > 0: f = open('/var/run/co2d.pid','w') f.write(str(pid)+"\n") f.close() sys.exit() if pid == 0: main() if __name__=='__main__': fork()
でdaemonで動かすために下記のような /usr/lib/systemd/co2d.service 作成
[Unit] Description=CO2 Monitoring Daemon [Service] ExecStart=/root/co2d.py Restart=always Type=forking PIDFile=/var/run/co2d.pid [Install] WantedBy=multi-user.target
systemctl enable co2d.service systemctl list-unit-files | grep co2d
リブートしてps -ef
でdaemon起動を確認できればOK。
雑感
楽しいので他にもいろいろなもので試してみたくなるものの、有用なケースはなかなか思いつかないのが悲しいところです。
少しずつ部屋の明かりの音声操作とかも取り入れてきていますが、気をつけているのは一緒に暮らしている人がストレスを感じないようにするところです。
・少しの便利さのために不便を強いることにならないように ・少しずつ導入してなれてきたら次のデバイスを入れる ・Google Homeで操作するときのニックネームを工夫して操作を楽しめるようにする
などなど。
次は草木の水やりのために水の乾き具合を計測できたらいいなとか思ったりしています。
最近読んだ本いくつか感想
- 作者: 三宅勝久
- 出版社/メーカー: 同時代社
- 発売日: 2018/06/18
- メディア: 単行本
- この商品を含むブログ (1件) を見る
某2階建てで話題になっていたので気になって購入。この会社は不動産クラスタのツイートで酷い書き方されてるところだからどんなものだろうかと。
しかし読んでるだけでイライラしてくるので最後まで読むのがつらかった。
サブリースなんてそもそも悪い話しか聞かないけど本の中身を見る限りイメージより更に酷い。
親に読んどいてもらいたいので次に実家帰るときに持って帰ろう。。
- 作者: 坂井豊貴
- 出版社/メーカー: 岩波書店
- 発売日: 2017/04/21
- メディア: 新書
- この商品を含むブログ (7件) を見る
ミクロ経済の超導入。大学のときはマクロ経済をとっただけでミクロ経済については基礎も知らなかったので雰囲気くらいはつかみたいなと。
数式を使わずに説明してくれていてさらっと読めて良い本でした。
もう一回くらい読み返してちゃんと頭に入れたい。
OKR(オーケーアール) シリコンバレー式で大胆な目標を達成する方法
- 作者: クリスティーナ・ウォドキー,及川卓也(解説),二木夢子
- 出版社/メーカー: 日経BP
- 発売日: 2018/03/15
- メディア: 単行本
- この商品を含むブログ (1件) を見る
少しタイミング遅れてしまったものの話題の本なので読んどかないとなと。
アジャイルとかスクラムとかの開発手法とは違って目標とその達成についての話なので特にエンジニアやプロダクトのチームに限定されないのが会社として取り入れやすくて良さそう。
数ヶ月単位の目標を定めるのでProduct/Market fitしてからじゃなとうまくいかないかもと書いてありましたが、 個人的な課題としてはそもそも自分が作るプロダクトについて Problem/Solution Fit や Product/Market Fit までをどうやるかという部分からなので、OKRがどうとかいうレベルになっていないのが悲しいところ。
バッファロー製ルーターWXR-1901DHP3のv6プラス設定
サーバーサイドエンジニアとして最近の雑感
最近はサーバーサイドが得意なフルスタックエンジニアですよ、って言って仕事を受けてるんですが、そんなことをしてるとやはりフロントサイドを書く機会も多くて、この時代のサーバーサイドエンジニアの価値ってなんだろうなぁと改めて思ったので考えたことをメモ。
RubyでもJavaでも何でも良いのですが、普通のWebアプリケーションがやってることって
という流れ。
ところが最近はUIがリッチになものが求められたりしてきているので、どうしてもSPAの流れになってきてるなと。WebじゃないネイティブアプリはそもそもがSPAみたいなものですし。
そうするとサーバーサイドはAPIだけの提供でよくて、更に複数の情報を組み合わせるようなデータの加工処理もクライアントサイド側で扱うほうが多くの場合パフォーマンス面や実装のシンプルさでメリットがあるなと最近フロントをガリガリ書いてて感じました。
そうするとサーバー側はシンプルなCRUDだけ提供していれば十分で、ここに複雑な機能はいりません。となるとmBaaSが提供するような永続化機能で十分だなと。GraphQL が流行っているのも納得で、サーバーサイドの人間とすると最初は呼び出し側が使い方を決めるなんてよくわからんと思ったりもしたんですが、データの保存と取得しか無いようなものであれば確かにクライアントサイドが処理をコントロールできるし、その方がメリットは大きい気がします。
自分が個人で受けていて1人で作っているサービスも結局SPAになって、サーバーサイドでやることほぼなくなってきました。
会計システム(受けてる案件の一つ)なんかはサーバーで処理する部分が多くなるのでサーバーサイドは大事ですが、BtoCのサービスで複雑なロジックが必要とされないようなものについては上記の感じじゃないでしょうか。
となると自分の強みの「サーバーサイドが他の人より多少できますよ」なんてのは大して意味がなくて、市場価値があるサーバーサイドのエンジニアになるには
- 複雑な業務システムを設計・開発・マネージメントできる
- システム全体としてのパフォーマンスを考えた設計・構築ができる
- 大規模であったり高パフォーマンスなシステムが作れる
- これは大企業で求められるレベルというレベル感。となると大企業で経験を積むしかなく、フリーでやってるとなかなかできる機会がないところ
- 周辺の技術領域まで手を伸ばす
- ユーザーの行動分析とか、インフラとか、フロントサイドとかを専門と言えるレベルまでやる
- 市場に供給が不足している技術を持つ
あたりでしょうか。
どれも大変そうですが、どれか一つくらいであれば最低限といえば最低限な気はします。いずれにせよコード書けるよ、だけだとサーバーサイドエンジニアは厳しそうです。
サーバーサイドエンジニアとして必要な知識はソフトウェアエンジニアなら誰もが持っていて欲しいものではあるですが、それだけでは価値がなくなりそうな時代かなと。
数年遅れの議論かもしれないですが、クライアントサイドを書く機会が増えてこんなことを思った次第です。
エンジニアリングの能力なんて本当はそこまで重要ではなくて、そもそものサービス志向とか一緒にものづくりをするメンバーとのコミュニケーションとかのが大事という思想ではあるんですが、とはいえエンジニアとしてこれからも生きていくわけではあるので技術面での生存戦略も忘れずにやっていきたい。
Coursera Machine LearningコースWeek 7~9
1月の中旬から始めたコースですがなんとか終わりが見えてきました。
Week7
Support Vector Machine について。昔習った気がするけど全く覚えてないよ。
一連の講義の中で一番わかりづらかったので実際使う時は復習しないとなぁという感じ。
特徴量が少なめの時に使うと良いらしい。
Week8
Unsupervised Learningについて。
K-Means法は大学で習いはしなかったけど研究室とかでよく耳にした手法。
あとはPCAによるDimensionality Deductionについて。
複雑な式の詳細には踏み込まずに概念だけで説明してくれるのですんなり理解できた。
Week9
引き続き教師なし学習の応用について。Videoの量としては一番長い週。
Anomaly DetectionとRecommender Systems。
プログラミング課題としてはこの週が最後ぽい。
Week 7, 8は特に悩まず解けて慣れてきたかと思ったけど、やはりVectorizedな形で複雑な式を実装するのは悩んでしまう。
それでも行列演算には慣れてきたので、成長してはいると思われる。
残りは Week 10とWeek 11で合わせてEstimated Timeは3時間くらい。
なんとか当初の予定の一週間遅れくらいで終わりそうな雰囲気です。
週末に見たアニメとマンガメモ
この週末はかなり疲れが溜まっていた(主に飲み会のせい)ので充電ということで何も考えずに飲み会で勧められたアニメとマンガを見ることに。
アニメはよっぽど好きなマンガがアニメ化されるとかでもない限り基本は見ないんですが、たまに一気見とかは楽しいですね。前はSAOとやらを見た記憶があります。
アニメ3つとマンガを4つほどですがこの勢いで情報を入れると一週間後にはほぼ覚えていなくなるのでメモしておきます。
アニメ:Re:ゼロから始める異世界生活
話題になってたことだけ知ってるので多分面白いんだろうなぁと思いつつ視聴。
中盤の主人公がウザキャラになり始めたあたりは辛かったんですが、その分最後に一通り解決していく流れがカタルシスを得られるので非常に満足度は高かったです。
特に気の利いた感想はないんですが、レムがいちばん人気なのはそりゃそうですよねぇと。
アニメ:ノーゲーム・ノーライフ
超人が無双していく話は嫌いじゃないので楽しめました。無駄にエロを入れてくるのは好みじゃないですが。
個人的にはしりとりの戦いが一番好き。
アニメ:有頂天家族
良い話。最後の方は一気に引き込まれました。矢二郎の活躍とか総一朗や母の思いとか全部泣けました。流石に3つ目となると集中して見れなかったので、もう少しじっくり味わいたかった気がします。
2期もあるみたいなのでそっちも見てみたい。
マンガ:さらば、佳き日
切なくなる恋愛ストーリー。疲れてるタイミングで見たせいなのかこの作者の表現力がすごいのか、他のこれ系の話と比べても胸が苦しくなる場面多数。
高校〜大学あたりの報われない恋って一番自分の琴線に触れる気がします。(この話は最終的には報われて欲しいですが。)
マンガ:世界で一番、俺が〇〇
一番不幸になった人が願い事を叶うという話。設定へのツッコミは無いことはないですが今のところ面白いので、10巻くらいで綺麗にまとまると良い気がする。
マンガ:アルテ
好きなタイプの話。現代より前の時代設定で女の子が逆境に負けずに頑張る系の話はありがちといえばありがちですが、主人公がとても魅力的。
これ系の話は主人公のステップアップで全く別の人間関係の場所に行くというのもよくあるかと思うんですが、作品としてはそこで話がリセットされて中だるみするのが多い気がするので、個人的にはその場所で頑張り続ける話のが基本的に面白いと思うのでそうあって欲しいなぁ。(その場所に居続けるとネタ切れになりやすいとかはあるんでしょうけれど。。)
Coursera Machine LearningコースWeek 6 (1ヶ月ぶり)
3月入ってから全然できていなかったコースやっと再開できました。これ期日に間に合わなくても1ヶ月も遅れると新しい期日設定して新しく再開できるんですね。
前回まででLinear RegressionとLogistic Regression、Neural Networkを学んできました。
Week 6はそれらを使う時の考え方というところで、ラーニングセットをTrain/Validation/Testに分けたり、Bias/Varianceのトレードオフについてといったところを学びました。
何とかこれ以上遅れさせずに終わらせたい…。