Raspberry Pi Zero WHで取得したセンサデータをGoogleスプレッドシートに自動記録

# はじめに
Raspberry Pi Zero WHで温度や照度を測って、Googleスプレッドシートに自動記録していく方法のメモ。
Raspberry Pi Zero WH本体のセットアップから、センサの接続、スプレッドシートへの記録まで。

# 用意したもの
- Raspberry Pi Zero WH
  * 参考URL：　https://www.switch-science.com/catalog/3646/
- RPZ-IR-Sensor Rev2.0（端子実装済 外付センサーセット）
  * 参考URL：　https://www.switch-science.com/catalog/5321/
- MicroSDカード ＆ リーダライタ
- USB ACアダプタ ＆ MicroUSBケーブル
- その他：ディスプレイ、キーボード、マウス、それらを接続するためのケーブルや変換アダプタなど

# 準備
### MicroSDカードのフォーマット
MicroSDカードをFAT32でフォーマットする。
これは、Raspberry Piがサポートしているフォーマット形式が、FAT32とFAT16のため。

4～32GBのカード（SDHC）であれば、通常FAT32でフォーマットされるので、特に留意点は無し。
32GBより大きなサイズのカード（SDXC）を使う場合は、普通にフォーマットするとexFAT形式になってしまうため、注意が必要。

32GBまでのカードを使うのが無難だけれど、64GB以上のカードでもFAT32でフォーマットすれば使える。
今回は、たまたま余っていたカードが64GBのものだったため、Disk Formatterを使ってFAT32でフォーマットした。
https://www.buffalo.jp/support/download/detail/?dl_contents_id=60879#1


### MicroSDカードへのOSイメージ書き込み
OSイメージは、以下URLからRaspbian Stretch with desktopをダウンロードした。
https://www.raspberrypi.org/downloads/raspbian/

ダウンロードできたら、balenaEtcherを使ってOSイメージをMicroSDカードに書き込む。
https://www.balena.io/etcher/

OSイメージの書き込みが完了したら、Raspberry Pi Zero WHにMicroSDをセットすれば起動できる。
が、その前にSSH有効化とWiFi設定を仕込んでおくと楽。
というわけで、以下、その手順。

### SSHの有効化
MicroSDのルート直下に「ssh」という名前の空ファイル（拡張子無し）を作成して置いておくと、Raspberry Pi Zero WHの起動時にSSHが有効化される。


### WiFi設定
以下の内容を記述した「wpa_supplicant.conf」という名前のファイルを作成し、MicroSDのルート直下に配置する。
これにより、Raspberry Pi Zero WHの起動時に、自動的にWiFiへの接続が行われる。

```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="無線LANのSSID"
    psk="パスフレーズ"
    scan_ssid=1
}
```


### Raspberry Pi Zero WHの起動
Raspberry Pi Zero WHにMicroSDカードをセット。
必要に応じて、ディスプレイ（mini HDMI経由）やキーボード（micro USB経由）等を接続した上で、電源ケーブルを接続する。
（電源スイッチは無いので、電源ケーブルを接続したらオンになる）

WiFiに接続されていること等を確認する。
ユーザ名piのパスワードを変更しておく。


### SSH接続の確認
起動したRaspberry Pi Zero WHにてIPアドレスを確認して、putty等でSSH接続すれば、つながるはず。

なお、SSHクライアント側がmDNS（multicast Domain Name System）に対応していれば、IPアドレスを確認しなくても、「raspberrypi.local」というホスト名を指定することで接続ができて楽。
macや、最新のWindows 10であればおそらく使える。
（※mDNSは、Apple製品でいうところのBonjour）


# 環境センサRPZ-IR-Sensorの利用
### Raspberry Pi Zero WHとの接続
今回用意したRPZ-IR-Sensorは、端子実装済みなので、はんだ付け不要で接続できる。
Raspberry Pi Zero WHにRPZ-IR-Sensorを重ねるようにして、Raspberry Pi Zero WHのGPIO（電源用MicroUSBと逆側の長辺にある、40ピンの接続端子）に接続すればOK。

