ラズパイ + Google Data Portalで自宅の気温・湿度をグラフ化


※2021/8/20
期間指定の部分の手順を変更しました。

これなに

 ラズパイで自宅周りの気温・湿度を取得して、スマホやPCでサクッと見れるようにしました。

 出来上がりは下記リンクになります。

 自宅周辺の気温・湿度の推移

動機

 Google DataPortalを使えるようになりたいなーと思っていたので、練習のためにやってみました。
 実際に作ってみると、なんとなく暑いなーと思っていたものが、何時から暑くなり始めて何時頃まで暑いのか、夜は何℃くらいまで下がるのかといったことがわかるようになって、色々面白いです。一家に一台くらいあってもいいかも。

 こだわった点としては、データを見る時にスマホでサクッと見れるという点を一番のポイントとして考えました。

 なお、パソコンは本業ではないので洗練された手順になっていないと思います。もっといい方法やスクリプトの書き方等あれば教えていただけるとありがたいです。

※2021.08.22 追記
DataPortal使えるようになりたいなーの第2弾を作成しました。
DataPortalで燃費の可視化

概要

  1. ラズパイで気温・湿度計測、spreadsheetに送信
  2. Google DataProtalでグラフ化
  3. スマホやPCのブラウザでアクセスするとデータが見れる

使ったもの

  • ラズパイ(手元に3B+が余っていたので今回は3B+で。ゼロWなら5000円くらい?)
  • DHT22(端子3本のやつ。1300円くらい)

つまづいた点

  • ラズパイのデータ取得
     DHT22というパーツから、pythonでデータを取得します。
     この時モジュールのimportがうまくいきませんでした。
     詳細は本文参照。

  • ラズパイからspreadsheetへのデータ送信
     最初、pythonモジュールのgspreadでやろうと思ったんですが、接続が上手くできませんでした。
     仕方ないので、最終的にはGASのWebアプリにGETで投げてspreadsheetに自動的に追記する形にしました。

手順

1. ラズパイで気温・湿度計測、データ送信

1-1.気温・湿度の計測

ラズパイで気温・湿度を計測する手順については、下記のサイトを参考にさせていただきました。
ありがたや。
非常にわかりやすかったので、このページでは詳細書きません。

簡単!Raspberry pi(ラズパイ)で温度・湿度(DHT22)を測る方法

ファイル構成(ラズパイ):

  • /home/pi/
    • Adafruit_Python_DHT
      • sample
        • get_temp.py
    • temperature.csv
    • get_temp.sh

 get_temp.pyで気温・湿度を取得し、そのままspreadsheetに送信します。
 うまくspreadsheetに送信できなかった時に手作業でspreadsheetを修正できるよう、homeディレクトリ(home/pi/)にあるtemperature.csvにも記録しときます。
 このスクリプトをcronで1時間ごとに実行します。

 つまづいた点としては、スクリプトファイルを置く場所がAdafruit_Python_DHTにあると、モジュールのimportでエラーが出てうまくいきませんでした。Adafruit_Python_DHT内に新たにフォルダを作ってその中でget_temp.pyを動かすとうまくいくようです。

get_temp.py
#!/usr/bin/python3
# coding: utf-8
import csv
from datetime import datetime
import Adafruit_DHT as DHT

# select sensor
SENSOR_TYPE = DHT.DHT22

# select GPIO
DHT_GPIO = 2

# DHT22からデータ取得
h, t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO)
t = '{0:0.1f}'.format(t)
h = '{0:0.1f}'.format(h)
time = datetime.now()
time = time.strftime('%Y-%m-%d %H:%M')

# ラズパイのCSVにデータ書き込み
with open('/home/pi/temperature.csv', 'a') as f:
    writer = csv.writer(f)
    writer.writerow([time, t, h])

# GAS Webアプリにデータ送信
import requests

url = 'https://script.google.com/macros/s/[spreadsheetのID]/exec?date_now={}&t={}&h={}'.format(time, t, h)
requests.get(url)

spreadsheetのID部分については、後ほどGoogle spreadsheetを準備したらまた修正します。

get_temp.sh
cd Adafruit_Python_DHT/sample
sudo python3 get_temp.py

cronも一応記載すると
00 * * * * /home/pi/get_temp.sh
です。

1-2. Google spreadsheetでのデータ受け取り

 GASでGETを受け取ってspreadsheetに追記します。
 1行目の項目名だけ作っておいて、GASのエディタを開きます。
 
 具体的な手順は下記のサイトを参考にさせていただきました。
 ありがたや。
 GASでGetパラメータを受け取ってスプレッドシートに書き込む方法

GASのコード
function doGet(e) {
  var date_now = String(e.parameters.date_now);
  var t = String(e.parameters.t);
  var h = String(e.parameters.h);
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow([date_now, t, h]);
}

 GASのWebアプリがデプロイできたら、ラズパイ内に保存したget_temp.pyのID部分をこのWebアプリのものに修正します。

 1時間おきにラズパイからデータが送られてくると、下記のような感じでspreadsheetにデータが追加されていきます。

2. データのグラフ化

 Google DataPortalにログインして新規のレポートを作成します。
 

 レポートで使う元データとして、気温データを保存したspreadsheetを指定します。

 レポートの編集画面になるので、レポートのレイアウトを整えます。

  • レポート名を編集

  • 図形の四角とテキストでページのタイトルを作成

  • コントロールを追加:期間設定を追加

    • データ.デフォルトの日付範囲.詳細設定(直近7日間を指定)

  • グラフを追加:スコアカードで最高気温を追加
    • 指標をtemperatureに変更、集計方法を最大値に変更


  • グラフを追加:スコアカードで最低気温を追加
    (手順は最高気温と同様)

  • グラフを追加:時系列グラフで気温の推移を追加

    • ディメンション:time(日付、時)
    • 指標:temperature


  • グラフを追加:時系列グラフで湿度の推移を追加
    (手順は気温の時系列グラフと同様)

  • レポートに最初から表示されていたデータテーブルの設定を変更

    • ディメンション:time(日付、時)
    • 指標:気温、湿度
    • 並べ替え:time(日時)、降順

  • ページ全体のテーマとレイアウトを整える

    • テーマ:エッジ
    • レイアウト:キャンパスサイズ.カスタム.幅380 高さ1100
  • 共有設定を、インターネット上の誰でも閲覧できるよう変更(これは任意)

完成。
自宅周辺の気温・湿度の推移

まとめ

 手探りで色々やってたら結構時間かかったんですが、記事にまとめてみるとそれほど大したことやってないですね。
 ただ、Google spreadsheetとDataPortalは無料で使えるのにここまで便利なツールが作れるので、ほんとにGoogle様様だと思います。頑張って便利なものができると楽しいですね。

 あと、うちは長野県の田舎にあるので、日が暮れると一気に気温が下がるのがグラフを見るとはっきりわかります。東京に住んでた頃は夜中まで暑くて大変だったんですが。夏はやっぱり長野最高。