温湿度・気圧センサモジュール、Raspberry Pi、Google Homeで快適なお部屋作り (後半)
“人感センサーを活用してPhilips Hue 電球専用のオンオフを自動化、省電力化を実現”
“ワンコインでお部屋の温度をHomeKitをベースに外出先でもモニターできるようにしてみました”
“Raspberry PiとGoogle カレンダでGoogle Homeにゴミの日を教えてもらう”
“温湿度・気圧センサモジュール、Raspberry Pi、Google Homeで快適なお部屋作り (前半)“の続きです。
前回のTALKで、温湿度・気圧センサーモジュール(”BME280搭載 温湿度・気圧センサモジュール ピンヘッダ実装済“)を使って、“Google Home“にお部屋のコンディションを定期的に喋ってもらうようにしました。
で、今回のTALKでは、その続編ということで、以前購入した時の在庫になっていた人感センサー”PIRセンサーモジュール [DSUN-PIR ]“、そして、こちらの以前購入した”Keynice USB扇風機 卓上 クリップ型 静音 USBケーブル1.5m ミニ扇風機 風量2段階調節 360度角度調整 4枚羽根 USBファン – ホワイト“と組み合わせて、室内が一定以上の温度になった時にミニ扇風機をオンに、一定の温度以下になったらミニ扇風機をオフにする、といったホームオートメーションを実現してみようと思います。
(1) 温度をリアルタイムに計測できるようにしましょう
今回は、温湿度・気圧センサーモジュール(”BME280搭載 温湿度・気圧センサモジュール ピンヘッダ実装済“)で計測したリアルタイムな温度を条件に、ミニ扇風機のオン・オフをしたいので、センサーモジュールのセットアップと、温度の計測を行うスクリプトを作成します。
詳しい内容は、前回のTALK”温湿度・気圧センサモジュール、Raspberry Pi、Google Homeで快適なお部屋作り (前半)“を参考にして下さい。
(2) 室内に人がいるのかいないのかを検知できるようにしましょう
室内の温度だけを条件にしてしますと、人がいない時にもミニ扇風機が回っているという、何とも電気代が勿体無いことになってしまうので、人感センサー”PIRセンサーモジュール [DSUN-PIR ]“を使って、室内に人がいるのかいないのかを検知できるにします。
詳しい内容は、以前のTALK”人感センサーを活用してPhilips Hue 電球専用のオンオフを自動化、省電力化を実現“を参考にして下さい。
(3) ラズパイのUSBポートを制御できるようにしましょう
以前も使わせてもらった実績がある”hub-ctrl.c“を今回も使って、ラズパイのUSBポートに接続したデバイスの電源のオン・オフをすることにしました。
インストールの手順は以下の通りです。
sudo apt-get install libusb-dev
wget http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
gcc -O2 hub-ctrl.c -o hub-ctrl-armhf-static -lusb -static
sudo cp hub-ctrl-armhf-static /usr/local/bin/hub-ctrl
POOHが今回使っている”Raspberry Pi 3 Model B“の場合、USBポートは次のように設計されているそうです。
まずは、開発用のラズパイを使って、どのようにUSBポートの電源供給を制御できるのか、いろいろなパターンでテストしてみます。
“lsusb
“コマンドで、USBポートの状態を確認できます。
ネットの情報を参考にしながら、手元にあるUSBハブなども使い、自分なりにテストしてみた結果、以下のパラメータしか有効ではありませんでした。
しかも、USB ポート#2というのは、特殊なポート(USBポートだけはなくて、ETH0もオン・オフしてしまうみたい)らしく、このポートに対してコマンドを発行すると、4個あるUSBポート全ての電源がオン・オフしてしまいます。
sudo hub-ctrl -b 1 -d 2 -P 2 -p 0 <-電源オフ
sudo hub-ctrl -b 1 -d 2 -P 2 -p 1 <-電源オン
本当だったら、ミニ扇風機を接続したUSBポートだけを対象に、オン・オフしたかったのですが、ま、夏場を乗り切ったら、また別のソリューションを見つければいいよねえ、ということで、今回はこのまま続行することにしました。この結果が分かっていれば、もともとUSBポートが1個しかない”Raspberry Pi Zero WH“を、夏場の間、ミニ扇風機専用ラズパイにしても良かったかなあ、と思った次第です。
基本的な準備とテストを終えたところで、実運用をしているラズパイで、改めてセットアップを行いました。
以前のTALK”“Amazon Dash ButtonでPhilips Hue 電球専用のDimmer スイッチを作ってみました (2)“”で使った”Amazon Dash Button“のパッケージ箱を流用して、人感センサーを設置してみました。ラズパイの設置場所が書斎なので、ソコソコな感じにしておかないとねえ。
(4) 室内の温度を条件にミニ扇風機の電源オン・オフができるようにしましょう
それでは、ミニ扇風機をコントロールするPythonスクリプトを書いていきましょう。
前回のTALK “温湿度・気圧センサモジュール、Raspberry Pi、Google Homeで快適なお部屋作り (前半)“で書いた”get_atmospheric_data.py”をベースに、一部を書き換えていくことにします。書き換えたスクリプト名は、”control_fan_by_atmospheric_data.py”にします。
nano control_fan_by_atmospheric_data.py
今回、書き換える箇所は、”def readData():”です。
def readData():
data = []
for i in range (0xF7, 0xF7+8):
data.append(bus.read_byte_data(i2c_address,i))
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
hum_raw = (data[6] << 8) | data[7]
今回は、計測した温度のみ使用するので、
global temperature_data
compensate_T(temp_raw)
“saved_fan_status_data.txt”というテキストファイルを用意して、そこに、直近のミニ扇風機の状態を記録します。初期値として、”STOP”というテキストを書いて、ラズパイに保存しておいて下さい。
あ、それと、このスクリプトを実行する前に、ターミナルで”hub-ctrl -b 1 -d 2 -P 2 -p 1″と実行して、ミニ扇風機をオフにしておいて下さい。
file = open('/home/pi/saved_fan_status_data.txt', 'r')
saved_fan_status_data = file.readline()
file.close()
計測した温度が25度以上で、ミニ扇風機がオフだったら、ミニ扇風機をオンにします。温度の値は、このスクリプトを実行する季節によって、適時変更して下さい。今回は、春先に動作テストを行ったので、25度を基準値にしています。
if (temperature_data >= 25) and (saved_fan_status_data == "STOP"):
os.system("sudo hub-ctrl -b 1 -d 2 -P 2 -p 1")
saved_fan_status_data = "START"
計測した温度が25度未満で、ミニ扇風機がオンだったら、ミニ扇風機をオフにします。
elif (temperature_data < 25) and (saved_fan_status_data == "START"):
os.system("sudo hub-ctrl -b 1 -d 2 -P 2 -p 0")
saved_fan_status_data = "STOP"
ミニ扇風機の状態を、”saved_fan_status_data.txt”というテキストファイルに記録しておきます。
file = open('/home/pi/saved_fan_status_data.txt', 'w')
file.writelines(saved_fan_status_data)
file.close()
温度を計測する関数部分は、グローバル変数 “temperature_data”に計測した温度を保存するよう修正します。
def compensate_T(adc_T):
global t_fine
v1 = (adc_T / 16384.0 - digT[0] / 1024.0) * digT[1]
v2 = (adc_T / 131072.0 - digT[0] / 8192.0) * (adc_T / 131072.0 - digT[0] / 8192.0) * digT[2]
t_fine = v1 + v2
temperature = t_fine / 5120.0
global temperature_data
temperature_data = temperature
それでは、スクリプトにエラーがないことを確認するために、一度、スクリプトを実行してみましょう。
python control_fan_by_atmospheric_data.py
(5) 書いたスクリプトを定期的に実行するクーロンを設定しましょう
cronを使って、上記で用意したスクリプトを20分間隔で定期的に実行するようにしておきましょう。
crontab -e
*/10 * * * * python /home/pi/control_fan_by_atmospheric_data.py
sudo /etc/init.d/cron start
(6) 人感センサーの検知結果をミニ扇風機の電源オン・オフの条件に加えてみましょう
ここで、人感センサー”PIRセンサーモジュール [DSUN-PIR ]“の出番です。
先程、書いたスクリプトに、人感センサーで検知したデータを加味した条件を加えてみましょう。
まずは、
スクリプトの先頭に追記。
import wiringpi as pi
import time
続いて、人感センサーで室内に人がいれば”True”、いなければ”False”を返すような関数を書き加えます。
def readPIRSensor():
SENSOR_PIN = 18
pi.wiringPiSetupGpio()
pi.pinMode( SENSOR_PIN, pi.INPUT )
if ( pi.digitalRead( SENSOR_PIN ) == pi.HIGH ):
return True
else:
return False
“def readData():で、人感センサーで検出した結果をもとに、ミニ扇風機のオン・オフする条件を修正します。
someone = readPIRSensor()
if (temperature_data >= 25) and (saved_fan_status_data == "STOP") and (someone):
os.system("sudo hub-ctrl -b 1 -d 2 -P 2 -p 1")
saved_fan_status_data = "START"
elif (temperature_data < 25) and (saved_fan_status_data == "START"):
os.system("sudo hub-ctrl -b 1 -d 2 -P 2 -p 0")
saved_fan_status_data = "STOP"
elif (someone == False):
os.system("sudo hub-ctrl -b 1 -d 2 -P 2 -p 0")
saved_fan_status_data = "STOP"
こうすることで、室内に人がいる時は、温度に応じたミニ扇風機のオン・オフをし、室内に人がいない時はミニ扇風機をオフにしておくことができます。
p.s>
折角、USBポートが4つもあるのに勿体無いなあ、と思っていたところ、たまたま、1年前に買ったミニ扇風機がアマゾンのタイムセールで売っていたので、2台目を買って、2台体制で実運用中です。
“Keynice USB扇風機 卓上 クリップ型 静音 USBケーブル1.5m ミニ扇風機 風量2段階調節 360度角度調整 4枚羽根 USBファン – ホワイト”
|
|
|
ホームページ “THE POOH FILES”にも是非お立ち寄り下さい。
“Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。