
部屋の湿度の自動通知装置を自作した話その2
こんにちは!
今回は前回の続きとして、部屋の湿度管理のための自動通知装置について書いていきます。前回は端末・センサー側のことを解説したので、今回はサーバーサイドについての説明です。前回の記事はこちら
ウェブフレームワーク「Flask」
今回サーバーサイドで使ったのは、「Flask」というpython言語におけるサーバーフレームワークです。以前作った天気予報ランプと同様にPHPを使って書いても良かったのですが、より使い慣れたPythonで書けるというのと、この手のフレームワークをちょっと試してみたかったという理由で選択した感じです。
ちょっと調べてみた限り、この「Flask」はちょっとしたWebアプリケーションなどによく使われるフレームワークのようで、学習コストの低いPythonで書けるというのが特徴のようですね。その他に、もっとしっかりしたPythonのサーバーフレームワークとしてはDjungoというものもあるらしいですが、こちらはもうちょっと多機能のしっかりしたアプリケーションで使うようなものらしいです。
今回のソフトでやりたかったことは非常にシンプルなので、「Flask」で十分でしょうということでこちらを選択しています。あくまでも個人的に使うものですし、そもそも直接ブラウザでアクセスするようなプログラムでもないですしね。今回必要なプログラムの機能は、単純にセンサーからのデータを受け取って簡単な処理をしてからSlackにメッセージを投げるというだけなので、「Flask」ですらその機能のほんの一部しか使っていませんw 多分、やろうと思えばマイコン側で処理することも全然可能ですが、マイコン側のプログラムを書き換えるのは面倒なので、サーバーとプログラムを分けるという発想自体はまあ悪くないかなと。
サーバー実行環境
今回は、サーバーとして以前購入したRaspberry Pi 4を使います。もう一台、ネットブックを改造して作ったサーバーマシンもありますが、そちらは32bitマシンで今後の運用に難が発生しそうなので、徐々にラズパイの方に移行していこうかなと。
32bitマシンだと苦しい一番の理由はやはりDockerが手軽に使えないことですね。今回の実行環境としてもDockerを利用するので、やはり移植性・拡張性を考えると32bitマシンは今後はきびしいなぁと。そもそも32bitに対応しているOSも限られてきているので、そろそろ限界な感じはしています。
ということで、今回利用した実行環境のDocker Fileはこちら。
やはりというか、Dockerで環境をつくれると非常に楽ですね。手元のパソコンでテスト環境をつくったら、それをサーバーマシンでgitからpullして実行するだけで環境構築できるのは安心です。サーバーマシンには主にSSHで接続しているので、操作性の面ではどうしても手元のPCには劣ります。
内容としては以前に書いたPythonの開発環境の話と大きくは変わりません。requirements.txtに「Flask」を追加したり、エントリーポイントの最後に
python3 /opt/working/app.py
という記載を追加して、docker-compose.ymlに開放するポート番号を書いていく感じです。まあ、詳細はリポジトリの方をご確認いただければと。
サーバーサイドプログラム
そして、実際のサーバーサイドのプログラムとしてはこちら。
from flask import abort, Flask, jsonify, request
import requests
import json
import os
app = Flask(__name__)
@app.route("/")
def PostHumid():
SLACK_URL = ""
temp = ""
humid = ""
abs_humid = ""
message = ""
with open('url.json','r') as f:
json_load = json.load(f)
SLACK_URL = json_load["SLACK_URL"]
temp = request.args.get('temp')
humid = request.args.get('humid')
abs_humid = request.args.get('abs_humid')
if temp == "" or humid == "" or abs_humid == "":
message = "センサーエラーです"
elif float(abs_humid) > 15:
message = "部屋の湿度が高いです\n絶対湿度は" + abs_humid + "です"
elif float(abs_humid) < 5:
message = "部屋が乾燥しています\n絶対湿度は" + abs_humid + "です"
requests.post(SLACK_URL,data=json.dumps({
"text" : message
}))
return "hello"
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True, port=5000)
内容としては非常にシンプルで、各種パラメータをurlパラメーターとして受け取って、絶対湿度の値が高すぎたり低すぎたりしたときにはSlackにメッセージを流すというもの。最後に返り値として「hello」をつけていますがこちらは特に意味はありませんw 敢えて言うならブラウザからテスト実行した際になにも出ないと動作しているかどうかわからないので、それ用に入れている感じですね。
作ってみた感想と改善予定
ということで、前回紹介した端末と今回紹介したサーバーサイドプログラムを組み合わせることで、部屋の絶対湿度が高すぎたり低すぎたりした際に音声通知してくれる装置が自作できました。ちなみに、センサー側のデータ転送は約30分おきに設定しています。あまり間隔が長すぎるとあまり意味がないですが、間隔が短すぎるとうるさいのでまあこのくらいがちょうどいいかなという形で調整しました。
実際に使ってみると、部屋の状態を自動で伝えてくれるのはやはりなかなか快適です。温度とは違って、湿度はなかなか人間がパッと感覚的にわかるものではないので、こういう形で伝えてくれるのは助かります。除湿機や加湿器を使うタイミングの目安としていい感じです。
また、作成自体の感想としては、意外と楽に実装できたなというのが正直な気持ちです。もう少しいろいろと考えるべきことがあるのかと思っていましたが、やってみたら案外あっさりできて拍子抜けしたほどです。これは、前回も書いたとおり、今までに作ったものの組み合わせでできたというところが大きいのでしょう。特にTaskerによる読み上げシステムと、Slackの存在が大きいですね。
ただ、一方でこのシステムについては色々と発展系が考えられるので、それについても開発を進めています。具体的には、
1. 家にいるときのみに通知するようにする
2. 他のセンサーも搭載する
特に1については結構切実なところで、家にいないときにもSlackの通知がくるのは非常に鬱陶しいので対応が必要です(というか、既に開発自体は完了済みです)。外出中の部屋の状態がどうであろうとあまり関係ないですし、そもそも湿度が上がった・下がったといわれてもどうしようもありませんw なので、自宅にいるのかどうかを検出する機能を作成し、それをチェックしてからSlackに通知を投稿するかどうかを決めるようなロジックを実装します。
そして、2についても並行して現在開発中です。特に興味があるのがテレワークの広がりで注目されているCO2濃度の話です。作業環境における二酸化炭素濃度を検出し、高くなってきたら換気を促す通知をしてくれると良いかなと。このあたりも、センサーの扱いさえ分かればそこまでハードルは高くなさそうです。
まとめ
今回は自作の湿度の自動通知装置についての記事を書きました。前回も書いたことですが、各種のモジュールを組み合わせることで新しいことができるというのがなかなかおもしろいところですね。
また、今回の最後に書いたとおり、いろいろと拡張性もあるシステムなので、開発が進みしだい順次こちらで記事にしていきたいところですね。
それでは、また!