話題の記事

AWSだけで飯が食えるのか 〜アグリテック的な何か〜

IoT事業部にジョインした営業がAgritechをやってみた
2021.09.09

7月に発足したIoT事業部で営業を担当している作間です。 IoT事業部にジョインさせてもらったので、IoTっぽい何かを作ってみたいということで、年明けからちょこちょこ遊んでいた個人プロジェクト。IoT事業部の懇親会で話したら意外に反応がよかったのでブログにもエントリーしてみます。クラスメソッドに入社して数々のプロジェクトに参加した知見を生かしてみよう。

ここではコードの解説とか共有はしません。趣旨がずれてくるので別エントリーにするかもしれません。

やりたいこと

IoTといってもその範囲は広いし、個人なので壮大なプロジェクトやちゃんとしたサービスを作るのも難しい。とりあえず、クラウドとデバイスを使ってIoTっぽい何かを作りたい。 LEDチカチカとか部屋の温湿度測るのもいいけど、身近にあるものや実際に役立つものを作ればもっといいんじゃない。ついでに家族も喜べば。ということで、人はAWSで飯が食えるのかという計画のもと、食べ物作りに取り組むことにしてみる。

最初は露地栽培で野菜を作ってみようと検討したけど、自宅はマンションで庭もないし農家から畑を借りるってのもできそうだけど、なにせこちらは農業素人。土弄りも不慣れでハードルが高い。やりたいのは、手間をかけずに、放っておけば野菜がざくざくと作られる仕組みであって、土弄りをしたいわけじゃない。

やってみる

まず決めたのは、家のベランダでできる範囲で作るってこと。プランタを買ってきて土や肥料で作ってもいいけど、やっぱりここはもう少し科学的なアプローチでいきたい。 ざっと検索してみると、露地栽培ではなく水耕栽培が気軽でよさそうな感触。水耕栽培は土を使わずに水と液体肥料、光だけで野菜などを育成する手法のひとつで、 畑などで栽培する路地栽培と比べて、気軽にやれそうだけど、それなりにメリットとデメリットがある。

メリット

  • 生育が安定する
  • 無農薬栽培が可能
  • 土を耕す必要がない
  • 野菜の質が安定する
  • 水やりが不要
  • 室内など限られた場所でも栽培できる

デメリット

  • 水耕栽培できる野菜の種類が限られる
  • 電気代が発生する
  • 設備費用が発生する

プランタで栽培するより設備の費用はかかるのは仕方ないとして、水道水と液体肥料、光さえあれば野菜が食べ放題になるという夢の栽培方法。水耕栽培で栽培できる野菜は、葉物野菜が向いているとのことで、まずはレタスで試してみることにした。 真剣に設計したり、計画を立てたりしても時間ばかりかかってしまうので、とりあえずやってみるの精神で自宅にあるものや100円ショップ、Amazonなどで購入できるもので設備を揃えてみる。

設計

当時書いた設計図。頭の中のイメージ整理をするためなので手書きで十分。実作業は現物合わせでいく。 システム要件定義書?システム設計書?そんなものはない。

栽培するための機材

設計を元に揃えたのが以下の機材。

水槽

ガラス水槽を買った。これにレタスの種を入れて育てる。水槽のサイズは各種あるが、欲張って大きくしても置き場に困るし、小さすぎてもたくさんレタスを収穫できない。売るほどのレタスを作るわけではないけど、家族で食べられる分くらいは作りたいし、なにより実験という役割も持たせたいということで、縦横高さ30cmの熱帯魚用のものをチョイス。本当は家に使わなくなった水槽もあったけど、熱帯魚が泳いだ後の水槽で作る野菜って少しイヤ。

コンテナ

水槽を直にベランダに置くのは雨風を考慮すると避けたいので、コンテナの中に水槽を入れて栽培することに。これも専用品ではなく灯油缶を保管するためのもの。自宅に空いているものが、なかったので、Amazonで購入。システム全体をコンテナ内に格納してパッケージにしてしまいたい。

container

LEDライト

