raspberry pi で取得した温度・湿度をgoogle spread sheetへ記録

以下のページの続きです。
raspberry piで取得したswitchbotの温湿度計データをgoogle spread sheetへ書き込んでいます。

https://qiita.com/tosshie/items/eee733de2540d1bf49a2


#### 前提

- switchbotの温湿度計があること
- Raspberry piの初期設定が終わっていること
- googleのアカウントを持っていること
- 上のページ↑の通り温湿度を取得できていること

https://qiita.com/tosshie/items/d06c9f57ceb340f2d589

#### 事前準備
- 基本的に以下のページを参照して実施しました

https://qiita.com/c60evaporator/items/ed2ffde4c87001111c12#python%E3%81%8B%E3%82%89gas%E3%81%AEapi%E3%82%92%E5%8F%A9%E3%81%84%E3%81%A6%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF

- google spread sheetで1個ファイルを作成
    - ファイル名は自由に設定、シート名は"test1"とします

- ツール→スクリプトエディタからgoogle apps scriptを開き、以下を貼り付ける
    - 一番上の行にはspreadsheetのIDを入力
        - urlのhttps://docs.google.com/spreadsheets/d/spreadsheetのIDはここです/edit
    - 私は以前のエディタを使用ボタンを押して、旧バージョンのUIでやっています

```
var spreadsheetId = 'スプレッドシートのIDを入れる'

//Postされたデータを受け取り
function doPost(e){
  var data = [
    e.parameter.datetime, // 日時
    e.parameter.Humidity_1F, // 1Fの湿度
    e.parameter.Battery_1F, // 1Fのバッテリー
    e.parameter.Temperature_1F, // 1Fの温度
    e.parameter.Humidity_2F, // 2Fの湿度
    e.parameter.Battery_2F, // 2Fのバッテリー
    e.parameter.Temperature_2F, // 2Fの温度
    e.parameter.Humidity_3F, // 3Fの湿度
    e.parameter.Battery_3F, // 3Fのバッテリー
    e.parameter.Temperature_3F, // 3Fの温度
    e.parameter.Humidity_LOFT, // LOFTの湿度
    e.parameter.Battery_LOFT, // LOFTのバッテリー
    e.parameter.Temperature_LOFT, // LOFTの温度
    new Date(), // アップロード終了時刻
  ];
  //取得したデータをログに記載
  Logger.log(new Date());
  //スプレッドシートへのデータ行書き込み
  addData(e.parameter.DeviceName, data);
  return ContentService.createTextOutput("ok");
}

//スプレッドシートへのデータ行書き込み
function addData(sheetName, data){
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
  sheet.appendRow(data);
}
```
- 公開→ウェブアプリケーションとして導入→
    - プロジェクトバージョン: new
    - Execute the app as: Me
    - Who has access to the app: Anyone, even anonymous <<<< ここは変更
- このアプリは確認されていません→詳細を非表示→postAPITest
- current web app URL: ここに出てくるURL(=API key)をメモ（このURLを使ってgoogle spread sheetに書き込みます）

#### APIをたたく
- curlコマンドで実行テスト
    - 以下のコマンドをraspberry piからたたく
    - API keyは↑で出てきたURLです
    - google spread sheetのB列に1000000が入るはずです

```
curl -L 'https://script.google.com/macros/s/{API key}/exec' -F 'DeviceName=test1' -F 'Humidity_1F=1000000'
```

#### Raspberry piからデータを送るための事前準備
- Requestsをinstall

```
pip install requests
```

- パッケージのインストール
    
```
sudo apt-get -y install python3-pip libglib2.0-dev
pip3 install bluepy
```

- bluepyに権限を付与 (実際にインストールしたフォルダで実行)

```
cd ~.pyenv/versions/3.7.6/lib/python3.7/site-packages/bluepy
sudo setcap 'cap_net_raw,cap_net_admin+eip' bluepy-helper
```

#### スクリプト作成
- スクリプトは、2種類作ります
    - 1. bluetooth で受信したデータを読み出すスクリプト(switchbot.py)
    - 2. データをgoogle spread sheetに送るスクリプト(switchbot_toSpreadSheet2.py)
- 1. bluetooth で受信したデータを読み出すスクリプトは、以下ページのものをそのまま使っています

https://qiita.com/c60evaporator/items/7c3156a6bbb7c6c59052


