
PowerHub 是一款集成多路电源管理的可编程控制器。采用 ESP32-S3-WROOM-1U-N16R8 主控模组,搭载双核 Xtensa LX7 处理器(主频 240MHz), 支持 2.4 GHz Wi-Fi,板载 16MB Flash 和 8MB PSRAM。内置协处理器 STM32G031G8U6 搭配多路 INA226 电压电流检测 IC 与 电子开关设计, 能够精准管理多个拓展接口的电源状态,实现精准功耗控制,并提供整机低功耗唤醒功能。
本文提供将 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 Web 上传固件
使用 USB-C 数据线将 PowerHub 连接至主机, 点击 CONNECT ,选择设备连接

之后,点击 INSTALL,选择之前下载的固件上传,再次点击 INSTALL,将固件烧录至设备。

当烧录完成后,设备会自动重置

当设备重启后,会自动连接之前配置的网络,正常情况下可以在 Settings -> Devices & services 发现设备

点击 Add 将 PowerHub 集成进入 Home Assistant,如果此前设置了 API Encryption Key ,此处可能需要填入 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。可以通过 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 才会生效。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" 灯光可以用来很方便的指示通道状态,可以根据各种 Sensor 的数据,选择性的更新灯光,比如在启动时打开 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 同步。此类外部时间源可能并非始终可用(例如网络受限)。
为了保证系统时间有效且可靠,系统应在启动时先读取一次 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: