ラズパイでQULIOもどき（施錠通知）を作ろう！(Line Messaging API版)

## LineNotifyが終わる！？
気付いたらLineNotifyサービスが終了との情報……
折角作ったQULIOもどきが機能しなくなってしまう…
代替機能を探してみるとLine Messagin APIというものが公開されているのでこちらを採用、改めて作り直してみた。

## 作りたいもの
・鍵を掛けたら鍵の状態を撮影、「鍵を掛けた！」とテキストでLineに通知を飛ばしたい

## 何で作りますか
取り敢えず家に転がっていた二つ
・ラズパイzero W
・マグネットセンサ
これさえあればGPIOでマグネットセンサのON・OFFで鍵の状態を検知、という作りたいものが達成できそう。

## 開発環境
OS：Windows 11 Pro 24H2
Raspberry Pi Pico2 W

## まずはLine Messaging APIの登録・設定を行う！
Messaging API - LINE Developersにアクセスし、右上のコンソールにログインするボタンをクリックする。
https://developers.line.biz/ja/services/messaging-api/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/7e3aa5e3-be1a-ee0d-68de-dc698e97016e.png)


LINEアカウントでログインをクリックし、自分が使用しているLineIDでログインする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/3e92b8ca-993e-bbcd-7dbb-dadbd6ffc410.png)


新規プロバイダーを設定するため、プロバイダー欄の作成ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/fbebfd8b-0620-1220-f155-29f43631ac21.png)


新規プロバイダー作成画面で名前を付けて作成ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/d93e32b3-64e1-fb43-5843-f30e2af207f1.png)


チャネル設定から画面中央のMessaginAPIをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/f11dfc95-b87c-657c-a1e9-b53589bb3784.png)


LINE公式アカウントを作成するをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/721e853d-f422-f7ba-2439-f74bca89d175.png)

自分のアカウントでログインする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/f10b1e1c-c57b-74a5-a027-a2b745097e69.png)

必須項目だけ入力し確認ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/6ca53392-2a75-0338-63d4-a0007f580065.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/127508c9-9a2a-1e40-27ed-1b99696d1dec.png)

入力内容を確認し、完了ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/bad60156-fc46-61a0-c44e-25b3cc8d2643.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/2e706bea-12a6-96cf-6211-3efbf60612d4.png)

LINE Official Account Managerの画面で同意をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/c450ca61-0a75-0c4c-d4ac-d7c6ad50a646.png)

個別規約への同意も同意をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/4f15c57b-4f86-80fe-52f6-c3e234abeef6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/64b1ce22-7f85-9b60-86f8-ccc636d77b3e.png)

アカウント名を入力し次へをクリック、ホーム画面を移動を押してホーム画面に移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/e0d23fef-c900-e550-42d4-c9f83c56cb03.png)

画面右上当たりの設定をクリックし、左側のツリーからMessaginAPIをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/dbf2b534-11ce-e211-605d-ade42a8a25f3.png)

MessaginAPIを利用するをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/c731bd7b-c5c6-b66f-2e3e-643e1baa0190.png)

作成済みのプロバイダーを選択、もしくは新規でプロバイダー名を指定して同意をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/b2d33ccf-22e4-2549-e021-6cd6b41db412.png)

プライバシーポリシーなどは無視してOKをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/bbb6385c-9abf-797f-2e96-ab53b0b93b04.png)

一度接続したプロバイダーとは解除ができない警告が表示されるのでOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/39ab80d5-693c-abb6-4b76-aa5601e1a688.png)

LINE Developersに戻り、コンソールトップから作成したチャネルをクリックし、MessaginAPI設定を開いた最下段にチャネルアクセスト－クンがあるのでメモ帳などエディターに控えておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/03a69ef0-964f-608a-f608-ee070a573646.png)



## 回路を作る！
適当に以下のイメージで回路を構成する。
プルアップ抵抗ってなんぞやみたいな人はググってください。
![Untitled Sketch_回路図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/d46f717a-10b9-0442-a545-a0d903e14dee.png)



## コードを書く！
ラズパイとPCをmicorUSBで接続し、「Thonny Python IDE」を起動する。
インストールしていない場合はThonnyをインストールしておくこと。

以下のコードをそれぞれraspberrypi pico2 Wに保存する。
main.pyがあることにより起動時に自動でimportに示されているpyファイルを順次実行してくれる。
今回で言うとwifi.pyとkeyopenstatus_lite.pyを順番に実行してくれる。

```main.py
import wifi
import keyopenstatus_lite
```

```wifi.py
import network
import time

SSID = '接続するWIFIの名前（SSID）'
PW = 'WIFIのパスワード（平文なのでセキュリティ的に良くはない…）'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PW)

while wlan.isconnected() == False:
    print('Connecting to Wi-Fi router')
    time.sleep(1)

wlan_status = wlan.ifconfig()
print('Connected!')
print(f'IP Address: {wlan_status[0]}')
print(f'Netmask: {wlan_status[1]}')
print(f'Default Gateway: {wlan_status[2]}')
print(f'Name Server: {wlan_status[3]}')


```

```keyopenstatus_lite.py
import machine #import Pin
import os
import time
import network, urequests
import requests
import json

led = machine.Pin("LED", machine.Pin.OUT)
token = 'チャネルアクセスト－クン'
url = 'https://api.line.me/v2/bot/message/broadcast'
headers = {'Authorization': f'Bearer {token}','Content-Type': 'application/json; charset=UTF-8;'}

button1 = machine.Pin(16,machine.Pin.IN,machine.Pin.PULL_UP)
button2 = machine.Pin(18,machine.Pin.IN,machine.Pin.PULL_UP)

opn = 1
opnd = 1

while True:
        #if button.is_pressed:
        if button2.value():
            if opn == 1:
                time.sleep(0.5)
                pass
            else:
                #print('Open')
                messageText:str = "KeyOpen"
                #data = {'to': user_id,'messages': [ {'type': 'text','text': messageText} ] }
                data = {'messages': [ {'type': 'text','text': messageText} ] }
                response = requests.post(url, headers=headers, json=data)
                time.sleep(0.5)
                led.value(0)
                opn = 1
        else:
            if opn == 0:
                time.sleep(0.5)
                pass
            else:
                #print('Lock')
                messageText= 'keyClose'
                data = {'messages': [{'type': 'text','text': messageText}]}
                response = requests.post(url, headers=headers, json=data)
                time.sleep(0.5)
                led.value(1)
                opn = 0
```

## 動作確認
磁石をセンサに近づけたり、遠ざけたりして作成した公式アカウントから「open」や「close」のメッセージが返ってきていればOK。

3Dプリンターでケースを作りラズパイとセンサ類を収めて、玄関に取り付ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/98a4288c-c464-6d28-9e3c-1b720d1a1517.png)

## 完成！
LineNotify時代の動作している様子を動画に収めました。gifなんで粗々ですけどね･･･
![無題の動画 ‐ Clipchampで作成 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/b89431cc-5ed2-1b87-f469-180566cb6d35.gif)
![無題の動画 ‐ Clipchampで作成 (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/d7e8d286-6756-4a03-ec31-e886473af807.gif)