使用 Home Assistant Glow 实时监测用电量

使用 Home Assistant Glow 实时监测用电量

我租住宿舍的电费通常三个月一结,每次结算总觉得用电量挺大,因此便一直在想办法看看电到底用在了哪里,从而便于通过各种方式进行优化(即使不能优化也知道钱到底花哪了)。之前便给家里的大大小小插座都加上了智能插座用来计量电量,并接入了 Home Assistant 进行汇总管理。最近在 Home Assistant 官方文档看到了推荐的各类能源用量的计量方案,本来是想找个水表可视化识别的轮子,结果发现通过电表频闪来实时计量电量的开源方案 Home Assistant Glow 非常适合我的场景,上网搜了下元器件只要二十几块,因此决定实装一下。本文将实装过程踩过的坑进行记录。

硬件准备

名称 价格 购买链接/说明
ESP32-32D 开发板【TYPE-C 接口】 ¥19.11 淘宝店 1
LM393 光敏二极管模块 ¥1.38 淘宝店 1
LED RGB 5mm 4Ppin 发光二极管 * 10 ¥1.70 淘宝店 2
跳线(母对母) - 之前买 CH340 送了很多
邮费 ¥2.00 淘宝店 1 邮费 2 块;淘宝店 2 包邮
总计 ¥24.19

所有硬件到祸之后,可以先按照官方文档的 原理图GPIO 引脚连接图 进行连接。需要注意的是,不清楚是我的 RP 问题还是本来就该这样,在没有刷入固件前把光敏模块和开发板连接在一起会导致光敏模块巨烫无比,因此建议先刷好固件再连接光敏模块。

固件安装

官方固件

没啥需要定制的情况下,可以直接把 ESP32 通过 USB 连接到电脑,然后使用官方 Getting Started 页面 上的 “Connect” 按钮进行连接并刷写固件。如果连接到电脑找不到设备,还需要安装 CP210x 等驱动,然后可能要按住开发板上的 BOOT 键再插 USB 线才能被识别。

但我刷好固件实装后,发现因为宿舍电表频闪导致的反光有概率会导致一次闪光会被 Home Assistant Glow 识别为两次闪烁,从而导致电量翻倍,功率会在很高的数值和正常数值之间反复横跳。经过在项目 GitHub 仓库的 Issues 里搜索,可以看到 #47#213#749 等多个类似问题(可谓是常见问题了,竟然没写在 FAQ 里面),发现除了调节光敏模块的灵敏度外,还可以通过修改固件的 internal_filter 参数来解决,该参数默认为 30ms,即 30ms 内的多次闪光会被识别为一次闪光,但看 Home Assistant Glow 的 Debug Log 里闪光的间隔高达 70ms,因此干脆定制固件把这个值改成 120ms,并且重新设计了外壳以尽量减少外部光线的干扰。

定制固件

定制固件需要用到 ESPHome Dashboard。如果是 Hypervisor 安装的 Home Assistant,可以通过 ESPHome 插件 来安装 ESPHome Dashboard。我是直接用 Python 跑的 Home Assistant Core,因此直接在宿主机上用 Docker Compose 来单独运行 ESPHome Dashboard:

version: '3'
services:
  esphome:
    container_name: esphome
    image: ghcr.io/esphome/esphome:2025.9.1 # 随便选了个比较新的,可能是镜像源的原因,我之前用 latest 标签反而拉到了很久以前的版本
    volumes:
      - ~/esphome-dashboard:/config
      - /etc/localtime:/etc/localtime:ro
    restart: always
    privileged: true
    network_mode: host
    devices:
      - "/dev/ttyUSB0:/dev/ttyUSB0"  # 将主机的串口设备映射到容器内,用于刷写固件,因为我之前已经烧好了固件,因此可以直接通过 WiFi 下发 OTA 固件
    environment:
      - TZ=Asia/Shanghai  # 设置容器时区
      - HTTPS_PROXY=http://100.111.100.3:20172 #设置代理
      - HTTP_PROXY=http://100.111.100.3:20172 #设置代理

然后使用 docker compose up -d 启动容器,访问 http://[宿主机IPv4]:6052 即可进入 ESPHome Dashboard。因为我之前已经刷好了固件,因此可以自动发现设备。接着点击 “EDIT” 进入配置编辑,在文件的任意位置添加如下内容:

sensor:
  - id: !extend sensor_energy_pulse_meter
    internal_filter: 120ms

