Skip to content

Releases: tiejiang29/state_grid

v0.7.11

Choose a tag to compare

@tiejiang29 tiejiang29 released this 09 Jul 15:53

v0.7.11 更新

新功能:在 HA 内修改国网登录密码

集成「配置」页面新增「新密码」字段,解决用户在国网官方修改密码后无法在 HA 内同步更新的问题。

工作流程

  • 留空:不修改密码,走原逻辑(不影响其它字段配置)
  • 填写:提交时触发一次 password_login 验证新密码
    • RK001 冷却期内禁止验证:避免把"登录限流"误判为"密码错误"
    • 手机号遇 RK001 且配置了邮箱:自动邮箱降级验证
    • 验证成功password_login 内部自动 save_data() 持久化新密码(MD5),下次轮询自动用新密码
    • 验证失败:显示对应错误码(invalid_auth / rk001_rate_limit 等),旧密码保持不变

安全设计

密码不进 ConfigEntryentry.options / entry.data),仍按原项目设计存在 state_grid.config Store 文件里以 MD5 形式。提交后 new_password 字段不会回填表单(password 类型字段默认行为)。

附带修复

  1. strings.json 补齐 config.error.rk001_rate_limit:原代码 async_step_user 里用到但未定义,UI 会显示原始字符串
  2. 修复 async_step_user 中调用不存在的 dc._login_with_email_fallback() 的隐藏 bug:邮箱降级那段代码原本是死代码,调用即抛 AttributeError 被外层 except 吞掉,邮箱降级从未真正生效。改为 dc.password_login(email, password)

