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

# 謝辞

**ミクミンPさんの[Twitter投稿]( https://mobile.twitter.com/ksasao/status/983019777189752834)でfauxmoを知りました。ミクミンPさん、ありがとうございます。**

# できること
* Raspberry PiでBelkin WeMoデバイスをエミュレートして、Amazon Echoのスマートホームデバイスとして認識させ、アレクサへの定形アクションによりRaspberry Piでコマンドを実行する。(**WeMoデバイスがなくても動きます！！**)
* ちなみに、[node-red-contrib-alexa-home-skill](https://github.com/hardillb/node-red-contrib-alexa-home-skill)を使うやり方は[こちら](https://qiita.com/michan06/items/08514e8e67960e45ff69)に書きました。
* [WeMo Switch](http://www.belkin.com/us/Products/home-automation/c/wemo-home-automation/)のエミュレートなので**ON/OFFのみ**です。


# 必要なもの

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

# メリット

* **HueやBelkinなどのスマートホーム対応の物理デバイスがなくても、Raspberry PiからアクセスできるモノはAmazon Echoでコントロール可能(赤外線リモコンなど)**
* [node-red-contrib-alexa-home-skill](https://github.com/hardillb/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になっていました…)
```

[デバイスの定義と実行するコマンドの指定](https://github.com/makermusings/fauxmo/blob/54e00be77552fba7b177866f55cf89d017c57dc6/fauxmo.py#L386)を必要に応じて修正。
そのままだと、指定したIPアドレスにリクエストします。ここでデバイスごとに**3つ目の要素としてポートを指定**しておくと、pythonを再起動してもポートが変わらなくなります。

```ruby
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],
]
```

実行するコマンドを追加

```ruby
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](https://qiita-image-store.s3.amazonaws.com/0/78540/d4e9721c-c2f7-b826-2be0-d050f26c3c28.png)

動作が確認できたら、[先人の知恵](http://hendigi.karaage.xyz/2016/11/auto-boot/)を参考に自動起動を設定します。私はcrontab -eで再起動時に起動しました。

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

# その他

1. Python2.7前提ですが、Python3に対応する[プルリク](https://github.com/makermusings/fauxmo/pull/5)が上がっているようですので、Python3な方はそちらをどうぞ。
1. [node-red-contrib-alexa-local](https://github.com/originallyus/node-red-contrib-alexa-local)は実デバイスが必要なようで、discoveryから先に行きませんでした。
1. ミクミンPさんの投稿にもある通り、[M5Stack](https://www.switch-science.com/catalog/3647/)にも[ポーティング](https://t.co/aSbcEPIeyj?amp=1)されています。
1. 最初はRaspberry Pi 3Bで動かしていましたが、偶然Raspberry Pi Zero WHが手に入ったので、現在はZero WHで動かしています。Zero WHだとNode-REDを動かすのが厳しいという[情報](https://signal-flag-z.blogspot.jp/2018/02/adrsir-raspberry-pi-zero-w.html)がありますが、こちらは、Python直接なのでZero WHでも特に問題なく動いているようです。