窓の開閉を検知するセンサーを作る

窓が開いているかどうかをモニターする仕組みを作ってみました。
窓が開いているか閉まっているかをgoogle spreadsheetに書き込みます。

#### 前提

- raspberry piの初期設定が終わっていること
    - 今回はraspberry pi zero WHを使っています
    - HDMIの変換コネクタとUSBの変換コネクタを使った以外はraspberry pi 4 model Bと同じやり方で初期設定しています
    - 電源とキーボードでコネクタが埋まってしまうのでマウスがなくて不便ですが、TabとSpaceを駆使して入力しました
- 開閉センサーを購入していること
- ブレッドボードがあること
- ジャンパーケーブルがあること（オス-メス * 2本）

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

開閉センサーは、これを使っています。

マグネットスイッチAMS-10C
https://www.amazon.co.jp/dp/B00NOUSVGS


#### ケーブル接続

- ラズベリーパイの6番ピン（GND）に黒いケーブルのメスをつなぐ
- ラズベリーパイの12番ピン（GPIO18）に白いケーブルのメスをつなぐ
- ブレッドボードの5eに黒いケーブルのオスをつなぐ
- ブレッドボードの1eに白いケーブルのオスをつなぐ
- センサーのケーブルを1aと5aにつなぐ

※ 下の絵では白のケーブルは紫で書いています

![mado_kairo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/cc85ef19-a4e2-34c8-132d-15fb62ce5cde.png)


- このページを参照しながらやりました
https://jellyware.jp/kurage/raspi/daiso_sensorlight.html


#### スクリプト作成
↑のページに記載されているプログラムをコピペして、sensor.pyで保存
※ ↓のプログラムではsleepを1秒に長くしています

``` sensor.py
import time
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BCM)
 
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)
 
sw_status = 1
 
while True:
    try:
        sw_status = GPIO.input(18)
        if sw_status == 0:
            print("Close")
        else:
            print("Open!")
 
        time.sleep(1)
    except:
        break
 
GPIO.cleanup()
print("end")
```

#### スクリプト実行
- センサーが近づいているとClose、離れているとopen!が出力されるはずです


```
$ sudo python sensor.py
Close
Close
Close
Close
Close
Open!
Open!
Open!
Open!
Open!
Open!
Open!

```

#### 1分おきに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でやっています

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

//Postされたデータを受け取り
function doPost(e){
  var data = [      
    e.parameter.Date_Master, // マスター日時     
    e.parameter.Mado_1F_north,    
    e.parameter.Mado_2F_north,    
    e.parameter.Mado_2F_south,     
  ];
  //取得したデータをログに記載
  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に書き込みます）

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

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


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

- スクリプトを作成
    - これは1階北側用。他の場所にするときは、"Mado_1F_north"を変更する。

```mado_status.py
import time
import RPi.GPIO as GPIO
import requests
import datetime
import csv
import pprint

dt_now = datetime.datetime.now()

GPIO.setmode(GPIO.BCM)

GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)

sw_status = 1

sw_status = GPIO.input(18)
if sw_status == 0:
    mado_status = "Close"
else:
    mado_status = "Open!"
GPIO.cleanup()

print(mado_status)

deviceName = 'test1'
data = {
'DeviceName': deviceName,
'Date_Master': str(dt_now),
'Mado_1F_north': str(mado_status),
}

url = 'https://script.google.com/macros/s/{API key}/exec'
response = requests.post(url, data=data)
```

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

#### cronの設定

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

```
*/5 * * * * python /{実際に保存した場所}/mado_status.py
```

#### 設置
窓に設置します。

* Open! の時

![DSC_1157.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/cf09d68c-03eb-bca2-3816-cbfa6a50badf.jpeg)

* Close の時

![DSC_1158.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/087a7836-d916-8290-df05-34b757223341.jpeg)





#### 他の窓の分を作成

- 他の窓の分のセットを作成します


---------
ポータルでの開閉状態の表示もできるようにしています

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


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

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