```switchbot.py
from bluepy import btle
import struct

class SwitchbotScanDelegate(btle.DefaultDelegate):
    def __init__(self, macaddr):
        btle.DefaultDelegate.__init__(self)
        self.sensorValue = None
        self.macaddr = macaddr

    def handleDiscovery(self, dev, isNewDev, isNewData):
        if dev.addr == self.macaddr:
            for (adtype, desc, value) in dev.getScanData():
                if desc == '16b Service Data':
                    self._decodeSensorData(value)

    def _decodeSensorData(self, valueStr):
        valueBinary = bytes.fromhex(valueStr[4:])
        batt = valueBinary[2] & 0b01111111
        isTemperatureAboveFreezing = valueBinary[4] & 0b10000000
        temp = ( valueBinary[3] & 0b00001111 ) / 10 + ( valueBinary[4] & 0b01111111 )
        if not isTemperatureAboveFreezing:
            temp = -temp
        humid = valueBinary[5] & 0b01111111
        self.sensorValue = {
            'SensorType': 'SwitchBot',
            'Temperature': temp,
            'Humidity': humid,
            'BatteryVoltage': batt
        }
```

- 2. データをgoogle spread sheetに送るスクリプト
    - MAC addressは小文字で入れないとだめでした
    - 私は4個の温湿度計のデータを取得したかったので、4個の温湿度計のMAC addressを指定しています
    - 4個の温度、湿度、バッテリー残量をgoogle spreadsheetに送っています

```switchbot_toSpreadSheet2.py
import requests
import datetime
import csv
import pprint
from bluepy import btle
from switchbot import SwitchbotScanDelegate

scanner1 = btle.Scanner().withDelegate(SwitchbotScanDelegate("aa:aa:aa:aa:aa:aa(ここにMAC addressを入れてください)"))
scanner1.scan(10.0)

Humidity_1F = scanner1.delegate.sensorValue['Humidity']
Battery_1F = scanner1.delegate.sensorValue['BatteryVoltage']
Temperature_1F = scanner1.delegate.sensorValue['Temperature']

scanner2 = btle.Scanner().withDelegate(SwitchbotScanDelegate("aa:aa:aa:aa:aa:aa(ここにMAC addressを入れてください)"))
scanner2.scan(10.0)

Humidity_2F = scanner2.delegate.sensorValue['Humidity']
Battery_2F = scanner2.delegate.sensorValue['BatteryVoltage']
Temperature_2F = scanner2.delegate.sensorValue['Temperature']

scanner3 = btle.Scanner().withDelegate(SwitchbotScanDelegate("aa:aa:aa:aa:aa:aa(ここにMAC addressを入れてください)"))
scanner3.scan(10.0)

Humidity_3F = scanner3.delegate.sensorValue['Humidity']
Battery_3F = scanner3.delegate.sensorValue['BatteryVoltage']
Temperature_3F = scanner3.delegate.sensorValue['Temperature']

scanner4 = btle.Scanner().withDelegate(SwitchbotScanDelegate("aa:aa:aa:aa:aa:aa(ここにMAC addressを入れてください)"))
scanner4.scan(10.0)

Humidity_LOFT = scanner4.delegate.sensorValue['Humidity']
Battery_LOFT = scanner4.delegate.sensorValue['BatteryVoltage']
Temperature_LOFT = scanner4.delegate.sensorValue['Temperature']

dt_now = datetime.datetime.now()

deviceName = 'test1'
data = {
'DeviceName': deviceName,
'datetime': str(dt_now),
'Humidity_1F': str(Humidity_1F),
'Battery_1F': str(Battery_1F),
'Temperature_1F': str(Temperature_1F),
'Humidity_2F': str(Humidity_2F),
'Battery_2F': str(Battery_2F),
'Temperature_2F': str(Temperature_2F),
'Humidity_3F': str(Humidity_3F),
'Battery_3F': str(Battery_3F),
'Temperature_3F': str(Temperature_3F),
'Humidity_LOFT': str(Humidity_LOFT),
'Battery_LOFT': str(Battery_LOFT),
'Temperature_LOFT': str(Temperature_LOFT)
}
url = 'https://script.google.com/macros/s/<API key>/exec'
response = requests.post(url, data=data)
```



#### cronの設定
- 以下の設定をしています
    - 5分おきにスクリプトを実行

```
*/5 * * * * python3 /<実際に保存した場所>/switchbot_toSpreadSheet2.py
```


-------
データをGoogle Data Portalで見やすく表示できるようにもしています

https://qiita.com/tosshie/items/34d348b31df4306db898

https://qiita.com/tosshie/items/ed1bf4ab51e0c0e43fb8


2021年3月から始めたスマートホーム化はこちらに一覧化しています（2021年5月時点）

https://qiita.com/tosshie/private/738a85184d6cdaf20b3e