洗濯物が出ているかどうかを機械学習モデルで判別してgoogle spreadsheetへ出力する

目標は、洗濯物が出ているのに雨が降り始めたら教えてくれるようにすることです。

前回、前々回で洗濯物が出ているかどうかを予測できるようにするところまで作りました。

https://qiita.com/tosshie/private/a3e451910857571b3fdd

https://qiita.com/tosshie/private/012dac7f6da60ba24f11


#### 10分おきにgoogle spread sheetに記録 (google spread sheet側の設定)

* 基本的に以下のページを参照して実施しました

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でやっています

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

function doPost(e) {
var jsonString = e.postData.getDataAsString();
var data = JSON.parse(jsonString);
  
// 今日の日付の取得
const date = new Date()
   
// シート取得
var ss = SpreadsheetApp.openById(spreadsheetId);
var sheet = ss.getSheetByName("test1");
  
// シートに記載のある最終行を取得
const lastRow = sheet.getLastRow()+1
// シートのA列に日付を「xxxx/xx/xx」の形式で挿入
sheet.getRange(lastRow, 1).setValue(Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss'))
sheet.getRange(lastRow, 2).setValue(data.predictions[0].label)
sheet.getRange(lastRow, 3).setValue(data.predictions[0].confidence)
sheet.getRange(lastRow, 4).setValue(data.predictions[1].label)
sheet.getRange(lastRow, 5).setValue(data.predictions[1].confidence)
sheet.getRange(lastRow, 6).setValue(data.predictions[2].label)
sheet.getRange(lastRow, 7).setValue(data.predictions[2].confidence)

```


- 公開→ウェブアプリケーションとして導入→
    - プロジェクトバージョン: 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に書き込みます）

- curlコマンドで実行テスト
    - 以下のコマンドをraspberry piからたたく
    - API keyは↑で出てきたURLです
    - google spread sheetには以下のように入るはずです
        - A: 日付と時刻
        - B: nai
        - C: 1
        - D: deteru
        - E: 0.1
        - F: mienai
        - G: 0.01

```
curl -X POST -H "Content-type: application/json" -L "https://script.google.com/macros/s/<API key>/exec" -d " {\"predictions\": [{\"label\": \"nai\", \"confidence\": 1}, {\"label\": \"deteru\", \"confidence\": 0.1}, {\"label\": \"mienai\", \"confidence\": 0.01}]}"
```


#### 1分おきにgoogle spread sheetに記録 (raspberry pi側の設定)

- スクリプトを作成
    - シェルで書いています
    - なかなか力業なシェルになっています。もう少しスマートな方法あると思うので、どなたか教えてください
    - (このくらいの技術力でも作れるぐらい簡単なものだと思ってもらえれば)

```shashin.sh

#!/bin/sh
fn=$(date +%Y%m%d%H%M%S)
raspistill -o /<写真の保存場所>/${fn}.jpg
predata=`sudo python3 /<lobeのモデルの保存場所>/tflite_example.py /<写真の保存場所>/${fn}.jpg`
data=`echo $predata | sed -e 's/Predicted://g' | sed -e "s/'/\x5c\"/g" | sed "s/^/\"/g" | sed "s/$/\"/g"`
echo $data

curl=`cat <<EOS
curl
 --verbose
 --request POST
 https://script.google.com/macros/s/<API key>/exec
 --header 'Content-Type: application/json'
 --data $data
EOS`
eval ${curl}

```

- スクリプトを実行して値がgoogle spread sheetに書き込まれることを確認


#### cronの設定

- 以下の設定をします
    - 10分おきにデータを記録

```
*/10 * * * * sh /<シェルを保存した場所>/shashin.sh
```

----------
next actionはこちらです

https://qiita.com/tosshie/items/6ec2b118ac016811a24a

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

https://qiita.com/tosshie/items/82dcc6405925b12d2fd1