読者です 読者をやめる 読者になる 読者になる

Matthewの備忘録

忘れたときはここを見ろ。何か書いてある。

昆布乾燥室温湿度モニタリングシステム その4

IoT

 忙しくて書き留めておく時間がなかなか確保できずその3から時間が経ってしまった。
 AWSIoTを利用しようかと思ったのだが、Google Spreadsheetを利用したほうが簡単そうなので、先にそちらで、遠隔地のスマフォからグラフを見れるようにした。

参考サイト:

Python gspread のインストール

 実は、その2でgitからcloneを作ったAdafruit_Python_DHTのexampleディレクトリにはgoogle_spreadsheet.pyというサンプルプログラムが含まれていて、Raspberry PiからGoogleのSpreadsheetへ直接計測値を書き込むデモンストレーションが行える。そしてそのプログラム中にgspreadというモジュールというかライブラリが利用されている。今回はこのサンプルプログラムを利用する。
 最新のRaspbian OSを使っているなら、pipを実行できるはずであるから、Pythonのgspreadパッケージをインストールできる。また、GoogleのSpreadsheetへ書き込みを行うのにOAuthのAPI認可手段を利用するのでoauth2clientもインストールしておく。因みに、下記のインストール・ログは、一度oauth2clientをインストール後にアンインストールした状態でインストールを実行したので、oauth2clientが依存しているライブラリが既にインストールされていることを示している。pip uninstall [パッケージ名]では依存パッケージを削除しないらしい(これは後でよく調べておこう)。

pi@raspberrypi:examples $ sudo pip install gspread oauth2client
Downloading/unpacking gspread
  Downloading gspread-0.4.1.tar.gz
  Running setup.py (path:/tmp/pip-build-lO9YbZ/gspread/setup.py) egg_info for package gspread
    
Downloading/unpacking oauth2client
  Downloading oauth2client-3.0.0.tar.gz (77kB): 77kB downloaded
  Running setup.py (path:/tmp/pip-build-lO9YbZ/oauth2client/setup.py) egg_info for package oauth2client
    
    warning: no previously-included files matching '*' found under directory 'tests'
Requirement already satisfied (use --upgrade to upgrade): requests>=2.2.1 in /usr/lib/python2.7/dist-packages (from gspread)
Requirement already satisfied (use --upgrade to upgrade): httplib2>=0.9.1 in /usr/local/lib/python2.7/dist-packages (from oauth2client)
Requirement already satisfied (use --upgrade to upgrade): pyasn1>=0.1.7 in /usr/local/lib/python2.7/dist-packages (from oauth2client)
Requirement already satisfied (use --upgrade to upgrade): pyasn1-modules>=0.0.5 in /usr/local/lib/python2.7/dist-packages (from oauth2client)
Requirement already satisfied (use --upgrade to upgrade): rsa>=3.1.4 in /usr/local/lib/python2.7/dist-packages (from oauth2client)
Requirement already satisfied (use --upgrade to upgrade): six>=1.6.1 in /usr/local/lib/python2.7/dist-packages (from oauth2client)
Installing collected packages: gspread, oauth2client
  Running setup.py install for gspread
    
  Running setup.py install for oauth2client
    
    warning: no previously-included files matching '*' found under directory 'tests'
Successfully installed gspread oauth2client
Cleaning up...
pi@raspberrypi:examples $ 

もしpipがインストールされていなければ、次を実行すればよい。

$ sudo apt-get update
$ sudo apt-get install python-pip

既にgspreadおよびoauth2clientのpythonパッケージがインストールされていたら、次のようにアップグレードしておいたがほうがよいかもしれない。

$ sudo pip install --upgrade gspread oauth2client

 この後、うまくいかないときは、認証関連パッケージを疑ってみたほうがよいかもしれない。google_spreadsheet.pyにはRaspbianにあるpython用opensslパッケージが少し古いために上手くいかないから、最新のpython-opensslにせよと記されている。

$ sudo apt-get update
$ sudo apt-get install python-openssl

