techrmc’s blog

ICT大好きな中小企業診断士のブログです

ESP-WROOM-02を用いた自作のWiFiドアセンサ 〜LINE通知版〜

以前の記事(IFTTT版)では、扉が開いたことを検知すると、IFTTTサーバ上のアプレットを叩き、IFTTTのアプレットスマホへメール送信していました。
techrmc.hatenablog.com
ここでは、IFTTTを利用せず、スマホのLINEアプリへメッセージを表示する仕組みに改造します。
LINEアプリへのメッセージングには、Notify APIを用います。
Notify APIについては、ネット検索で多数の記事が見つかるので、先達の記事を参考にさせて頂きました。参考にした記事例を2つほど。

burariweb.info
qiita.com

LINE Notifyを利用するには、まずLINEにログインしてトークンを取得する必要があります。トークンの取得方法は先達の記事をご覧ください。

検知回路

検知回路は以前の記事(IFTTT版)から改造せず、そのまま使用します。

プログラム

LINEのNotity APIを叩くよう、IFTTT版を改造しました。
Esp_Line_Notifyというライブラリを利用すると、もっとシンプルに記述できるようですが、ここではEsp_Line_Notifyは利用しない方式としました。改造箇所は次の通りです。

Notify APIの固定パラメータ

LINE Notify APIを叩くための固定パラメータをセットします。

// LINE
const char* host = "notify-api.line.me";
const int httpPort = 443;
const char* token = "xxxxxxxx";
const char* message = "PostBox: Opened";

上記ではtokenを"xxxxxxxx"と伏せてありますが、実際には取得したトークンの文字列で置き換えます。
messageは、LINEアプリに表示されるメッセージ文です。ここでは、"PostBox: Opened"が表示されます。

clientオブジェクト

IFTTT版ではWiFiClientクラスを使っていましたが、Notify APIではHTTPS接続が必要なため、WiFiClientSecureクラスを使います。

WiFiClientSecure client;

Notify APIのキック

IFTTT版のsend2IFTTT()の代わりに、次のsend2LINE()を用います。
client.setInsecure()は証明書の検証を省くためのコードです。

void send2LINE(){ 
    client.setInsecure(); 
    if (!client.connect(host, httpPort)) {
        return;
    }
    
    String content = String("message=") + String(message);
    client.print(String("POST /api/notify HTTP/1.1\r\n")
                   + "Host: " + host + "\r\n"
                   + "Authorization: Bearer " + token + "\r\n"
                   + "Content-Length: " + String(content.length()) + "\r\n"
                   + "Content-Type: application/x-www-form-urlencoded\r\n\r\n"
                   + content + "\r\n"); 
    unsigned long timeout = millis();
    while (client.available() == 0) {
        if (millis() - timeout > 5000) {
            client.stop();
            return;
        }
    }
  
    // Read all the lines of the reply from server
    while(client.available()){
        String line = client.readStringUntil('\r');
    }
}

スマホ画面

スマホのLINE画面を次に示します。扉を開ける度に"PostBox: Opened"というメッセージが表示されているのがわかります。ちなみに、"IoT"はトークン発行時に登録したトークン名で、トークン発行時に任意の文字列が設定可能です。

LINE Notify画面