WeMoをWebからオン/オフできるようにしてみた
全部をここに書くことはできないけど
実家にあるBelkin WeMo, WeMo Insightですが、iPhoneアプリからだけでなく Webでもオン/オフできるようにしてみました。方法を全部書いてしまうと、ハッキングされて勝手にWeMoを操作されてしまうおそれがあるので概要だけ紹介します。
WeMoはWi-FiルータのDHCPからIPアドレスをもらって動くので、先ずWeMoのIPアドレスを調べることが必要になります。WeMoはUPnP機器ですので、SSDPという特殊なパケットを送信し、返事を帰してきた機器の中からWeMoを探し出します。UPnP対応機器を探し出す方法については、こちらのsearchRootDevice.py というPythonスクリプトを利用させていただきました。実行には Pythonが必要になりますが、MacOS Xには最初から Python 2.xxが入っていますので、問題なく実行できるはず。スクリプトを実行すると、
$ ./searchRootDevice.py
from ('192.168.xx.xx', 3250)
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=86400
DATE: Wed, 11 Feb 2015 14:31:44 GMT
EXT:
LOCATION: http://192.168.xx.xx:49153/setup.xml
OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
01-NLS: 905a423c-1dd2-11b2-8284-cb16daf5fb57
SERVER: Unspecified, UPnP/1.0, Unspecified
X-User-Agent: redsonic
ST: upnp:rootdevice
USN: uuid:Insight-1_0-221437K12000E5::upnp:rootdevice
========================================
|
といった内容がぞろぞろ〜っと出力されます。その中からWeMoを探し出します。上はWeMo Insightなのですが、何を見てWeMoであると判断すれば良いのかが問題です。本当は LOCATION: で示されているURLにアクセスして帰ってくるxmlを見て判断するべきでしょうが、面倒なので安直にポート番号で判断します。WeMoのポート番号は 49153〜49155 らしいのですが、ポート番号が変わる理由は良く分かっていません。現在ウチにあるWeMo、WeMo Insightのポート番号は両方とも49153でしたので、これでWeMoであると判断することにしました。
LOCATION: で示された URLにアクセスしてみると、
$ curl -s http://192.168.xx.xx:49153/setup.xml
<?xml version="1.0"?>
<root xmlns="urn:Belkin:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:Belkin:device:insight:1</deviceType>
<friendlyName>Mac mini Switch</friendlyName>
<manufacturer>Belkin International Inc.</manufacturer>
<manufacturerURL>http://www.belkin.com</manufacturerURL>
<modelDescription>Belkin Insight 1.0</modelDescription>
<modelName>Insight</modelName>
<modelNumber>1.0</modelNumber>
<modelURL>http://www.belkin.com/plugin/</modelURL>
<serialNumber>2a1b1cKd1x0y4z</serialNumber>
〜略〜
</device>
</root>
|
と、WeMo機器の情報や<friendlyName>タグでは自分が付けたWeMoの名前を得ることができますし、この後に利用可能なサービスがずら〜っと出力されて来ます。
IPアドレスが分かったら、次はWeMoを制御するスクリプトです。制御スクリプト wemo_control.sh はこちらから入手しました。このスクリプトでは最初に49152〜49155のポート番号をチェックしていますが、今回はポート番号49153決め打ちですから、ポート番号のチェック処理を削除して PORT=49153 に書き換えてしまいました。使い方は、
$ ./wemo_control.sh 192.168.xx.xx OFF
0
$ ./wemo_control.sh 192.168.xx.xx ON
1
$ ./wemo_control.sh 192.168.xx.xx GETSTATE
ON
|
です。
以上で材料は揃いましたので、これらを結びつけてCGIとしてWebから呼び出せるようにします。その際、誰でも呼び出せてしまったら困るので、Apacheの設定(.htaccess, .htpasswd)で認証をパスしなければアクセスできないようしておきました。
1) "/etc/httpd/httpd.conf" の設定変更(CGIの有効化)
<Directory /Users/*/Sites>
AllowOverride FileInfo AuthConfig Limit
AddHandler cgi-script cgi
Options MultiViews Indexes SymLinksIfOwnerMatch ExecCGI IncludesNoExec
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
|
2) "~/Sites/.htaccess" の作成
任意のエディタで以下のファイルを作成します。
AuthUserFile /Users/hoge/Sites/.htpasswd
AuthGroupFile /dev/null
AuthName "Please Enter UserID and Password"
AuthType Basic
Require valid-user
|
owner, group をwwwに変更し、read権のみにしておきます。
# chown www:www .htaccess
# chmod 400 .htaccess
|
3) .htpasswdファイルの作成
# htpasswd -c /Users/hoge/Sites/.htpasswd hoge
New password:
Re-type new password:
Adding password for user hoge
# chown www:www /Users/hoge/Sites/.htpasswd
# chmod 400 /Users/hoge/Sites/.htpasswd
|
こうして作ったのが、
こんな感じのホームページ(CGI)です。これで iPhoneがバッテリ切れ等で使えないとか、将来WeMoアプリがアップデートされなくなって動かないような事になってもWeMoを操作することは可能と言うわけです。
|