Googleフォームからbeebotteを経由してRaspberry Piにメッセージ送信、PCをWake on LAN起動する
スマートフォンやPCからGoogleフォームで作成したWake on LAN起動用画面にアクセスしてフォーム「送信」で事務所内のPCを起動させる環境の構築について。
Raspberry Pi に対応モジュールを起動させておき、beebotteを仲介することでGoogleフォームから送信したメッセージをリアルタイムでRaspberry Pi が受信して、Wake on LAN信号を事務所内に送信する。
Beebotte(ビーボットでいいのかな)はメッセージの受け渡しを行うクラウドサービスで、無料アカウントで50000メッセージ/日まで使うことができる。
このやり方の良いところは、起動させるための操作が簡単で、初期設定不要でPCでもスマートフォンでも、ブラウザでGoogleフォームに入力できればいいということだ。
手順
- 遠隔起動したいPCをWake on LANで起動できるよう設定
- Raspberry PiにWake on LANのマジックパケットを送信するモジュールを入れる
- beebotteにアカウントを作り必要な設定をする
- Raspberry Piがbeebotteからメッセージを受け取れるようにする
- Googleフォームのサブミットでbeebotteにメッセージを送信するスクリプトを作成する
1から4の詳しい内容は以下のサイトを参考にさせていただいた。
ほぼ同じだが、2.の実装方法が違う。どちらもとても丁寧に書いていただいているのでほぼそのまますんなり設定できた。感謝。
Googleフォームを作成する
フォームを新規作成して質問を1つ追加。タイプはプルダウンにして、選択肢にMACアドレスを登録する。
MACアドレスだけだとどの端末なのかがわからないので、カッコ書きで説明を追加してみた。
リストボックスから取得した選択値の先頭から17文字(MACアドレス部分)を切り出して送信するとよい。
右上の点が縦に3つ並んだアイコンをクリックしてメニューから〔スクリプトエディタ〕を選択して、スクリプトエディタを開き、フォームの送信データを取得してbeebotteにメッセージをpostするスクリプトを追加する。
パラメータの”–Channel Name–“,”–Resources Name–“,”–Channel Token–“はそれぞれboobotteでchannel作成したものに置き換えること。
function wolkick(e) {
var itemResponses = e.response.getItemResponses();
var macaddress = itemResponses[0].getResponse();
sendMqttMessage("--Channel Name--","--Resources Name--","--Channel Token--",macaddress.substr(0,17));
}
function sendMqttMessage(channel, resource, token, value) {
var endpoint = Utilities.formatString("https://api.beebotte.com/v1/data/write/%s/%s", channel, resource)
var headers = {"X-Auth-Token":token}
var payload = {"data":value}
var params = {"method" :"post",
'contentType': 'application/json',
"headers" : headers,
"payload" :JSON.stringify(payload)
}
return UrlFetchApp.fetch(endpoint, params).getResponseCode()
}
トリガーを追加して、フォームが送信されたら上記スクリプトのwolkick関数を実行するように設定する。
これだけでOK。
自動起動を設定
PCが自動起動できることが確認できたら、python で作ったスクリプトを Raspberry Pi が起動したら自動的に実行するように設定しておく。
Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説
rc.localで自動起動するときにやっておくべきこと
/etc/rc.local に記述するやり方にすることにして、起動用のスクリプトを作成する。
#!/bin/sh
sleep 10
nohup /usr/bin/python -u /home/***/raspiwol/raspiwol.py >>/home/***/raspiwol/raspiwol.log 2>&1 &
ログを出力して、バックグラウンドで実行するようにした。
sleep 10 が入っているのは、ある意味おまじないというか。
スクリプトを実行して動くことを確認した後にラズパイを再起動して自動起動した状態でPC起動を試してみると、起動しない。手動で実行すると動くのに自動起動させると動かないという現象に陥り、いろいろ調べた結果『起動直後のせいで名前解決ができていない』が原因なんじゃないかと思い、上記”rc.localで自動起動するときにやっておくべきこと”にあるとおり待ち時間を入れてみた。
ちょっとずつ躓きながらも親切な賢い人がいろいろ紹介してくれているおかげですんなり実現できてしまった。
ラズパイ、結構楽しい。