**重要说明:**原作者@renhai-lab 已于2023年10将项目归档,原仓库不再更新。这个版本是在原仓库基础上大幅改动,在此向原作者表达谢意和致敬。验证码识别已经从最开始的在线商业API替换成离线神经网络检测版本,请使用本仓库的同学点个小星星,或者打赏鼓励。
添加微信通知后,我想这基本上就是这个插件的最终形态了,docker镜像压缩到300MB,后续可能只会在网站变动或者出问题才会更新,再次感谢大家的Star。
注意 有很多新手都在提交验证码不能识别的相关issue,特在此统一说明:国网每天有登录限制,每天只能登录有限的几次,超过限制验证码识别成功也不会登录成功。因此,诸如issue47,issue50,issue29这些都是这个问题,以后就不做回复了。
最近issue太多实在是回复不过来了,特此添加QQ交流群 通过为项目点star并微信打赏备注QQ名或QQ号等信息,入群会审核这些信息 关于创建QQ付费群的说明
本应用可以帮助你将国网的电费、用电量数据接入homeassistant,实现实时追踪家庭用电量情况;并且可以将每日用电量保存到数据库,历史有迹可循。具体提供两类数据:
在homeassistant以实体显示:
| 实体entity_id | 说明 |
|---|---|
| sensor.last_electricity_usage_xxxx | 最近一天用电量,单位KWH、度。 |
| sensor.electricity_charge_balance_xxxx | 预付费显示电费余额,反之显示上月应交电费,单位元。 |
| sensor.yearly_electricity_usage_xxxx | 今年总用电量,单位KWH、度。 |
| sensor.yearly_electricity_charge_xxxx | 今年总用电费,单位元。 |
| sensor.month_electricity_usage_xxxx | 最近一个月用电量,单位KWH、度。 |
| sensor.month_electricity_charge_xxxx | 上月总用电费,单位元。 |
| sensor.month_valley_usage_xxxx | 当月谷时用电量,单位KWH、度。 |
| sensor.month_flat_usage_xxxx | 当月平时用电量,单位KWH、度。 |
| sensor.month_peak_usage_xxxx | 当月峰时用电量,单位KWH、度。 |
| sensor.month_tip_usage_xxxx | 当月尖时用电量,单位KWH、度。 |
| sensor.prepay_balance_xxxx | 预付费余额/应交金额(后付费账户),单位元。 |
可选,近三十天每日用电量数据(SQLite数据库) 数据库表名为 daily+userid ,在项目路径下有个homeassistant.db 的数据库文件就是; 如需查询可以用
"SELECT * FROM dailyxxxxxxxx;"
得到如下结果:
本镜像支持架构:
linux/amd64:适用于 x86-64(amd64)架构的 Linux 系统,例如windows电脑。linux/arm64:适用于 ARMv8 架构的 Linux 系统,例如树莓派3+,N1盒子等。linux/armv7,暂不提供 ARMv7 架构的 Linux 系统,例如树莓派2,玩客云等,主要原因是onnx-runtime没有armv7版本的库,用户可以参考 https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux.git自行安装库然后编译docker镜像。
通过 Python 的 Playwright 自动化获取国家电网官网的电费电量数据,绕过网站的反爬虫检测。
登录支持两种模式,验证码均由大模型(LLM)视觉识别自动解算:
| 登录方式 | 验证码类型 | LLM 方案 | 适用场景 |
|---|---|---|---|
| 密码登录 | 腾讯图标点击验证码 | DOM 提取参考图标 + 主图 → 图标匹配定位 | 生产环境 |
短信验证码登录 (DEBUG_MODE) | 腾讯文字顺序验证码 | 截图 + LLM 读提示文字 → 按顺序点击汉字 | 本机调试 |
Cookie 自动持久化到 data/sgcc_cookies.json,下次启动时复用,避免频繁登录触发风控。数据获取优先使用页面 Vue 状态注入(一次性提取年度/月度/日分时数据),DOM 方式兜底。获取数据后通过 Home Assistant 的 REST API 将实体状态 POST 更新到 Home Assistant。
本项目使用硅基流动(SiliconFlow) 的 Qwen/Qwen3.5-35B-A3B 多模态大模型自动解算国家电网验证码。支持任意 OpenAI 兼容 API。
🎁 推荐链接:https://cloud.siliconflow.cn/i/2JCjsjdB(邀请码
2JCjsjdB),点击注册即赠 16元代金券(充值一分钱后可使用)!
https://cloud.siliconflow.cn/i/2JCjsjdB(邀请码 2JCjsjdB),新用户赠16元代金券(充值一分钱后可使用)。.env 文件:
LLM_API_KEY="sk-xxxxx"
Qwen3.5-35B-A3B 输入仅 ¥0.0004 / K tokens,每次验证码解算约 500 token,个人使用几乎免费。也可切换其他多模态模型:
| 模型 | 输入价格 | 备注 |
|---|---|---|
Qwen/Qwen3.5-35B-A3B | ¥0.0004/K tokens | 推荐 |
Qwen/Qwen2.5-VL-72B-Instruct | ¥0.004/K tokens | 更准确 |
gpt-4o | ~¥0.015/K tokens | OpenAI |
doubao-seed-2-0-pro | ~¥0.004/K tokens | 火山引擎 |
注意:DeepSeek 全系列(V3/V4/R1)均为纯文本模型,不支持图片识别,无法用于验证码解算。
本项目通过 OpenAI 兼容接口调用 Qwen/Qwen3.5-35B-A3B 多模态模型,能够准确识别:
首先要注册国家电网账户,绑定电表,并且可以手动查询电量
注册网址:https://www.95598.cn/osgweb/login
token获取方法参考https://blog.csdn.net/qq_25886111/article/details/106282492
git clone https://github.com/ARC-MX/sgcc_electricity_new.git
# 如果github网络环境不好的话可以使用国内镜像,完全同步的,个人推荐使用国内镜像
# git clone https://gitee.com/ARC-MX/sgcc_electricity_new.git
cd sgcc_electricity_new
cp example.env .env
vim .env # 参考以下文件编写.env文件
### 以下项都需要修改
## 国网登录信息
# 修改为自己的登录账号
PHONE_NUMBER="xxx"
# 修改为自己的登录密码
PASSWORD="xxxx"
# 排除指定用户ID,如果出现一些不想检测的ID或者有些充电、发电帐号、可以使用这个环境变量,如果有多个就用","分隔,","之间不要有空格
IGNORE_USER_ID=xxxxxxx,xxxxxxx,xxxxxxx
# DB_TYPE 数据储存类型 SQLITE / MYSQL w,默认未NONE 不进行数据储存
DB_TYPE=NONE
# sqlite 数据库名,默认为homeassistant
DB_NAME="homeassistant.db"
# COLLECTION_NAME默认为electricity_daily_usage_{国网用户id},不支持修改。
# mysql 的数据库配置
MYSQL_HOST="mysql.lan"
MYSQL_USER="user"
MYSQL_PASSWORD="password"
MYSQL_DATABASE="sgcc"
MYSQL_PORT=3306
## homeassistant配置
# 改为你的localhost为你的homeassistant地址
HASS_URL="http://localhost:8123/"
# homeassistant的长期令牌
HASS_TOKEN="eyxxxxx"
## selenium运行参数
# 任务开始时间,24小时制,例如"07:00”则为每天早上7点执行,第一次启动程序如果时间晚于早上7点则会立即执行一次,每隔12小时执行一次。
JOB_START_TIME="07:00"
# 每次操作等待时间,推荐设定范围为[2,30],该值表示每次点击网页后所要等待数据加载的时间,如果出现“no such element”诸如此类的错误可适当调大该值,如果硬件性能较好可以适当调小该值
RETRY_WAIT_TIME_OFFSET_UNIT=15
## 记录的天数, 仅支持填写 7 或 30
# 国网原本可以记录 30 天,现在不开通智能缴费只能查询 7 天造成错误
DATA_RETENTION_DAYS=7
## PUSH_TYPE 余额不足提醒方式 PUSHPLUS / URLPUSH ,默认为None不通知
PUSH_TYPE=None
# 余额提现阈值,通知类型PUSHPLUS / URLPUSH 都生效
BALANCE=5.0
# pushplus token 如果有多个就用","分隔,","之间不要有空格,单个就不要有","
PUSHPLUS_TOKEN=xxxxxxx,xxxxxxx,xxxxxxx
# url_push 地址 通知body {"user_id": user_id, "balance": balance}
PUSH_URL="http://push.lan/notify"
# 密码登录失败(登录次数过多等)的备选方案
LOGIN_FALLBACK='qrcode'
# 二维码的提交地址
PUSH_QRCODE_URL="http://push.lan/qrcode"
# 二维码扫描后的最多等待时间 = QR_CODE_LOGIN_WAIT_COUNT x QR_CODE_LOGIN_WAIT_TIME_INTERVAL_UNIT
# 测试发现二维码默认有效期限为60s
#二维码登录等待次数
QR_CODE_LOGIN_WAIT_COUNT=30
#二维码登录等待间隔
QR_CODE_LOGIN_WAIT_TIME_INTERVAL_UNIT=10
## 浏览器反检测参数(可选,默认值即可正常工作)
# 浏览器语言
# BROWSER_LANGUAGE=zh-HK,zh,en-US,en
# 浏览器窗口尺寸
# BROWSER_WINDOW_SIZE=1158,848
# 设备像素比
# BROWSER_DEVICE_SCALE_FACTOR=2
# 自定义 User-Agent(留空使用 Chrome 默认)
# BROWSER_USER_AGENT=
## ONNX Runtime 线程数限制(可选)
# 在 Docker 中限制了 CPU 数量时,设置此项可消除线程亲和度错误
# 建议设置为 Docker 分配的 CPU 核心数
# OP_NUM_THREADS=2
## 大模型验证码识别配置(必填)
# 默认硅基流动 Qwen 多模态模型(DeepSeek 等纯文本模型不支持图片识别)
LLM_API_KEY="your-api-key-here"
LLM_BASE_URL="https://api.siliconflow.cn/v1"
LLM_MODEL="Qwen/Qwen3.5-35B-A3B"
## 调试模式(可选)
# 设置为 true 启用调试模式(仅限本机运行,Docker 中无效):
# 浏览器窗口可见 — 可观察完整自动化操作过程
# 短信验证码登录 — 通过弹窗输入短信码,验证码由 LLM 自动解算
# DEBUG_MODE=false
## 用户名映射(可选)
# 为每个户号指定友好名称,格式:户号:名称,户号:名称
# USER_NAMES="1234567890:家庭用电,0987654321:公司用电"
我已经优化了镜像环境,将镜像的地址配置为阿里云,如果要使用docker hub的源可以将docker-compose.yml中 image: registry.cn-hangzhou.aliyuncs.com/arcw/sgcc_electricity:latest 改为 arcw/sgcc_electricity:latest
运行获取传感器名称
docker-compose up -d
docker-compose logs sgcc_electricity_app
运行成功应该显示如下日志:
2026-07-24 07:00:15 [INFO ] ---- 程序开始,当前仓库版本为1.x.x
2026-07-24 07:00:15 [INFO ] ---- 当前登录的用户名为: xxxxxx
2026-07-24 07:00:16 [INFO ] ---- Browser ready (standard + stealth)
2026-07-24 07:00:30 [INFO ] ---- 已输入用户名: 138xxxxxxxx
2026-07-24 07:00:45 [INFO ] ---- Cookie 有效,跳过登录
2026-07-24 07:00:52 [INFO ] ---- [640xxxxxxxxx] 电费余额: 27.66 元
2026-07-24 07:01:05 [INFO ] ---- [640xxxxxxxxx] 年度用电量: 1691 度, 年度电费: 758.57 元 (Vue)
2026-07-24 07:01:15 [INFO ] ---- [640xxxxxxxxx] 2026-07: 用电 169 度, 电费 75.81 元 (Vue)
2026-07-24 07:01:20 [INFO ] ---- [640xxxxxxxxx] 最近用电: 2026-07-23 6.56 度 (Vue)
2026-07-24 07:01:30 [INFO ] ---- Home Assistant 传感器更新完成!
2024-06-06 16:01:55 [INFO ] ---- Get month power charge for xxxxxxx successfully, 01 月 usage is xxx KWh, charge is xxx CNY.
2024-06-06 16:01:55 [INFO ] ---- Get month power charge for xxxxxxx successfully, 02 月 usage is xxx KWh, charge is xxx CNY.
2024-06-06 16:01:55 [INFO ] ---- Get month power charge for xxxxxxx successfully, 2024-03-01-2024-03-31 usage is xxx KWh, charge is xxx CNY.
2024-06-06 16:01:55 [INFO ] ---- Get month power charge for xxxxxxx successfully, 2024-04-01-2024-04-30 usage is xxx KWh, charge is xxx CNY.
2024-06-06 16:01:59 [INFO ] ---- Get daily power consumption for xxxxxxx successfully, , 2024-06-05 usage is xxx kwh.
........
2024-12-25 13:43:25 [INFO ] ---- Check the electricity bill balance. When the balance is less than 100.0 CNY, the notification will be sent = True
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.electricity_charge_balance_xxxx state updated: 102.3 CNY
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.last_electricity_usage_xxxx state updated: 6.56 kWh
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.yearly_electricity_usage_xxxx state updated: 1691 kWh
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.yearly_electricity_charge_xxxx state updated: 758.57 CNY
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.month_electricity_usage_xxxx state updated: 169 kWh
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.month_electricity_charge_xxxx state updated: 75.81 CNY
2024-12-25 13:43:25 [INFO ] ---- User xxxxxxx state-refresh task run successfully!
sensor.electricity_charge_balance_xxxx 为余额传感器
template:
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.electricity_charge_balance_xxxx
sensor:
- name: electricity_charge_balance_xxxx
unique_id: electricity_charge_balance_xxxx
state: "{{ states('sensor.electricity_charge_balance_xxxx') }}"
state_class: measurement
unit_of_measurement: "CNY"
device_class: monetary
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.last_electricity_usage_xxxx
sensor:
- name: last_electricity_usage_xxxx
unique_id: last_electricity_usage_xxxx
state: "{{ states('sensor.last_electricity_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_electricity_usage_xxxx
sensor:
- name: month_electricity_usage_xxxx
unique_id: month_electricity_usage_xxxx
state: "{{ states('sensor.month_electricity_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_electricity_charge_xxxx
sensor:
- name: month_electricity_charge_xxxx
unique_id: month_electricity_charge_xxxx
state: "{{ states('sensor.month_electricity_charge_xxxx') }}"
state_class: measurement
unit_of_measurement: "CNY"
device_class: monetary
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.yearly_electricity_usage_xxxx
sensor:
- name: yearly_electricity_usage_xxxx
unique_id: yearly_electricity_usage_xxxx
state: "{{ states('sensor.yearly_electricity_usage_xxxx') }}"
state_class: total_increasing
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.yearly_electricity_charge_xxxx
sensor:
- name: yearly_electricity_charge_xxxx
unique_id: yearly_electricity_charge_xxxx
state: "{{ states('sensor.yearly_electricity_charge_xxxx') }}"
state_class: total_increasing
unit_of_measurement: "CNY"
device_class: monetary
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_valley_usage_xxxx
sensor:
- name: month_valley_usage_xxxx
unique_id: month_valley_usage_xxxx
state: "{{ states('sensor.month_valley_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_flat_usage_xxxx
sensor:
- name: month_flat_usage_xxxx
unique_id: month_flat_usage_xxxx
state: "{{ states('sensor.month_flat_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_peak_usage_xxxx
sensor:
- name: month_peak_usage_xxxx
unique_id: month_peak_usage_xxxx
state: "{{ states('sensor.month_peak_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_tip_usage_xxxx
sensor:
- name: month_tip_usage_xxxx
unique_id: month_tip_usage_xxxx
state: "{{ states('sensor.month_tip_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.prepay_balance_xxxx
sensor:
- name: prepay_balance_xxxx
unique_id: prepay_balance_xxxx
state: "{{ states('sensor.prepay_balance_xxxx') }}"
state_class: measurement
unit_of_measurement: "CNY"
device_class: monetary
配置完成后重启HA, 刷新一下HA界面
docker-compose down # 删除容器
docker-compose pull # 更新镜像
git pull --tags origin master:master #更新代码,代码不在容器中,所以要手动更新
docker-compose up -d # 重新运行
#如果git 拉取失败可以执行如下命令,重新拉取
git fetch --all
git reset --hard origin/master
git pull
结合mini-graph-card 和mushroom实现美化效果:
将下面中的_xxxx 替换为自己log中的_xxxx后缀。
type: vertical-stack
cards:
- type: custom:mini-graph-card
entities:
- entity: sensor.last_electricity_usage_xxxx
name: 国网每日用电量
aggregate_func: first
show_state: true
show_points: true
icon: mdi:lightning-bolt-outline
- entity: sensor.electricity_charge_balance_xxxx
name: 电费余额
aggregate_func: first
show_state: true
show_points: true
color: "#e74c3c"
icon: mdi:cash
y_axis: secondary
group_by: date
hour24: true
hours_to_show: 240
lower_bound: 0
upper_bound: 10
lower_bound_secondary: 0
upper_bound_secondary: 120
show:
icon: false
- type: horizontal-stack
cards:
- graph: none
type: sensor
entity: sensor.month_electricity_charge_xxxx
detail: 1
name: 上月电费
icon: ""
unit: 元
- graph: none
type: sensor
entity: sensor.month_electricity_usage_xxxx
detail: 1
name: 上月用电量
unit: 度
icon: mdi:lightning-bolt-outline
- type: horizontal-stack
cards:
- animate: true
entities:
- entity: sensor.yearly_electricity_usage_xxxx
name: 今年总用电量
aggregate_func: first
show_state: true
show_points: true
group_by: date
hour24: true
hours_to_show: 240
type: custom:mini-graph-card
- animate: true
entities:
- entity: sensor.yearly_electricity_charge_xxxx
name: 今年总用电费用
aggregate_func: first
show_state: true
show_points: true
group_by: date
hour24: true
hours_to_show: 240
type: custom:mini-graph-card
更新电费余额不足提醒,在.env里设置提醒余额。目前我是用pushplus的方案,注册pushplus然后,获取token,通知给谁就让谁注册并将token填到.env中 token获取方法参考https://cloud.tencent.com/developer/article/2139538
当前作者:https://github.com/ARC-MX/sgcc_electricity_new
原作者:https://github.com/louisslee/sgcc_electricity,原始README_origin.md。
增加的部分:
由于现在用户越来越多,稍有问题大家就在github上发issue,我有点回复不过来了,故创建一个付费加入的QQ群。该群只是方便大家讨论,不承诺技术协助,我想大多数用户参考历史issue和文档都能解决自己的问题
100 followers · starred Nov 2024
500 followers · starred May 2025
66 followers · starred Sep 2024
407 followers · starred Sep 2025
**重要说明:**原作者@renhai-lab 已于2023年10将项目归档,原仓库不再更新。这个版本是在原仓库基础上大幅改动,在此向原作者表达谢意和致敬。验证码识别已经从最开始的在线商业API替换成离线神经网络检测版本,请使用本仓库的同学点个小星星,或者打赏鼓励。
添加微信通知后,我想这基本上就是这个插件的最终形态了,docker镜像压缩到300MB,后续可能只会在网站变动或者出问题才会更新,再次感谢大家的Star。
注意 有很多新手都在提交验证码不能识别的相关issue,特在此统一说明:国网每天有登录限制,每天只能登录有限的几次,超过限制验证码识别成功也不会登录成功。因此,诸如issue47,issue50,issue29这些都是这个问题,以后就不做回复了。
最近issue太多实在是回复不过来了,特此添加QQ交流群 通过为项目点star并微信打赏备注QQ名或QQ号等信息,入群会审核这些信息 关于创建QQ付费群的说明
本应用可以帮助你将国网的电费、用电量数据接入homeassistant,实现实时追踪家庭用电量情况;并且可以将每日用电量保存到数据库,历史有迹可循。具体提供两类数据:
在homeassistant以实体显示:
| 实体entity_id | 说明 |
|---|---|
| sensor.last_electricity_usage_xxxx | 最近一天用电量,单位KWH、度。 |
| sensor.electricity_charge_balance_xxxx | 预付费显示电费余额,反之显示上月应交电费,单位元。 |
| sensor.yearly_electricity_usage_xxxx | 今年总用电量,单位KWH、度。 |
| sensor.yearly_electricity_charge_xxxx | 今年总用电费,单位元。 |
| sensor.month_electricity_usage_xxxx | 最近一个月用电量,单位KWH、度。 |
| sensor.month_electricity_charge_xxxx | 上月总用电费,单位元。 |
| sensor.month_valley_usage_xxxx | 当月谷时用电量,单位KWH、度。 |
| sensor.month_flat_usage_xxxx | 当月平时用电量,单位KWH、度。 |
| sensor.month_peak_usage_xxxx | 当月峰时用电量,单位KWH、度。 |
| sensor.month_tip_usage_xxxx | 当月尖时用电量,单位KWH、度。 |
| sensor.prepay_balance_xxxx | 预付费余额/应交金额(后付费账户),单位元。 |
可选,近三十天每日用电量数据(SQLite数据库) 数据库表名为 daily+userid ,在项目路径下有个homeassistant.db 的数据库文件就是; 如需查询可以用
"SELECT * FROM dailyxxxxxxxx;"
得到如下结果:
本镜像支持架构:
linux/amd64:适用于 x86-64(amd64)架构的 Linux 系统,例如windows电脑。linux/arm64:适用于 ARMv8 架构的 Linux 系统,例如树莓派3+,N1盒子等。linux/armv7,暂不提供 ARMv7 架构的 Linux 系统,例如树莓派2,玩客云等,主要原因是onnx-runtime没有armv7版本的库,用户可以参考 https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux.git自行安装库然后编译docker镜像。
通过 Python 的 Playwright 自动化获取国家电网官网的电费电量数据,绕过网站的反爬虫检测。
登录支持两种模式,验证码均由大模型(LLM)视觉识别自动解算:
| 登录方式 | 验证码类型 | LLM 方案 | 适用场景 |
|---|---|---|---|
| 密码登录 | 腾讯图标点击验证码 | DOM 提取参考图标 + 主图 → 图标匹配定位 | 生产环境 |
短信验证码登录 (DEBUG_MODE) | 腾讯文字顺序验证码 | 截图 + LLM 读提示文字 → 按顺序点击汉字 | 本机调试 |
Cookie 自动持久化到 data/sgcc_cookies.json,下次启动时复用,避免频繁登录触发风控。数据获取优先使用页面 Vue 状态注入(一次性提取年度/月度/日分时数据),DOM 方式兜底。获取数据后通过 Home Assistant 的 REST API 将实体状态 POST 更新到 Home Assistant。
本项目使用硅基流动(SiliconFlow) 的 Qwen/Qwen3.5-35B-A3B 多模态大模型自动解算国家电网验证码。支持任意 OpenAI 兼容 API。
🎁 推荐链接:https://cloud.siliconflow.cn/i/2JCjsjdB(邀请码
2JCjsjdB),点击注册即赠 16元代金券(充值一分钱后可使用)!
https://cloud.siliconflow.cn/i/2JCjsjdB(邀请码 2JCjsjdB),新用户赠16元代金券(充值一分钱后可使用)。.env 文件:
LLM_API_KEY="sk-xxxxx"
Qwen3.5-35B-A3B 输入仅 ¥0.0004 / K tokens,每次验证码解算约 500 token,个人使用几乎免费。也可切换其他多模态模型:
| 模型 | 输入价格 | 备注 |
|---|---|---|
Qwen/Qwen3.5-35B-A3B | ¥0.0004/K tokens | 推荐 |
Qwen/Qwen2.5-VL-72B-Instruct | ¥0.004/K tokens | 更准确 |
gpt-4o | ~¥0.015/K tokens | OpenAI |
doubao-seed-2-0-pro | ~¥0.004/K tokens | 火山引擎 |
注意:DeepSeek 全系列(V3/V4/R1)均为纯文本模型,不支持图片识别,无法用于验证码解算。
本项目通过 OpenAI 兼容接口调用 Qwen/Qwen3.5-35B-A3B 多模态模型,能够准确识别:
首先要注册国家电网账户,绑定电表,并且可以手动查询电量
注册网址:https://www.95598.cn/osgweb/login
token获取方法参考https://blog.csdn.net/qq_25886111/article/details/106282492
git clone https://github.com/ARC-MX/sgcc_electricity_new.git
# 如果github网络环境不好的话可以使用国内镜像,完全同步的,个人推荐使用国内镜像
# git clone https://gitee.com/ARC-MX/sgcc_electricity_new.git
cd sgcc_electricity_new
cp example.env .env
vim .env # 参考以下文件编写.env文件
### 以下项都需要修改
## 国网登录信息
# 修改为自己的登录账号
PHONE_NUMBER="xxx"
# 修改为自己的登录密码
PASSWORD="xxxx"
# 排除指定用户ID,如果出现一些不想检测的ID或者有些充电、发电帐号、可以使用这个环境变量,如果有多个就用","分隔,","之间不要有空格
IGNORE_USER_ID=xxxxxxx,xxxxxxx,xxxxxxx
# DB_TYPE 数据储存类型 SQLITE / MYSQL w,默认未NONE 不进行数据储存
DB_TYPE=NONE
# sqlite 数据库名,默认为homeassistant
DB_NAME="homeassistant.db"
# COLLECTION_NAME默认为electricity_daily_usage_{国网用户id},不支持修改。
# mysql 的数据库配置
MYSQL_HOST="mysql.lan"
MYSQL_USER="user"
MYSQL_PASSWORD="password"
MYSQL_DATABASE="sgcc"
MYSQL_PORT=3306
## homeassistant配置
# 改为你的localhost为你的homeassistant地址
HASS_URL="http://localhost:8123/"
# homeassistant的长期令牌
HASS_TOKEN="eyxxxxx"
## selenium运行参数
# 任务开始时间,24小时制,例如"07:00”则为每天早上7点执行,第一次启动程序如果时间晚于早上7点则会立即执行一次,每隔12小时执行一次。
JOB_START_TIME="07:00"
# 每次操作等待时间,推荐设定范围为[2,30],该值表示每次点击网页后所要等待数据加载的时间,如果出现“no such element”诸如此类的错误可适当调大该值,如果硬件性能较好可以适当调小该值
RETRY_WAIT_TIME_OFFSET_UNIT=15
## 记录的天数, 仅支持填写 7 或 30
# 国网原本可以记录 30 天,现在不开通智能缴费只能查询 7 天造成错误
DATA_RETENTION_DAYS=7
## PUSH_TYPE 余额不足提醒方式 PUSHPLUS / URLPUSH ,默认为None不通知
PUSH_TYPE=None
# 余额提现阈值,通知类型PUSHPLUS / URLPUSH 都生效
BALANCE=5.0
# pushplus token 如果有多个就用","分隔,","之间不要有空格,单个就不要有","
PUSHPLUS_TOKEN=xxxxxxx,xxxxxxx,xxxxxxx
# url_push 地址 通知body {"user_id": user_id, "balance": balance}
PUSH_URL="http://push.lan/notify"
# 密码登录失败(登录次数过多等)的备选方案
LOGIN_FALLBACK='qrcode'
# 二维码的提交地址
PUSH_QRCODE_URL="http://push.lan/qrcode"
# 二维码扫描后的最多等待时间 = QR_CODE_LOGIN_WAIT_COUNT x QR_CODE_LOGIN_WAIT_TIME_INTERVAL_UNIT
# 测试发现二维码默认有效期限为60s
#二维码登录等待次数
QR_CODE_LOGIN_WAIT_COUNT=30
#二维码登录等待间隔
QR_CODE_LOGIN_WAIT_TIME_INTERVAL_UNIT=10
## 浏览器反检测参数(可选,默认值即可正常工作)
# 浏览器语言
# BROWSER_LANGUAGE=zh-HK,zh,en-US,en
# 浏览器窗口尺寸
# BROWSER_WINDOW_SIZE=1158,848
# 设备像素比
# BROWSER_DEVICE_SCALE_FACTOR=2
# 自定义 User-Agent(留空使用 Chrome 默认)
# BROWSER_USER_AGENT=
## ONNX Runtime 线程数限制(可选)
# 在 Docker 中限制了 CPU 数量时,设置此项可消除线程亲和度错误
# 建议设置为 Docker 分配的 CPU 核心数
# OP_NUM_THREADS=2
## 大模型验证码识别配置(必填)
# 默认硅基流动 Qwen 多模态模型(DeepSeek 等纯文本模型不支持图片识别)
LLM_API_KEY="your-api-key-here"
LLM_BASE_URL="https://api.siliconflow.cn/v1"
LLM_MODEL="Qwen/Qwen3.5-35B-A3B"
## 调试模式(可选)
# 设置为 true 启用调试模式(仅限本机运行,Docker 中无效):
# 浏览器窗口可见 — 可观察完整自动化操作过程
# 短信验证码登录 — 通过弹窗输入短信码,验证码由 LLM 自动解算
# DEBUG_MODE=false
## 用户名映射(可选)
# 为每个户号指定友好名称,格式:户号:名称,户号:名称
# USER_NAMES="1234567890:家庭用电,0987654321:公司用电"
我已经优化了镜像环境,将镜像的地址配置为阿里云,如果要使用docker hub的源可以将docker-compose.yml中 image: registry.cn-hangzhou.aliyuncs.com/arcw/sgcc_electricity:latest 改为 arcw/sgcc_electricity:latest
运行获取传感器名称
docker-compose up -d
docker-compose logs sgcc_electricity_app
运行成功应该显示如下日志:
2026-07-24 07:00:15 [INFO ] ---- 程序开始,当前仓库版本为1.x.x
2026-07-24 07:00:15 [INFO ] ---- 当前登录的用户名为: xxxxxx
2026-07-24 07:00:16 [INFO ] ---- Browser ready (standard + stealth)
2026-07-24 07:00:30 [INFO ] ---- 已输入用户名: 138xxxxxxxx
2026-07-24 07:00:45 [INFO ] ---- Cookie 有效,跳过登录
2026-07-24 07:00:52 [INFO ] ---- [640xxxxxxxxx] 电费余额: 27.66 元
2026-07-24 07:01:05 [INFO ] ---- [640xxxxxxxxx] 年度用电量: 1691 度, 年度电费: 758.57 元 (Vue)
2026-07-24 07:01:15 [INFO ] ---- [640xxxxxxxxx] 2026-07: 用电 169 度, 电费 75.81 元 (Vue)
2026-07-24 07:01:20 [INFO ] ---- [640xxxxxxxxx] 最近用电: 2026-07-23 6.56 度 (Vue)
2026-07-24 07:01:30 [INFO ] ---- Home Assistant 传感器更新完成!
2024-06-06 16:01:55 [INFO ] ---- Get month power charge for xxxxxxx successfully, 01 月 usage is xxx KWh, charge is xxx CNY.
2024-06-06 16:01:55 [INFO ] ---- Get month power charge for xxxxxxx successfully, 02 月 usage is xxx KWh, charge is xxx CNY.
2024-06-06 16:01:55 [INFO ] ---- Get month power charge for xxxxxxx successfully, 2024-03-01-2024-03-31 usage is xxx KWh, charge is xxx CNY.
2024-06-06 16:01:55 [INFO ] ---- Get month power charge for xxxxxxx successfully, 2024-04-01-2024-04-30 usage is xxx KWh, charge is xxx CNY.
2024-06-06 16:01:59 [INFO ] ---- Get daily power consumption for xxxxxxx successfully, , 2024-06-05 usage is xxx kwh.
........
2024-12-25 13:43:25 [INFO ] ---- Check the electricity bill balance. When the balance is less than 100.0 CNY, the notification will be sent = True
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.electricity_charge_balance_xxxx state updated: 102.3 CNY
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.last_electricity_usage_xxxx state updated: 6.56 kWh
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.yearly_electricity_usage_xxxx state updated: 1691 kWh
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.yearly_electricity_charge_xxxx state updated: 758.57 CNY
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.month_electricity_usage_xxxx state updated: 169 kWh
2024-12-25 13:43:25 [INFO ] ---- Homeassistant sensor sensor.month_electricity_charge_xxxx state updated: 75.81 CNY
2024-12-25 13:43:25 [INFO ] ---- User xxxxxxx state-refresh task run successfully!
sensor.electricity_charge_balance_xxxx 为余额传感器
template:
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.electricity_charge_balance_xxxx
sensor:
- name: electricity_charge_balance_xxxx
unique_id: electricity_charge_balance_xxxx
state: "{{ states('sensor.electricity_charge_balance_xxxx') }}"
state_class: measurement
unit_of_measurement: "CNY"
device_class: monetary
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.last_electricity_usage_xxxx
sensor:
- name: last_electricity_usage_xxxx
unique_id: last_electricity_usage_xxxx
state: "{{ states('sensor.last_electricity_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_electricity_usage_xxxx
sensor:
- name: month_electricity_usage_xxxx
unique_id: month_electricity_usage_xxxx
state: "{{ states('sensor.month_electricity_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_electricity_charge_xxxx
sensor:
- name: month_electricity_charge_xxxx
unique_id: month_electricity_charge_xxxx
state: "{{ states('sensor.month_electricity_charge_xxxx') }}"
state_class: measurement
unit_of_measurement: "CNY"
device_class: monetary
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.yearly_electricity_usage_xxxx
sensor:
- name: yearly_electricity_usage_xxxx
unique_id: yearly_electricity_usage_xxxx
state: "{{ states('sensor.yearly_electricity_usage_xxxx') }}"
state_class: total_increasing
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.yearly_electricity_charge_xxxx
sensor:
- name: yearly_electricity_charge_xxxx
unique_id: yearly_electricity_charge_xxxx
state: "{{ states('sensor.yearly_electricity_charge_xxxx') }}"
state_class: total_increasing
unit_of_measurement: "CNY"
device_class: monetary
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_valley_usage_xxxx
sensor:
- name: month_valley_usage_xxxx
unique_id: month_valley_usage_xxxx
state: "{{ states('sensor.month_valley_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_flat_usage_xxxx
sensor:
- name: month_flat_usage_xxxx
unique_id: month_flat_usage_xxxx
state: "{{ states('sensor.month_flat_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_peak_usage_xxxx
sensor:
- name: month_peak_usage_xxxx
unique_id: month_peak_usage_xxxx
state: "{{ states('sensor.month_peak_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.month_tip_usage_xxxx
sensor:
- name: month_tip_usage_xxxx
unique_id: month_tip_usage_xxxx
state: "{{ states('sensor.month_tip_usage_xxxx') }}"
state_class: measurement
unit_of_measurement: "kWh"
device_class: energy
- trigger:
- platform: event
event_type: state_changed
event_data:
entity_id: sensor.prepay_balance_xxxx
sensor:
- name: prepay_balance_xxxx
unique_id: prepay_balance_xxxx
state: "{{ states('sensor.prepay_balance_xxxx') }}"
state_class: measurement
unit_of_measurement: "CNY"
device_class: monetary
配置完成后重启HA, 刷新一下HA界面
docker-compose down # 删除容器
docker-compose pull # 更新镜像
git pull --tags origin master:master #更新代码,代码不在容器中,所以要手动更新
docker-compose up -d # 重新运行
#如果git 拉取失败可以执行如下命令,重新拉取
git fetch --all
git reset --hard origin/master
git pull
结合mini-graph-card 和mushroom实现美化效果:
将下面中的_xxxx 替换为自己log中的_xxxx后缀。
type: vertical-stack
cards:
- type: custom:mini-graph-card
entities:
- entity: sensor.last_electricity_usage_xxxx
name: 国网每日用电量
aggregate_func: first
show_state: true
show_points: true
icon: mdi:lightning-bolt-outline
- entity: sensor.electricity_charge_balance_xxxx
name: 电费余额
aggregate_func: first
show_state: true
show_points: true
color: "#e74c3c"
icon: mdi:cash
y_axis: secondary
group_by: date
hour24: true
hours_to_show: 240
lower_bound: 0
upper_bound: 10
lower_bound_secondary: 0
upper_bound_secondary: 120
show:
icon: false
- type: horizontal-stack
cards:
- graph: none
type: sensor
entity: sensor.month_electricity_charge_xxxx
detail: 1
name: 上月电费
icon: ""
unit: 元
- graph: none
type: sensor
entity: sensor.month_electricity_usage_xxxx
detail: 1
name: 上月用电量
unit: 度
icon: mdi:lightning-bolt-outline
- type: horizontal-stack
cards:
- animate: true
entities:
- entity: sensor.yearly_electricity_usage_xxxx
name: 今年总用电量
aggregate_func: first
show_state: true
show_points: true
group_by: date
hour24: true
hours_to_show: 240
type: custom:mini-graph-card
- animate: true
entities:
- entity: sensor.yearly_electricity_charge_xxxx
name: 今年总用电费用
aggregate_func: first
show_state: true
show_points: true
group_by: date
hour24: true
hours_to_show: 240
type: custom:mini-graph-card
更新电费余额不足提醒,在.env里设置提醒余额。目前我是用pushplus的方案,注册pushplus然后,获取token,通知给谁就让谁注册并将token填到.env中 token获取方法参考https://cloud.tencent.com/developer/article/2139538
当前作者:https://github.com/ARC-MX/sgcc_electricity_new
原作者:https://github.com/louisslee/sgcc_electricity,原始README_origin.md。
增加的部分:
由于现在用户越来越多,稍有问题大家就在github上发issue,我有点回复不过来了,故创建一个付费加入的QQ群。该群只是方便大家讨论,不承诺技术协助,我想大多数用户参考历史issue和文档都能解决自己的问题
100 followers · starred Nov 2024
500 followers · starred May 2025
66 followers · starred Sep 2024
407 followers · starred Sep 2025