读取 95598(国家电网)账户的余额、日/月/年用电量与分时拆分。取数默认走网页那条纯 HTTP 通道,App 接口兜底:没有验证码,不需要大模型,也不需要浏览器。
取数与解析逻辑沿用 bilezhou/state_grid(MIT),未改语义。
网页通道(web_api.py) ──每格先问它(默认)──▶ refresh_data 解析 ─▶ 实体
App 通道(app_api.py) ──按刷新间隔灌进推送缓存,网页没供上的格子兜底──┘
- App 通道用 SM4/SM2/SM3 信封直连国网 App 网关,设备令牌
deviceTokenTX在本地生成(turing/,MIT vendored)——不经过任何第三方打码或加密代理服务。 - 会话令牌有效期 15 天,存在 HA 的
.storage里,到期自动重新登录。 - 协调器每 5 分钟一轮,但取数一天两次就够:两条通道都跟着「刷新间隔」走(默认 12 小时),国网一天内也只会多给出新的一天。
- 网页通道是默认的主供数源(
web_api.py):纯 HTTP——不开浏览器、不过验证码,登录标识先用手机号那把,被硬拒(RK001)时自动改用你配的备用邮箱再登一次,两把都被拒就当天不再试、第二天自己恢复;每发之间隔 0.3-0.5 秒。代价要说清:网页的 bearer 只有约 25 分钟命,所以每轮都要重登一次,一天约 2 次登录、7-9 发业务请求。 - App 那条即使不是主力也仍然每轮打一次:这既保住那份 15 天的设备会话(长期不用会过期,重新登录可能撞上"新设备短信"这种集成做不了的验证),也让网页万一挂掉时本轮就有兜底数据。想彻底不发 App 请求的话,把「网页优先」关掉即可回到"App 供数、网页只补格子"的老顺序。
- HACS → 集成 → 探索并添加自定义仓库:
https://github.com/tiejiang29/state_grid,类别 集成 - 下载 → 重启 Home Assistant
升级:HACS → 集成 → 国家电网 → 「重新下载」(有新版本时上面会显示当前版本与可用版本)→ 重启 Home Assistant。
从 Releases 下载,把 custom_components/state_grid/ 整目录覆盖到 HA 配置对应位置,删除 custom_components/state_grid/__pycache__,重启 Home Assistant。升级就是同样三步(覆盖 → 清缓存 → 重启)。
用 HACS 装的请不要直接改
custom_components/state_grid/里的文件:「重新下载」是整份覆盖,本地改动会丢。
设置 → 设备与服务 → 添加集成 → 国家电网,只问两件事:手机号与密码。
添加时集成会立刻做一次 App 登录验证;成功才建条目。密码只在生成 md5 摘要时用一次,明文不进配置项、不进 store、不进日志。
选项里可以改:
- 刷新间隔(12-48 小时):两条通道多久真实取一次数的闸门(网页优先时每轮还要各发一次登录)。默认 12 小时,也就是一天两次
- 网页通道(默认开):关掉后完全不发网页请求,只吃 App 与推送缓存
- 网页优先取数(默认开):每格先问网页、App 灌进来的那份兜底;关掉则回到 App 优先、网页只补没货的格子
- 备用登录标识(选填):一般填登记在国网的邮箱。网页登录被硬拒(
RK001)时改用这一把,不需要你动手;留空表示一旦被拒就等第二天 - 新密码:在国网改了密码后填这里,会走 App 通道验证一次才写入;失败保持原值不变
| 传感器 | 说明 | 单位 |
|---|---|---|
| 账户余额 | 预付费账户为负数表示预存 | 元 |
| 本月电费 / 历史欠费 | 同一发余额响应里的 estiAmt/historyOwe。estiAmt 是本月到此刻已产生的电费合计(实测恒等式 sumMoney = prepayBal − estiAmt);判断"缴没缴清"看历史欠费与账户余额(账单制欠费时余额为负) |
元 |
| 年度累计用电 / 峰 / 谷 / 平 / 尖 | 年度总量与分时 | kWh |
| 年度累计电费 | 年度总电费 | 元 |
| 上个月用电 / 上个月电费 | 上月账单口径 | kWh / 元 |
| 上个月抄表 | 见下方「已知限制」:这一格站点答回的就是 0 | - |
| 当月累计用电 / 峰 / 谷 / 平 / 尖 | 当月按日累计 | kWh |
| 日总用电 / 峰 / 谷 / 平 / 尖 | 最近一个出数日 | kWh |
| 最近 30 天每日用电、最近 12 个月每月用电 | 属性里的图表数据 | - |
| 最新日用电日期、最近刷新时间 | 数据新鲜度 | - |
- 「上个月抄表」显示 0。 这一格只有网页那侧有接口(
c04/f03)。2026-10-07 实测:网页通道能正常拿到答复,读数那组键(readList,走pointList时嵌一层)也在,但示数就是 0——所以这个 0 是站点给的,不是没取到。App 侧没有对应端点(月度接口只给档位levelStdCode/firstRefPq/secondRefPq和结算区间,不给示数)。关掉网页通道时这一格同样是 0,那时它是缺数。 - 年度分时之和比年度累计电量少约 0.3%(实测 4.2 kWh / 1647.3 kWh)。日电量的发布口径与月结算电量本身不重合,不是窗口算错。
- App 会话是单份的:同一账号在别处重新登录会顶掉 HA 里这份(服务端回
-201 登录状态已失效)。生产侧下一轮会自动重新登录,但调试时请记着这点。 - "新设备安全验证"(服务端
resultCode=4006)无法在 HA 里完成:这条路线的设备身份是本地合成的(turing/画像 + 现造的deviceTokenTX),服务端第一次见到就可能要短信验证。本集成不做短信、不做扫码,碰上时配置页会直接这么告诉你(不再和"密码错了"混成一句)。自己的账号从 10-03 起没被要求过,所以这是按账号/按风控的,不是必然。要避开的只有"换设备画像"这一件事:.storage/state_grid.app_device存的是画像种子,删掉它等于换一台新设备。 - RK001 是按登录标识计的日额度(错误码 11401),换 IP、换客户端都没用;被限流时当天不会再成功。
集成只往 HA 日志写有用的东西:每轮哪几格是网页答的、哪几格回落到 App 的推送缓存(未命中会带上原因和当时缓存里还剩的键)、被拒或续期失败时下一次再来是什么时候。凭证、令牌、密码一律只打长度。
- bilezhou/state_grid — 取数与解析逻辑来源(MIT,署名见
custom_components/state_grid/LICENSE.hass-state-grid) - renxiaoyaoo/ha-95598 与 ARC-MX/sgcc_electricity_new — 接口与验证码链路的逆向参考
- state_grid_docker — 同作者的另一个仓库,本集成不依赖它
本集成只访问您自己账号的用电数据,凭证仅保存在本地 Home Assistant 实例中。国网接口非公开、随时可能变更,届时数据可能中断;使用本项目风险自负。