新增 i18n key(options.error

  • invalid_auth — 新密码验证失败
  • cannot_connect — 无法连接到国家电网服务器
  • no_account — 未找到运行中的集成实例
  • rk001_cooldown_cannot_verify — 冷却期内无法验证
  • rk001_rate_limit — 密码登录日额度已用完

使用方法

  1. 覆盖安装 custom_components/state_grid/ 后重启 HA
  2. 进入 设置 → 设备与服务 → 国家电网 → 配置
  3. 滚动到底部,会看到新字段「新密码(留空不修改;填写后会触发一次登录验证)」
  4. 填入国网新密码 → 提交
  5. 后台会调一次 password_login 验证:
    • 成功 → 表单关闭,新密码已写入 Store,下次轮询自动用新密码
    • 失败 → 表单回弹并显示错误(旧密码不变)
    • RK001 冷却期 → 提示"明日0点后重试"
    • 手机号 RK001 且配了邮箱 → 自动邮箱降级验证

注意事项

  • 验证过程会真实调用 LLM 解验证码(消耗少量 token)和一次 95598 登录接口(消耗一次日额度)
  • 若集成已处于 RK001 冷却期,需等到次日 0 点(北京时间)后再来修改密码

v0.7.10

Choose a tag to compare

@tiejiang29 tiejiang29 released this 21 Jun 10:17

v0.7.10 更新

优化

refresh_interval 字段从数字滑动条改为普通文本输入框,跟其它字段风格统一。

原因

之前用 vol.Coerce(int) + vol.Clamp(min=12, max=48),HA 会把它渲染成数字 slider/box(看起来像拉动条),跟旁边的 LLM 配置、邮箱等纯文本字段风格不一致,显得突兀。

改动

  • schema 改用 selector({"text": {"type": "text"}}),UI 渲染成普通文本输入框
  • 提交处理:int(str(x).strip()) 转换 + max(12, min(48, hours)) clamp 兜底
  • 默认值改成字符串 "12",跟其它字段类型统一
  • 顺手清掉未使用的 _int helper

使用

直接填小时数(如 12、24、36),范围 12-48。填小于 12 会被提到 12,填大于 48 会被压到 48,填非数字会被静默忽略保留原值。

v0.7.9

Choose a tag to compare

@tiejiang29 tiejiang29 released this 21 Jun 09:58

v0.7.9 更新

修复

OptionsFlow 配置向导 500 错误的真正根因 —— v0.7.7 的 try/except 思路是错的。

原因

v0.7.7 的代码:

def __init__(self, config_entry):
    try:
        super().__init__(config_entry)
    except TypeError:
        self.config_entry = config_entry

实际运行时两条路都走不通(traceback 已确认):

  1. super().__init__(config_entry)object.__init__() 不接受参数 → TypeError
  2. except 分支 self.config_entry = ...config_entry 是只读 property → AttributeError

修复方案

不碰 config_entry 这个名字,用私有属性 self._entry 保存:

def __init__(self, config_entry):
    self._entry = config_entry

async def async_step_init(self, user_input=None):
    current = {**(self._entry.data or {}), **(self._entry.options or {})}

无论新旧版本 HA 都能正常工作。

v0.7.8

Choose a tag to compare

@tiejiang29 tiejiang29 released this 21 Jun 09:52

v0.7.8 更新

修复

async_migrate_entry 中硬编码的目标版本号 12 改为从 StateGridOnnxConfigFlow.VERSION 动态读取。

原因

v0.7.6 引入的 async_migrate_entry 把目标版本号硬编码成字面量 12

if entry.version < 12:
    hass.config_entries.async_update_entry(entry, version=12)

未来 config_flow.VERSION 升到 13、14 时,这里仍然只升到 12,会再次触发同样的 500 错误。

修复方案

顶部新增 from .config_flow import StateGridOnnxConfigFlow,迁移逻辑改为:

target_version = StateGridOnnxConfigFlow.VERSION
if entry.version < target_version:
    hass.config_entries.async_update_entry(entry, version=target_version)

未来升版本时只需改 config_flow.VERSION 一处,迁移逻辑自动跟进。

v0.7.7

Choose a tag to compare

@tiejiang29 tiejiang29 released this 21 Jun 09:35

v0.7.7 更新

修复

修复 AttributeError: property config_entry of OptionsFlowHandler object has no setter

原因

新版 HA(你用的是 Python 3.14 + 最新 HA)的 OptionsFlow 基类把 config_entry 改为只读 property(无 setter),直接 self.config_entry = config_entry 会报错。

修复方案

def __init__(self, config_entry):
    try:
        super().__init__(config_entry)  # 新版 HA
    except TypeError:
        self.config_entry = config_entry  # 旧版 HA 兼容

这样无论新旧版本 HA 都能正常工作。

v0.7.6

Choose a tag to compare

@tiejiang29 tiejiang29 released this 21 Jun 09:33

v0.7.6 更新

修复

配置向导 500 Internal Server Error 的根本原因

之前版本只修复了 vol.Optional 缺少 default 的表层问题,但实际根本原因是缺少 async_migrate_entry 方法。HA 在打开 options 配置页时,如果 entry.version < config_flow.VERSION (12),会调用此方法做迁移,不实现就会报 500。

改动

  • 添加 async_migrate_entry 处理 ConfigEntry 版本迁移
  • OptionsFlow: refresh_interval 改用 vol.Coerce + vol.Clamp,避免 number selector 兼容性问题
  • OptionsFlow: 增加类型安全的默认值提取函数
  • OptionsFlow: 提交处理逻辑更健壮,正确处理 None 值

v0.7.5

Choose a tag to compare

@tiejiang29 tiejiang29 released this 21 Jun 09:01

v0.7.5 更新

修复

  • 修复配置向导 500 Internal Server Error(vol.Optional 缺少 default)

新增

  • 配置页可修改:LLM API Key、Base URL、Model、备用邮箱、刷新间隔(12-48小时)
  • 配置修改后实时生效,无需重启 HA
  • 所有字段默认填入当前值,留空表示不修改

v0.7.4

Choose a tag to compare

@tiejiang29 tiejiang29 released this 21 Jun 08:43

v0.7.4 更新

修复

修复 timestamp 字段在登录失败/异常时被错误覆盖的问题

v0.7.3

Choose a tag to compare

@tiejiang29 tiejiang29 released this 21 Jun 08:39

v0.7.3 更新

改动

  • HA 重启不再强制刷新数据,避免每次重启都消耗 RK001 日额度
  • 仅在首次安装(无缓存数据)时强制刷新一次
  • 重启后由 12 小时间隔判断自动决定是否刷新

修复

  • 修复 timestamp 字段未保存到存储的问题(导致重启后 12 小时间隔判断失效)
  • 启动时从存储加载 timestamp,兼容旧版无此字段的存储

重启行为对比

场景 旧行为 新行为
首次安装 强制刷新 强制刷新
HA 重启 强制刷新(消耗额度) 不刷新,使用缓存
重启后超过12小时 - 自动刷新

v0.7.2

Choose a tag to compare

@tiejiang29 tiejiang29 released this 14 Jun 15:40

v0.7.2 更新

改动

  • 数据刷新间隔从8小时调整为12小时
  • 国家电网官网每日更新一次数据,12小时间隔更合理
  • 最低刷新间隔限制同步调整为12小时
  • 首次安装仍强制刷新一次数据