=====================================================================
 ManageRS
=====================================================================
「ManageRS」は、Buffalo 製 RemoteStation(PC-OP-RS1)をコンピュータ側から
コントロールするための Python スクリプトです。


このソフトウェアは Python ライセンスのもと、改変、配布を含め、自由に使用す
ることができます。詳しくは同パッケージ内の LICENSE ファイルを御覧ください。

(C) 2009 M.Decimal at Specurio studio


機能
----------------------------------------------------------------------
- アクセス LED の点灯
- リモコン信号の記録。
- リモコン信号の発信。
- 登録信号の管理
-                                                  など


必要環境
----------------------------------------------------------------------
- Python 2.4 以降
- pySerial
-     http://pyserial.sourceforge.net/
- pexpect
-     http://www.noah.org/wiki/Pexpect
-


ご注意
----------------------------------------------------------------------
以下の説明は私の開発環境でのみ確認された事項です。Linux であれば各種ディス
トリビューションでも動作するとは思いますが、ファイル名やその配置ディレクト
リ等については、それぞれディストリビューションごとの流儀がありますから、そ
れにしたがって読み替えてください。
私の開発環境は以下のとおりです。
    
    CentOS 5.4(2.6.18-164.6.1.el5)
    Python 2.4.3(CentOS パッケージ)
    pexpect 2.3(CentOS パッケージ)
    pySerial 2.4

現在のところ Windows では動作確認をしていませんし、インストーラも対応してい
ません。デバイスへの通信はクロスプラットフォームな pySerial が行っているの
で問題ありませんが、デバイスの検索は Windows 用のコードが無いので動作しま
せん。
ソースパッケージ内のスクリプトとモジュールを手作業で適切なフォルダへコピー
し、デバイス名を設定ファイル経由、あるいは直接オプション指定すれば、動く「
かも」しれません。ただ、Buffalo 純正のコントロールソフトウェアがあるので、
そこまでして managers.py を使用する価値はない、と思います


準備
----------------------------------------------------------------------
ManageRS を使用するためには、USBSerial のドライバがカーネルに組み込まれて
いる必要があります。

  /sbin/modprobe ftdi_sio vendor=0x0411 product=0x00b3

を実行してください。ただ、再起動後にはまたドライバが外れた状態になるので、
起動するごとに上のコマンドを実行するような状態にしておいたほうがいいでしょ
う。方法はいろいろありますが、私は crontab -e で次の一行を追加しています。

  @reboot /sbin/modprobe ftdi_sio vendor=0x0411 product=0x00b3

さらに、RemoteStation のデバイスが作成された際にそのパーミッションが一般
ユーザの読み込みと書き込みが禁止されている場合、スクリプト側からコマンドを
送ったり情報を取得することができません（CentOS ではそうなるようです）。
そこで、udev のルール設定で次の文を追加してください（折り返して二行になって
いますが、実際には一行です）。

  KERNEL=="ttyUSB*", SYSFS{product}=="BUFFALO RemoteStation PC-OP-RS1",
     GROUP="uucp", MODE="0666"

書き換えたら再起動しましょう。


インストール
----------------------------------------------------------------------
ダウンロードした tar ボールを解凍し、そのディレクトリに移動、次のコマンドを
実行してください。

    % python setup.py install

実行ファイルやライブラリを /usr/local 以下に保存したい場合、上のコマンドを
次のように置き換えてください。

    % python setup.py install --prefix /usr/local

注：--prefix を使ってデフォルト以外の場所にインストールする場合、環境変数
PATH と PYTHONPATH が適切に設定されている必要があります。


使用方法
----------------------------------------------------------------------
       managers.py find
       managers.py list [オプション] [セット名]
       managers.py delete [オプション] セット名[.信号名]
       managers.py led [オプション] [繰り返し数 [インターバル]]
       managers.py capture [オプション] [セット名[.信号名] [注釈]]
       managers.py emit [オプション] [チャンネル [セット名.信号名]]
       
