PowerHub コントローラー Home Assistant 連携ガイド

本章では、多チャンネル電源管理を統合したプログラマブルコントローラー PowerHub を Home Assistant に連携させる方法について説明します。

1. 準備

環境準備

  1. Home Assistant 公式ドキュメントを参照して Home Assistant をインストールします。
  2. ESPHome 公式ドキュメントを参照して ESPHome Device Builder アドオンをインストールします。(注:本チュートリアルは ESPHome 2025.11.2 を基準に作成されています。コンパイルエラーが発生した場合は、このバージョンに切り替えて確認してください。)

ハードウェア製品

2. オンライン書き込み

下の オンライン書き込み ボタンをクリックし、画面の指示に従ってファームウェアの書き込みと Wi-Fi 設定を完了すると、PowerHub を Home Assistant にすぐに接続して試すことができます。

書き込みと設定の詳細については、ESPHome ファームウェアのオンライン書き込みと設定を参照してください。

オンライン書き込みを使用した場合、「ファームウェアのコンパイルと書き込み」の手順は不要です。4. 使い方へ進んでください。

3. ファームウェアのコンパイルと書き込み

このセクションでは、二次開発、機能変更、機能追加を行うために、yaml 設定ファイルを基にプロジェクトを再コンパイルする方法を説明します。

コンパイル時間
HA でのファームウェアコンパイルは多くのリソースを消費します。初回コンパイル時は、HA サービスを実行するデバイスの性能やネットワーク品質によって、リソースのダウンロードに時間がかかる場合があります。

デバイスの作成

  1. Home Assistant で ESPHome Builder を開き、右下の NEW DEVICE ボタンをクリックして空の設定ファイルを作成します。

  2. ダイアログで CONTINUE をクリックします。

  1. Empty Configuration を選択します。
  1. 必要に応じてファイル名を入力します。

設定の変更

  1. 新しく作成された設定ファイルの EDIT をクリックします。
  1. configurations.yaml の内容を設定ファイルにコピーします。

  2. 必要に応じてネットワーク設定や API 情報を変更します。たとえば、認証用の API Encryption Key を作成する場合は以下のように設定します:

    yaml
    1 2 3
    api:
      encryption:
        key: "Your_Encryption_Key"
API Encryption Key
Key が必要な場合は、Native API ページの encryption で生成できます。

または、タイムゾーン設定を変更する場合:

yaml
1
timezone: Europe/London

適切なタイムゾーンに変更します:

yaml
1
timezone: Asia/Shanghai
  1. 右上の SAVEINSTALL を順にクリックし、Manual download を選択します。

  2. コードが生成され、プロジェクトのコンパイルが開始されます。

  3. コンパイルが完了したら、Factory format を選択してファームウェアをダウンロードします。

ファームウェアの書き込み

  1. ESPHome Builder の Manual download から Factory format ファームウェアをダウンロード済みであることを確認します。

  2. ブラウザで ESPHome Web を開きます。

  3. USB Type-C ケーブルで PowerHub をコンピューターに接続し、CONNECT をクリックして該当するデバイスポートを選択します。

  1. INSTALL をクリックしてダウンロードしたファームウェアを選択し、再度 INSTALL をクリックしてデバイスに書き込みます。
  1. 書き込みが完了すると、デバイスは自動的にリセットされます。

4. 使い方

  1. デバイスが再起動すると、設定済みのネットワークに自動接続します。通常は Settings -> Devices & services でデバイスが検出されます。

  2. Add をクリックして PowerHub を Home Assistant に統合します。事前に API Encryption Key を設定した場合は、ここで入力して認証を行う必要があります。

PowerHub の Dashboard サンプル:

 <img src="https://m5stack-doc.oss-cn-shenzhen.aliyuncs.com/1183/powerhub_ha_controls.webp" style="object-fit: contain;" width="30%" />
 <img src="https://m5stack-doc.oss-cn-shenzhen.aliyuncs.com/1183/powerhub_ha_sensors.webp" width="30%" />
 <img src="https://m5stack-doc.oss-cn-shenzhen.aliyuncs.com/1183/powerhub_ha_selec_misc.webp" width="30%" />
  1. 照明スイッチや電源スイッチを使って各チャンネルの照明や電源出力を個別に制御できます。ドロップダウンメニューで USB 動作モード、RS485 & CAN インターフェースの出力電圧および電流制限を設定できます(RS485 & CAN Power Output を有効にする必要があります)。

5. コンポーネント設定

