ラズパイでQULIOもどき（施錠通知）を作ろう！(2025/1/28更新：LineNotify版)

※2025年4月1日以降、LINE Notifyのすべての機能が利用できなくなるとの案内が出ておりますのでこの記事もLine通知部分以外しか役に立たなくなります。
## 突然何を思い立った！？
いや、自分旅行出かけるの好きなんですよ。別に長期連休でなくても小旅行したりと家を空ける時間が長い日があるわけです。ふと思うわけですよ、しかも出発して10分くらい後に。あれ、鍵かけたっけ？？それはそれは不安に駆られるわけです。でも戻って確認したところで鍵かかってる訳ですよ。何が気になるって今鍵の状態どうなってるんだろ？が分からないから気になるんですよね。だったら自分だけに届く施錠通知があればいいんじゃね？なんなら高齢でちょっとオトボケ入った両親も使えたら便利じゃね？ってことで。

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

## 何で作りますか
取り敢えず家に転がっていた二つ
・ラズパイzero W
~~・ pi camera~~
・マグネットセンサ
これさえあればGPIOでマグネットセンサのON・OFFで鍵の状態を検知、~~鍵の状態が変化したらpi cameraで写真を撮る~~という作りたいものが達成できそう。
※Raspberry Pi Zero Wの性能が低すぎて画像を撮影して送るだけで大遅延するため早々に断念。

## 開発環境
OS：Windows 11 Pro 21H2
Raspberry Pi Zero W
PCスペックは皆さんが使用しているマシンより間違いなく性能低いです。

## 準備しよう！
まずは光の如くRaspbrrypi OSをインストール
以下からリンクからDLサイトへ飛び、
https://www.raspberrypi.com/software/

「Download for Windows」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/b74e834f-c0d5-c53d-cedf-2ffdeae52ea7.png)

DLしたセットアップファイルを実行、「Install」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/59227d64-09fe-6b8f-1231-628a9ea5b0d8.png)

インストールが終わったらチェックを外さず「Finish」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/6ac859c3-3b3d-66d8-7a50-752b6ee53c6a.png)

Raspberry PiのイメージをDL・書き込みしてくれるソフトが起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/26340ebd-7453-f0b1-0562-beda6646e65b.png)

OSは「RASPBERRY PI OS（32-BIT）」を選択、ラズパイに突っ込むmicroSDカードをPCに接続しストレージを選択、最後に「書き込む」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/524bbfe8-0d7d-c977-9190-97163bfe2342.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/8dc60866-fb72-8cbd-52d3-091a9f78213e.png)

書き込みが終わったらmicroSDをラズパイに突っ込む

## LineNotifyのトークンを発行する！
LineNotifyにアクセスする
https://notify-bot.line.me/ja/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/88d59851-0f9d-73d8-d266-7d39c5128274.png)

ログインボタンを押し、自分が使用しているLineIDでログインする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/f876de3f-4443-7329-68e9-a272287ee403.png)

ID名隣の▽をクリックして「マイページ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/54150b7a-7e60-acae-bd31-3b23976061e1.png)

「トークンを発行する」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/a2795334-3f90-1e3e-0bf0-ba1186c96345.png)

後でわかりやすいように「トークン名」を入力し、通知を送信する相手を指定する。
今回はとりあえず１：１で通知を受け取る設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/dcea8c93-a369-7d60-82c4-c3b40ed98041.png)

「発行する」ボタンをクリックするとトークンが表示される。
一度だけの表示なのでどこかしら控えておくこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/8312f8e8-f25f-8fae-b53c-05a9377999e9.png)

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



## コードを書く！
ラズパイにmicorUSBとHDMI端子、USBキーボード・マウスを接続して起動
ラズパイOSが起動したらメニューから「Thonny Python IDE」を起動
以下のコードを打ち込む
トークンは先ほどLineNotifyで発行したトークン（文字列）に置き換えること！
（urlは固定でOK）
```keyopenstatus_lite.py
from gpiozero import Button
import requests
import urllib.parse as parse
import os
import time

token = 'LineNotifyトークン'
url = 'https://notify-api.line.me/api/notify'

button = Button(13)
opn = 1
opnd = 1
cnt = 0

while True:
        if button.is_pressed:
            if opn == 1:
                pass
            else:
                print('close')
                ms_data = "鍵が掛かっています。"
                send_data = {'message': ms_data}
                headers = {'Authorization':'Bearer ' + token}
                res = requests.post(url,data=send_data,headers=headers)
                time.sleep(1)
                opn = 1
        else:
            if opn == 0:
                pass                 
            else:
                print('opne')
                ms_data = "鍵が開いています。"
                send_data = {'message': ms_data}
                headers = {'Authorization':'Bearer ' + token}
                res = requests.post(url,data=send_data,headers=headers)
                time.sleep(1)
                opn = 0
```
## 動作確認
磁石をセンサに近づけたり、遠ざけたりしてコンソールに「open」と「close」の値が返ってきていればOK。

仕上げにヘッドレス動作させるため起動時に「keyopenstatus_lite.py」を自動実行する設定

```コマンドライン.cmd
sudo raspi-config
sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart
```

エディタが起動したら以下を打ち込み、保存して閉じる。
```autostart
@python3 /保存してあるディレクトリ/keyopenstatus_lite.py
```
コマンドに戻り自動ログイン設定を行う。
```コマンドライン.cmd
sudo raspi-config
```
設定画面が開くので「1.System Options」を選択しEnterキーを押す
![2022-12-25-133012_1920x1080_scrot__.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/0250073f-01d9-b5c8-ac1b-a0d0c8fde16e.png)

次に「B4 Desktop Autologin」を選択しEnterキーを押す
![2022-12-25-133140_1920x1080_scrot__.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/bdf3c652-c6d6-dfaf-7fe3-5740502d2b4e.png)
Escキーで戻りコマンド画面を閉じる。

## ケースを作る
適当に3D図面を書いて

印刷設定を行い
![insatsu__.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/c4d4c55c-4be5-7c74-3b2e-1839c713775b.png)


印刷が終わったらラズパイとセンサ類を収めて、玄関に取り付ける。
※防犯上よろしくないので周辺はぼかしてます。悪しからず。
![IMG_3615.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603328/c3651fe3-e494-15da-0bb1-bb8a2489a48a.jpeg)

## 完成！
動作時の様子を動画に収めました。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)