UnitV2 WiFi IP Slack通知

# １．はじめに
UnitV2はWiFiが使えるので、WiFi経由でUnitV2にSSH接続することができます
※通常通りUnitV2をPCにUSB接続するとネットワークとして認識されPCのWiFi接続を邪魔することがあるので、WiFi接続を実施しています
ただ、ウチの環境ではWiFiが不調なことがあり、WiFi接続できていないのか、前回と別IPで接続できているのかイマイチ判断できないことがあります（9割方WiFi不調なのですが）
そこで、UnitV2起動時にSlackへIPを通知する仕組みを作りました。

これにより、以下のメリットがあります。
・UnitV2が起動したことを判別できる
・久しぶりの利用でIPを忘れてしまった時に役立つ
・他の環境に持って行った際にIPが分かる

固定IP化だけで十分な方は以下のサイトを参考にして下さい
[【中級者向け】M5Stack UnitV2をハックするためのTips](https://raspberrypi.mongonta.com/m5stack-unitv2-tips-for-hack/)

# ２．Slack準備
Slack incomming Webhookを設定し、投稿用URLを取得します
こちらの手順は今回は省略しますので、以下のサイトなどを参考にして下さい。
[Slack での Incoming Webhook の利用](https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8)

# ３．Pythonライブラリインストール
WiFi IP取得、Slack送信処理として今回はPythonで組みました
IPを取得するのにipgetを使用するのでインストールします。
※当初netifacesを使おうとしましたが、pip installでエラーがでたのでipgetに変えました

```
unitv2% sudo pip install ipget
```
※m5stackユーザではエラーがでたのでsudoで実行
このままだとrootユーザでインストールされるので、実行権限を付与する為にインストールフォルダを確認

```
unitv2% sudo pip show ipget

Name: ipget
Version: 0.0.3
Summary: This package is for those that know the local ip in linux.
Home-page: http://kitagami.org
Author: Yuta Kitagami
Author-email: hokusin02@gmail.com
License: LGPL
Location: /usr/lib/python3.8/site-packages
Requires:
Required-by:
```
実行権限を付与

```
unitv2% cd /usr/lib/python3.8/site-packages
unitv2% sudo chmod 755 ipget*
unitv2% ls -la ipget*
-rwxr-xr-x    1 root     root           881 Dec 20  2012 ipget.py
-rwxr-xr-x    1 root     root          1266 Nov 22 14:23 ipget.pyc
```

# ４．IP取得処理実装
i_am_here.py

```
import requests
import json
import socket
import ipget
import time

WEB_HOOK_URL = "https://hooks.slack.com/services/xxxx" # WebHookURLをセット

host = socket.gethostname()
print(host)

ip = ""
cnt = 0
while(ip == "" and cnt <= 60):
    cnt+=1
    try:
        ip = ipget.ipget().ipaddr("wlan0")
        if ip == "10.254.239.1/24":
            ip = ""
        print(ip)
        time.sleep(5)
    except:
        time.sleep(5)
        print("Waiting network connection...")

if ip != "":
    cnt = 0
    while(cnt <= 10):
        try:
            cnt+=1
            text = "I'm here!\n" + "[host]" + host + "\n[ip]" + ip
            requests.post(WEB_HOOK_URL, data=json.dumps({
                "text" : text,
            }))
            break
        except:
            time.sleep(5)
            print("Slack send error...retry")

    print(text)
    print("Send to Slack done.")
else:
    print("network connection search timeout.")
```
IPを取得する処理とSlackに送信する処理で1回で処理が成功しないことがあり、適度にリトライループをいれています

# ５．UnitV2起動時処理実装
/etc/init.d配下に起動スクリプトを配置することで起動時実行ができます
また、pythonを起動するためのshellスクリプトも間に入れています

i_am_here.sh（i_am_here.pyと同ディレクトリに配置）

```
#!/bin/sh

cd $(cd $(dirname $0);pwd)

date >> i_am_here.log
python i_am_here.py >> i_am_here.log 2>&1
```

実行権限付与

```
unitv2% chmod +x i_am_here.sh
```

/etc/init.d/S99local

```
#!/bin/sh

case "$1" in
        start)
                sudo -u m5stack /home/m5stack/work/i_am_here.sh
                ;;
        stop)
                ;;
        restart|reload)
                ;;
        *)
                exit 1
esac

exit 0
```
引数でstart/stop/restart/reloadに対応するように実装しています
パスは配置したパスに合わせて下さい

実行権限付与

```
unitv2% sudo chmod +x S99local
```

# ６．動作確認
再起動で起動時にIP Slack通知してくれるか確認します

```
unitv2% sudo reboot
```

Slack通知を確認することができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2042441/3f40babe-038d-b03e-bc83-24456065eefd.png)