
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 に統合する方法を説明します。
2025.11.2 でキットをコンパイル/アップロードしています。コンパイルやアップロードに問題がある場合は、このバージョンに切り替えることを検討してください。Home Assistant で ESPHome Builder を開き、空の設定ファイルを作成します。
右下の NEW DEVICE ボタンをクリック。
ダイアログで CONTINUE をクリック。

Empty Configuration を選択。

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

必要に応じてネットワーク設定や API 情報を変更します。例として、認証用に API Encryption Key を作成する場合:
api:
encryption:
key: "Your_Encryption_Key"あるいはタイムゾーン設定を変更します:
timezone: Europe/London適切なタイムゾーンに置き換えます:
timezone: Japan続いて右上の SAVE と INSTALL をクリックし、Manual download を選択します。

コードが生成され、プロジェクトがコンパイルされます。
コンパイル完了後、Factory format を選択してファームウェアをダウンロードします。

ブラウザで ESPHome Web を開き、ファームウェアをアップロードします。
USB-C ケーブルで PowerHub をホストに接続し、CONNECT をクリックしてデバイスを選択します。

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

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

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

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

ライト/電源スイッチで各チャンネルを制御し、ドロップダウンで USB 動作モードを設定、RS485 & CAN の出力電圧・電流制限を設定できます(RS485 & CAN Power Output をオンにしてください)。
I2C は本デバイス設定に必須です。
# Example configuration entry
powerhub: powerhub の Binary Sensor はトップの PMU ボタンが押されたかを検出します。
binary_sensor:
- platform: powerhub
id: powerhub_binary_sensor
button:
name: "Top PMU Button" 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 スイッチと該当の出力チャネルをオンにする必要があります。負荷を接続して初めて有効な値になります。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 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 true。true。true。powerhub の select は USB Type A または USB Type C インターフェースの USB モードを切り替えます。
select:
- platform: powerhub
usb_mode:
name: "USB Mode"
id: usb_mode_select Default、Host for USB-C、Host for USB-A。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" 3000 mV。rs485_can_direction スイッチをオンにする必要があります。13 mA。rs485_can_direction スイッチをオンにする必要があります。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" ライトでチャネル状態を視覚化できます。センサー値に応じてライトを更新する例:起動時に 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(); powerhub には RX8130 RTC チップが内蔵されており、デバイスの時間ソースとして利用できます。
time:
- platform: powerhub
id: powerhub_time powerhub.write_time アクションこの Action は現在のシステム時刻を RTC ハードウェアに同期します。
on_...:
- powerhub.write_time
# powerhub の id を指定する場合
- powerhub.write_time:
id: powerhub_time powerhub.read_time アクションこの Action は 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: