Node.js経由でRaspberryPiやObnizからLINEへの通知を行ってみる

前からも持ってはいたのですが、obniz Board 1Y(以降Obnizとします)を入手しました。これまでObnizを使って行っていたのはWeb経由でのアプリ開発まではおこなっていました。具体的には以下のようなものをつくっています。

protopedia.net

この中ではObnizはタイマー処理、大型のソレノイドの制御(木魚を鳴らす)、リレー制御(ブッダマシン起動)を行っています。基本的にはUIありきという内容だったのでWebのインターフェースを使用するのもちょうどよかったのかなと思います。

f:id:ueponx:20210413142530p:plain

個人的にはあまりWebのUI開発に関しては得意ではないので、出来ればNode.jsなどのコードから直接から制御できればいいなと思っていました。ただ、手を付けられていませんでした。

そんな中、「obniz IoT コンテスト 2021 | elchika」が開催されるという話をきいたので、ちょっと使ってみようと思いました。(アイデアに使うかはまだ決めていない)

elchika.com

そこで検索したところ以下のようなものがあることを見つけました。Node.jsで動くことは知っていましたが、LINEのNotifyのメッセージを送信することができるようでした。

qiita.com

今回はこちらを利用して、Obnizだけでなく、RaspberryPiでもNode.jsをつかってメッセージ送信をしてみようと思います。

LINE側の事前設定

LINE側ではそのままではメッセージの送信を行うことができません。そこでLINE側で事前設定を行う必要があります。

以下のリンクをクリックし、LINEにログインを行ってください。(LINEアカウントを持っていない方は残念ながらこの機能は使用することはできません)

notify-bot.line.me

以下のような表示になるので、

f:id:ueponx:20210413002250p:plain

画面上部右側にあるユーザー名のプルダウンをクリックし、その中からマイページを選択します。

f:id:ueponx:20210413002253p:plain

すると表示が変わり以下のような画面に遷移します。続いてはアクセストークンの発行(開発者向け)にある 【トークンを発行する】ボタンをクリックします。

f:id:ueponx:20210413002257p:plain

すると、ダイアログが表示されます。ここで【トークン名】と【通知を送信するトークルーム】の設定を行います。トークン名は識別に使用できるようにメッセージに付加される情報になるので、わかりやすいものを使用しましょう。相手先は自分に遅れればとくに問題はないかなと思いますが、宛先の方がびっくりしないように注意してください。

f:id:ueponx:20210413002301p:plain

今回は最終的にObnizからメッセージ送信を行うので、以下のようにObniz通知を設定しました。宛先は自分のみに設定しています。設定が終わったら、下の方にある【発行する】ボタンをクリックします。

f:id:ueponx:20210413002305p:plain

すると、トークンが発行されます。ここで表示されるトークンは1度きりの表示なので、忘れずにコピーを行って保存してください。

f:id:ueponx:20210413002309p:plain

【閉じる】ボタンをクリックすると、先ほどの情報が連携中サービスとして登録されています。これでLINE側の事前作業は完了です。

f:id:ueponx:20210413002313p:plain

RaspberryPiをホストとして使用する

今回はNode.jsさえ動作すれば、処理系はなんでもよいのですが、今回は導入が比較的慣れているRaspberryPiにしました。まずは、RaspberryPiにNode.jsをインストールしていきます。バージョンを自由にかえる事のできるnを導入するのでもよいのですが、今回は普通にインストールを行っていきます。以下のようにするとNode.jsの14系がインストールされ、npmなどもインストールされます。

Node.jsのインストール

$ curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt-get install -y nodejs

参考

github.com

RaspberryPiからLINE Notifyメッセージを送信する

Node.jsがインストールができたので、続いてはLINEのNotifyメッセージを送信するというモジュールをインストールしていきます。

再掲

qiita.com

インストールは以下のようにすればOKです。

$ npm install line-notify-nodejs

インストールが問題なく行われたら、以下のようなapp.jsを作成します。途中にある*の羅列は先ほど生成したLINE側のトークンになりますので、入れ替えてください。

app.js(情報ページからの抜粋)

const lineNotify = require('line-notify-nodejs')('****************************'); // 先ほど生成したトークン

lineNotify.notify({
  message: 'send test',
}).then(() => {
  console.log('send completed!');
});

こちらを使用して、以下のように実行を行うことで

$ node app.js

メッセージがLINEアプリ側に送信されます。

f:id:ueponx:20210413005745j:plain

送信元はLINE Notifyから送信されます(個人から起こるのではなく、個人の持つNotifyというチャンネルから送信されることになります。複数に送信する場合には、事前設定時に自分が所属しているグループ指定を行う必要があります)

今回は表示が[Obniz通知]となっていますが先ほどLINE側で設定したトークン名がはいりますので、RaspberryPiだけで終わる場合には設定は変更しておいた方がいいでしょう。

Obnizから送信する

無事にNode.jsから送信することができたので、続いてObnizのイベント(ボタンの押下)を使用してメッセージを飛ばしてみます。以下のエントリが非常に参考になります。

toyoshi.hatenablog.com

まずは、Node.jsObnizの連携をするモジュールをインストールします。先ほどインストールしたline-notify-nodejsも忘れずにインストールしておいてください。

モジュールのインストール

$ npm install obniz 
$ npm install line-notify-nodejs

インストールの参考 obniz.com

モジュールのインストールが終わったら、以下のようにapp.jsというファイルを作成して、メッセージを送信します。途中にある*の羅列は先ほど生成したLINE側のトークンになりますので、入れ替えてください。また、XXXX-XXXXは自分の使用するObnizのデバイスコードになるのでこちらも忘れずに変更してください。

app.js(参考エントリーからの抜粋)

var Obniz = require("obniz");
const lineNotify = require('line-notify-nodejs')('****************************'); // 先ほど生成したトークン

var obniz = new Obniz("XXXX-XXXX");
obniz.onconnect = async function () {
  obniz.switch.onchange = function(state) {
    if (state === "push") {
      lineNotify.notify({
        message: 'スイッチが押されました'
      })
    }
  }
}

ファイルが完成したら以下のように実行します。

$ node app.js

実行後は待機状態になっているので、Obnizのボタンを押下すると、以下のようにNotifyメッセージが通知されます。

f:id:ueponx:20210413005752j:plain

これで、Node.js経由でObnizとLINEの通知メッセージがうまく連携しました。

おわりに

Node.jsを使って、RaspberryPiやObnizからLINEにメッセージの送信が簡単に行えるようになりました。LINEへの通知ができることもよかったのですが、HTMLを使用しなくてもNode.jsObnizで制御できることもわかりましたし。後はコンテストに出すアイデアがあれば…。

/* -----codeの行番号----- */