Raspberry Pi と Hubot で観葉植物の水やりを自動化する
Raspberry PI と Hubot を使って、Slack から観葉植物の水やりを実行できる装置を作りました。
材料
- Raspberry Pi Type A 256MB
- GPIO 拡張ボード
- ジャンパワイヤ
- スピーカーケーブル
- エポキシ接着剤
- 灯油缶
- アルミ線
- S8050 トランジスタ (詰合せで購入)
- 灯油ポンプ
- チューブジョイント
- シリコンチューブ (4mm x 6mm)
- コルク栓
回路
灯油ポンプ に直接はんだ付けして、+- 極をスピーカーケーブルでブレッドボードに引っ張ってきて、Raspberry Pi から 5V 電源を供給します。
S8050 トランジスタにはそれぞれ、
- E (エミッター): Raspberry Pi GND
- B (ベース): Raspberry Pi GPIO 0
- C (コレクター): 灯油ポンプの - 極
が接続されています。
パイプの分配
植物への水の供給は、シリコンチューブから行います。
コルク栓をカッターナイフで、灯油ポンプのパイプと丁度合う様な大きさに加工し、中央に穴を開け、チューブジョイントをエポキシ接着剤で固定します。
Hubot で Slack と連携
チャット応答には Hubot を使います。
Raspberry PI がプライベートネットワークにあり、Webhook が設定できないため、XMPP 経由で Slack と連携します。
詳しいセットアップ方法は、前のエントリーに書いています。
npm ライブラリの pi-gpio を使って、メッセージに応答し、GPIO の信号を操作します。
# Descriotion:
# Water plants
#
# Commands:
# hubot water (for n seconds)- Water plants. Defaults to 10 seconds.
#
gpio = require 'pi-gpio'
PIN = 11
DEFAULT_SECONDS = 10
module.exports = (robot)->
busy = no
robot.respond /\s*water(?:\s+for\s+(\d+)\s*s(?:ec(?:onds?)?)?)?\s*$/i, (msg)->
if busy
msg.reply "Sorry, I'm busy :("
return
sec = if msg.match[1] then parseInt(msg.match[1]) else DEFAULT_SECONDS
msg.reply "Watering for #{sec} sec. :droplet:"
gpio.open PIN, 'output', (err)->
busy = yes
gpio.write PIN, 1, ->
setTimeout ->
gpio.write PIN, 0, ->
gpio.close PIN
msg.reply "Done watering :seedling:"
busy = no
, sec * 1000
以下の様なやりとりで、水やりを指示できます。
全てのソースコードは ngs/watering-pi で管理しています。
完全自動化など
もう一匹、Heroku で動かしている Hubot を Room に常駐させ、例えば hubot-cron を使うことによって、定時に水やりを実行する様に設定できます。
cronbot new job 0 10 * * * say wpi water
それだけだと、世話している感がないので、Yo と連動して水やりを指示する様にする予定です。