太陽の恵みを電気で代用。野菜に光と温度を与えるためのもの。本来は部屋の中で育てる観葉植物に使うというのが用途らしいけど、同じ植物なので見切りで購入。電力は75W相当で消費電力が20W程度とのことで、白熱電球や蛍光灯に比べて4分の1程度の消費電力。タイマーも付いているので、数時間おきにライトをON/OFFしてくれる。さすがに24時間つけっぱなしは成長にとって良くないという仮説も立てた上で、12時間サイクルでONとOFFを繰り返す設定にしてみる。ベストな照射時間はよくわからないので、12時間というのは適当な値。

エアーポンプ

水槽内の水に対して常に新鮮な空気を供給することで、水槽内の水質の安定と植物の根腐れを防ぐことを目的として。藻が生えた水槽で作った野菜は食欲湧かないでしょう。これも熱帯魚に使うための汎用品で、水槽内には二つのエアストーンから酸素を入れることに。機種はなんでもよかったけど、最終的な選択基準は動作音と振動が少ないものを選んだ。ベランダでやるから音や振動はあまり気にならないかもしれないけど、隣の家からクレームが来るのもイヤなので。

ヒーター

レタスの水耕栽培に適した水温は15から25度とのこと。実験したのは今年の1月から3月で冬真っ盛り。自宅は神奈川県なのだけど、深夜などは気温が0度を下回ったり雪が降ったりして、水槽内の水が凍結するリスクも十分に想定できるし放置したら最適温度すら維持できないので、水温調節用のヒーターを購入。これも熱帯魚用で、サーモスタットがついており、25度±1.5度前後に水温を保ってくれるナイスな仕様。

ファン

光、水ときたら次は空気。コンテナ内で空気が汚れてしまうのも気持ち良くない。ファンをコンテナ内部に取り付け換気をすれば、大丈夫でしょう。どちらもデスクトップパソコンのケースに取り付けて内部のエアフローを確保する用途のものを2つ購入。

1個目の目的はLEDライトの温度が上がり過ぎるのを防ぐためと、植物に風を当てるため。エアフローを加えると光合成が促進されやすくなるのは、露地栽培同様。

2つ目はコンテナ内の換気を行うため。コンテナ内は水温が25度に保たれているため、外気温の差が大きいと結露してしまうのは明白。コンテナ内にセンサーとかの電子機器も入れたいので、過酷な状態になることは避けたい。結露を防ぐいちばんの近道は一般的な部屋と同様に換気すること。吸気にするか、排気にするか、少し迷って一旦は排気にしてみる。

イチゴなどの高級な果物を育てたいという欲もでてきてしまうけど、今回は当初の予定通りレタスを選択。近所の園芸店で百円くらい。実験では使いきれないくらいの量が入っていた。

スポンジ

露地栽培でいうところの土の代わり。自宅のキッチンにあったのを適当に4分割してポットに入れ種を植えていく。発芽するまでは、乾燥させたくないのとファンの風で飛ばされるほど種が小さいたので、種を撒いた後にトイレットペーパーを種に被せて保湿しておく。レタスの発芽率を見ると80%と記載されていたので、ひとつのスポンジに2つの種を撒けば100%発芽する想定。

ポット

上記スポンジを入れておくためのもの。天然素材で作られているジフィーポットを選んだけど、これは多分失敗。使っていくうちに素材が崩れてしまい水槽内に落ちてしまうので、樹脂製の方が、水の汚れがなくていいかも。

発泡スチロール

ポットを入れて水槽に浮かせるためのもの。100円ショップで購入。ポットが水槽に落ちない程度の穴を開け水槽のサイズよりも少し小さめにカットして水に浮くようにしておく。

水と液体肥料

水耕栽培というだけあって肝心な水と肥料。水は普通の水道水を、液体肥料はハイポニカ一択っぽいので、こちらも園芸店で購入。中をみると2液式になっていて、水槽内の水にそれぞれの液体肥料を500倍希釈で入れるだけ。これも実験では使いきれないくらいの量。

電源

LEDライト、ヒーター、USBファンや後述するIoT関連のデバイスに必要な電源を用意する。たまたまベランダに掃除用のAC電源があったためこれを利用することにして、コンテナ内にはテーブルタップを格納する。一応漏電が怖いので、こんな感じで対策を。

水槽内部

一通り取り付けた感じ。実際に入れてみると浮力が足りなかったため、発泡スチロールを2枚重ねにして浮力を確保する。こうしておけば、水の蒸発などによって水槽内の水位が下がっても同時に発泡スチロールも下がってくるので、常時レタスに水は供給されるはず。

