このガイドでは、多チャンネル電源管理を統合したプログラマブルコントローラー PowerHub を Home Assistant に連携させる方法について説明します。
2025.11.2 でコンパイルおよびアップロードしています。コンパイル / アップロードに問題が発生した場合は、ESPHome をこのバージョンに切り替えることをご検討ください。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: Asia/Shanghai右上の SAVE と INSTALL を順にクリックし、Manual download を選択します。

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

ファームウェアのダウンロード:ESPHome Builder の Manual download を使用して Factory Format のファームウェアをダウンロードします。
Web ツールを使用してファームウェアを書き込みます:
ブラウザを開き、ESPHome Web にアクセスしてファームウェアをアップロードします。
USB-C ケーブルで PowerHub をホストに接続し、CONNECT をクリックしてデバイスを選択します。

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

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

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

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

RS485 & CAN Power Output を有効にする必要があります)。I2C はデバイス設定に必要なコンポーネントです。
# Example configuration entry
powerhub: never に設定すると更新を無効化します。デフォルト値は 10s です。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 は、電源状態をテキスト形式でレポートするとともに、デバイスの内部ファームウェア / ブートローダーのバージョンもレポートします。
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。
その他のオプションは Switch と同様です。true。
その他のオプションは Switch と同様です。true。
その他のオプションは Switch と同様です。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 です。
その他のオプションは Select と同様です。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" 3000 mV。
スイッチ rs485_can_direction を有効にしないと反映されません。
その他のオプションは Number と同様です。13 mA。
スイッチ rs485_can_direction を有効にしないと反映されません。
その他のオプションは Number と同様です。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: Asia/Shanghai
update_interval: never
- platform: homeassistant
# ネットワーク経由で繰り返し同期を試みる ...
on_time_sync:
then:
# ... 同期成功後に RTC を更新する
powerhub.write_time: