IoTで水耕栽培研究

水耕栽培とかIoTの備忘録

ネットワークカメラとGoogle Driveの連携

前回の続き、ネットワークカメラの撮影結果をGoogle Driveに定期保存する方法を解説します。

今回はネットワークカメラに関する記事の続きです。

amesyabody.hatenablog.com

前回説明した全体図のうち、今回ご説明する部分を赤枠で囲みました。

全体図 今回は④と⑤

④ cronで毎日0,6,12,18時に画像撮影
⑤ PyDriveで画像をクラウドへ保存

pythonのプログラムでRaspBerry PiからC200に撮影リクエストを行い、 取得した画像を保存する事が出来ていました。 今回はその取得した画像を単にRaspBerry Piに保存するのではなく、 Google Drive上のフォルダに送信するコードを追加します。

Google Driveについて

Googleのサービスは日本でも広く使われているため、 説明するまでもなくご存じの方もいらっしゃるかと思います。 同サービスはクラウドストレージとしては古くから存在し、 常にサービスのブラッシュアップがなされてきました。 クラウドストレージと呼ばれるサービスは数あれど、 Google ドライブはコスト、機能ともに優れており、 お勧めなサービスの一つです。

個人的には、ブラウザ上のファイルビューアがとても優秀です。 画像データはもちろん、HDビデオを再生する事も可能で、 クラウド上のデータを確認する際に一々余計なダウンロードを挟まなくとも済みます。 また、1つのGoogleアカウントに15GBまでの無料利用枠が有、 今回のように画像データを保存し続ける用途ではまず不足することはありません。 (Google フォトなどと連携されている方は、写真やビデオで圧迫されることもあるかと思いますが、これ専用のアカウントを作成すれば問題ない話だと思います。)

Google Driveに保存フォルダを作成

下記リンクからGoogle Driveにアクセスしましょう。

www.google.com

右上の「ドライブに移動」で個人のアカウントのGoogle Driveに移動できます。

Google Drive画面

適当なフォルダを作成しましょう。(私はc200という名前にしました。)作成したフォルダにクリックして入ると、 URLの「https://drive.google.com/drive/u/0/folders/」以下に赤枠のような長い文字列が現れるはずです。(画像では15…で始まる所) これがフォルダIDであり、後程Pythonスクリプトで必要な情報となります。この文字列をメモしておいてください。

Python側の準備

PyDriveにPythonからアクセスするためのライブラリ群をインストールしましょう。 今回は以下の二つが必要です。

クライアントAPI
pip install google-api-python-client
PyDrive
pip install PyDrive

OAuthの準備

PyDriveにセキュアにアクセスするために、Google Cloud Platform上でOAuthの設定を行います。 手順を解説している方がいましたので、紹介します。

PythonでGoogle Driveにファイルをアップロードする | Men of Letters(メン・オブ・レターズ) – 論理的思考/業務改善/プログラミング

以下の二点を行います。 * Google API コンソール(Google Developers Console)のGoogle Drive APIを有効にする。 * OAuth 2.0 クライアント IDを作成する。

上記はコンソール上で実行することが可能です。 一通り終わりましたら、 アクセスするために必要な「client_secrets.json」「credentials.json」「settings.yaml」の3ファイルを入手してください。 これをRaspberry Piのホームディレクトリに保存します。

注意:後程設定するcronはホームディレクトリで実行されるため、 上記の3ファイルもホームディレクトリに保存する必要があります。 ここははまるポイントなので、ご注意ください。

Pythonコード

先日紹介したコードを応用して、画像を取得してからGoogle Driveに送信するまでの一連を一つのスクリプトにしました。 一時的に画像をRaspberry Piフォルダに保存し、題名を日付タイムスタンプにして保存します。

import cv2
import os
from datetime import datetime as dt
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

drive_root_dir="./gdrive/My Drive"

drive_folder_id = 'hogehuga' #メモした保存先のフォルダID
user_id = "amesyabody"
user_pw = "hogehuga"
host = "xxx.xxx.xxx.xxx"
port = "554"
stream = "stream2"
cap = cv2.VideoCapture(f"rtsp://{user_id}:{user_pw}@{host}:{port}/{stream}")
ret, frame = cap.read()

# 日付読み込み
tdatetime = dt.now()
tstr = tdatetime.strftime('%Y-%m-%d-%H-%M-%S')
#print(tstr+".jpg")

# 静止画中間ファイル保存
cv2.imwrite("tmp.jpg", frame)

#Google Driveへ保存
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
f = drive.CreateFile({'title': tstr+".jpg",'parents' : [{'id' : drive_folder_id}], 'mimeType': 'image/jpeg'})
f.SetContentFile("tmp.jpg")
f.Upload()

os.remove(r"tmp.jpg")

cap.release()
cv2.destroyAllWindows()

cronでなく単純に実行する際には、Pythonスクリプトと同じフォルダに「client_secrets.json」「credentials.json」「settings.yaml」の3ファイルを 保存して参照できるようにする必要があります。cronではホームディレクトリに保存することに注意です(大事なことなので2回目言いました)。

cron

Pythonスクリプトを実行し、無事日付のついた画像ファイルがc200フォルダに保存されたら、最後にcronで自動的に実行するようにします。 crontabを編集しましょう。

crontab -e

個人的な趣向ですが、crontabの編集はnanoコマンドがやりやすいです。人によると思いますが…。 毎日0時、6時、12時、18時に定期実行する場合は、下記を追記しましょう。

0 0,6,12,18 * * * /usr/bin/python3 /home/pi/Desktop/cap_c200.py

さいごに

以上で定期的にネットワークカメラから画像を取得して、Google Driveに保存する仕組みが完成しました。 実は、野菜の成長を見守るために始めたのですが、ゆずの木を手に入れたので、 現在はゆずの木の見守りに使っていたりします。 ただ、ゆずの木は成長が年単位なので、一日に4枚写真を撮ってもあまり変わり映えしないかも…。 ちょっとまだ使い方は他にもあるかなと思っていて、考えてます。 それはそれとして、今回はネットワークカメラの仕組み、データのやり取り、Google Drive等非常に勉強になりました。 3回に分けて、大分ボリュームのある記事になってしまいましたが、その価値はあったかなと思います。

一方で、水耕栽培の研究らしき記事が最近ちょっとない! ぼちぼちサニーレタス、べんり菜、ルッコラ、クレソンの収穫が始まっているので、 それらの記事も書いていければ、と思います。

ではまた!