環境データを取得する機材

種を撒いてから収穫までの環境データと育成状況を取得するため、以下の機材も揃えてみた。ここからがIoTっぽいところか。

Raspberry Pi ZERO WHと温湿度センサー

センサーからデータを収集してクラウドにデータを送るためのもの。ここはあまり悩まずにRaspberry Piを採用。特に重い処理をすることもなさそうなので、安価なZERO WHを。環境センサーを接続したいのでピンヘッダ付きのものを選定。 Raspberry Piのセットアップ自体は以前と比べてとても簡単。公式サイトの手順通りに進めただけ。なお、インターネットへの接続は自宅のWi-Fiを使った。

コンテナ内の温度と湿度をセンシングするため、DHT22というセンサーを選択。Raspberry Piに接続するためのケーブルが付属していて、Amazonで1,000円くらい。廉価版のDHT11もあるけど、値段の差もないし、精度がこちらの方がよかったので。

カメラ

レタスの生育状況の写真を撮ってケータイで見たい。というか毎日コンテナ開けて生育状況観察するのは、スマートではないし、もしかしたら機械学習的な何かをするとしても、写真があればいいのでは?という想定で定期的に写真も撮っておきたい。 Raspberry Piに取り付けられるカメラはいくつかあるけど、調査してみるとどれも画質がイマイチ。普段スマートフォンの写真を見慣れているので、あの画質は辛い。

どうしようかなと検索していると、今手に持っているスマートフォンに、超高性能なカメラが付いているじゃないか!ということに気がつく。そこで数年前に利用していたAndroidスマートフォンのカメラで試してみることにした。数年前とはいえRaspberry Pi専用カメラと比べると画質は雲泥の差。あらたな投資も必要ないし、これはナイスなソリューション。

その他

ホース、テーブルタップ、工具、資材類 ホースはコンテナのテーブルタップから電源までを接続するためのケーブルが水没して、家が火事になったらたまらんという防水目的で。その他ハサミだったり両面テープだったりという工具は自宅にあったものを利用。

エッジ側の構成

Raspberry Piには、上述した温湿度センサーとスマートフォンを取り付けるのだけど、適当に差しても当然動作しない。仕様に従って付属のケーブルで以下のように接続する。GPIOは4番。

コンテナ内の温湿度の取得はGitHubにPythonのライブラリがあったので、ありがたく活用させていただくことにする。GPIOの番号を指定すると温度、湿度を返してくれるという、今回の目的そのままのライブラリ。特にプログラム上で考慮する点はないはず。

カメラとして使うスマートフォンは、Raspberry PiのmicroUSBから microUSB to USB Cケーブルを利用し充電ポート接続しているだけ。こちらは流石のUSBなので、適当に差してOK。同時にRaspberry Piからスマートフォンへの給電も可能なので、バッテリー切れの心配もしなくていい。 Raspberry PiからスマートフォンへのコマンドはADB(Android Debug Bridge)を利用した。

写真を撮るには、 Raspberry PiからADBコマンドを発行 > スマートフォンのカメラで水槽内を撮影 > 撮影した画像ファイルをRaspberry Piに転送 ここまで出来てしまえば、写真をクラウドにアップロードするのは楽勝。

データを取得するタイミング

センサーとカメラを使い温湿度と写真を取得するタイミングは結構悩んだ。常時監視して、水槽内に変化が起きた時にスクリプトを起動させるというのがイベントドリブンっぽくてかっこいいけど、難易度が高め。そもそもコンテナ内部にどんなイベントが起きるのかも想定できない。仕方ないのでRaspberry PiにCronを設定し1時間に1度取得するというレガシーな仕様でお茶を濁す。

エッジ全体

最終的にはこんな感じ。少しだけ未来を感じるというか、なんとなく自作PCっぽいというか。ケーブル類のマネジメントは無視しているので、ごちゃごちゃした感じになってしまっているのが残念ポイントか。あんまり拘ってもキリがなさそうなので、このまま行く。

クラウド

