pdf-icon

PowerHub Home Assistant 統合

PowerHub は複数の電源を統合管理するプログラマブルコントローラです。ESP32-S3-WROOM-1U-N16R8(デュアルコア Xtensa LX7、240 MHz)を採用し、2.4 GHz Wi‑Fi をサポート、16 MB Flash と 8 MB PSRAM を搭載しています。内蔵の STM32G031G8U6 コプロセッサと複数の INA226 電圧/電流検出 IC、電子スイッチにより、複数の拡張インターフェースの電源状態を精密に管理し、正確な消費電力制御とシステムの低消費電力ウェイクアップを提供します。

本稿では PowerHub を Home Assistant に統合する方法を説明します。

準備

  • Home Assistant ホスト
  • Home Assistant に ESPHome Builder をインストールして有効化
ヒント
本チュートリアルでは ESPHome 2025.11.2 でキットをコンパイル/アップロードしています。コンパイルやアップロードに問題がある場合は、このバージョンに切り替えることを検討してください。

Home Assistant で ESPHome Builder を開き、空の設定ファイルを作成します。

  • 右下の NEW DEVICE ボタンをクリック。

  • ダイアログで CONTINUE をクリック。

  • Empty Configuration を選択。

  • (任意)ファイル名を入力。

  • 新規作成された設定ファイルで EDIT をクリック。

その後、configurations.yaml の内容を設定ファイルにコピーします。

必要に応じてネットワーク設定や API 情報を変更します。例として、認証用に API Encryption Key を作成する場合:

yaml
1 2 3
api:
  encryption:
    key: "Your_Encryption_Key"
ヒント
Key が必要な場合は native api(encryption 配下)で生成できます。

あるいはタイムゾーン設定を変更します:

yaml
1
timezone: Europe/London

適切なタイムゾーンに置き換えます:

yaml
1
timezone: Japan

続いて右上の SAVEINSTALL をクリックし、Manual download を選択します。

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

ヒント
初回コンパイルは時間がかかる場合があります(Home Assistant ホスト性能とネットワーク状況によります)。

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

ファームウェアをアップロード

ブラウザで ESPHome Web を開き、ファームウェアをアップロードします。

USB-C ケーブルで PowerHub をホストに接続し、CONNECT をクリックしてデバイスを選択します。

続いて INSTALL をクリックし、先ほどダウンロードしたファームウェアを選択して再度 INSTALL を押し、デバイスに書き込みます。

書き込み完了後、デバイスは自動的にリセットされます。

Home Assistant へ追加

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

Add をクリックして PowerHub を Home Assistant に統合します。事前に API Encryption Key を設定している場合は、ここで入力を求められることがあります。

PowerHub の Dashboard 例:

ライト/電源スイッチで各チャンネルを制御し、ドロップダウンで USB 動作モードを設定、RS485 & CAN の出力電圧・電流制限を設定できます(RS485 & CAN Power Output をオンにしてください)。

Component/Hub 設定

I2C は本デバイス設定に必須です。

  • RS485 と CAN インターフェースを備えており、使用する場合は Modbus ControllerCAN Bus などのコンポーネントを追加設定します。
  • USB Type A / 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 は電源状態をテキストで報告し、内部ファームウェア/bootloader バージョンも報告します。

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(任意):bootloader バージョン。
    他のオプションは 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 / Type C の host/device モードを設定します。両方のポートを同時に USB host にはできません。
    デフォルトは device モード。選択肢は DefaultHost for USB-CHost for USB-A
    他のオプションは Select
  • powerhub_id(任意、ID):PowerHub の ID。

Number

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

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(黄色の丸ボタン下)を制御。
    他のオプションは Light
  • pwr_l_rgb(任意):左側の電源インジケータ RGB LED(トップ PMU ボタン左半分)を制御。
    他のオプションは Light
  • pwr_r_rgb(任意):右側の電源インジケータ RGB 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 を読み取り、有効なタイムスタンプを取得した場合にシステムクロックを同期します(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: Japan
    update_interval: never

  - platform: homeassistant
    # ネットワーク越しに再試行して同期 ...
    on_time_sync:
      then:
        # ... 同期成功後、RTC を更新
        powerhub.write_time:

Video

On This Page