Intel Edisonでホームサーバ構築 (2)  家庭用100V電源の制御

Intel Edisonで電源スイッチを直接触れずに家庭用100V電源を制御する方法を紹介します。
自分はひとまず間接照明のON/OFFを実現し、快適に寝落ちできるようにしました(笑)

回路は組みません。USB機器を組み合わせて実現します。イメージは下図になります。

![hub_ctrl.png](https://qiita-image-store.s3.amazonaws.com/0/100741/2cd2b6e7-db73-cb5b-1b0f-6be7733daef5.png)

モノを2個調達、プログラムを1つコンパイルする必要があります。

# 調達編

USBポートごとにコマンドで電源ON/OFFが制御できるUSBハブと、USB連動式の電源タップが必要です。USB連動式の電源タップは、電源タップから出ているUSBポートをPCに繋ぎ、通電しているか否かで電源タップのスイッチを連動させるものです。今回はEdisonからUSBハブの電源の制御を行うことによって、電源タップに繋がれている家電等の電源のON/OFFを実現します。

## 電源が制御できるUSBハブ

意識しないとこういう製品にはなかなか出会いませんが、現在入手出来る製品として[SUGOI HUB USB2.0](http://www.system-talks.co.jp/product/sgc-4X.htm)があります。Amazonで入手可能です。据え置きで使うので、ACアダプタが付属している方が何かと便利です。電源が操作できるUSBポートは4つあるうちの左2つなので、残り右2つの非連動ポートは常に通電させることができ、単独でUSB充電にも使えます。

## USB連動式の電源タップ

家電量販店の電源タップコーナーにあったりしますが、サンワサプライから[USB連動タイプの電源タップ](http://www.sanwa.co.jp/product/oatap/rendo.html)が出ています。自分は[TAP-RE7U](http://www.sanwa.co.jp/product/syohin.asp?code=TAP-RE7U&cate=1)という2個口のものを用意しました。

# プログラムのインストール編

[hub-crtl](http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/)というプログラムで行います。
usb.hが必要なので、まずはlibusb-0.1-devをインストールします。

```
# opkg install libusb-0.1-dev
```

補足

- `opkg files libusb-0.1-dev`を実行すると /usr/include/usb.h が含まれていることが確認できます。

- Intel Edisonのカスタムイメージを作成する場合は、edison-image.bbにlibusb-compatとlibusb-compat-devを含めれば、元からインストールされている状態のイメージファイルが作成できます。

次に、hub-ctrl.cを取得、コンパイルし、インストールします。

```
# wget http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
# gcc -O2 -o hub-ctrl hub-ctrl.c -lusb
# cp hub-ctrl /usr/bin/
```

また、作ったバイナリはバックアップしておくと、再インストールした際に上記の手間が省けます。

# 動作編

EdisonのUSB OTGからSUGOI HUBを接続します。SUGOIハブにACアダプタを接続し、コンセントに差し込みます。

また、USB連動式の電源タップをコンセントにつなぎ、電源ON/OFFしたい機器のコンセントをこの電源タップにつなぎます。電源タップのUSBポートをSUGOIハブのポート1か2(左2つのどちらか)に接続します。

(再掲)
![hub_ctrl.png](https://qiita-image-store.s3.amazonaws.com/0/100741/2cd2b6e7-db73-cb5b-1b0f-6be7733daef5.png)

まずはSUGOI HUBが認識されているか確認します。

```
# lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

SUGOI HUBは2行目の"NEC Corp. HighSpeed Hub"が該当します。
Bus番号が1、Device番号が2であることは後で使いますので、頭の片隅に入れておきます。

続いて、ポートごとの電源状態を確認します。

```
# lsusb -v | less

Bus 001 Device 002: ID 0409:005a NEC Corp. HighSpeed Hub
(中略)
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0000 power
   Port 3: 0000.0100 power
   Port 4: 0000.0100 power
```

powerの表記があると、通電しています。

以下のコマンドで電源のON/OFFができます。-bオプションにBusの番号、-dオプションにDeviceの番号を入れ、-PオプションにUSBポートの番号、-pオプションにオン(1)/オフ(0)を指定します。

```
hub-ctrl -b 1 -d 2 -P 1 -p 1   ※ポート1の電源をON
hub-ctrl -b 1 -d 2 -P 1 -p 0   ※ポート1の電源をOFF
hub-ctrl -b 1 -d 2 -P 2 -p 1   ※ポート2の電源をON
hub-ctrl -b 1 -d 2 -P 2 -p 0   ※ポート2の電源をOFF
```

スマートフォンにSSHクライアントを入れ、Edisonに接続するとリモートでコントロールできるようになります。簡単なエイリアスでも作っておけばなおよしですね。

# 補足

## 再起動後、USBポートを見失う。

rebootをすると、USBポートを見失うことがあります。このとき、`lsusb`の結果が下記のようになります。

```
# lsusb
unable to initialize libusb:-99
```

もう一度再起動すれば元に戻るケースが多いですが、面倒です。

[Github](http://git.yoctoproject.org/cgit/cgit.cgi/meta-intel-edison/)から最新のEdisonイメージをビルドすれば、このバグは解消されています。
BSPマニュアルのお作法とはかなり変わっていますので、[aboutページ](http://git.yoctoproject.org/cgit/cgit.cgi/meta-intel-edison/about/)のQuick Startに沿ってイメージを作成します。
カーネルの修正でパッチを作成する必要がなくなり、楽になりました。

## Todo

ブラウザ経由で操作したい：
GETメソッドで実現する単純なCGIをpythonで組み、ちょっとしたwebアプリを作りました。紹介は後日したいと思います。

Raspberry Pi Zeroでも試す。

## さらなる工夫編

- ネットワーク上のファイルの内容を読みに行き、電源のON/OFF。帰宅前に何かのスイッチをいれるとか、家を留守にしているがいるふりをするとか(防犯)。
- 明るさ等のセンサーから電源のON/OFF。機械学習からルールを生成できると面白いかもですね。

# 参考
http://atotto.hatenadiary.jp/entry/linux-sugoi-usb-hub-power-ctrl