9
7

More than 5 years have passed since last update.

Amazon EchoからRaspberry Pi(から赤外線リモコンなど)をコントロール(ローカル編)

Last updated at Posted at 2018-04-11

謝辞

ミクミンPさんのTwitter投稿でfauxmoを知りました。ミクミンPさん、ありがとうございます。

できること

  • Raspberry PiでBelkin WeMoデバイスをエミュレートして、Amazon Echoのスマートホームデバイスとして認識させ、アレクサへの定形アクションによりRaspberry Piでコマンドを実行する。(WeMoデバイスがなくても動きます!!)
  • ちなみに、node-red-contrib-alexa-home-skillを使うやり方はこちらに書きました。
  • WeMo SwitchのエミュレートなのでON/OFFのみです。

必要なもの

  1. Raspberry Pi(3BとZero WHで動作確認)
  2. Amazon Echo(Dotでしか動作確認はしていません。)
  3. その他(赤外線LEDを操作するのであれば赤外線LEDなど)

メリット

  • HueやBelkinなどのスマートホーム対応の物理デバイスがなくても、Raspberry PiからアクセスできるモノはAmazon Echoでコントロール可能(赤外線リモコンなど)
  • node-red-contrib-alexa-home-skillとは違って外部サーバは不要なので、サーバのメンテやサーバの運用停止を気にする必要がない。(hardillさんお世話になっております。)
  • サーバを経由せず、ローカルLANで実行されるので反応が早い。

手順

fauxmoをローカル(Raspberry Pi)の適当なディレクトリにclone

git clone https://github.com/makermusings/fauxmo.git

依存ライブラリをインストール

pip install requests   (←pip install requestになっていました…)

デバイスの定義と実行するコマンドの指定を必要に応じて修正。
そのままだと、指定したIPアドレスにリクエストします。ここでデバイスごとに3つ目の要素としてポートを指定しておくと、pythonを再起動してもポートが変わらなくなります。

FAUXMOS = [
    ['TV_ONOFF', exec_handler('code/tv_turnon.data', 'code/tv_turnon.data'),42200],
    ['TV_SILENT', exec_handler('code/tv_silent.data', 'code/tv_silent.data'),42201],
    ['TV_VOL', exec_handler('code/tv_vol_up.data', 'code/tv_voldown.data'),42202],
    ['TV_ECOSRC', exec_handler('code/tv_eco.data', 'code/tv_src.data'),42203],
    ['AMP_ONOFF', exec_handler('code/amp_turnon.data', 'code/amp_turnoff.data'),42210],
    ['AMP_VOL', exec_handler('code/amp_volup.data', 'code/amp_voldown.data'),42211],
    ['AMP_SRC_CDTUNER', exec_handler('code/amp_src_cd.data', 'code/amp_src_tuner.data'),42212],
    ['AMP_SRC_RECOPT', exec_handler('code/amp_src_recorder.data', 'code/amp_src_optical.data'),42213],
    ['LIVINGLIGHT_ONOFF', exec_handler('code/livinglight_turnon.data', 'code/livinglight_turnoff.data'),42220],
    ['LIVINGLIGHT_MODE_MINMAX', exec_handler('code/livinglight_mode_minlight.data', 'code/livinglight_mode_maxlight.data'),42221],
    ['LIVINGLIGHT_MODE_LIB_TAB', exec_handler('code/livinglight_mode_library.data', 'code/livinglight_mode_table.data'),42222],
    ['LIVINGLIGHT_MODE_LAMP_ECO', exec_handler('code/livinglight_mode_lamp.data', 'code/livinglight_mode_eco.data'),42223],
    ['RECORDER_ONOFF', exec_handler('code/recorder_turnon.data', 'code/recorder_turnoff.data'),42230],
    ['RECORDER_PAUSE', exec_handler('code/recorder_pause.data', 'code/recorder_play.data'),42231],
]

実行するコマンドを追加

class exec_handler(object):
    def __init__(self, on_cmd, off_cmd):
        self.on_cmd = on_cmd
        self.off_cmd = off_cmd

    def on(self):
        dbg("cmd: python %s/r02.py t %s" % (IR_PATH ,self.on_cmd))
        r = subprocess.call(["python", os.path.expanduser("%s/r02.py" % IR_PATH), "t", os.path.expanduser("%s/%s" % (IR_PATH,self.on_cmd))])
        return r

    def off(self):
        dbg("cmd: python %s/r02.py t %s"  %  (IR_PATH, self.off_cmd))
        r = subprocess.call(["python", os.path.expanduser("%s/r02.py" % IR_PATH ), "t", os.path.expanduser("%s/%s" % (IR_PATH,self.off_cmd))])
        return r

python fauxmo.py -dで起動しておくと、Amazon Echoからデバイスの検出で検出されます。(-dはコンソールにデバッグ出力するオプションです。)
Alexaアプリではこんな感じ↓に検出されました。
image.png

動作が確認できたら、先人の知恵を参考に自動起動を設定します。私はcrontab -eで再起動時に起動しました。

  • 2018/05/27追加 環境によっては、cronの@rebootで実行する場合、ネットワークサービスが立ち上がっていない場合があるので、sleep 30;などで30秒程度待たせる必要があるようです。 (新規に環境構築したら立ち上がらなくなって、原因を調べたら、ネットワークサービスが立ち上がっていないからでした…)

その他

  1. Python2.7前提ですが、Python3に対応するプルリクが上がっているようですので、Python3な方はそちらをどうぞ。
  2. node-red-contrib-alexa-localは実デバイスが必要なようで、discoveryから先に行きませんでした。
  3. ミクミンPさんの投稿にもある通り、M5Stackにもポーティングされています。
  4. 最初はRaspberry Pi 3Bで動かしていましたが、偶然Raspberry Pi Zero WHが手に入ったので、現在はZero WHで動かしています。Zero WHだとNode-REDを動かすのが厳しいという情報がありますが、こちらは、Python直接なのでZero WHでも特に問題なく動いているようです。
9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7