然后点击右上角的 “SAVE” 保存配置,接着点击 “INSTALL” 进行固件刷写,选择 “Wirelessly (OTA)” 即可通过 WiFi 下发固件。但我点击 INSTALL 之后,即使给容器配置了 HTTP_PROXY 和 HTTPS_PROXY 环境变量,并用 git config --global http.proxygit config --global https.proxy 配置了 git 的代理,仍然卡在 Installing tools via idf_tools.py,等了几个小时依然没反应。遂进入容器手动执行命令,发现要下载工具链安装包,估计是一直重复下到一半失败后重试的过程,结合知乎专栏:完美解决esp-idf 安装问题:clone代码速度慢,执行install.sh 龟速的方法,直接在宿主机使用 wget 将工具链安装包下载到 ~/esphome-dashboard 目录:

cd ~/esphome-dashboard
sudo wget https://github.com/espressif/crosstool-NG/releases/download/esp-14.2.0_20241119/xtensa-esp-elf-14.2.0_20241119-x86_64-linux-gnu.tar.xz

然后进入容器,将安装包复制到 ~/.platformio/dist/ 目录下:

sudo docker compose exec esphome bash
cp /config/xtensa-esp-elf-14.2.0_20241119-x86_64-linux-gnu.tar.xz ~/.platformio/dist/

然后再重新点击 ESPHome Dashboard 上的 INSTALL 即可顺利刷写固件。

外壳重新设计

官方的外壳设计在文档的3D打印示例页面最下面提供,但我实装发现这个外壳和国内常见的空开盒不太匹配,国内空开盒一般会凹进去一些以便可以合上盖子,这就导致官方的外壳不太能贴合电表的表面,同时他放指示灯以及 Type-C 接口的孔也留的比较小,导致正常打印如果稍微收缩一点就会很难怼进去甚至进不去。为此,我重新设计了外壳,放大了指示灯和 Type-C 接口的孔,并且把光敏接收灯泡的孔洞拉长成一个圆柱,以便更好地直接怼到指示灯上。模型发布到了 Maker World 上,有需要可以自取:Home Assistant Glow 外壳

Home Assistant 配置

接入 WiFi 后,Home Assistant Glow 会自动出现在 Home Assistant 的集成页面中,点击配置即可。配置完成后,因为我还使用其他智能插座监测了部分插座的用电量,所以还需要先使用 Home Assistant 的 “辅助元素” 把总用电量和这些插座用电量做差,才能得到未监测插座的用电量,方便在“能源”页面进行汇总查看。

在创建辅助元素前,由于 Home Assistant Glow 默认的固件总用电量在与 Home Assistant 断开后会重置为 0,官方 GitHub 仓库的 Issue #319 也遇到了相同的问题,最后提问者使用 “utility meter”(公共事业仪表)集成解决了问题。因此需要先使用 “公共事业仪表” 集成创建一个辅助元素用于持续记录总用电量。进入“集成”页面,点击右下角的 “添加集成”,搜索 “公共事业仪表” 并添加,在弹出的对话框中填写:

项目 内容
名称 总用电量
输入传感器 sensor.home_assistant_glow_total_energy
计量复位周期 无周期
计量复位偏移 0
支持的税费 不选
数值可回退
差值
定期重置
传感器始终可用

然后点击 “提交” 即可创建该辅助元素,后续将使用该辅助元素作为总用电量进行计算,而不是使用 Home Assistant Glow 的默认传感器。

接着进入辅助元素页面,点击右下角的 “添加辅助元素”,选择“Template”->“传感器模板”,如下填写:

项目 内容
名称 其余用电量
状态模板 见下方代码块
度量单位 kWh
设备类别 电力
状态类 总量
设备 可以选择 Home Assistant Glow,也可以不选

状态模板比较复杂,我的是:

{{ (states('sensor.zong_yong_dian_liang')| float - states('sensor.ups_zong_yong_dian_liang')|float - states('sensor.re_shui_qi_yong_dian_liang_2')|float - states('sensor.ke_ting_cha_zuo_yong_dian_liang')|float - states('sensor.kong_diao_cha_zuo_yong_dian_liang')|float - states('sensor.bing_xiang_cha_zuo_yong_dian_liang')|float - states('sensor.kong_qi_jing_hua_qi_yong_dian_liang')|float +  12.29609 + 1141.20497 + 120.54106 + 5.12248 )| round(5) }}

其中,每一项都需要使用 states(‘sensor.xxx’) | float 来获取传感器的数值并转换为浮点数,最后加上我之前使用智能插座监测的各个插座的初始电量(因为 Home Assistant Glow 是从 0 开始计量的,而智能插座是从某个数值开始计量的,因此需要把初始电量加回来),最后用 round(5) 保留五位小数。

此外,功率也可以使用传感器模板进行计算,其中设备类型选“电源”,状态类选“测量值”。

(Home Assistant 这都什么奇葩翻译,“energy” 翻译成 “电力”,“power” 反而是 “电源”,一开始选错了设备类型,能源界面死活显示不出来这个辅助元素 T_T)