【ラズパイピコ】Raspberry Pi Pico Wでインターホン呼出しをスマホにLINE通知(LINE Messaging API)

その他

【ラズパイピコ】Raspberry Pi Pico Wでインターホン呼出しをスマホにLINE通知(LINE Messaging API)

Raspberry Pi Pico WとLINEのMessaging APIを利用して、自宅インターホン呼び出しが押されたことをLINE通知の受け取りにて気付けるようにしました。
この方法であれば、外出中でも電波が届く所ならインターホンが鳴ったことがリアルタイムでわかります。

2025年3月まではLINE Notifyのサービスを利用して同様のことを行っていましたが、LINE Notifyのサービス終了に伴いMessaging APIの方法に乗り換えました。

Raspberry Pi Pico W初期設定およびインターホン室内機との接続作業

ハード的な作業の説明です。

Raspberry Pi Pico Wの初期設定

本作業で使用するRaspberry Pi Pico Wです。
OSがない安価な商品ですが、Wi-Fi機能が備わっているものになります。

Pico2というシリーズもリリースされています。

パソコンにてRaspberry Pi Pico Wにファームウェアを書き込み、プログラミング言語「MicroPython」を使用できるようにします。

プログラミングの開発環境である「Thonny」をパソコンにインストールし、ソースコードを書き込める準備を行います。

Raspberry Pi Pico Wの初期設定については以下の記事をご参照下さい。

【ラズパイピコ】Raspberry Pi Pico Wの初期設定からLチカするまでの方法(MicroPython)
Raspberry Pi Pico Wを初期設定してからLチカさせるまでの手順をご紹介します。メカ屋の私でも取っ付きやすく、ソフトの勉強をするにはうってつけだと思います。Raspberry Pi Picoは安価で、無料の開発環境も存在しているので初期投資もほとんどかかりません。

インターホン室内機とRaspberry Pi Pico Wの配線接続

インターホン室外機の呼び出しボタンが押されると、室内機のA接点回路が繋がります。
そのA接点回路にRaspberry Pi Pico Wの3.3V出力と、任意の入力用GPIOを接続することで、呼び出しボタンが押されたことをRaspberry Pi Pico Wに認識させます。
その為の配線接続作業を行いますが、電気的な危険を伴う作業なのでご注意下さい。

インターホン室内機と接続できたRaspberry Pi Pico WにはUSBケーブルで電源供給できるようにしておきます。

インターホン室内機のA接点とRaspberry Pi Pico Wを配線で接続する方法については以下の記事をご参照下さい。

【ラズパイピコ】Raspberry Pi Pico Wをインターホン室内機のA接点に接続して入力信号を取得する方法
インターホン室内機のA接点とRaspberry Pi Pico Wを配線で接続することでインターホン室外機の呼び出しを入力信号として取り出すことができました。これを何かしらの通知に利用できそうです。

LINE Messaging API の登録と設定

途中の細かい設定方法は割愛しており主要な点のみご説明します。

LINE BusinessIDの登録

以下サイトにて、「アカウントを作成する」からLINE BusinessIDの登録を行います。
https://www.lycbiz.com/jp/login/

LINE公式アカウントの作成

先ほどの画面に従って設定を進めます。
LINE公式アカウントの項目で、メールアドレスでアカウントを作成していきます。
途中で設定する業種は「個人・個人(その他)」にしました。
運用目的は「その他」、主な使い方は「メッセージ配信用」としました。

表示に従って設定を行うと、LINE公式アカウントが作成されます。

ユーザーIDの確認、トークンの発行

LINE Official Account Managerでログインし、表示に従って進めるとホーム画面が表示されます。
ホーム画面右上の「設定」を押します。

画面左側の項目で「Messaging API」を選択します。
その後、画面中央に表示される「Messaging APIを利用する」を押します。

プロバイダーを作成・選択します。
次の表示でプライバシーポリシーと利用規約を尋ねられますが、個人利用なので登録欄は空白のまま次に進み、完了すればMessaging APIが有効になります。

LINE Official Account Managerホーム画面右上のアカウントマークから「設定」を押します。

LINE Business IDの画面にて、LINEの項目が未連携になっているので右のアイコンを押して連携させます。
これを行っておかないと後述するLINE Developersでの「あなたのユーザーID」が表示されません。

LINE Official Account Manager画面にて「応答設定」を表示します。
応答機能「応答メッセージ」のラジオボタンをOFFにしておきます。

LINE Official Account ManagerのMessaging API画面下の方の“その他の設定はLINE Developersから行えます。“の「LINE Developers」(現在は「LINE Developersコンソール))を押します。

コンソール(ホーム)画面が表示されます。
(LINE Developersホーム画面の場合は右上に表示される「コンソール」を押してコンソール画面に遷移します。)
Adminを選択してチャネル設定で使用するプロバイダーを選択します。

「チャネル基本設定」画面を下にスクロールし、「あなたのユーザーID」を確認し、IDを控えておきます。

「Messaging API設定」画面で表示されるQRコードをスマホで読みこめば友達追加できます。
画面下のチャネルアクセストークンのチャネルアクセストークン(長期)で「発行」を押すとトークンが表示されます。
ここまでで取得したユーザーIDとトークンをプログラムに書き込めば個人宛にLINE通知させることができます。

グループ通知させるためのID取得(個人宛のみ通知させる場合は作業不要)

LINE Official Account Manager画面にて、設定→アカウント設定→機能の利用→トークへの参加 項目を「グループ・複数人トークへの参加を許可する」に変更します。

Googleスプレッドシートを使用する必要があるので、Googleアカウントがない場合は登録する必要があります。
ブラウザにてGoogleスプレッドシートを開き、スプレッドシート名を任意に変更しておきます。
そこに表示されているURLの「/d/」と「/edit」の間にある「スプレッドシートID」を控えておきます。
拡張機能からApps Scriptを選択します。

Apps Scriptのプロジェクト名を任意に変更します。
コード.gsの表示にて、初期状態で記載されているコードは全て削除します。
白紙になったところに以下のコードを記載します。
「スプレッドシートID」と記載している部分は先ほど控えておいたスプレッドシートIDを記載します。

function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if (event.type === 'message' && event.source.type === 'group') {
      var groupId = event.source.groupId;

      // スプレッドシートに記録
      var sheet = SpreadsheetApp.openById('スプレッドシートID').getActiveSheet();
      sheet.appendRow([new Date(), groupId]);
    }
  });
  return ContentService.createTextOutput(JSON.stringify({ 'content': 'post received' }))
    .setMimeType(ContentService.MimeType.JSON);
}
//参考記事  https://zenn.dev/mojakun/articles/5443f647e49998

コードが記載できれば保存ボタンを押してドライブに保存します。
保存できれば画面右上のデプロイから「新しいデプロイ」を選択します。

表示された画面内の設定から「ウェブアプリ」を選択します。

アクセスできるユーザーを「自分のみ」から「全員」に変更し、「デプロイ」を押します。

その後のページで表示される「アクセスを承認」を押します。
アカウント選択画面にて自身のアカウントを選択し、ビックリマークが表示される画面にて左下に出てくる「Advanced」を押します。
次の画面も同様の位置にある「Go to LINE_GroupID(unsafe)」(中間部分の名称は自身が設定したプロジェクト名)を押します。
次の画面で「Allow」を選択します。
新しいデプロイの画面でウェブアプリ項目に表示されているURLをコピーし、完了を押します。

LINE Developers画面に移り、”Messaging API設定”の”Webhook設定”の”Webhook URL”の「編集」を押します。
するとURLを記入する欄が表示されるので、先ほどコピーしたウェブアプリのURLを貼り付けます。
そして「更新」ボタンを押します。

その下にある”Webhookの利用”ラジオボタンをONに切り替えます。

LINE Official Account Manager画面にて、“設定”→“Messaging API”画面にある”Webhook URL”にURLが記載されていることを確認して右にある「保存」を押します。
もし空白だった場合は画面の更新を行ってください。

LINEアプリにて、公式アカウントが参加しているグループラインに、内容は何でもよいのでメッセージを送信します。
その後スプレッドシートを表示すると、LINEにメッセージを送信した日時の隣に「グループID」が表示されているので控えます。
このグループIDとトークンをプログラムに書き込めばグループ宛にLINE通知させることができます。

LINE Developersにて”Webhookの利用”ラジオボタンはOFFに戻しておきます。

お試しソースコードでインターホン呼び出しからのLINE通知確認

上記の準備が整った状態で、インターホンの呼び出しボタンが押されるとLINE通知が来るソースコードを試してみたいと思います。

以下のソースコードをコピーしてThonnyにペーストし、Raspberry Pi Pico Wに「main.py」のファイル名で保存します。
(至らない点もあると思いますがご容赦下さい。)

import machine
import utime
import network, urequests
import gc
import ujson

SSID = 'SSIDを入力'   #Wi-FiのSSIDを入力
password = 'passwordを入力'   #Wi-Fiのパスワードを入力
token = 'トークンを入力'   #Messaging APIで発行したトークンを入力
LINE_id = "ユーザーIDまたはグループID"   #個人宛ならユーザーID、グループ宛ならグループIDを入力
url = 'https://api.line.me/v2/bot/message/push'
message="visitor"   #表示されるメッセージ

led= machine.Pin('LED', machine.Pin.OUT)
sw = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)

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

data = {
             "to": LINE_id,
             "messages": [{"type":"text", "text":message}]
             }
header = {
        'Content-Type' : 'application/json',
        'Authorization' : f'Bearer  {token}'
        }

while(not wlan.isconnected()):
    print('connecting...')
    utime.sleep(1)
print('connected.')

presw = 0
nowsw = 0

while(True):
    nowsw = sw()
    if presw == 0 and nowsw == 1 :
        led.on()
        for num in range(2):   #LINE通知回数
            req = urequests.post(
                url,
                data = ujson.dumps(data).encode("utf-8"),
                headers = header
            )
            req.close()
            utime.sleep(0.5)
        led.off()
        presw = nowsw            
        print(message)
        utime.sleep(0.5)
    elif presw == 1 and nowsw == 0 :
        presw = 0
        print('presw = 0')
        utime.sleep(3)
    else:
        led.on()
        utime.sleep(0.5)
        led.off()
        utime.sleep(0.5)
        print('wait')
        utime.sleep(0.5)

※7~10行目は書き換えが必要です。
「SSIDを入力」には使用するWi-FiのSSIDを入力して下さい。
「passwordを入力」には使用するWi-Fiのパスワードを入力して下さい。
「トークンを入力」にはMessaging APIで発行したトークンを入力して下さい。
「ユーザーIDまたはグループID」には上記作業で取得したIDを入力して下さい。
いづれも前後の「’」(ダッシュ、プライム)は残します。

入力用GPIOはGP16として作成しています。

Raspberry Pi Pico WにUSBケーブルで電源を供給すると以下の動作を行うはずです。

このコードでは、電源供給するとWi-Fi接続を開始し、接続が完了すればRaspberry Pi Pico WのLEDが点滅して待機状態に入ります。
その状態でインターホンの呼び出しボタンが押されると数秒間LEDが点灯し、それとほぼ同じタイミングでLINE通知が来るはずです。
メッセージ内容も任意で設定できるので、今回は「visitor」としています。

一回の通知では気付けない場合があるのではないかと思い、このコードでは一回の呼び出しにつき連続で2回の通知が来るようにしています。

動作状況の参考としては、サービス終了となったLINE Notifyのものと同様なので以下の記事内の下にある動画をご参照下さい。

【ラズパイピコ】Raspberry Pi Pico Wでインターホン呼出しをスマホにLINE通知(スピーカー2階増設の代用)
Raspberry Pi Pico Wを利用して、自宅インターホンの呼び出しボタンが押された際にLINE通知が来るようにしてみました。室内機の呼び出し音が届かない場所(外出中含む)にいてもスマホを持っていればインターホンが鳴ったことに気付けるようになりました。

まとめ

Raspberry Pi Pico Wを利用して、自宅インターホンの呼び出しボタンが押された際にLINE通知が来るようにしてみました。
LINE Notifyサービスが終了してしまったので、Messaging APIのサービスを利用して実現しました。

室内機の呼び出し音が届かない場所にいてもスマホを持っていれば来客に気付けるようになりました。
LINE通知を受け取れる環境があれば、外出中でもインターホンが鳴ったことがわかります。

コメント

タイトルとURLをコピーしました