RaspberryPiでスマートホーム 〜PCの電源をオン・オフする〜

ラズパイでMQTTで指令を受信して、コマンドをリモートから実行できるようにしました。

現在JavascriptとAlexaからMQTTで指令を送信して、照明のオン・オフができます。

今度はPCの電源のオン・オフができるようにしてみます。

PC側

電源オン

PCの電源はラズパイからWake on Lanのマジックパケットを送って、スイッチを入れます。

BIOS

BIOSにそれ用の設定があるので、セットします。マザーボードごとに表記が違うようですが、うちで使ってる”ASRock Z170 Extreme4”の場合は、

”Advanced Mode”→”Advanced”→”ACPI Configuration”の”PCIE Devices Power On”を”Enabled”にしたら、使えるようになります。

あと、Windows側でも設定が必要です。

ネットワークアダプターの設定

”コントロールパネル”→”システム”→”デバイスマネージャー”→”ネットワークアダプター”→”Intel(R)Ethernet Connection (2) I219-V”(環境によって名前に違いあり)を右クリックでプロパティを表示、”電力管理”タブの”Wake on Lan”の項目にチェックが入っていることを確認します。

私の場合はデフォルトで上から3つにチェックが入っていたので何もいじってません。この画面も使ってるアダプターによって変わってきます。

高速スタートアップをオフにする

うちでは高速スタートアップにチェックが入っているとWake On Lanで起動してくれませんでした。

”コントロールパネル”→”電源オプション”から”高速スタートアップを有効にする”のチェックを外します。もしグレーになっててチェックを外せない場合は、上の方にある”現在利用可能ではない設定を変更します”をクリックすると、チェックが外せるようになります。

一度外しても、Windows Updateの時に勝手に復活してたこともありました。

設定すると、PCの電源を落としてもLANの端子のランプがつきっぱなしになってるはずです。

あと、MACアドレスを調べておきます。

コマンドプロンプトで

ipconfig /all

でアダプタ情報が表示されるのでイーサネットアダプターの物理アドレスをコピーしておきます。

電源オフ

Windowsはコマンドプロンプトから以下のコマンドでシャットダウンできます。

shutdown /s /t 5

/t の後ろはシャットダウン開始するまでの秒数です。

スクリプトの作成

上記のシャットダウンコマンドはPC上で実行しないといけないので、電源オフに関してはMQTTでの指令をPC側で受け取ることにします。

ラズパイ用に作成した待ち受けプログラムを少し修正して使用します。

Pythonのスクリプトなので、Pythonがインストールされてないといけません。私はTensorflow用にAnacondaをインストールしてましたので、それを使いました。Anacondaのインストール方法は以下を参考にしてください。

”smarthome”という環境をPython3.6で作成しました。

conda create -n smarthome python=3.6

activateしてから、mqttライブラリの”paho-mqtt”をインストールします。

activate smarthome
pip install paho-mqtt

Pythonのスクリプトhomeapp.pyをラズパイからコピーして修正します。

書き換えたのはon_message()関数で、リソース”pc”、コマンド”power”、パラメータ”off”にのみ反応するようにしました。該当のコマンドを受け取ったら、上記のシャットダウンコマンドを実行します。

接続先(エンドポイント)は、ラズパイで使ってた時と同じです。

なお今回もAWS IoTを使います。なので、ラズパイ同様PCをAWSに登録して、証明書を発行しないといけないのですが…面倒なのでラズパイの証明書をコピーしてPCでも使いました。

証明書は以下の名前でラズパイ側に保存していましたので、それをラズパイからコピーして、スクリプトと同じフォルダに入れます。

  • certificate.pem.crt
  • private.pem.key
  • VeriSign.pem

スタートアップに登録

このスクリプトは常に実行されてないと受信してくれないので、同じフォルダにバッチファイルを作ってスタートアップに登録します。

homeapp.batという名前で作成しました。

Anacondaで先ほど作ったsmarthome環境をactivateしてから、スクリプトを起動しています。

次にスタートアップフォルダに登録します。

