謝辞
ミクミンPさんのTwitter投稿でfauxmoを知りました。ミクミンPさん、ありがとうございます。
できること
- Raspberry PiでBelkin WeMoデバイスをエミュレートして、Amazon Echoのスマートホームデバイスとして認識させ、アレクサへの定形アクションによりRaspberry Piでコマンドを実行する。(WeMoデバイスがなくても動きます!!)
- ちなみに、node-red-contrib-alexa-home-skillを使うやり方はこちらに書きました。
- WeMo SwitchのエミュレートなのでON/OFFのみです。
必要なもの
- Raspberry Pi(3BとZero WHで動作確認)
- Amazon Echo(Dotでしか動作確認はしていません。)
- その他(赤外線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アプリではこんな感じ↓に検出されました。
動作が確認できたら、先人の知恵を参考に自動起動を設定します。私はcrontab -eで再起動時に起動しました。
- 2018/05/27追加
環境によっては、cronの@rebootで実行する場合、ネットワークサービスが立ち上がっていない場合があるので、sleep 30;などで30秒程度待たせる必要があるようです。
(新規に環境構築したら立ち上がらなくなって、原因を調べたら、ネットワークサービスが立ち上がっていないからでした…)
その他
- Python2.7前提ですが、Python3に対応するプルリクが上がっているようですので、Python3な方はそちらをどうぞ。
- node-red-contrib-alexa-localは実デバイスが必要なようで、discoveryから先に行きませんでした。
- ミクミンPさんの投稿にもある通り、M5Stackにもポーティングされています。
- 最初はRaspberry Pi 3Bで動かしていましたが、偶然Raspberry Pi Zero WHが手に入ったので、現在はZero WHで動かしています。Zero WHだとNode-REDを動かすのが厳しいという情報がありますが、こちらは、Python直接なのでZero WHでも特に問題なく動いているようです。