12 Feb 2018, 11:36

Google Homeで DI.FMのTech Houseを聴く

はじめに

プログラマーならば、テクノ・ミュージック、ですよね。

とてもとてもニッチな小ネタだけれども、誰かの役に立てれば。

自分は、作業用音楽として、Digitally Importedの Tech Houseを溺愛している。

テクノ・ミュージックを聴くと、テンション上がって作業がとても捗るのだ。Google Homeを購入したので、せっかくいいスピーカーなので、これで聴きたい!

ということで、Digitally ImportedのTech House のチャンネルを聴く方法を試した。もちろん、同様の方法は、JazzRadioでもいける。

ChromeCastできくとwifiが切れる

まず思い付いた方法は、Google Chromeのキャスト機能を利用して、Google Chromeで流れている音楽をGoogle Homeに転送して聴く方法。

これでうまく行った、と思いきや、なぜかwifiが1分もするとブツブツ切れてしまう。失敗。

iPhone経路で聴くことに成功

調査を続けると、Digitally Imported が Chromecastをサポートしているとのこと。

試しに、iPhoneアプリを起動してみて、上記記事のようなアイコンを押すと、なんと流れた!おおーっ。

パソコン経由で聴くことに成功

欲を入れば、OK Google, テクノ・ミュージックかけて、で音楽を流したい。なので、パソコンからやる方法を調べた。pychromecastを使えばいけた。

まずは、digitally importedのstream urlをしらべる。

次に以下のスクリプトを書いた。

#!/usr/bin/env python
import pychromecast

def play_mp4(url):
    cast.wait()
    mc = cast.media_controller
    mc.play_media(url, 'audio/mp4')
    mc.block_until_active()

chromecast_name = "Main"
chromecasts = pychromecast.get_chromecasts()
cast = next(cc for cc in chromecasts if cc.device.friendly_name == chromecast_name)

play_mp4("http://pub2.diforfree.org:8000/di_techhouse_hi")

これを実行すると、Tech Houseが流れた。いえい!あとは、こことかでやった方法を応用して、声のインタフェースを用意すれば完成!

09 Feb 2018, 15:29

pychromecastでお手軽にGoogle Homeから時報を鳴らす

はじめに

Google Homeで 時報を鳴らしたい。こんな記事があり、試してみようと思った。

google-home-notifierというツールを使うのが王道なようだ。

しかし、いかんせん、node.jsがわからない。。できれば、いつも使っているPythonでやりたいなーと思っていろいろ試した結果、pychromecastというものをつかうと、GoogleHomeから音楽を鳴らすことができたので、そのメモ。

pychromecastをつかう

pychromecastを使うと、かなりお手軽にやりたいことが実現できた。

pip install pychromecast

Web上のリソースをGoogleHomeで鳴らすことができるので、以下のダウンロードサイトから、音源を鳴らすことにした。

コードは以下。

これを実行すると、Google Homeから音を鳴らすことができる。

cronで定期実行

cronで1時間ごとに実行するように、設定してみる。 crontab -e で Ok。

0 */1 * * * python google-home-jihou.py

これで、ピッピッピっポーン。

04 Feb 2018, 14:20

Google Homeから Linux上のパソコンをコマンド操作を自由にする

はじめに

GoogleHome/ IFTTT/ Beebotte、そして Pyhtonを使えば声をトリガーに任意の作業ができる。前回、ダーゲットPCに対して、別のサーバを用意していたけれどもど、今回の場合は実行したいPCを用意すれば良い。

まずは結果を。

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

システム構築

基本的には前回の記事と同じだ。

マシンが違うので、異なるチャンネル beebotteで作成した。

出来るようになったこと

こである声をトリガにして、処理を実施するということができるようになった。

具体的には、

  • モニター OFF
  • モニターON
  • パソコン シャットダウン
  • パソコン Sleep
  • パソコン再起動

しかし、これだけではない。Linux上で実施するあらゆる操作がpythonコードを介して実現可能となった。これは大きな一歩だ。

#!/home/tsu-nera/anaconda3/envs/py3/bin/python
import paho.mqtt.client as mqtt
import json
import os

HOST = 'mqtt.beebotte.com'
PORT = 8883
CA_CERTS = '/home/tsu-nera/repo/python-scripts/mqtt.beebotte.com.pem'
TOKEN = '[チャンネルのトークン]'
TOPIC = 'Galleria/voice'

MONITOR_ON_CMD = "xset dpms force on"
MONITOR_OFF_CMD = "xset dpms force off"
PC_SLEEP_CMD = "systemctl suspend"
PC_OFF_CMD = "shutdown now"
PC_REBOOT_CMD = "shutdown -r now"

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]
    print(data)
    if data["device"]=="monitor" and data["action"]=="on":
        os.system(MONITOR_ON_CMD)
    elif data["device"]=="monitor" and data["action"]=="off":
        os.system(MONITOR_OFF_CMD)
    elif data["device"]=="pc" and data["action"]=="スリープ":
        os.system(PC_SLEEP_CMD)
    elif data["device"]=="pc" and data["action"]=="シャットダウン":
        os.system(PC_OFF_CMD)
    elif data["device"]=="pc" and data["action"]=="再起動":
        os.system(PC_REBOOT_CMD)
    else:
        print("Ivalid requset")
    
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()

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.