3年目となるラズパイによるスマートリモコンの改良です。
s51517765.hatenadiary.jp
s51517765.hatenadiary.jp
s51517765.hatenadiary.jp
昨年のスマートリモコンに温湿度・気圧センサーを連携します。
これまでの、エアコンをSlackで操る機能はそのままに、温湿度・気圧センサーもslackで取得できるようにしました。
「温度」「湿度」といったキーワードに反応して温湿度・気圧センサーにアクセスします。
#plugins.py @listen_to(u'(温|tem|湿|環)+') @respond_to(u'(温|tem|湿|環)+') def temp(message, something): try: env_result = bme280.main() #センサーにアクセス message.reply(env_result) #センサーからの応答をslackに返す except NameError as e: print(e) message.reply("NameError. airconSet.py") except Exception as e: print(e) message.reply("指示を解釈できませんでした。")
センサーのスクリプトでは、温度、気温、気圧を文字列にして返します。
また、呼ばれるごとに、日付時刻と温度、気温、気圧をcsv形式で書き出しておきます。
これで、データを収集してExcelで解析しやすくなります。
#bme280.py def main(): print("BME280 Start!") tdatetime = dt.datetime.now() try: sensor = Bme280() Pres = "{:.1f}".format(sensor.getPressure()) Temp = "{:.1f}".format(sensor.getTemperature()) Hum = "{:.1f}".format(sensor.getHumidity()) env_result = str(Pres)+"hPa / "+str(Temp)+"deg / "+str(Hum) + "%" print(env_result) file = open('env_result.txt', 'a', encoding='utf') # 追記モードでオープン file.write(str(tdatetime)+", "+Pres + ", "+Temp+", "+Hum+"\n") return env_result except Exception as e: print(tdatetime) print("Error in BME280") print(e)
Slackからの応答の様子。
また、bme280.py
をslackBotと並行で起動しておくことで、1時間ごとに温度、気温、気圧を取得します。
これでエアコンの設定が変わったときの様子が見れるはずです。
#bme280.py def get_env_loop(inerval=3600): while (True): main() time.sleep(inerval) if __name__ == '__main__': get_env_loop()
Pythonによる並列化
これを実現するためにSlackBot.main()
とbme280.get_env_loop()
を並列化します。ラズパイでターミナルを2つ起動してPyhtonを2つ起動するという形でも実現可能ですが、せっかくなのでPythonの並列化
threading
を利用します。並列処理、並行処理、マルチプロセス、マルチスレッド…など似たような言葉が多くありますが、これらの違いについては↓がわかりやすかったです。
qiita.com
今回はその中から並列化threading
がやりたいことになります。
Qiitaのサンプルがわかりやすかったのでそのまま使いました。
#main.py # -*- coding: utf-8 -*- import slackBot import bme280 import datetime as dt import threading def worker1(): slackBot.main() def worker2(): bme280.get_env_loop() if __name__ == "__main__": print("Main Start!") t1 = threading.Thread(target=worker1) t2 = threading.Thread(target=worker2) t1.start() t2.start()
ここではDebug用に30秒ごとに環境を取得していますが、SlackBot.main()
の応答とbme280.get_env_loop()
が両方動いていることが確認できました。
トラブったこと
コーディングはリビングで実施していて、ほぼ完成したところで寝室にラズパイを設置しました。このとき、電源のUSBケーブルを長いものに変更したら温湿度センサがErrorになるということが起きました。
Pythonは正常に動いているのに、i2cでのセンサだけ不能という現象が発生。
BME280という環境センサをラズパイでi2cで使っているんですが、ラズパイは起動するし、Pythonも動くのに、センサーが
— プログラミング素人 (@s51517765) 2020年5月20日
”[Errno 121] Remote I/O error”
を吐いた。さっきまで動いていたのに?センサー壊れたか?と思ったが、もしや電源!?とUSBケーブルを戻したら動いた。場所を変えるのにケーブルを
ソースコード・回路図等の全貌
github.comRaspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス
- メディア: エレクトロニクス