OAuth Credentials(クライアント資格証明情報)

 既にGoogleのアカウントは取得済みであるとする。できればログインしているほうがよいだろう。
 Raspberry PiからGoogleスプレッドシートに書き込みアクセスするために、そのための資格証明書をJSONファイル形式で取得しなければならない。google_spreadsheet.pyにはhttp://gspread.readthedocs.org/en/latest/oauth2.htmlを見よと書いてあるが、現在はhttp://gspread.readthedocs.io/en/latest/oauth2.htmlに自動的に遷移する。
 上記のサイトの文書には、最初にGoogle Developers Consoleにアクセスしろと書いてあるが、Google Could Platformを既に利用を始めていたか登録していなけければ、Google Could Platformで一定の期間無料で利用できる無料トライアルに申し込むことから始める。有料でよければそれを選択しても構わない。登録していなければ次の手順を踏む。

  1. Googleアカウントにログイン。ログインせずにGoogle Could Platformを閲覧しても必ずログインを催促される。
  2. 国を選択し(日本在住なら日本でよい)、二つの、状況・状態によっては一つの受諾で「はい」を選択し、「同意して続行」を押下。
    1. 全てのCloud Platformにアクセスでき、$300相当のクレジットが与えられ、無料使用期間が終わっても自動的に請求されることがないことが示されていることを確認しほうがよい。
  3. 請求情報を入力する
    1. 口座の種類を選択(今回は個人)
    2. 名前と住所を記入
    3. メインの連絡先記入
    4. 支払い方法(デビットカード可)
    5. 使用言語(今回は日本語)
  4. 「無料試用を開始」ボタンを押下し、しばらく待つ。
  5. ウェルカムメッセージが表示される(OKを押して消す。次からは表示されないだろう。)
  6. ダッシュボード上部、"Google Could Platform"の右隣のプルダウンメニューより「プロジェクトを作成」を実行する。最初のプロジェクトのを利用してもよいが、整理しやすいように分けるほうが良いだろう。
    1. プロジェクト名を記入
    2. 詳細設定を表示をクリックしてApp Engineの場所を確認。デフォルトのus-centralでよい。
    3. 「作成」ボタンを押下して暫く待つ
  7. ダッシュボード上部の「+APIを有効にする」をクリック
    1. 検索欄で"Drive"とタイプしてリストに"Google Drive API"を出現させる。
    2. Google Drive APIの説明画面が出現するので、上部の「有効にする」をクリック。
    3. 初めて有効になると「このAPIは...」と注意メッセージ表示される。「認証情報に進む」をクリック。
      1. 「1 必要な認証情報の種類を調べる」で次の設定をして「必要な認証情報」ボタンをクリック。
        • 使用するAPIを"Google Drive API"
        • APIを呼び出す場所を「その他の非UI(cronジョブ、デーモンなど)」
        • アクセスするデータの種類を「アプリケーションデータ」
        • Google App EngineGoogle Compute Engine を使用しますか?を「いいえ、使用していません」
      2. 「2 サービスアカウントを作成する」で次の設定をして「次へ」ボタンをクリック
        • サービスアカウント名(適当に分かり易いものを)
        • サービスアカウントID(自動的に補完され、他の名前と重なることがなければサービスアカウント名、重なることがあれば適当な数字が付加される。補完されたもの以外でもよい。)
        • キーのタイプ(絶対にJSONを指定)
      3. 問題がなければ「次へ」をクリック後に「サービスアカウント作成」が実行され、自動的にJSONファイルが作業中のPCなどにダウンロードされる。このダウンロードしたファイルがOAuth Credentials(クライアント資格証明情報)である。

 OAuth Credentials(クライアント資格証明情報)は大切にとっておくように。試してはいないが、同じ内容で発行しようとすると、サービスアカウント名などを異なるものにしなければ登録できないと想像している。

認証用(資格証明)JSONファイルの配置

 どのディレクトリに置いても実行できるのか試したかったが、後日試すことにして、Adafruit_Python_DHT/examples/google_spreadsheet.pyと同じディレクトリに置いた。

Googleスプレッドシートの用意

共有

 Googleスプレッドシートの利用に慣れているという前提で、まずGoogle Drive内のどこでもよいからスプレッドシートを用意する。そして、資格証明JSONファイル中に書かれているclient_emailのメールアドレスを読み書き編集可能な編集者のメールアドレスとして登録し、共有をかける。リンクを知っている全員が閲覧可でよいだろう(このあたりのセキュリティについては後日考察する)。

  ...
  "private_key_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "client_email": "hogehoge@hogehoge.iam.gserviceaccount.com",
  "client_id": "yyyyyyyyyyyyyyyyy",
  ...
行を削除

 Googleスプレッドシートを新しく用意した時点で行が1000行用意されているが、今回のスクリプトを実行してGoogle Drive APIスプレッドシートへの書き込みを任せると、最終行に値を追加していく。これを知らないと不具合か何かがあって書き込めていないと思ってしまうだろう。実行する前に、スプレッドシートのデフォルトで用意されている2行目から1000行目を削除しておく。1行目は、左から、日付、温度、湿度、と記入しておけば分かり易いだろうし、最初の行を固定行にしておけばよいだろう。

google_spreadsheet.pyの修正

 修正箇所だけ挙げておく。CPU温度も付け加えておこう。

$ sudo vi google_spreadsheet.py
...
DHT_TYPE = Adafruit_DHT.DHT11 # DHT22からDHT11へ
...
DHT_PIN  = 4 # 23から4へ
...
GDOCS_OAUTH_JSON = "/hoge/hogehoge/abcdefg.json" # 認証用JSONファイルへのフルパス
...
GDOCS_SPREADSHEET_NAME = 'measurement' # 用意したspreadsheetの名前
...
FREQUENCY_SECONDS = 60 # 測定周期(秒)
...
    humidity, temp = Adafruit_DHT.read(DHT_TYPE, DHT_PIN) # この行の次に次の行を追加
    cpu_temp = int(commands.getoutput("cat /sys/class/thermal/thermal_zone0/temp")) / 1000
・・・

認証用JSONファイルは、google_spreadsheet.pyと同じディレクトリにおかないといけないが、GDOCS_OAUTH_JSONはフルパスでなくてもよいかもしれない(後日調べておこう)。

計測

 以上で全ての準備が整った。google_spreadsheet.pyを実行するだけである。

$ sudo ./google_spreadsheet.py
または
$ sudo python ./google_spreadsheet.py

用意したスプレッドシートに設定した周期で刻々と計測した日時、温度、湿度、CPU温度が記録されていくはずだ。

スマフォで見る

 スマフォで見るには、共有したときのダイアログ上部にリンク(URL)が表示されているので、それをスマフォでみるだけだ。メールで送るなり、QRコードにするなりして、スマフォに共有先のリンクを伝えればよい。
 PCでみれば、スプレッドシートや、そのデータで作ったグラフは自動更新されるが(自動更新される設定になっていればそうなる)、スマフォで見た場合はRaspberry Piからの情報が追加更新されても、スマフォで見ている画面は更新されないかもしれない(検証はしていない、したいところだが)。