また、今回用意したRPZ-IR-Sensorには、外付センサが同梱されている。
これは、Raspberry Pi Zero WH本体の発熱等の影響を受けずに測定するためのもの。
RPZ-IR-Sensorの端にある4ピンの端子に、接続する。
RPZ-IR-Sensor側と、外付センサ側、それぞれ、4ピン端子のところをよく見ると、各ピンの役割（SDA、SCL等）が書いてある。これが合致する向きになるよう、ケーブルの色を見て、接続すればOK。

### データの取得
RPZ-IR-Sensorを使う前に、Raspberry Pi Zero WHのI2Cを有効にする必要がある。

`$ sudo raspi-config`

と打つと、設定画面が現れる。
「5. Interfacing options」から、I2Cを有効（enabled）に設定する。

後は、サンプルプログラムを持ってきて動かせば、ひとまずセンサデータが取得できる。
サンプルプログラムへのリンクは、以下のサポートページに記載されている。
http://indoor.lolipop.jp/IndoorCorgiElec/RPZ-IR-Sensor.php

```
$ wget http://indoor.lolipop.jp/IndoorCorgiElec/RPZ-IR-Sensor/rpz-sensor.zip
$ unzip rpz-sensor.zip
$ sudo pip3 install docopt
$ python3 /home/pi/rpz-sensor/python3/rpz_sensor.py
```

うまくいくと、以下のような形でセンサデータが表示される。
0x76が外付センサ、0x77が基板上のセンサ。

```
BME280 0x76
 Temp     : 26.3C
 Pressure : 1005.3hPa
 Humidity : 36.3%

BME280 0x77
 Temp     : 32.6C
 Pressure : 1004.0hPa
 Humidity : 30.5%

TSL2572
 Lux : 285.2lux
```


# Googleスプレッドシートへのセンサデータ記録
取得したセンサデータを、Googleスプレッドシートに自動記録したい。
要件は以下。

- 定期的にセンサデータを取得し、Googleスプレッドシートに追記
- 過去一定期間のデータ（24時間分、等）を対象に、センサデータをグラフ表示

以下の記事を参考にさせていただいた。
https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3

今回使ったスクリプト等は、以下に置いてある。
https://github.com/nabon/raspberrypi-to-spreadsheet

- sample.xlsx
- script.gs
- measure.py

まず、Googleスプレッドシート上で、記録用のシートを作成する。
sample.xlsxは、シートのサンプル。以下のような仕様になっている。

- 151行目以降に、センサデータが記録される。
- 新しいデータが上にくる。（151行目が最新データ）
- 2行目～145行目には、過去144回分のデータ（151行目～294行目のデータ）が転記される。10分間隔のデータなら24時間分に相当。
- 温度、気圧、湿度、照度のグラフは、2行目～145行目を対象として描画。

「ツール」から「スクリプトエディタ」を開いて、スクリプトを作成する。
script.gsは、スクリプトのサンプル。
過去60,000回分（10分間隔だとおよそ1年分）の測定データを記録するようになっている。

「公開」から「ウェブ アプリケーションとして導入」を選択。
ダイアログの指示に従って、導入処理をする。

ここまでできたら、Raspberry Pi Zero WH側へのプログラム配置と定期実行の設定を行う。

rpz_sensor.py等がある場所と同じ場所（`/home/pi/rpz-sensor/python3/`）に、measure.pyを置く。
measure.pyは、rpz_sensor.pyを参考にしたもので、センサデータの取得とGoogleスプレッドシートへの送信を行うプログラムになっている。
measure.pyの以下の箇所に、スプレッドシートのスクリプトの、ウェブアプリケーションのURLを記載する。

```
url = "<URL of web application>"
```

measure.pyを実行すると、スプレッドシートにデータが1行追記されるはず。
これを、cronで定期実行するように設定する。

まず、cronのログが出力されるように設定する。

`$ sudo nano /etc/rsyslog.conf`

以下のようにコメントアウトを外す。

```
#cron.* /var/log/cron.log
↓
cron.* /var/log/cron.log
```

ログシステムを再起動。

`$ sudo /etc/init.d/rsyslog restart`

cronのスケジュールを設定する。

`$ crontab -e`

以下のように記載する。（10分毎に実行する場合）

```
*/10 * * * * /home/pi/rpz-sensor/python3/measure.py
```

スケジュールされていることを確認する。

`$ crontab -l`

ログの確認は以下。

`$ sudo cat /var/log/cron.log`


以上で、定期的にスプレッドシートへの記録が行われるはず。
おつかれさまでした。