大学生の初めての電子工作 スマートリモコン編(外部サービス)


この記事ではスマートリモコン編で作成したスマートリモコンで使用した外部サービスについて記載します。

  1. beebotte
  2. IFTTT

今回は上記の2つのサービスを利用したので、この2つのサービスについて紹介していきます。
 beebotteとは、無料で一日50000件のメッセージを送信することができる、IoTやリアルタイム接続アプリケーションに特化したクラウドプラットフォームです。今回はこのサービスを利用してbeebotteにデータを送り、送ったデータをRaspberryPiのプログラムによって読み取り、その読み取ったデータに応じた処理(エアコンをつけるなど)を行います。
 IFTTTとは、外部サービス同士を連携させることができるサービスで、これを使うことでAlexa や Google Assistant と beebotte を連携させることができます。こちらも無料のサービスです。

  

1. beebotte

まず、beebotteを初めて使う方はUsername、メールアドレス、パスワードを入力してbeebotteにアカウントを作成します。

  
ログインしたら、"create new" をクリックします。

  
  
すると以下のような画面が表示されるので、Channel名とResource名、それからそれらの説明の合計4つを入力したら、"create channel" をクリックします。
(Channel名、Resource名は何でも構いません)

  
  
以上でChannelの作成は完了です。作成したChannelにアクセスするためにChannel Tokenを控えておきます。
以下のように作成したChannel名をクリックして、Channel Tokenをメモしておきます。

2. IFTTT

 続いてIFTTTの設定を行います。メールアドレスとパスワードからやGoogleやFacebookアカウントからもアカウントを作成できます。

  
  
アカウントを作成しログインしたら、右上の自分のアカウント名をクリックし、"New Applet"をクリックします。

  
  
以下のような画面が表示されるので、"+This" というところをクリックします。

  
  
"search service" のところに "Google" と入力してGoogle Assistant を探し、Google Assistantのアイコンをクリックします。
(Alexaの設定を行う場合は同様にしてAlexaを選択します。)

  
  
Google Assistant を連携させるのが初めての場合は、連携について確認画面が表示されるので、"Connect"をクリックします。

  
  
以下の画面が合表示されたら "Say a simple phrase" をクリックします。

  
  
以下のように、Google Assistant に話しかける(または入力する)フレーズとそのレスポンスを入力し、言語をJapaneseに設定したら "create trigger" をクリックします。

  
  
次に、Google Assistant と beebotteを連携させるための仲介役となるサービスであるwebhooksとの連携をしていきます。
以下のような画面が表示されるので、"+That" をクリックします。

  
  
"search service" のところに "Webhooks" と入力してWebhooksを探し、Webhooksのアイコンをクリックします。

  
  
Webhooks を連携させるのが初めての場合は、連携について確認画面が表示されるので、"Connect"をクリックします。

  
  
  
"Make a web request" をクリックします。

  
  
  
以下の画像のように、

URL
" https://api.beebotte.com/v1/data/publish/チャンネル名/トピック名?token=[先ほどメモしたBeebotteのトークン] "と入力
Method
" POST "を選択
Content Type
" application/json "を選択
Body
" {"data":[{"device":"デバイス名","action":"アクション名"}]} "と入力

と入力したら、"Create action" をクリックします。

URL中のチャンネル名/トピック名にはbeebotteで設定したチャンネル名とトピック名を入力してください。
Bodyのデバイス名とアクション名は、赤外線学習をした際に設定したものを入力してください。
例: $ python3 irrp.py -r -g18 -f codes air_con:on --post 130
   というコマンドで学習したものを使用する場合は、
   デバイス名は" air_con ",アクション名は" on "となります。

  
  
  
"Create action" をクリックすると、このような画面に切り替わるので、"Finish" をクリックすればIFTTTでの設定は完了です。

  
  
  

最後に・・

プログラム編で紹介したhomeauto.pyというプログラムの、TOKENというところに先ほどメモしたBeebotteのトークンを、TOPICというところにチャンネル名とトピック名を以下のように入力してください。

homeauto.py
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import subprocess
import json
from time import sleep

HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = 'mqtt.beebotte.com.pem'
TOKEN = "token_xxxxxxxxxxxxxxxxxx"  #Beebotteで作成したチャンネルのトークンを入力
TOPIC = "RaspberryPi/SmartRemocon"  #Beebotteで作成したチャンネル名、トピック名を入力

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

def on_message(client, userdata, msg):
    print(msg.topic + ' ' + str(msg.payload))
    data = json.loads(msg.payload.decode("utf-8"))["data"][0]
    print(msg.payload.decode("utf-8"))
    print(data)

    def default_command(data):
        subprocess.call(["python3", "irrp.py", "-p", "-g17", "-f", "codes", data["device"]+":"+data["action"]])
        print("excuted command: " + data["device"]+":"+data["action"])
        print(" ")

    # control ps4
    if (data["device"] == 'ps4'):
        subprocess.call(["python3","L_tika.py"])  #動作確認用
        if (data["action"] == 'on'):
            subprocess.call(["sudo", "/opt/nodejs/bin/ps4-waker"])
        elif (data["action"] == 'standby'):
            subprocess.call(["sudo", "/opt/nodejs/bin/ps4-waker", "standby"])
        elif (data["action"] == 'enter'):
            subprocess.call(["sudo", "/opt/nodejs/bin/ps4-waker", "remote", "enter"])
        elif (data["action"] == 'back'):
            subprocess.call(["sudo", "/opt/nodejs/bin/ps4-waker", "remote", "back"])
        elif (data["action"] == 'torne'):
            subprocess.call(["sudo", "/opt/nodejs/bin/ps4-waker", "start", "CUSA00442"])
        elif (data["action"] == 'primevideo'):
            subprocess.call(["sudo", "/opt/nodejs/bin/ps4-waker", "start", "CUSA03099"])
        elif (data["action"] == 'youtube'):
            subprocess.call(["sudo", "/opt/nodejs/bin/ps4-waker", "start", "CUSA01065"])
        print(" ")

    # control by temperature
    elif (data["device"] == 'temp'):
        subprocess.call(["cd", "DHT11_Python"])
        subprocess.call(["python3", "dht11_for_homeauto.py"])
        subprocess.call(["cd", ".."])
        print(" ")

    # control other
    else:
        default_command(data)
        print(" ")

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()

  
  
TOKENとTOPICを入力したらプログラムを保存し、以下のコマンドでhomeauto.pyを実行してみてください。

pi@raspberrypi:~ $ cd code
pi@raspberrypi:~/code $ sudo chmod 755 homeauto.py
pi@raspberrypi:~/code $ python3 homeauto.py

実行して数秒待つと、mqttによる接続が開始され " status 0 " と表示されるので、お手持ちのスマホやGoogle HomeからGoogle Assistantを呼び出し、先ほどIFTTTで設定した言葉(エアコンつけてなど)を話してみてください(入力でも可)。先ほどIFTTTで設定した言葉(エアコンをつけますなど)が返ってきて、ターミナルにBeebotteに送られたデータ等が表示されたら外部サービスとの連携は成功です。さらに数秒待つと赤外線送信が実行されます。
Alexaから操作する場合は1つ注意する点があり、" アレクサ、エアコンつけて "と話しかけても動作しません。Alexaから IFTTTを使用するには" アレクサ、トリガー、エアコンつけて "といったり、" アレクサ、エアコンつけてをトリガー " といったように話しかけなければいけません。成功すると " IFTTTに送信します " という言葉が返ってきます。

  
  
  
これでスマートリモコンは完成です。
次の記事では、 google home や Alexa がなくてもRaspberryPiひとつで、家の中から声でスマートリモコンを操作できるように、RaspbberyPiにGoogle Assistantをいれていきたいと考えています。また、RaspbberyPiでPS4を操作するps4-wakerについても書いていく予定です。
  
  
  
  
  

参考サイト

IFTTTとBeebotteを使ってGoogleHomeからRaspberryPiを操作する

https://qiita.com/msquare33/items/9f0312585bb4707c686b
hubotを用いた方法ではうまくいかなかったので、こちらのBeebotteを介した方法を採用させていただきました。