04 Feb 2018, 06:37

Google Homeから Wake on Lanで パソコン起動

はじめに

Google Homeに 「パソコンつけて」といって、パソコンを起動してみました。

[https://www.youtube.com/embed/B1FW42dwSWs]

仕組み

必要なものは以下です。

  • Google Home(Google Assistants) ・・・ 音声インタフェース。トリガを与える口。
  • IFTTT(https://ifttt.com/) ・・・ Google Assistantsからの通知をトリガにして GET リクエストを Beeboteに投げる。
  • Beebotte(https://beebotte.com/) ・・・ MQTTメッセージBroker。 IFTTTからのRestを受け取る。Mindstormsからの mqttのポーリングに応答する。
  • Linuxサーバ(Raspberry Piをつかう人が大半だけれども、自分は持っていないので LEGO Mindstormsに ev3devいれている)
  • python + paho-mqtt ・・・ Pythonで mqtt通信を実施するためのライブラリ。
  • wakeonlan ・・・ wakeonlan発行ツール
  • 起動対象のパソコン

処理の流れは以下のような感じ。

  • GoogleHome -(音声)→ IFTTT -(REST)→ Beebotte ←(監視)- Mindstorms -(wol)-> PC

システム構築

基本的には、以下の記事に従って構築しました。

IFTTTや Beebotteの設定は上記記事に詳しく書いてあるので、参照してください。ここでは省略し、差分のみを書きます。

Mindstormsでの設定

Beebotteに通知されたGETリクエストを監視するために、paho-mqttを入れます。

$ sudo apt install pip
$ sudo pip install paho-mqtt

以下のようなスクリプトをpythonで書きました。

mqtt_client.py:

#!/usr/bin/python
import paho.mqtt.client as mqtt
import json
import os

HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = 'mqtt.beebotte.com.pem'
TOKEN = '[channelのトークン]'
TOPIC = 'MySmartHome/voice'
CMD = 'wakeonlan 70:85:c2:67:7a:66'

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))

def on_message(client, userdata, msg):
    data = json.loads(msg.payload)["data"][0]
    if data["action"] == "on":
        os.system(CMD)

if __name__ == '__main__':
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.username_pw_set('token:%s' % TOKEN)
    client.tls_set(CA_CERTS)
    client.connect(HOST, PORT)
    client.subscribe(TOPIC)
    client.loop_forever()

UbuntuでWake on Lanするための設定メモ | Futurismo

このスクリプトをシステム起動時に起動するようにサービス化します。

シェルスクリプトを作成。 /usr/local/bin/hal.sh

 #!/bin/bash
 /home/robot/scripts/mqtt_client.py 

サービスファイルを以下のように、作成 /lib/systemd/system/hal.service

シンボリックリンク作成。

ln -s /lib/systemd/system/hal.service /etc/systemd/system/hal.service

サービス起動。

sudo systemctl daemon-reload
sudo systemctl enable hal
sudo systemctl start hal

rebootして、サービス起動していればOK.