I2C はデバイス設定に必要なコンポーネントです。

  • このデバイスは RS485 と CAN インターフェースを提供しています。RS485/CAN インターフェースを使用する場合は、Modbus ControllerCAN Bus などのコンポーネントを追加で設定する必要があります。
  • USB Type A または USB Type C ポートの USB モードを設定できます。USB インターフェースを通じて通信する場合は、USB Host InterfaceTinyUSB の設定が必要になる場合があります。
# Example configuration entry
powerhub:

設定変数

  • id(任意、ID):PowerHub コンポーネントに ID を指定します。
  • update_interval(任意、Time):センサーのチェック間隔。never に設定すると更新を無効化します。デフォルト値は 10s です。

Binary Sensor

powerhub の Binary Sensor は、主にトップ PMU ボタンが押されているかどうかを検出するために使用します。

binary_sensor:
  - platform: powerhub
    id: powerhub_binary_sensor
    button:
      name: "Top PMU Button"

設定変数

  • powerhub_id(任意、ID):PowerHub の ID。
  • button(任意):トップ PMU ボタン(矩形)が押されているかどうかを検出します。 その他のオプションは Binary Sensor と同様です。

Sensor

powerhub 上のセンサーは、電圧 / 電流などさまざまな計測値をレポートします。

sensor:
  - platform: powerhub
    battery_voltage:
      name: "Battery Voltage"
      id: bat_volt_sensor
    battery_current:
      name: "Battery Current"
      id: bat_curr_sensor
    battery_level:
      name: "Battery Percentage"
      id: bat_level_sensor
    grove_red_voltage:
      name: "Port.A Voltage"
      id: grove_red_volt_sensor
    grove_red_current:
      name: "Port.A Current"
      id: grove_red_curr_sensor
    grove_blue_voltage:
      name: "Port.C Voltage"
      id: grove_blue_volt_sensor
    grove_blue_current:
      name: "Port.C Current"
      id: grove_blue_curr_sensor
    can_voltage:
      name: "CAN Voltage"
      id: can_volt_sensor
    can_current:
      name: "CAN Current"
      id: can_curr_sensor
    rs485_voltage:
      name: "RS485 Voltage"
      id: rs485_volt_sensor
    rs485_current:
      name: "RS485 Current"
      id: rs485_curr_sensor
    usb_voltage:
      name: "USB Voltage"
      id: usb_volt_sensor
    usb_current:
      name: "USB Current"
      id: usb_curr_sensor
ヒント
センサーを使用するには VAMeter Power スイッチと対応する出力チャンネルを有効にする必要があります。対応する負荷を接続した場合のみ、読み取り値が有意になります。

設定変数

  • battery_voltage(任意):バッテリー電圧。 その他のオプションは Sensor と同様です。
  • battery_current(任意):バッテリー電流。 その他のオプションは Sensor と同様です。
  • battery_level(任意):バッテリー残量をパーセンテージでレポートします。 その他のオプションは Sensor と同様です。
  • grove_red_voltage(任意):grove red(Port.A)チャンネルの電圧。 その他のオプションは Sensor と同様です。
  • grove_red_current(任意):grove red(Port.A)チャンネルの電流。 その他のオプションは Sensor と同様です。
  • grove_blue_voltage(任意):grove blue(Port.C)チャンネルの電圧。 その他のオプションは Sensor と同様です。
  • grove_blue_current(任意):grove blue(Port.C)チャンネルの電流。 その他のオプションは Sensor と同様です。
  • can_voltage(任意):CAN インターフェースの電圧。 その他のオプションは Sensor と同様です。
  • can_current(任意):CAN インターフェースの電流。 その他のオプションは Sensor と同様です。
  • rs485_voltage(任意):RS485 インターフェースの電圧。 その他のオプションは Sensor と同様です。
  • rs485_current(任意):RS485 インターフェースの電流。 その他のオプションは Sensor と同様です。
  • usb_voltage(任意):USB インターフェースの電圧。 その他のオプションは Sensor と同様です。
  • usb_current(任意):USB インターフェースの電流。 その他のオプションは Sensor と同様です。
  • powerhub_id(任意、ID):PowerHub の ID。

Text Sensor

powerhub の Text Sensor は、電源状態をテキスト形式でレポートするとともに、デバイスの内部ファームウェア / ブートローダーのバージョンもレポートします。

text_sensor:
  - platform: powerhub
    charge_status:
      name: "Battery Charge Status"
      id: bat_charge_status_text_sensor
    vin_status:
      name: "External Input Power Status"
      id: ext_vin_status_text_sensor
    firmware_ver:
      name: "Internal Firmware Version"
      id: int_firm_ver_text_sensor
    bootloader_ver:
      name: "Bootloader Version"
      id: boot_ver_text_sensor

設定変数

  • charge_status(任意):バッテリーが充電中かどうかを検出します。 その他のオプションは Text Sensor と同様です。
  • vin_status(任意):外部入力電源が存在するかどうかを検出します。 その他のオプションは Text Sensor と同様です。
  • firmware_ver(任意):デバイスの内部ファームウェアバージョンをレポートします。 その他のオプションは Text Sensor と同様です。
  • bootloader_ver(任意):デバイスのブートローダーバージョン。 その他のオプションは Text Sensor と同様です。
  • powerhub_id(任意、ID):PowerHub の ID。

Switch

powerhub のスイッチを使用して、フロントエンドから各電源チャンネルを有効 / 無効にできます。

switch:
  - platform: powerhub
    led_pwr:
      name: "LED Power"
      id: led_pwr_switch
    usb_pwr:
      name: "USB Power"
      id: usb_pwr_switch
    grove_red_pwr:
      name: "Port.A Power"
      id: grove_red_pwr_switch
    grove_blue_pwr:
      name: "Port.C Power"
      id: grove_blue_pwr_switch
    rs485_can_pwr:
      name: "RS485&CAN Power"
      id: rs485_can_pwr_switch
    vameter_pwr:
      name: "VAMeter Power"
      id: vameter_pwr_switch
    charge_pwr:
      name: "Charge Power"
      id: charge_pwr_switch
    rs485_can_direction:
      name: "RS485&CAN Power Output"
      id: rs485_can_direction_switch

設定変数

  • led_pwr(任意):LED 電源のオン / オフ。デフォルト true。 その他のオプションは Switch と同様です。
  • usb_pwr(任意):USB 電源のオン / オフ。 その他のオプションは Switch と同様です。
  • grove_red_pwr(任意):Port.A(grove red)電源のオン / オフ。 その他のオプションは Switch と同様です。
  • grove_blue_pwr(任意):Port.C(grove blue)電源のオン / オフ。 その他のオプションは Switch と同様です。
  • rs485_can_pwr(任意):RS485 & CAN 電源のオン / オフ。 その他のオプションは Switch と同様です。
  • vameter_pwr(任意):VAMeter 電源のオン / オフ。デフォルト true。 その他のオプションは Switch と同様です。
  • charge_pwr(任意):充電電源のオン / オフ。デフォルト true。 その他のオプションは Switch と同様です。
  • rs485_can_direction(任意):RS485 & CAN 電源の出力方向を制御します。有効にすると出力が開始されます。 その他のオプションは Switch と同様です。
  • powerhub_id(任意、ID):PowerHub の ID。

Select

powerhub の select を使用して、USB Type A または USB Type C インターフェースの USB モードを切り替えることができます。

select:
  - platform: powerhub
    usb_mode:
      name: "USB Mode"
      id: usb_mode_select

設定変数

  • usb_mode(任意):USB Type A または USB Type C ポートの host/device モードを設定します。両方のポートを同時に USB host モードに設定することはできません。 デフォルトは device モードです。選択可能な値は DefaultHost for USB-C、または Host for USB-A です。 その他のオプションは Select と同様です。
  • powerhub_id(任意、ID):PowerHub の ID。

Number

number を使用して、RS485 & CAN インターフェースの出力電圧と電流制限を設定できます。

number:
  - platform: powerhub
    rs485_can_output_voltage:
      name: "RS485&CAN Output Voltage"
    rs485_can_current_limit:
      name: "RS485&CAN Output Current Limit"

設定変数

  • rs485_can_output_voltage(任意):RS485 & CAN インターフェースの出力電圧を設定します。デフォルト 3000 mV。 スイッチ rs485_can_direction を有効にしないと反映されません。 その他のオプションは Number と同様です。
  • rs485_can_current_limit(任意):RS485 & CAN インターフェースの出力電流制限を設定します。デフォルト 13 mA。 スイッチ rs485_can_direction を有効にしないと反映されません。 その他のオプションは Number と同様です。
  • powerhub_id(任意、ID):PowerHub の ID。

Light

powerhub の各電源チャンネルには、電源状態を示すステータス RGB LED が搭載されています。

light:
  - platform: powerhub
    usb_c_rgb:
      name: "USB C Light"
    usb_a_rgb:
      name: "USB A Light"
    grove_blue_rgb:
      name: "Port.C Light"
    grove_red_rgb:
      name: "Port.A Light"
    rs485_can_rgb:
      name: "RS485&CAN Light"
    bat_charge_rgb:
      name: "Battery Charge Light"
    pwr_l_rgb:
      name: "Power L Light"
    pwr_r_rgb:
      name: "Power R Light"

