From 18c47052e6555d2f6a6c6f9be9916a4d41757aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E6=B1=82=E5=9C=A3=E5=89=91?= Date: Tue, 14 Oct 2025 11:51:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=A3=E7=A0=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC=E5=88=B0?= =?UTF-8?q?=20v1.0.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 config_flow.py 中的 KeyError 风险 - 添加 MQTT broker 地址和端口验证 - 完善翻译文件,添加所有配置字段的中文翻译 - 修复 sensor.py 中的弃用 API 使用 - 改进错误处理,转换失败时设置 available 为 False - 添加 device_info 中的 sw_version 字段 - 清理 manifest.json 中不必要的 paho-mqtt 依赖 - 修正 README.md 中的路径错误 - 更新版本号到 1.0.3 --- README.md | 4 +-- custom_components/JackeryHome/config_flow.py | 30 ++++++++++++++----- custom_components/JackeryHome/manifest.json | 5 +--- custom_components/JackeryHome/sensor.py | 7 ++++- custom_components/JackeryHome/strings.json | 10 +++++-- .../JackeryHome/translations/zh-Hans.json | 10 +++++-- 6 files changed, 45 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 24a767e..4b3a767 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ 本项目包含两个主要部分: 1. **MQTT 模拟器** (`main.py`) - 模拟发送能源监控数据到 MQTT broker -2. **Home Assistant 自定义集成** (`custom_components/energy_monitor/`) - 接收 MQTT 数据并创建传感器实体 +2. **Home Assistant 自定义集成** (`custom_components/JackeryHome/`) - 接收 MQTT 数据并创建传感器实体 ## 传感器列表 @@ -161,7 +161,7 @@ entities: ### 核心文件 - `main.py`: MQTT 传感器模拟器主程序 -- `custom_components/energy_monitor/`: Home Assistant 自定义集成 +- `custom_components/JackeryHome/`: Home Assistant 自定义集成 - `__init__.py`: 集成入口 - `manifest.json`: 集成元数据 - `sensor.py`: 传感器平台实现 diff --git a/custom_components/JackeryHome/config_flow.py b/custom_components/JackeryHome/config_flow.py index 1ff5705..e08951a 100644 --- a/custom_components/JackeryHome/config_flow.py +++ b/custom_components/JackeryHome/config_flow.py @@ -43,16 +43,30 @@ class JackeryHomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): errors = {} if user_input is not None: - # 检查是否已经配置 - await self.async_set_unique_id(DOMAIN) - self._abort_if_unique_id_configured() + # 验证 MQTT broker 地址 + mqtt_broker = user_input.get("mqtt_broker", "").strip() + if not mqtt_broker: + errors["base"] = "mqtt_broker_required" - _LOGGER.info(f"Creating JackeryHome config entry with topic_prefix: {user_input['topic_prefix']}") + # 验证端口范围 + try: + mqtt_port = int(user_input.get("mqtt_port", 1883)) + if mqtt_port < 1 or mqtt_port > 65535: + errors["base"] = "invalid_port" + except (ValueError, TypeError): + errors["base"] = "invalid_port" - return self.async_create_entry( - title="JackeryHome", - data=user_input, - ) + if not errors: + # 检查是否已经配置 + await self.async_set_unique_id(DOMAIN) + self._abort_if_unique_id_configured() + + _LOGGER.info(f"Creating JackeryHome config entry with topic_prefix: {user_input.get('topic_prefix', 'homeassistant/sensor')}") + + return self.async_create_entry( + title="JackeryHome", + data=user_input, + ) return self.async_show_form( step_id="user", diff --git a/custom_components/JackeryHome/manifest.json b/custom_components/JackeryHome/manifest.json index e30dcf2..7b0a08f 100644 --- a/custom_components/JackeryHome/manifest.json +++ b/custom_components/JackeryHome/manifest.json @@ -11,8 +11,5 @@ "documentation": "https://github.com/suyulin/jackery_home", "issue_tracker": "https://github.com/suyulin/jackery_home/issues", "iot_class": "local_push", - "requirements": [ - "paho-mqtt>=1.6.0" - ], - "version": "1.0.2" + "version": "1.0.3" } \ No newline at end of file diff --git a/custom_components/JackeryHome/sensor.py b/custom_components/JackeryHome/sensor.py index baebfec..4841abf 100644 --- a/custom_components/JackeryHome/sensor.py +++ b/custom_components/JackeryHome/sensor.py @@ -101,7 +101,7 @@ async def async_setup_entry( ) entities.append(entity) - async_add_entities(entities, True) + async_add_entities(entities) _LOGGER.info(f"Added {len(entities)} JackeryHome sensors") @@ -132,6 +132,7 @@ class JackeryHomeSensor(SensorEntity): "name": "JackeryHome", "manufacturer": "Jackery", "model": "Energy Monitor", + "sw_version": "1.0.3", } self._topic = f"{topic_prefix}/{sensor_id}/state" self._attr_native_value = None @@ -169,7 +170,11 @@ class JackeryHomeSensor(SensorEntity): try: value = float(payload) except ValueError: + # 如果无法转换为数字,保持原值但设置不可用 value = payload + self._attr_available = False + self.async_write_ha_state() + return # 更新传感器状态 self._attr_native_value = value diff --git a/custom_components/JackeryHome/strings.json b/custom_components/JackeryHome/strings.json index b98e6b7..254356a 100644 --- a/custom_components/JackeryHome/strings.json +++ b/custom_components/JackeryHome/strings.json @@ -3,14 +3,18 @@ "step": { "user": { "title": "配置 JackeryHome", - "description": "设置 MQTT 主题前缀以接收能源监控数据", + "description": "设置 MQTT 连接参数以接收能源监控数据", "data": { - "topic_prefix": "MQTT 主题前缀" + "topic_prefix": "MQTT 主题前缀", + "mqtt_broker": "MQTT Broker 地址", + "mqtt_port": "MQTT 端口" } } }, "error": { - "already_configured": "该集成已配置" + "already_configured": "该集成已配置", + "mqtt_broker_required": "MQTT Broker 地址不能为空", + "invalid_port": "端口号必须在 1-65535 范围内" }, "abort": { "already_configured": "该集成已配置" diff --git a/custom_components/JackeryHome/translations/zh-Hans.json b/custom_components/JackeryHome/translations/zh-Hans.json index b98e6b7..254356a 100644 --- a/custom_components/JackeryHome/translations/zh-Hans.json +++ b/custom_components/JackeryHome/translations/zh-Hans.json @@ -3,14 +3,18 @@ "step": { "user": { "title": "配置 JackeryHome", - "description": "设置 MQTT 主题前缀以接收能源监控数据", + "description": "设置 MQTT 连接参数以接收能源监控数据", "data": { - "topic_prefix": "MQTT 主题前缀" + "topic_prefix": "MQTT 主题前缀", + "mqtt_broker": "MQTT Broker 地址", + "mqtt_port": "MQTT 端口" } } }, "error": { - "already_configured": "该集成已配置" + "already_configured": "该集成已配置", + "mqtt_broker_required": "MQTT Broker 地址不能为空", + "invalid_port": "端口号必须在 1-65535 范围内" }, "abort": { "already_configured": "该集成已配置"