Raspberry PiとGoogleスプレッドシートの連携方法 データ記録と制御の実践ガイド

はじめに

Raspberry PiとGoogleスプレッドシートを連携させることで、データの記録やグラフ化、プログラムの制御変更をスマホのアプリから手軽に実現でき、非常におすすめです。
Raspberry Pi⇔PC間でファイル共有に便利なWinSCPは以下を参照ください。

Google Cloud Platform (GCP)の設定

スプレッドシートのAPIを使える状態にします。

STEP
Google Cloud Consoleにログイン

Google Cloud Consoleにアクセス(右上のアイコン)し、Googleアカウントでログインします。

STEP
新しいプロジェクトを作成

「プロジェクトを作成」をクリックし、名前を付けてプロジェクトを作成します。

STEP
Google Sheets APIとGoogle Drive APIを有効化
  • サイドメニューからAPIとサービス→ライブラリに移動
  • Google Sheets APIGoogle Drive APIを検索して有効化
STEP
サービスアカウントの作成とキーのダウンロード
  • APIとサービス→認証情報に移動
  • 認証情報を作成」→サービスアカウントを選択
  • サービスアカウントを作成し、JSONキーを生成してダウンロード
  • JSONファイルをラズベリーパイに転送

Python環境のセットアップ

・ラズベリーパイに以下のライブラリをインストールします

pip install gspread oauth2client

# 上記で駄目なら
sudo apt install python3-gspread python3-oauth2client

# それでもだめなら以下。環境が壊れる危険がある為、自己責任でお願いします。
pip install gspread oauth2client --break-system-packages

・JSONキーを保存
先ほどダウンロードしたJSONファイルを、ラズベリーパイ内の安全な場所(例: /home/pi/credentials/)に保存します。別のPCに保存した場合は、WinSCPを使えば簡単に移動できます。

スプレッドシートの共有設定

ラズベリーパイがGoogle APIを通じてスプレッドシートにアクセスするために認証が必要です。

  • スプレッドシートを開く
  • 右上の「共有」ボタンをクリック
  • JSONファイル内に記載されているサービスアカウントのメールアドレス
    (例: your-service-account@your-project.iam.gserviceaccount.com)をコピー
  • 「共有相手を追加」にこのメールアドレスを入力し、「編集者」として追加

Raspberry Pi × googleスプレッドシート

スプレッドシートに書き込む

ラズベリーパイで取得したセンサーデータなどをスプレッドシートに書き込むコードです。
スプレッドシート名、sheet名はそれぞれ、raspberry-pi_data、raspiとしています。

import gspread
from oauth2client.service_account import ServiceAccountCredentials

# スコープの設定
scope = [
    'https://spreadsheets.google.com/feeds',
    'https://www.googleapis.com/auth/drive'
]

# 認証情報の読み込み
# ご自身のjsonファイルの保存場所を指定してください
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    r'/home/pi/****.json', scope)

# Googleスプレッドシートにアクセス
gc = gspread.authorize(credentials)

# スプレッドシートを開く
spreadsheet = gc.open('raspberry-pi_data')  # スプレッドシート名を指定
worksheet = spreadsheet.worksheet('raspi')  # sheet名を指定

# データの読み込み
data = worksheet.get_all_records()

# データの書き込み
# 14行6列めに文字を記入します
worksheet.update_cell(14, 6, 'Hello, Raspberry Pi!')

スプレッドシートの値を読み取る

データを読み取る方法を示します。
特定のセルの値を取ってきて変数に代入する、時系列データをデータフレームにして分析する等が可能です。

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(
    r'/home/pi/****.json', scope)

# Googleスプレッドシートにアクセス
gc = gspread.authorize(credentials)

# スプレッドシートを開く
spreadsheet = gc.open('raspberry-pi_data')  # スプレッドシート名を指定
worksheet = spreadsheet.worksheet('raspi')  # sheet名を指定

# 以下、様々なデータの取得方法

# 特定のセルから数値を読み取る
# 例えば、2行3列のデータを取得
value = worksheet.cell(2, 3).value  # 2行3列の値を取得
print(f"セル(2, 3)の値: {value}")

# シート全体をリスト形式で読み取る
all_data = worksheet.get_all_values()  # 全セルの値をリスト形式で取得
for row in all_data:
    print(row)

# 特定列の数値を抽出
# 例: 3列目のデータをすべて取得(ヘッダーを除く)
column_data = worksheet.col_values(3)[1:]  # 1行目(ヘッダー)を除外
print(f"3列目の値: {column_data}")

# 辞書形式でデータを読み取る
# 例: ヘッダーをキーとして各行を辞書形式で取得
records = worksheet.get_all_records()
for record in records:
    print(record)

# pandas.DataFrame に変換
# 1行目をヘッダーとし、それ以降をデータとして扱う
df = pd.DataFrame(all_data[1:], columns=all_data[0])

# 必要に応じてデータ型を変換
# 例えば数値データが文字列の場合、float に変換
for col in df.columns:
    try:
        df[col] = pd.to_numeric(df[col])
    except ValueError:
        pass  # 数値に変換できない列はそのまま

まとめ

googleスプレッドシートとラズベリーパイを連携させれば様々なデバイスから操作することが可能です。また、可視化も容易にでき、やりたいことが増えていくと思います。まずは初期設定をぜひチャレンジしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする