筆者はラズパイを無線LANにつないで、WindowsからTera Termで操作してます。
IPを固定化しないで使っているので、まれにIPが変りWindowsからつながらなくなってしまいます。
都度、ディスプレイつないで確認するのがめんどくさいのでラズパイ起動時にLineとSlackに通知するようにしました。
作成に当たり以下の記事を参考にさせていただきました。
環境
- raspberrypi4
- Linux raspberrypi 5.10.103-v7l+
- Python3
手順
Line通知の事前準備
Line Notifyを使って通知を行うので、事前にLineからAccess Tokenを取得します。
1.Line Notifyにログインします。IPを通知したいアカウントでログインしてください。
2.ログイン後、トークンを取得をクリックしてAccess Tokenを作成します。
- トークン名:任意の名称
- トークルーム:1:1でLINE Notifyから通知を受け取る
として発行するをクリックします。
この後のプログラムで使用するので、発行されたAccess Tokenをメモ帳などにコピペします。
重要
- ページを閉じると2度と表示されないので、必ずコピペしていることを確認してください。誤って閉じた場合は、新しく発行してください。
以上でLINEの事前準備は完了です。
Slack通知の事前準備
次はSlackの事前準備です。
Incoming Webhookを使って通知します。Slackn App Directoryで準備していきます。
1.Slackn App Directoryでログインして、IPを通知したいワークスペースを選択します。
ワークスペースを新規で作ることもできます。
2.Incoming Webhookの設定をします。
検索ボックスでIncoming WebhookをSlackに追加します。
通知先のチャンネルを選択します。新規で作ることもできます。
選択したらIncoming Webhookインテグレーションの追加をクリックします。
インテグレーションの設定を行います。
この後のプログラムで使用するので、WebhookURLをメモ帳などにコピペしてください。
特に変更せずデフォルトのままでOKです。必要に応じて画像などを設定してください。
設定したら、設定を保存するをクリックします。
以上でSlackの事前準備は完了です。
通知プログラムの作成
今回は、Pythonで通知プログラムを作成します。ipgetでIPを取得し、取得したIPをLINEとSlackに通知します。
どちらか一方のみに通知したい場合は、コメントアウトや削除するなどして無効にしてください。
1.slack通知のためのライブラリをインストールします。
python3 -m pip install slackweb
ポイント
- slackweb以外のライブラリはインストール不要の想定ですが、環境によってプログラム実行時にライブラリのインポートでエラーになる場合があります。
その際は、slackwebと同様にpipでインストールしてください。
例)python3 -m pip install ipget
2.任意のディレクトリにをプログラムファイルを作成します。
例)workフォルダにnotice.pyを作成する場合
cd work
touch notice.py
コードは以下の通りです。
<CODE>
作成したファイルにコピペします。
重要
- 「書き換え項目1」、「書き換え項目2」の部分をそれぞれ下準備でコピペしたAccess Token、WebhookURLに書き換えます。
# -*- coding: utf-8 -*-
import requests
import ipget
import slackweb
def line(message:str):
url = "https://notify-api.line.me/api/notify"
token = "LINE通知の事前準備で作成したAccess Token" # 書き換え項目1
headers = {"Authorization": "Bearer " + token}
params = {"message": message}
r = requests.post(url, headers=headers, params=params)
print(r.text)
def slack(message:str):
url = "Slack通知の事前準備で作成したWebhookURL" # 書き換え項目2
slack = slackweb.Slack(url=url)
slack.notify(text= message)
if __name__ == '__main__':
ip_address = ipget.ipget()
message = f"IP Address: {ip_address.ipaddr('wlan0')}"
line(message)
slack(message)
2.プログラムを実行して通知されるか確認します。
作成したプログラムを実行します。
python3 notice.py
プログラムが正常終了するとIPアドレスが通知されます。
ラズパイ起動時に自動通知させる
rc.local を使って自動起動するように設定します。
このファイルに実行したい処理を記述することで、OS起動時に実行させることができます。
1./etc/rc.local にプログラムファイルの実行を追記します。
任意のエディタで/etc/rc.local を開きます。
vi で開く場合は
sudo vi /etc/rc.local
exit 0の上にコマンドを追記します。ファイルのパスは環境に自身の置き換えてください。
末尾に&を付けているのはバックグラウンドで実行するためです。
# notice LINE/Slack
/usr/bin/python3 /home/root/work/notice.py &
<rc.local>
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# notice LINE/Slack
/usr/bin/python3 /home/root/work/notice.py &
exit 0
2.ラズパイのConfigを設定します。
コマンドを実行してConfigを開きます。
sudo raspi-config
1 System Optionsを選択します。
S6 Network at Boot Select wait for network connection on bootを選択します。
<はい>を選択します。
<了解>を選択します。
<Finish>を選択します。
3.ラズパイを再起動します。
sudo reboot
ラズパイの起動にあわせてLine/SlackへIPが通知される事が確認出来ればOKです。
通知されない場合、次の補足を参考に原因を調査・解消してください。
補足:自動通知されない場合の対応
筆者が実装時に確認した問題と調査/対応方法を残しておきます。
1.rootでプログラムが実行できるか試してみる
rc.localはrootで実行されるため、rootでプログラムが実行されるか確認します。
ルートに昇格
sudo su root
プログラムの実行
python3 notice.py
実行時にimportエラーが出た場合、改めてライブラリをインストールしてから再度プログラムを実行してみてください。
これは、プログラム作成時にroot以外のユーザを使っていたことで、pipでインストールしたライブラリのインストール先が、rootが参照している場所と異なるためrootでライブラリが正しく見えていないためです。
そこで、rootでインストールすることでライブラリを参照できるようにしています。
まとめ
無事、ラズパイのIPをLineとSlackに通知できるようになりました。
ラズパイのIPを固定IPにすればいいじゃんって話ですが、理由あって固定IPにできない場合もあると思います。
結構手軽に実装できていちいちディスプレイつながなくても、IPが確認できるようになったのでいい感じです。
興味ある方はぜひ試してみてください。