Raspberry Piが取得したデータや写真を保存するためにクラウドともデータ連携しておく。クラスメソッド的にはAWSなのだけどEC2とかRDSはあまり向いてなさそうなのと、サーバ管理とかインフラ管理とか面倒なことはしたくないというか、時間的にもスキル的にも、費用としても遠回りな気がしているので、AWSのマネージドサービスのみを使ってみる。ネットワークの知識が皆無でもそれなりに動いてしまうのがありがたい。

クラウドの構成

構成はこんな感じに。まあこの辺は色んなやり方あるだろうけど、よくある構成というか、教科書通りというか。

外気温と湿度、天気も取っておきたかったので、OpenWeatherMapのAPIから取得しておく。 コンテナ内の写真やデータを見るのに管理画面も欲しかったけど、どうせ自分しかみないのでLINEに通知するだけという手抜き仕様。

実際のところ、無駄に管理画面なんか作らず、見るだけならこれで十分です。

全体としては以下の流れ。

  1. 毎時0分にコンテナ内の写真と、温湿度を採取
  2. Raspberry PiからDynamoDBに温湿度データの書き込みと、S3への写真データの転送
  3. S3に写真を保存するイベントが発火するとLambdaが起動して写真にタイムスタンプを書き込み
  4. DynamoDBに2.の値が書き込まれるとLambdaが起動して外気温、外湿度、天気を取得して書き込み
  5. 毎時3分にCloudWatch EventsでLambdaを起動しLINEに3と4のデータを送信

これを24時間動かせば完全放置で世界中どこにいてもレタスの状況がわかる。本当はAWS IoT Coreなんかを使ってRaspberry Piを良い感じにリモート操作したかったけど、所詮エッジ端末は一台なのでSSHで繋げられれば、問題が起きてもある程度は対処可能。

実際に動かしてみる

当たり前といえば当たり前だけど、一連の動作は特に問題なし。 こんな感じでLINEのアプリに毎時レタスの情報が送られてくる。初めてすぐに気がついたけど、1時間に一度は頻度が高すぎると思う。昼夜問わず通知されるのでLINEのアプリで通知設定をOFFにしてしまった。24時間に1回でも十分かもしれない。

心配だったのは、クラウド側ではなくエッジ側。停電したり漏電したりもそうだけど、寒すぎてヒーターの動作が追いつかず水が凍ってしまうとか、結露で機器が故障してしまうとかがやってみないとわからない部分だった。結果として杞憂に終わったので、そこは心配しすぎた点。コンテナ内部と周辺の水回りと換気だけ気をつけておけば、とりあえずは大丈夫そう。

できあがり

おおよそ2ヶ月間の軌跡をいくつか。写真の色がピンクなのはLEDの色に引っ張られているから。

もちろん無農薬で、立派にできあがったレタスはこんな感じで、とても美味しく育ちました。

結論

タイトル通りAWSで飯は食えて、やった!これで一生レタスが食べ放題だ!量産すれば世界中の飢餓に苦しむ人を救える!

と喜ぶのはまだ早い。ここまで読んですでにお気づきの人もいると思うけど、やっぱりネックは電気代。 冬に実験したこともあるけど、ざっくり計算するとレタス4玉を作るのに、1000円程度の電気代が発生してしまう。これでは無限にレタスが食べられるどころか無限にお金が減っていくという残念な結果に。

ここからは推測だけど、電気代を節約する方法(自然エネルギーの活用とかそもそも電気代が安い国)を検討したり、寒さ暑さの影響を受けにくい葉物野菜を選択したりすれば、エネルギー効率もよくなって、コスト0円で無限に野菜が食べられるかもしれない。

発生した費用

  • エッジとか水槽とかの設備費用 約2万円
  • AWS利用料 無料枠で収まったので 0円

終わりに

エッジからクラウドまでIoTっぽいことができたしレタスも美味しかったし、当初の目的は達成できたのでよかったと思う。やっぱり目に見える成果物が出来上がってくるというのは、個人プロジェクトのモチベーションとしては大事なところかなといった感想です。

クラスメソッドのIoT事業部ではもっと壮大で社会に貢献できるプロジェクトが数多くあります。受託もそうだし、エンジニアの個人プロジェクトもあります。エンジニア、プロダクトマネージャー、営業の方などを募集していますので、興味のある方は是非求人ページよりエントリーしてみてください。