最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
- Raspberry Piで測定したデータをcsvに出力してるけど外部から確認できない。
- Dropboxを使えば外出先からでも確認できそう
- RubyでDropboxAPIをつかってアップロードしてみた。
Dropbox使ってますか?
オンラインストレージサービスはいろいろありますが、やっぱりDropboxが一番かなぁと感じてます。
チームで使う、とかだとboxやGoogleドライブとか共有して編集できるほうがいいと思いますが、個人的にはDropboxですね。
そんなDropboxですが、オンラインストレージサービスという特性を生かしてこんな使い方してみました。
- Raspberry Piで測定した温度、湿度情報をcsvに出力してグラフ化する
- DropboxApi をつかってDropboxにアップロード
- 外出先から確認
Raspberry Piで温度、湿度を測定してcsvに出力してグラフ化する
これは去年の夏にやった[ラズパイ] Rubyを使ってBME280センサの気温、湿度、気圧をslackに通知するをもとにしてcsvに出力するスクリプトを作成しました。
ついでに、csvを読み込んでgruffをつかってグラフ化するスクリプトも同梱しています。
使い方はそのうち紹介します。
DropboxApiをつかってDropboxにアップロード
ここからが今日の本題。
Dropboxが公式に出しているSDKだとRuby向けって無いんですよね。
Rubyの場合はCommunity SDKsの DropboxApi by Jesús Burgos Maciá を使ってくれってことみたいです。
使い方は簡単です。
事前準備としてDropboxにアプリを登録してアクセストークンを取得しておきます。
Dropbox App Consoleを開いて Create app
ボタンからアプリを追加します。
Dropbox API と Dropbox Business APIの選択がありますが、Dropbox APIを選択します。
次にアクセス権についてアプリ専用フォルダのみにするのか、アカウント単位にするのかと聞かれますが、ここは App folder を選ぶ方をオススメします。
App folder にするとDropboxのルートに アプリ というフォルダが作成され、さらにそのなかにアプリ名のフォルダが追加されます。このアプリ名のフォルダのみが作成したアプリから操作可能な領域になります。
作成したらアプリの設定画面で Generated access token のところにある Generate ボタンを押すと新しいトークンが発行されるので控えておきます。
いよいよRubyでDropboxへアップロードするスクリプトを作り込んでいきます。
まずはgemをインストール
1 |
$ gem install dropbox_api |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if ENV['DROPBOX_API_TOKEN'].nil? exit end require 'dropbox_api' db_client = DropboxApi::Client.new(ENV['DROPBOX_API_TOKEN']) filename = '20180518.csv' db_client.upload( sprintf('/%s', filename), IO.read(file_name), :mode => :overwrite ) |
はい、以上です。簡単ですね〜、短いですね〜。
要点をかいつまんで説明します。
最初のif文は環境変数 DROPBOX_API_TOKEN
が設定されていなかったらスクリプトを終了します。
アクセストークンはスクリプトにハードコーディングするのではなく、環境変数に設定するほうがよいでしょう。
それ以降は DropboxAPI をつかってファイルをアップロードするものです。
ここではスクリプトファイルと同じフォルダにある 20180518.csv
をアップロードする想定です。
upload()
の第1引数でアップロードするファイル名を指定しますが、最初に /
を忘れないようにしましょう。
/
がDropboxのどのフォルダを指すかは利用するアプリのアクセス権設定によります。
今回は App folder を指定して作成したので アプリ/[アプリ名] のフォルダがルート扱いとなります。
full Dropbox を指定したときはHOMEがルート扱いとなります。
ちなみにフォルダを作成してアップロードしたいときは /2018/05/18.csv
とすると自動的にフォルダも作成してくれます。
次に、第2引数ではアップロードするファイルの内容を指定します。今回はファイル名からIO.read()をつかって読み込んでいますが、文字列をしていすることもできます。
最後、第3引数で :mode => :overwrite
を指定していますが、これはすでに同名のファイルが存在しているときに上書きするオプションになります。
省略すると :mode => :add
となり新規アップロードとなるため、次回以降に差分が生じたファイルを同名でアップロードしたときにエラーとなります。
1 2 |
`build_result': path/conflict/file/.. (DropboxApi::Errors::UploadWriteFailedError) |
実行は次のように環境変数を設定してからスクリプトを実行します。
1 2 |
$ DROPBOX_API_TOKEN=hogehogeaccesstoken; ruby upload_dropbox.rb |
これでDropboxの アプリ/[アプリ名]/20180518.csv にファイルがアップロードされます。
それじゃ、rubyスクリプト側の20180518.csvを編集してから再度スクリプトを実行してみましょう。
そうすると、Dropbox側の20180518.csvも更新されているはずです。
外出先(Dropbox iOSアプリ)から確認
DropboxのiOSアプリを立ち上げたら ファイル を開いて アプリ>[アプリ名] と進むとアップロードしたファイル(20180518.csv)が有るはずなので、開いてみましょう。
アプリがあればcsvファイルだってきれいに表示されるって知ってました?
これでいつでもRaspberry Piからの温度情報を確認することができるようになりました。
あとはcrontabにアップロードスクリプトの実行を設定して1時間毎にファイルをアップロードするように設定したらいい感じになりそうです。
アップロードするファイル名が日によって異なったりする場合はいい感じにスクリプトを調整してください。
ちなみに、最初に紹介したリポジトリには sync_dropbox.rb
が追加済みです。
最後に
これで自宅においてあるRaspberry Piが測定した温度、湿度が外出先からでも確認できるようになりました。
これから暑くなるので、一体昼間は何度あったんだろう、とかわかるようになりました。
ただ、わかったからってそれが何?といわれるとそれまでなんですが(笑)