日常がちょっとだけ便利になる電子工作

# インターホン検知をスマホに通知しよう
やろうやろうと思っていたがついつい先延ばしになっていたインターホン検知のシステムだったが、この度実際に運用開始できたのでそのメモを残しておきます。
***
## 動機
- リビング以外にいると音を聞き逃すから
- 外出中の自宅への訪問がわからないから
主な動機は上記２点。
[高級インターホン](https://panasonic.jp/door/contents/select/smartphone.html)ならオンライン接続可能でスマホで確認も簡単なんだろうが、マンションの共有部分を交換などできるわけもないのでDIYで解決することにした。
***
## やりたいこと
- インターホンが鳴ったらLineに通知がくるようにしたい

外出中は来客があったことがわかれば十分だが、在宅中に見過ごすわけには行かないのでお知らせの遅延は極力減らす。
***
## システム構成
- RaspberryPi zero 
    - microSD 8gb
    - microusb to usb cable
- USB Mic（Aliexpressで200yenくらい)
- python3

逸般の誤家庭にはよくあるラズパイで初期投資を。
新たに購入したのはUSB Micのみ。Amazonなら700円ほどで即届くがのんびり海を超えて200円ほどで到着したものを使用する。
<img width="200" alt="2022-10-02 17.07.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/e0c3c003-1037-7ab3-9929-1b31113979f5.jpeg"> <img width="300" alt="usbmic2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/a3f0ec5a-1e99-ff08-4322-745a4fdfb340.png">
***
## 処理概要
1. リアルタイムに音の取得
2. インターホンの音の識別
3. IFTTT経由でLineNotifyへ通知
※notify-apiを直接実行でもいいけど通知先などスマホから操作しやすいので今回はIFTTT経由
***
## ざっくり図
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/88472ba3-90ed-2401-a79a-7d4d3a77feaf.png">

```特定の音を拾ったらIFTTT経由でスマホに通知するシンプルな構成```
***
## 準備
1. RaspberryPiのセットアップ
    - [公式ページ](https://www.raspberrypi.com/software/)からセットアップツールを使用してOSインストール
2. 音の取得確認
    - micの確認
        - arecord -lでマイクの認識を確認
            ~~~
            pi@raspberrypi:~ $ arecord -l
            **** List of CAPTURE Hardware Devices ****
            card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
              Subdevices: 0/1
              Subdevice #0: subdevice #0
            ~~~
         - card1,device0 で認識されていたのでインターホンを手動で録音してみる
            ~~~
            pi@raspberrypi:~ $ arecord -D plughw:1,0 mic.wav
            Recording WAVE 'mic.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
            ~~~
    - [Audacity](https://forest.watch.impress.co.jp/library/software/audacity/)で録音したインターホンの音の詳細を確認してみる
        - 録音した音を再生しながら、インターホンの波形が現れる箇所を特定
            - インターホンの波長が現れる箇所選択して、「解析→スペクトル表示」を選択する。
            ![スペクトル表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/1fbde37f-910d-fa84-d52a-eba74ecbf95f.png)
        - FFT解析（周波数解析）してインターホンの周波数を識別する → [FFT解析とは？](https://kgrneer.com/fourier-fft-kaisetu/)
            - 横軸が周波数、縦軸は周波数成分の大きさで構成されている
            - 最大振幅の周波数を確認
                - 今回は511Hzと649Hzの周波数を検知したらインターホンが鳴ったと判断する
            ![周波数解析.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/59b6acc0-609c-a17a-7205-684f9ebd77fd.png)
        - IFTTT、[LineNotify](https://notify-bot.line.me/ja/)の設定  
            1. IFTTTアプレットはトリガー:bellhop:をWebhooks、アクションをLine Notifyを選択する
                <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/72e19ecd-0086-ef11-f2ea-3c617d8eb016.png">
            2. Webhooksのトリガーイベントキーを設定（POSTの後のURLを後ほど使用する）
                <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/9195b53e-ac3c-15ba-1606-bbc1b38f0cc3.png">
            3. Line Notifyの通知のアカウントと、メッセージの設定
                <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/725c0cdb-0810-1c90-fa61-6cddb52d8801.png">
            ```周波数検知時にWebhooksをトリガーにしてLineNotifyへ通知する```
            ※IFTTTの基本的な使い方は[こちら](https://atmarkit.itmedia.co.jp/ait/articles/1711/22/news031.html)
            ※Webhooksの基本的な使い方は[こちら](https://ifttt-japan.club/apply-webhooks)  
***
## プログラム
1. インターホンの音を検知したらアマゾンエコーに喋らせるプログラムをベースにして一部改変
    ```
    git clone https://github.com/kenmasumitsu/intercom.git
    ```
    検知したあとAlexaに喋らせる部分のコード
    https://github.com/kenmasumitsu/intercom/blob/master/detector.py#L332
    をIFTTTの処理に変更

        detector.py
        speak_alexa() -> requets.post("iftttのwebhooks url")
2. 必要パッケージのインストール
    ```
    apt install python3-pyaudio python3-numpy python3-scipy
    pip3 install python-dotenv
    ```
3. FFT解析で確認した周波数を入力
    ```
    FREQ_1ST: float = 511.0  # ピンポーンのピンの周波数
    FREQ_2ND: float = 649.0  # ピンポーンのポーンの周波数
    ```
    https://github.com/kenmasumitsu/intercom/blob/master/detector.py#L26-L27
4. まずは手動でプログラム実行して動作確認を行う
    ```
    python detector.py -w wav
    ```
5. 問題なく検知できることが確認できたら
    ```
    ./run.sh
    ```
    を実行する
    nohup付きで実行されるのでTerminalを閉じてもプログラムが実行されたままになっている。
***
## 参考にしたコード
https://github.com/kenmasumitsu/intercom

***
## おしゃれではないインターホン周りの写真
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245304/f2943985-3e0b-23c7-d5c7-4d2c884a2dee.jpeg">

***
## おわりに
RaspberryとMicでインターホンの通知を行うことはできました。
ただ、、、いかんせんおしゃれではない。
全くスマートではないのでここは要改善項目である。

***
## もっとスマートに。。。
M5StickC-Plusというものを見つけた。
マイク、バッテリー内蔵で小型のキットがあるらしい。
みんなのAliexpressでも販売しているようなので機会があればこちらでも試してみようかなと思う。

https://github.com/m5stack/M5StickC-Plus

https://ja.aliexpress.com/item/1005003297502591.html?gps-id=pcStoreJustForYou&scm=1007.23125.137358.0&scm_id=1007.23125.137358.0&scm-url=1007.23125.137358.0&pvid=850fc1f7-a7a8-4292-8faf-bb192c549025&_t=gps-id%3ApcStoreJustForYou%2Cscm-url%3A1007.23125.137358.0%2Cpvid%3A850fc1f7-a7a8-4292-8faf-bb192c549025%2Ctpp_buckets%3A668%232846%238113%231998&pdp_ext_f=%7B%22sku_id%22%3A%2212000025078737107%22%2C%22sceneId%22%3A%2213125%22%7D&pdp_npi=2%40dis%21USD%2119.95%2119.95%21%21%21%21%21%400b1b207816649796534035337e1af4%2112000025078737107%21rec&spm=a2g0o.store_pc_home.smartJustForYou_6000640622363.0&gatewayAdapt=glo2jpn

Sony製のおしゃれなやつは開発用のUIも筐体デザインも洗練されていて素敵です（やすけｒ

https://meshprj.com/jp/