スマホから電源スイッチのリモート操作を可能にするシステムをDIYしよう。

サーバ管理経験者なら、これって意外と夢だったりしませんかね?
パソコンの電源スイッチをリモート(自宅の外)からON/OFF操作する。
これ、意外と簡単にできちゃいます。電子工作経験とRaspberry Piみたいな小型低消費電力サーバと、低消費電力無線機能付きマイコンXBeeが2つあれば。

XBeeを使ってできること

こちらに概要を書いていますが、Arduinoほどの自由度はありません。
でもXBee自身が結構な数のI/Oを持つ上、ADCもあったりするので、ちょっとしたことならXBeeだけで出来てしまいます。今回のようなリレー操作なら超簡単。
とあるピンにリモートで0か1を指定して、それがそのままリレーのON/OFFに変換されるというだけでの仕組みです。
XBeeLayout

そんなシステムの構成

それなりにシーケンス図を書いてみるとこうなります。
sequence_web.png
PC電源をON/OFFするには、マザーボードの電源スイッチ端子をショートさせればいいので、リレーを使います。
リレー制御は3.3V highにできるGPIOがあれば十分なので、XBeeのdigital I/O操作APIを叩くだけというお手軽さ。

設定やら構築やらの手順

RaspberryPi + XBee Coordinatorの組み立てと設定

RaspberryPiがWebサーバとして動作して、ユーザはブラウザ経由でXBee Coordinatorを操作することになります。
家庭菜園リモート監視の記事のCoordinatorの設定Raspberry Pi側のサーバ環境構築を参考にXBeeとRaspberryPiを設定してみてください。
この辺も整理しないと・・・。

小型リレーボードキットLK-RB1 + XBee Routerの組み立てと設定

お手軽にリレーを使えるようにしたキットがあります。小型リレーボードキットLK-RB1です。

これらを以下のように配線します。
リレーの初期状態をOFF(PC電源ボタン端子アンショート)にするため、DIO10 pin6はpull downしておき、J1はPCの電源ボタン端子に接続しています。
remote power controller_回路図.png
絵にするとこんな感じです。実際の電源は電池ではなく、太陽光だったりしますが。
remote power controller_フ_レット_ホ_ート_.png
XCTUツールを操作して、XBee Routerを以下のように設定します。

  1. PAN ID, Scan Channels, Baud Rateは、RaspberryPiに接続したCoordinatorと同じ値を設定する。
  2. Destination Address Low/Highには0を設定する。0は、通信相手がCoordinatorであることを示す。
  3. API Enableを2に設定する。
  4. D0〜D5, P1〜P2を全てDisabledに設定する。リレーの初期状態をOFF(PC電源ボタン端子アンショート)にするため、P0(DIO10 pin6)のみDigital Out Lowに設定する。

スクリーンショット 2015-07-22 1.33.26.png
でもって、LK-RB1とAE-XBee-REG-DIPを回路図の通りに配線したボードを作ります。下記はあくまで一例なので、適当で構いません。動けばいいんです。
IMG_7495.JPG
基盤を載せて、
IMG_7494.JPG
本体電源スイッチとリモートスイッチの両方で操作可能にするため、どちらでもショートできるように配線し、
IMG_7497.JPG
IMG_7496.JPG
あとは基盤の電源を入れるだけ。
IMG_7498.JPG
あとはRaspberry Piでスイッチ操作ツールを実行すれば、リモートから電源ONすることができます。

リモート電源スイッチ操作ツール(コマンドライン版)インストール

Pythonで書きました。
Raspberry Piにログインして、以下のようにコマンド実行するとインストール出来ます。…初心者丸出しコードで恥ずかしい… 書き直そう。

$ git clone https://github.com/dodo5522/rpwc.git
$ cd rpwc
$ virtualenv .
$ . bin/activate
(rpwc)$ ./setup.sh

以下のようにコマンドを実行すると、電源ボタンを押下して1秒後に離す、といった動作をします。

$ python3 -m rpwc -d 0x0013A20040AFBCCE -g P0 -i 1
{'status': b'?x00', 'source_addr': b'%Y', 'source_addr_long': b'?x00?x13?xa2?x00@?xaf?xbc?xce', 'frame_id': b'?x01', 'command': b'P0', 'id': 'remote_at_response'}
{'status': b'?x00', 'source_addr': b'%Y', 'source_addr_long': b'?x00?x13?xa2?x00@?xaf?xbc?xce', 'frame_id': b'?x02', 'command': b'P0', 'id': 'remote_at_response'}

オプションの概要は以下の通り。

optional arguments:
  -h, --help            show this help message and exit
  -d L, --xbee-dest-addr L
                        destination address of xbee terminal as hexdecimal
  -g P, --xbee-gpio-power P
                        GPIO pin name which is assigned to power control on
                        xbee
  -p M, --serial-port M
                        serial port device file path to communicate with xbee
                        terminal
  -b N, --serial-baurate N
                        serial port baurate
  -i I, --interval I    interval time between press and release of power buton

まとめ

PyPIにxbeeパッケージが公開されているので、同梱されるZigBeeクラスを使えば楽勝で実装できると踏んでたんですが、remote_at関数を見つけるのに手間取って、意外とハマりました。
zibee.pyのapi_commandsとbase.pyのgetattrの実装を覚えておくと、いつか役に立つ気がします。

Close Bitnami banner
Bitnami