managers.py には６つのサブコマンドがあります。

    find
        コンピュータに接続されているすべての RemoteStation を検索し、表示
        します。Linux では次のように表示されます。
        
            0: /dev/ttyUSB0
            1: /dev/ttyUSB5
        
        最初に識別番号、次にデバイス名が表示されます。識別番号を設定ファイ
        ルの「auto_select」に使用し、デフォルトで使用される RemoteStation
        を指定しておくことができます。デバイス名は -d(--device)オプション
        で使用すること出来ます。
        
    list
        スクリプトで使用できるセット名とシグナル名をリストします。セット
        名はシグナル名をグルーピングするもので、ファイルに対するディレク
        トリのようなものです。信号名は実際の信号の識別名となります。これ
        は次のようにピリオド（.）区切りの書式です。
        
            TV.switchOn
            TV.channel8
        
        セット名が引数として指定されない場合、セット名に属するものだけをリ
        ストし、そうでない場合すべてがリストされます。
        
    delete
        指定のセットまたは信号を削除します。セット名だけを指定すると、そ
        のセットに属するすべての信号と、そのセット自体を削除します。
        
    led
        RemoteStation のアクセス LED を点灯させます。何回点灯させるか
        （repeat）、何秒消灯させるか（interval）をそれぞれ指定できます。
        残念ながら、何秒点灯させるかは指定することはできません。
    
    capture
        リモコンの信号を指定の名前で記録します。信号名が省略されると、捕
        捉した信号に対する名前は managers.py が自動的に決定します。注釈
        引数でこの信号に対しての説明を記録しておくこともできます。すべて
        の引数が省略されると、managers.py は標準出力へ信号を書きだします。
        
    emit
        RemoteStation の赤外線送信部から指定された信号を発信します。通
        常、ポート A からのびる黄色いテープが巻かれた送信部がチャンネル
        1、黄色いテープがないものがチャネル 2、ポート B の黄色いテープ付
        き送信部がチャンネル 3、そしてテープがないものがチャンネル 4 と
        なります。
        チャンネルが省略されると、managers.py は信号をすべてのチャネルか
        ら順次（同時ではありません）発信しようとします。
        信号名が省略された場合、信号は標準入力から取得されます。

使用できるオプションは次のものです。

    -c --config-file PATH
        そのコマンド実行にのみ有効なワンタイムの設定ファイルのパスを指定
        します。通常、managers.py はアプリケーションのデフォルト設定（
        Linux の場合 /etc/managers.conf）、ユーザ用の設定（$HOME/
        .managers/user.conf）の順に読み込みますが、ワンタイム設定ファイ
        ルが指定されると、ユーザ用の設定ファイルを無視します（アプリケー
        ションデフォルト設定は読み込まれます）。
    
    -s --signal-file PATH
        そのコマンド実行にのみ有効なワンタイムの信号データファイルのパス
        を指定します。通常、managers.py はアプリケーションのデフォルト信
        号データ（Linux の場合 /etc/managers.sig）、ユーザ用の信号データ
        （$HOME/.managers/user.sig）の順に読み込みますが、ワンタイム信号
        データファイルが指定されると、ユーザ用の信号データファイルを無視し
        ます（アプリケーションデフォルト信号ファイルは読み込まれます）。
    
    -d --device DEVICE
        RemoteStation のデバイスを指定します。Linux では /dev/ttyUSB?（?
        は整数）となるでしょう。デバイス名がわからなければ、find サブコマ
        ンドで表示される第二カラムを使用することができます。


デバイス検索について
----------------------------------------------------------------------
managers.py は、コマンド実行時にデバイス名が不明な場合、自動的にそのデバイ
スを検索しようとします。しかし、その動作には root 権限が必要であり、内部的
に sudo を使用しています。
コマンド実行時にオプションによってデバイスを指定しない、あるいは設定ファイ
ルでデバイスを指定しない、または find サブコマンドを使用する場合、root 権
限で実行するか、sudoers で実行ユーザに
    /bin/cat /proc/tty/driver/usbserial
のコマンド実行を許可しなければなりません。
極力 root 権限でのコマンド実行を回避したければ、RemoteStation を接続した
直後に一回だけ root 権限で find を実行し、そのデバイス情報をアプリケーショ
ンデフォルト設定（/etc/managers.conf）に書き込んでしまいましょう。

[device]
name=/dev/ttyUSB0

こうしておけば、（デバイス検索を強制する find サブコマンドを除き、）一般ユ
ーザ権限でも問題なく実行することができます。


謝辞
----------------------------------------------------------------------
RemoteStation の解析については、以下のウェブサイトを参考にさせていただきま
した。

    スーの道具箱
    http://su-u.jp/juju/

クロスプラットフォームなファイルロックのためのモジュールは、ActiveState
Code に投稿された Jonathan Feinberg 氏のコード、Portalocker を使用させて
頂きました。

    http://code.activestate.com/recipes/65203/