設定変数

  • usb_c_rgb(任意):USB Type C インターフェース下部の RGB LED を制御します。 その他のオプションは Light と同様です。
  • usb_a_rgb(任意):USB Type A インターフェース下部の RGB LED を制御します。 その他のオプションは Light と同様です。
  • grove_blue_rgb(任意):Port.C(grove blue)インターフェース下部の RGB LED を制御します。 その他のオプションは Light と同様です。
  • grove_red_rgb(任意):Port.A(grove red)インターフェース下部の RGB LED を制御します。 その他のオプションは Light と同様です。
  • rs485_can_rgb(任意):RS485 & CAN インターフェース下部の RGB LED を制御します。 その他のオプションは Light と同様です。
  • bat_charge_rgb(任意):バッテリー充電状態の RGB LED を制御します。この LED は黄色の丸ボタンの下部にあります。 その他のオプションは Light と同様です。
  • pwr_l_rgb(任意):左側の電源インジケーター RGB LED を制御します。この LED はトップ PMU ボタン(矩形)の左半分内にあります。 その他のオプションは Light と同様です。
  • pwr_r_rgb(任意):右側の電源インジケーター RGB LED を制御します。この LED はトップ PMU ボタン(矩形)の右半分内にあります。 その他のオプションは Light と同様です。
  • powerhub_id(任意、ID):PowerHub の ID。

照明はチャンネル状態の表示に非常に便利です。各種センサーのデータに基づいて照明を選択的に更新できます。たとえば、起動時に PMU ボタン内の照明を点灯させる場合:

esphome:
  ...
  on_boot:
    then:
      # Turn on the power (L/R) light
      - light.turn_on:
          id: led_pwr_l
          brightness: 100%

      - light.turn_on:
          id: led_pwr_r
          brightness: 100%

バッテリー残量の読み取り値に基づいて、トップの PMU ボタンライトを更新する場合:

sensor:
  - platform: powerhub
    ...
    battery_level:
      name: "Battery Percentage"
      id: bat_level_sensor
      on_value:
        - lambda: |-
            auto call_1 = id(led_pwr_l).turn_on();
            auto call_2 = id(led_pwr_r).turn_on();
            auto call_off_1 = id(led_pwr_l).turn_off();
            auto call_off_2 = id(led_pwr_r).turn_off();
            call_1.set_transition_length(1000);
            call_2.set_transition_length(1000);
            call_off_1.set_transition_length(1000);
            call_off_2.set_transition_length(1000);
            call_1.set_color_mode(ColorMode::RGB);
            call_2.set_color_mode(ColorMode::RGB);
            // if read battery level is unknown
            // set the LED color to white
            if ( std::isnan(x) ) {
              call_1.set_rgb(1.0, 1.0, 1.0);
              call_2.set_rgb(1.0, 1.0, 1.0);
              call_1.set_brightness(1.0);
              call_2.set_brightness(1.0);
              call_1.perform();
              call_2.perform();
              return;
            }

            if ( x > 80.0f && x <= 100.0f ) {
                call_1.set_rgb(0, 1.0, 0);
                call_2.set_rgb(0, 1.0, 0);
                call_1.set_brightness(1.0);
                call_2.set_brightness(1.0);
                call_1.perform();
                call_2.perform();
            } else if ( x > 50.0f && x <= 80.0f ) {
                call_1.set_rgb(0, 1.0, 0);
                call_2.set_rgb(0, 1.0, 0);
                call_1.set_brightness(1.0);
                call_2.set_brightness(0.8);
                call_1.perform();
                call_2.perform();
            } else if ( x > 20.0f && x <= 50.0f ) {
                call_1.set_rgb(1.0, 0.95, 0.19); // left only one LED on with YELLOW color suggest low power
                call_1.perform();
                call_off_2.perform();
            } else if ( x > 5.0f && x <= 20.0f ){
                call_1.set_rgb(1.0, 0.43, 0.32); // left only one LED on with RED color suggest extremely low power
                call_1.perform();
                call_off_2.perform();
            } else {
                call_1.set_rgb(1.0, 0.43, 0.32);
                call_1.set_brightness(0.8); // almost empty
                call_1.perform();
                call_off_2.perform();
            }
    ...

またはチャンネルスイッチのオン / オフ時に、対応する LED インジケーターを連動させる場合:

switch:
  - platform: powerhub
    ...
    usb_pwr:
      name: "USB Power"
      id: usb_pwr_switch
      on_turn_on:
        - light.turn_on:
            id: led_usb_a
            brightness: 90%
            # Color maybe
            # red: 100%
            # green: 100%
            # blue: 100%
        - light.turn_on:
            id: led_usb_c
            brightness: 90%
      on_turn_off:
        - light.turn_off:
            id: led_usb_a
        - light.turn_off:
            id: led_usb_c

    grove_red_pwr:
      name: "Port.A Power"
      id: grove_red_pwr_switch
      on_turn_on:
        - light.turn_on:
            id: led_grove_red
            brightness: 90%
      on_turn_off:
        - light.turn_off:
            id: led_grove_red

    grove_blue_pwr:
      name: "Port.C Power"
      id: grove_blue_pwr_switch
      on_turn_on:
        - light.turn_on:
            id: led_grove_blue
            brightness: 90%
      on_turn_off:
        - light.turn_off:
            id: led_grove_blue

    rs485_can_pwr:
      name: "RS485&CAN Power"
      id: rs485_can_pwr_switch
      on_turn_on:
        - light.turn_on:
            id: led_rs485_can
            brightness: 90%
      on_turn_off:
        - light.turn_off:
            id: led_rs485_can

    charge_pwr:
      name: "Charge Power"
      id: charge_pwr_switch
      restore_mode: RESTORE_DEFAULT_ON
      on_turn_on:
        - light.turn_on:
            id: led_bat_charge
            brightness: 90%
      on_turn_off:
        - light.turn_off:
            id: led_bat_charge
    ...

バッテリー充電中にパルス / ブリージングライトで充電状態を表示する場合(照明に pulse エフェクトを追加する必要があります):

light:
  - platform: powerhub
    ...
    bat_charge_rgb:
      id: led_bat_charge
      name: "Battery Charge Light"
      effects:
        - pulse:
            name: "Slow Pulse"
            transition_length: 500ms
            update_interval: 2s
    ...
text_sensor:
  - platform: powerhub
    charge_status:
      name: "Battery Charge Status"
      id: bat_charge_status_text_sensor
      on_value:
        - lambda: |-
            static std::string last_state = "";
            if (last_state == x) return;
            last_state = x;

            auto call = id(led_bat_charge).turn_on();
            call.set_brightness(0.9);
            call.set_color_mode(ColorMode::RGB);

            if (x == "Charging") {
              // Pulse green
              call.set_rgb(0, 1.0, 0);
              call.set_effect("Slow Pulse");
            } else if (x == "Discharging") {
              // Solid green
              call.set_rgb(0, 1.0, 0);
              call.set_effect("None");
            } else {
              // Solid white
              call.set_rgb(1.0, 1.0, 1.0);
              call.set_effect("None");
            }
            call.perform();

Time

powerhub には RX8130 RTC チップが内蔵されており、デバイスの時刻ソースとして使用できます。

time:
  - platform: powerhub
    id: powerhub_time

設定変数

powerhub.write_time アクション

この Action は、現在のシステム時刻を RTC ハードウェアに同期させます。

ヒント
このアクションを明示的にトリガーしない限り、powerhub コンポーネントは RTC に時刻を書き込みません。
on_...:
  - powerhub.write_time

  # powerhub の id を指定する場合
  - powerhub.write_time:
      id: powerhub_time

powerhub.read_time アクション

この Action は、RTC ハードウェアから現在のシステム時刻を同期させます。

ヒント
デフォルトでは、powerhub コンポーネントは 15 分ごとに自動的に RTC 時刻を読み取り、RTC から有効なタイムスタンプを取得した際にシステムクロックを同期します(update_interval で調整可能)。
このアクションは追加の同期をトリガーするために使用できます。
on_...:
  - powerhub.read_time

  # powerhub の id を指定する場合
  - powerhub.read_time:
      id: powerhub_time

設定例

通常、RTC と同期するための外部時刻ソースが少なくとも 1 つ必要です。このような外部時刻ソースは常に利用可能とは限りません(例:ネットワーク制限時)。 システム時刻を有効かつ信頼性の高い状態に保つため、起動時にまず RTC を一度読み取り、その後信頼できる外部時刻ソースとの同期を試みることを推奨します。 外部時刻ソースとの同期が成功した後、その時刻を再度 RTC に書き込んで再同期することができます。

esphome:
  on_boot:
    then:
      # システム起動時に RTC 時刻を一度読み取る
      powerhub.read_time:

time:
  - platform: powerhub
    # 外部 RTC が内部クロックより精度が高くない場合は繰り返し同期不要
    timezone: Asia/Shanghai
    update_interval: never

  - platform: homeassistant
    # ネットワーク経由で繰り返し同期を試みる ...
    on_time_sync:
      then:
        # ... 同期成功後に RTC を更新する
        powerhub.write_time:

6. 動画

Page Tools
PDF
On This Page