*dPWR* - ウェブベースのデジタル電源コントローラ

English

概要

ウェブベースの電力コントローラーが必要でした。大量のデバイスを遠隔制御するため、主電源(230VAC)と低電圧 DC の両方に対応し、スイッチ設定や電源状態などのリモート値も読み取れるものです。市場を調べたところ、許容できる価格帯に適切なものが見当たりませんでした(B2B 機器は数千ポンドの価格帯でした)。専用の回路基板を設計・製作したくなかったので、部品箱を漁り、手元にあるものを使って dPWR コントローラーが誕生しました。

Hardkernel.org の Odroid U3(Raspberry Pi 型の開発ボード)と U3 シールド、リレーおよびサイリスタスイッチングボード、いくつかの IO エキスパンダーチップと ATMega デバイスがありました。これらのパーツを組み合わせ、必要に応じてコンポーネントを追加できる先見性を持って dPWR を構築することにしました。ソフトウェアについては、Odroid が十分に強力で低消費電力であり、開発をはるかに容易にするため、組み込みアプリケーションではなく Linux オペレーティングシステムをベースプラットフォームとして採用しました。

時間が限られていたため、C/C++ は開発に時間がかかりすぎるとして除外し、Java、Python、Perl が候補に残りました。ちょうどクライアントの仕事で Perl アプリケーションを完成させたばかりだったこともあり、スクリプト言語として主にレポーティング用に開発されたものの、そのエコシステムが非常に豊富だったため、Perl を自然な選択としました。

dPWR の機能要件は以下のとおりでした:

  • GPIO、I2C、シリアルポート、イーサネットポートと直接通信し、手元の様々なボードを活用するために設定、設定、読み取りを行う。必要に応じてハードウェアとサポートソフトウェアを追加できるモジュラーシステムが必要でした。
  • リモート設定、制御、監視を可能にするウェブサーバーを提供する。
  • dPWR がデバイスを監視して必要な行動を取れるように(例:ping)、設定可能な自動化を提供する。

上記は開発・実装され、過去 4 年間で信頼性高く稼働してきました。最近、Corsair 電源が故障したため dPWR ハードウェアを取り外してメンテナンスを行い、下記の写真を撮影しました。

ソフトウェアをパブリックドメインに公開します。現状のままの形、またはその一部を使用してカスタムデジタル電力コントローラーを構築したり、そのウェブインターフェースを他のプロジェクトに活用できると考えているためです。

dPWR ハードウェアの回路図はすべて紙ベースだったため、再作成が必要です。

Docker での評価

dPWR を評価するには、Docker イメージを作成して実行するのが最も簡単な方法です。

  1. リポジトリをクローンして Docker イメージをビルドします。

     cd ~
     git clone https://git.eaw.app/eaw/dPWR.git
     cd dPWR
     docker build -f Dockerfile.dpwr -t dpwr .
    
  2. 使用したいポートに 8080 をマッピングしてイメージを実行します。

     docker run --rm -p 8082:8080 --name dpwr dpwr
    
  3. ウェブブラウザを開き、http://localhost:8082 にアクセスします。

  4. 以下の認証情報でログインします。
     ユーザー: root
     パスワード: 0000
    
  5. アプリケーションを停止します。

     docker stop dpwr
    

dPWR のインストール

以下のセクションでは Debian またはその派生ディストリビューションへのインストールを前提としています。Red Hat ベースの Linux バージョンは yum コマンドに置き換えてください。

  1. 開発ボードのフラッシュ、SD、または eMMC に Linux をインストールします。
  2. リポジトリをローカルの一時ディレクトリにクローンし、/usr/local にインストールして所有権を設定します。

     cd ~
     git clone https://git.eaw.app/eaw/dPWR.git
     cd dPWR
     cp -r dPWR/* /usr/local/DPWR/
     chown -R www-data:www-data /usr/local/DPWR
    
  3. すべてのアップデートを適用します。

     apt-get update
     apt-get upgrade
    
  4. 必要な Linux パッケージをインストールします(Perl はパッケージのコンパイルにビルド環境が必要です。ビルド環境のインストールを避けたい場合はパッケージを手動で配置することもできます)。

     apt-get install procps build-essential perl socat cpanminus vim
    
  5. 必要な Perl パッケージをインストールします。

     cpanm forks Switch CGI CGI::Session Device::SerialPort
    
  6. 開発ボードにシリアルポート(物理または USB)がない場合は、socat 仮想 tty をインストールして、ATMEGA328P デバイスの選択が dPWR アプリケーションの停止を引き起こさないようにします。

     # dPWR ATMEGA がシリアルポートと通信することを期待するため、仮想ポートを作成します。
     # 必要であれば、コンテナのポートフォワーディング経由でシリアルポートに接続できます。
     for i in {0..4}
     do
         socat  pty,link=/dev/vcom${i},raw  tcp4-listen:1000${i} &
     done
    
     # 上記は開発ボードの再起動時に失われます。dPWR 実行時に仮想ポートを永続的に
     # 存在させたい場合は、/usr/local/DPWR/etc/startDPWR スクリプトを編集して、
     # 上記のコードブロックと同一の行のコメントを解除してください。
    
  7. 設定ファイル /usr/local/DPWR/etc/DPWR.cfg を編集し、以下の「HTTP Server configuration」ブロックを見つけて「your」で始まる値を設定します:

     # HTTP サーバー設定パラメーター。
     #
     HTTP_SERVER_HOST                    = "<your IP Address>"
     HTTP_SERVER_PORT                    = <your Port Number>
     HTTP_DOC_PATH                       = "/usr/local/DPWR/htdocs"
     HTTP_LOGFILE                        = "/usr/local/DPWR/log/dpwr_http.log"
     HTTP_PASSWORD                       = "0000"
     HTTP_MAX_RETRIES                    = 3
     HTTP_SESSION_TIMEOUT                = 600
    

    開発ボードにシリアルポートがある場合は、以下を見つけてボードの実際のデバイス名に変更してください。そうでない場合はステップ 6 を実行してください。

     DEVICE_1_UART                       = "/dev/<your serial 1 device>"
     DEVICE_2_UART                       = "/dev/<your serial 2 device>"
    

    注意: 設定ファイルには 2 つの CONFIG ブロックがあります。「PRODUCT v2dev」キーワードが使用するブロックを示します。このようなブロックはいくつでも作成できますが、アクティブにできるのは 1 つだけで、PRODUCT キーワードで示されます。

  8. dPWR サーバーはユーザースペースプロセスとして実行されますが、システムレベルの設定プログラムへのアクセスが必要です。このために SUID root で実行し必要なシステムコマンドを呼び出すラッパースクリプトが作成されています。ix プログラムは以下のように SUID root を設定する必要があります:

    cd /usr/local/DPWR/bin
    chown root:root ix ix-x86 ix-arm
    chmod 4755 ix ix-x86 ix-arm
    
  9. dPWR アプリケーションを起動します。

     cd /usr/local/DPWR/bin
     ./startDPWR
    

    エラーメッセージが出力されている場合は修正してください。例:「Cannot open UART」は 7 で設定した UART に問題があることを意味します。確認して、必要であれば物理的なシリアルポートが動作するまでステップ 6 に戻ってください。

  10. ネットワーク上のウェブブラウザを開き、7 で設定した http://<IP>:<Port> に接続して動作を確認します。

dPWR ウェブインターフェース

設定ファイルとページを可能な限り活用した包括的なウェブインターフェースが Perl で開発されました。以下の画像はウェブインターフェースの基本画面を示しています。

ログイン
ユーザー/パスワードでログインします。4 人のユーザーが事前定義されており、それぞれ異なる権限を持っています。

ホーム画面
ホーム画面 — 空白ですが、ステータスや他の必要なデータ/説明を簡単に追加できます。

プライマリ出力画面
プライマリ出力制御画面。有効化されて出力用に設定された各ポートが説明とオン/オフスイッチとともに表示されます。制御デバイスの状態を簡単に変更できます。複数のユーザーがシステムを使用している場合、「自動更新」をチェックすると別のユーザーがスイッチを変更した際にこのビューが更新されます。

プライマリ入力画面
プライマリ入力状態画面。有効化されて入力用に設定された各ポートが現在値とともにオン/オフスイッチの形式で表示されます。「自動更新」をチェックすると定期的(設定可能)にデバイスが再読み込みされ状態が表示されます。

デバイス設定画面
デバイス設定画面。ここでデバイスを追加して設定データを設定できます。有効化されたデバイスはそのポートをグローバルプールに割り当てます。

ポート設定画面
ポート設定画面。ここでポートを有効/無効にして設定を構成できます。

ポートタイマー設定画面
ポートタイマー画面。ここで出力ポートをスケジュールで実行するように設定できます。ポートごとに 8 つのタイマーがあります。

ポート Ping 設定画面
Ping アクティビティによるポート変更画面。ここでネットワーク ping の成否に応じてポートを変更するように設定できます。例:ポートがルーターを制御していて、設定時間後に ping が確立できない場合、自動的にルーターの電源をオフにして再起動します。

状態画面 1
以下の画面でユーザーは dPWR ハードウェアの状態を確認できます。

状態画面 2

状態画面 3

状態画面 4

状態画面 5
DDNS 設定画面。自動 Dynamic DNS 更新を設定できます。dPWR が変化する動的 IP アドレスの背後にある場合、このオプションを使用して Dynamic DNS ホスト名を現在の IP で更新することで、常に dPWR に接続できます。

メール設定画面
メール設定画面。状態変化が発生した際(例:pinger が失敗してデバイスを自動再起動する)のメールアラートを設定できます。

パスワード変更画面
現在のユーザーパスワード変更画面。

時刻設定画面
時刻設定画面。タイマーを使用する場合に必要な現在の日付と時刻を、手動または NTP サービス経由で入力できます。

ウェブサーバーパラメーター設定画面
dPWR 設定パラメーター設定画面。特定の dPWR ランタイム値を変更します。

今後の予定

  1. このドキュメントをより使いやすいインストールガイドに仕上げる。