GoogleHomeからRESTを叩いて、実行結果を喋らせるその[0~1]
の続き。
記事一覧
- [0] Raspberrypiのセットアップ
- [1] IFTTTからGoogleAssistant⇒GoogleSpreadSheetでタスク名を書き込む
- [2] ローカルネットワークに繋いだRaspberrypiで[1]を受け取る
- [3] Raspberrypiでそのまま[2]を叩く
- [4] Raspberrypiで[3]の結果を受け取る
- [5] Raspberrypiで[4]の結果をGoogleHomeに喋らせる
[2] ローカルネットワークに繋いだRaspberrypiで[1]を受け取る
RaspBerrypiからgspreadを使ってGoogleSpreadSheet内の値取得と書き込みを行う。
参考:Using OAuth2 for Authorization — gspread 3.0.0 documentation
Google側のAPI設定
Google Developers Consoleにアクセスして、プロジェクトを作成。
左上メニューからAPIとサービス>ライブラリ
「Google Sheet API」と「Google Drive API」を選択して有効にする。
先程と同じ左上メニューで「ライブラリ」の下に合った「認証情報」を押下。
認証情報を作成>サービス アカウント キーの作成
アカウント名を適当につけて、役割はとりあえずProject>編集者。
キーのタイプはJSONを選択。
作成されたjsonファイルの中には色々ごちゃごちゃと書かれているが
ここで必要なのはとりあえず「client_email」。アドレスをコピー。
[1] IFTTTからGoogleAssistant⇒GoogleSpreadSheetでタスク名を書き込むで作成したSpreadSheet画面の右上から「共有」。
アドレスを貼り付けて「送信」で共有完了。
↑のjsonファイルは後ほど使うのでどこかに保存しておく。
Raspberry側でGoogleSpreadSheetを弄る準備
$ sudo apt install python3-pip
pip3をインストール
$ sudo pip3 install gspread
$ sudo pip3 install oauth2client
$ sudo pip3 install PyOpenSSL
gspreadとoauth2clientをインストール
PyOpenSSLも環境によっては必要になるらしい。一応インストール。
$ mkdir google_test
適当にフォルダを作成。先程作成したサービスアカウントキーのjsonをこの中に入れる。
# -*- coding: utf-8 -*-
import gspread
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('保存したjsonファイルの名前.json', scope)
gc = gspread.authorize(credentials)
wks = gc.open('cue').sheet1
print(wks.acell('B1'))
pythonファイルを作ってこれもフォルダの中に入れちゃう。
テスト実行。
SpreadSheetのB1セルから「RobotName」が取得出来た。
連携に成功。
サービスアカウントキーを作成してすぐに実行するとエラーが返ってきたので、10分くらい待ってみるといいかもしれない。
未実行のタスクをSpreadSheet追加順に受け取る
# -*- coding: utf-8 -*-
import gspread
import datetime
from oauth2client.service_account import ServiceAccountCredentials
.
.
.
gc = gspread.authorize(credentials)
wks = gc.open('cue').sheet1
i = 1
for i in wks.col_values(1):
if wks.cell(i,3).value != '': #C列(RobotDirectory)がブランクでなければ
if wks.cell(i,5).value == '': #E列(start)がブランクなら
wks.update_cell(i,5,datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S")) #E列に実行開始日時を入力
robotdir = wks.cell(i,3).value #C列(RobotDirectory)を取得
print(robotdir)
先程テストしたpythonの11行目以降を書き換え。日時を書き込むのでdatetimeもインポートする。
[1] IFTTTからGoogleAssistant⇒GoogleSpreadSheetでタスク名を書き込むで準備したGASと関数により3列目には2列目から自動で変換された値が入るようになっているので、それを受け取る。
1行目から最終行までループして、C列に入力があり且つE列に入力がない行からC列の値を取ってくる。
つまり、「命令済みだが未実行の行」ということ。
取得したらE列には日時を入れ、実行済みのフラグとする。
実行。
C2、C3の値を受け取ることが出来た。
SpreadSheetを見ると、E列に実行済みを示す日時が入っている。
もう1度同じコマンドを入力しても未実行の行は無いので何も取得できない。
ここまで確認でテスト完了。