ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Raspberry Pi3(ラズパイ)でも、コマンドでGoogle Drive

(2019-02-11 初稿 - 2021-05-10 転記・修正)

はじめに

以前にUbuntuコマンドラインからGoogle Driveを利用する方法を紹介した。

今回は、Raspberry Pi3で温度を計測したデータをテキストファイルに書き出して、Google Driveに保存し、他のPC等から閲覧や解析をするために設定を行った。

なお、Dropbox Uploader等を利用してRaspberry Pi3とDropboxの同期をとることも考えたが、初期設定がgdriveの方が楽そうだったので、gdriveを選んだ。

このページの記述は、以下のサイトを参考にさせていただいた(多謝 m(__)m)。

ダウンロードとインストール

以下のコマンドでダウンロード。

cd /home/pi/bin
wget -O gdrive https://docs.google.com/uc?id=0B3X9GlR6EmbnVXNLanp4ZFRRbzg&export=download

ダウンロードしたファイルに実行権を与える。

chmod +x gdrive

最初に実行するときには、以下のコマンドを実行する。

gdrive about

コマンド実行後に表示されるURLコピーしてブラウザでアクセスする。
アクセス後、表示される認証コードをコピーして、ターミナルに貼り付けてエンターキーを押す。

使い方

使い方は、gitのページをコピペです。手抜き (^^ゞ

gdrive [global] list [options] : List files
gdrive [global] download [options] <fileId> : Download file or directory
gdrive [global] download query [options] <query> : Download all files and directories matching query
gdrive [global] upload [options] <path> : Upload file or directory
gdrive [global] upload - [options] <name> : Upload file from stdin
gdrive [global] update [options] <fileId> <path> : Update file, this creates a new revision of the file
gdrive [global] info [options] <fileId> : Show file info
gdrive [global] mkdir [options] <name> : Create directory
gdrive [global] share [options] <fileId> : Share file or directory
gdrive [global] share list <fileId> : List files permissions
gdrive [global] share revoke <fileId> <permissionId> : Revoke permission
gdrive [global] delete [options] <fileId> : Delete file or directory
gdrive [global] sync list [options] : List all syncable directories on drive
gdrive [global] sync content [options] <fileId> : List content of syncable directory
gdrive [global] sync download [options] <fileId> <path> : Sync drive directory to local directory
gdrive [global] sync upload [options] <path> <fileId> : Sync local directory to drive
gdrive [global] changes [options] : List file changes
gdrive [global] revision list [options] <fileId> : List file revisions
gdrive [global] revision download [options] <fileId> <revId> : Download revision
gdrive [global] revision delete <fileId> <revId> : Delete file revision
gdrive [global] import [options] <path> : Upload and convert file to a google document, see 'about import' for available conversions
gdrive [global] export [options] <fileId> : Export a google document
gdrive [global] about [options] : Google drive metadata, quota usage
gdrive [global] about import : Show supported import formats
gdrive [global] about export : Show supported export formats
gdrive version : Print application version
gdrive help : Print help
gdrive help <command>  : Print command help
gdrive help <command> <subcommand> : Print subcommand help

 

Tips

Google Driveは、ファイル名でフォルダを管理しているのではなくて、File IDで管理している。
したがって、室温を書き込んだテキストファイル(room_temp.txt)を1時間ごとに追記してアップロードすると、1日あたり24個のroom_temp.txtが作成されてしまう。
この点の注意のために、このページを作った。^^;

ひとつのファイルを更新する場合は、一例であるが以下のようする。

gdrive list
1GyJqEM-rPVPuOG2p5R08S7iGJ3OhyPhB room_temp.txt bin 27.0 B 2019-02-11 21:01:05

最初のフィールドに出てくる意味不明の文字列が File IDになる。
このファイルを毎時変更するためには、以下のコマンドを実行する。

gdrive update 1GyJqEM-rPVPuOG2p5R08S7iGJ3OhyPhB ./room_temp.txt

listでFile IDを調べて、uploadで更新するのを、ワンライナーで書くと以下になる。

gdrive update $(gdrive list | grep room_temp.txt | cut -d' ' -f1) ./room_temp.txt 

ときどき、File IDが拾えない。^^;

スクリプトを作成

前項までで、ひと通りの手順が明らかになったので、シェルスクリプトを作成する。
(2019-03-11 追記)
スクリプトを作成し実行すると頻繁にエラーにみまわれた。(^_^;)
エラーの多くは、gdrive listで何も返ってこない、または、アクセスしすぎというエラーメッセージであった。
そこで、エラート対策をしたVer0.02に改良した。

cat ~/bin/up-gdrive

#!/bin/bash
# 2019-02-11 ver0.01 start
# 2019-03-11 ver0.02 エラー対策


filename="temp-$(date +"%Y-%m-%d").txt"
#echo $filename


fullpath="/home/pi/data/"$filename
#echo $fullpath


result=$(/home/pi/bin/gdrive list)
while [ -z "$result" ] || $result == *Error*
do
    sleep 10
    result=$(/home/pi/bin/gdrive list)
    #echo "$result"
done


fileid=$(echo "$result" | /bin/grep $filename | /usr/bin/cut -d' ' -f1)
#echo $fileid


if [ -n "$fileid" ]; then
    /home/pi/bin/gdrive update $fileid $fullpath
    #echo "gdrive update ${fileid} ${fullpath}"
else
    /home/pi/bin/gdrive upload $fullpath
    #echo "gdrive upload ${fileid} ${fullpath}"
fi

以下のとおり、実行権を与える。

chmod +x ~/bin/up-gdrive 

実行して、エラーが出ないか確認すること。

Crontabに登録する

実行して、エラーがでなくなったら crontab に登録する。

crontab -e
3 * * * * /home/pi/bin/up-gdrive                             # 毎時3分にファイルをアップデート すべてメール
3 * * * * /home/pi/bin/up-gdrive 1> /dev/null          # 同上 エラーのみメール
3 * * * * /home/pi/bin/up-gdrive > /dev/null 2>&1   # 同上 エラーメールも送らない

いずれも、毎時3分になると、ファイルをアップデートする。
一番上の設定では、メールが頻繁に来るので、2番目のエラーが起きたときのみメールが来るように設定するのがおすすめ。

なお、初めてcrontab を設定するときには、exim4またはpostfixなどのメールトランスファーエージェント(MTA)が必要なようです。

crontabのエラーは、/var/log/syslogに(CRON) info (No MTA installed, discarding output)等と出ますので、ファイルが更新されない場合は、確認すること。
筆者は、以下のとおりインストールした。

sudo apt-get install exim4

デフォルトの設定では、local (そのPC内のメールしか送らいない)設定になっているが、念のために以下で確認すること。

less /etc/exim4/update-exim4.conf.conf

dc_eximconfig_configtype='local'                       # この行が local になっていればOK

なお、本格的に外向きにメールを送りたいときは、以下のページを参考に設定する。
ただし、メール設定のエラーは多大な迷惑をかけるので、設定にはくれぐれもご注意を。

  • debianサーバでメールを送る(exim4編)

おわりに

Raspberry Pi3で、部屋の温度やCPU温度を計測すると、ファイルに保存したくなる。
ここでは、保存したファイルを効率よくアップする方法について考えてみた。

また、より良い方法があったら追記する。

関連ページ