エクスプローラーでこのファイルを右クリックして、”ショートカットの作成(S)”を選び、ショートカットを作成します。普通に起動するとコマンドプロンプトが表示されてしまうので、このショートカットのプロパティを表示させ”ショートカット”タブの”実行時の大きさ”を”最小化にしました。

そして”Windows”キー+”R”でコマンドを”ファイル名を指定して実行”画面を表示させます。”shell:startup”と入力して、エンターキーをおすとスタートアップフォルダが表示されるので、そこに先ほどのショートカットを移動します。

これでWindows起動時にスクリプトが起動するようになりました。起動中はタスクバーにコマンドプロンプトが表示されます。

ラズパイ側

マジックパケット送信

ラズパイからはマジックパケットを送信するのですが、パッケージを利用します。

sudo apt-get install wakeonlan

これで

wakeonlan (MACアドレス)

と打ち込めばマジックパケットが送信できます。

一度ここでWake on LanでちゃんとPCの電源が入るか、実際に実行して確認しておきましょう。なお、先ほどのWindowsのipconfigコマンドでは区切り文字が”-”になってますが、”:”に変えて実行します。

これをシェルスクリプトにしました。

”wol.sh”という名前で保存しました。待ち受けスクリプトはこのシェルスクリプトを呼び出すことにします。

待ち受けスクリプトの修正

以前作成した、ラズパイ側での待ち受けプログラムを少しだけ改造します。

on_message()関数で、リソース”pc”に対応するようにしました。同じフォルダにある”wol.sh”をMACアドレスを引数に呼び出します。

MACアドレスはソースの先頭の”xx:xx:xx:xx:xx:xx:”を実際のものに置き換えます。

送信側

送信側も”pc”というリソースを送れるようにします。

Javascript

こちらはHTMLに行を増やすだけです。

【PC】以下の5行を追加してます。

Alexa(スマートホームスキル)

AWSのLambdaのソースを少し変更します。

Discovery用のデータを増やすことと、endpointの判断ロジックが追加されたところが変更点です。

実行してみる

実際に実行して確認してみます。うまくいかないときは…

Wake on Lanが動作するか

まずはMQTT云々以前に、ラズパイから手でコマンド叩いて、PCが起動するか確認です。MACアドレスはちゃんと有線LANのアドレスか確認します。

データが送信されているか

AWSのIoT Coreのテスト画面で、トピックをサブスクライブしてデータが送信されているか確認します。

以下のページの”テスト”を参考にしてください。

ラズパイが受信しているか

on_message()関数内で、print(data)でもしてみます。

nohup python homeapp.py &で起動しているのなら、nohup.txtにprintの内容が表示されるのでちゃんと受信しているか確認します。

PCが受信しているか

こちらも同じく、on_message()関数内で、print(data)でもしてみます。

タスクバー上のコマンドプロンプトをクリックすると画面が開くので、受信していればそこに表示されるはずです。

感想

これで声でPCのオン・オフができるようになりました。PCのところに行く前にアレクサに電源入れてもらえば、椅子に座るころには電源が入って、起動が完了しています!

さらに今までは電源切り忘れたままベッドに入った時は、消すの面倒くさくてつけっぱなしで寝てましたが、もう大丈夫!

まあ、PCはめっちゃ近くにあるんですけどね。なんか、どんどんダメ人間になっていっている気がするのは、気のせいでしょうか…

さらに…

ラズパイとは関係ないですけど、Windows側では待ち受けのスクリプトが走っているので、さらにコマンドを増やしてやれば電源オンオフだけでなく色々できそうですね。例えば”startapp”というコマンドでアプリを起動したり…

アレクサ使えば声で起動できます。ただスマートホームスキルでは使える語呂が少なさそうなので、この場合はカスタムスキルの方がよさそうですね。

アレクサ、PCで音楽かけて

音楽を再生します。

 
アレクサ、PCで仕事やっといて

すいません、ちょっとよく分かりません。

 
アレクサ、PCで株の売買して稼いで

損切りしました。

夢は広がります。