Raspberry Pi と Hubot で観葉植物の水やりを自動化する

Raspberry PIHubot を使って、Slack から観葉植物の水やりを実行できる装置を作りました。

材料

回路

灯油ポンプ に直接はんだ付けして、+- 極をスピーカーケーブルでブレッドボードに引っ張ってきて、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 と連動して水やりを指示する様にする予定です。

comments powered by Disqus