秘密の本棚

気になることをなんでも書きます

「OK Google, 筋肉体操」で身体を徹底的に追い込む

今回やりたいこと

最近、NHKの番組の「筋肉体操」というのが話題ですね。特別な道具を使わずに短時間で筋トレをする方法を、ムキムキな先生と3人のモデルが教えてくれます。これを見ているだけで筋トレをした気分になれます。

ただ、本当は見ているだけではダメで、自分で実践していかないと意味がありません。しかし、番組でやっていたトレーニングの内容を自分でやろうと思っても、なにしろ負荷がキツいので途中で挫折してしまいます。やはり先生の厳しい声が必要です。したがって、この番組を録画しておいて再生しながら筋トレをするというのが現実的でしょう。
ただ、毎回毎回テレビをつけて、番組を選択して再生するというのは面倒です。できればワンタッチで始めたいですよね。そこで今回は、Raspberry PiとChromecastを用いて、OK Google, 筋肉体操」と言えば自動的にテレビで筋肉体操のプレイリストが再生されるようにしてみたいと思います。

用意するもの

以下のものを用意します。

必要なステップに分解する

OK Google, 筋肉体操」を実現するために必要なステップは以下のとおりです。

これらをそれぞれ実装します。

Google HomeからRaspberry Piが指示を受け取る

この部分は以下の記事と全く同じです。
nexusuica.hatenablog.jp
IFTTTにトリガーとしてGoogle Assistantを指定しておき、「筋肉体操」というフレーズに対してBeebotteのWebhookを投げるようにします。Python側ではこれを監視し、リアルタイムでその指示を受け取ることができます。

import paho.mqtt.client as mqtt
import json
import subprocess

TOKEN = "<Boobotteのトークン>"
HOSTNAME = "mqtt.beebotte.com"
PORT = 8883
TOPIC = "<Beebotteのチャンネル名>/<Beebotteのリソース名>"
CACERT = "mqtt.beebotte.com.pem"

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

def on_message(client, userdata, msg):
    #print(msg.topic + " " + str(msg.payload))
    data = json.loads(msg.payload.decode("utf-8"))["data"][0]
    #data = {key:value.strip() for key, value in data.items()}
    print(data)
    for key, value in data.items():
        if key == "action" and value == "start":
            muscle_start()

client = mqtt.Client()
client.username_pw_set("token:%s"%TOKEN)
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(CACERT)
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()

Raspberry PiがChromecastに指示を送る

Chromecastをシェルから操作するには、専用のツールが必要です。今回はCattというPythonコマンドラインツールを利用します。
github.com
Cattの使い方は簡単で、例えば

catt cast "https://www.youtube.com/watch?v=PyJOEt2nsGQ"

とすればWiFiに接続されたChromecast上でYouTubeの動画が再生できます。やや動作に時間がかかるのは難点ですが、このツール以外でChromecastを操作できるものは少ないです。
Cattを用いて、Chromecastで筋肉体操の4本の動画を連続して再生させます。1本目はそのまま再生し、それ以降の動画はキューに追加しておけばよいです。たまに失敗するので、10回試行するようにしています。

VIDEO_IDs = ["PyJOEt2nsGQ","1GanGLmDt2I","IHYOhDe4FB8","WndOChZSjTk"]

def create_url(video_id):
    return "https://www.youtube.com/watch?v="+video_id

def muscle_start():
    for i in range(0,len(VIDEO_IDs)):
        for x in range(0,10):
            if(i==0):
                d = subprocess.call("catt cast "+"\""+create_url(VIDEO_IDs[0])+"\"",shell=True)
            else:
                d = subprocess.call("catt add "+"\""+create_url(VIDEO_IDs[i])+"\"",shell=True)
            if(not d):
                break

最後に動作している様子をご覧ください。これで快適な筋肉体操ライフが実現しますね!