From 2d22a250063a26e0a1ecfb689a06f6b3a6ff5953 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, 18 Nov 2025 15:37:19 +0800 Subject: [PATCH] refactor: rename JackeryHome component directory and update references - Renamed the `custom_components/JackeryHome/` directory to `custom_components/jackery_home/` for consistency. - Updated all references in documentation and scripts to reflect the new directory name. - Removed obsolete files related to the previous directory structure. --- AGENTS.md | 2 +- HACS_PUBLISHING_GUIDE.md | 4 +- README.md | 10 +- .../{JackeryHome => jackery_home}/README.md | 0 .../{JackeryHome => jackery_home}/__init__.py | 0 .../config_flow.py | 0 .../manifest.json | 0 .../{JackeryHome => jackery_home}/sensor.py | 144 ++++++++++-------- .../strings.json | 0 .../translations/zh-Hans.json | 0 prepare_release.sh | 8 +- 11 files changed, 96 insertions(+), 72 deletions(-) rename custom_components/{JackeryHome => jackery_home}/README.md (100%) rename custom_components/{JackeryHome => jackery_home}/__init__.py (100%) rename custom_components/{JackeryHome => jackery_home}/config_flow.py (100%) rename custom_components/{JackeryHome => jackery_home}/manifest.json (100%) rename custom_components/{JackeryHome => jackery_home}/sensor.py (83%) rename custom_components/{JackeryHome => jackery_home}/strings.json (100%) rename custom_components/{JackeryHome => jackery_home}/translations/zh-Hans.json (100%) diff --git a/AGENTS.md b/AGENTS.md index 3ea4c51..b826d8d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ ## Project Structure & Module Organization - Energy simulator lives at `main.py`; MQTT examples under `data_transmission_example.py`. -- Home Assistant integration is in `custom_components/JackeryHome/` with `__init__.py`, `sensor.py`, `config_flow.py`, translations, and docs. +- Home Assistant integration is in `custom_components/jackery_home/` with `__init__.py`, `sensor.py`, `config_flow.py`, translations, and docs. - Branding assets sit in `brands/`; release helpers and docs (e.g., `prepare_release.sh`, `README.md`, `energy_flow_card_config.yaml`) are at the repo root. - Tests currently consist of targeted scripts such as `test_mqtt.py`; add new suites beside related modules. diff --git a/HACS_PUBLISHING_GUIDE.md b/HACS_PUBLISHING_GUIDE.md index bddd444..a0435ea 100644 --- a/HACS_PUBLISHING_GUIDE.md +++ b/HACS_PUBLISHING_GUIDE.md @@ -90,11 +90,11 @@ jackery_home/ ``` 3. **更新版本号** - 编辑 `custom_components/JackeryHome/manifest.json` 中的版本号 + 编辑 `custom_components/jackery_home/manifest.json` 中的版本号 4. **提交版本更新** ```bash - git add custom_components/JackeryHome/manifest.json + git add custom_components/jackery_home/manifest.json git commit -m "版本更新至 v1.0.0" ``` diff --git a/README.md b/README.md index 4b3a767..472da56 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ 本项目包含两个主要部分: 1. **MQTT 模拟器** (`main.py`) - 模拟发送能源监控数据到 MQTT broker -2. **Home Assistant 自定义集成** (`custom_components/JackeryHome/`) - 接收 MQTT 数据并创建传感器实体 +2. **Home Assistant 自定义集成** (`custom_components/jackery_home/`) - 接收 MQTT 数据并创建传感器实体 ## 传感器列表 @@ -57,7 +57,7 @@ ### 方式二:手动安装 1. 下载最新的 [Release](https://github.com/suyulin/jackery_home/releases) -2. 将 `custom_components/JackeryHome` 文件夹复制到你的 Home Assistant 配置目录的 `custom_components/` 文件夹中 +2. 将 `custom_components/jackery_home` 文件夹复制到你的 Home Assistant 配置目录的 `custom_components/` 文件夹中 3. 重启 Home Assistant 4. 按照上述"配置集成"步骤进行配置 @@ -161,7 +161,7 @@ entities: ### 核心文件 - `main.py`: MQTT 传感器模拟器主程序 -- `custom_components/JackeryHome/`: Home Assistant 自定义集成 +- `custom_components/jackery_home/`: Home Assistant 自定义集成 - `__init__.py`: 集成入口 - `manifest.json`: 集成元数据 - `sensor.py`: 传感器平台实现 @@ -199,7 +199,7 @@ entities: ## 文档 - [**HACS 发布指南**](HACS_PUBLISHING_GUIDE.md) - 如何发布到 HACS -- [自定义集成 README](custom_components/JackeryHome/README.md) - 集成技术文档 +- [自定义集成 README](custom_components/jackery_home/README.md) - 集成技术文档 ## 开发者 @@ -213,7 +213,7 @@ entities: 或手动发布: -1. 更新 `custom_components/JackeryHome/manifest.json` 中的版本号 +1. 更新 `custom_components/jackery_home/manifest.json` 中的版本号 2. 提交更改并推送到 GitHub 3. 创建新的 Git tag(如 `v1.0.1`) 4. 在 GitHub 创建 Release diff --git a/custom_components/JackeryHome/README.md b/custom_components/jackery_home/README.md similarity index 100% rename from custom_components/JackeryHome/README.md rename to custom_components/jackery_home/README.md diff --git a/custom_components/JackeryHome/__init__.py b/custom_components/jackery_home/__init__.py similarity index 100% rename from custom_components/JackeryHome/__init__.py rename to custom_components/jackery_home/__init__.py diff --git a/custom_components/JackeryHome/config_flow.py b/custom_components/jackery_home/config_flow.py similarity index 100% rename from custom_components/JackeryHome/config_flow.py rename to custom_components/jackery_home/config_flow.py diff --git a/custom_components/JackeryHome/manifest.json b/custom_components/jackery_home/manifest.json similarity index 100% rename from custom_components/JackeryHome/manifest.json rename to custom_components/jackery_home/manifest.json diff --git a/custom_components/JackeryHome/sensor.py b/custom_components/jackery_home/sensor.py similarity index 83% rename from custom_components/JackeryHome/sensor.py rename to custom_components/jackery_home/sensor.py index f1d9a0d..3d1d0d5 100644 --- a/custom_components/JackeryHome/sensor.py +++ b/custom_components/jackery_home/sensor.py @@ -251,67 +251,91 @@ class JackeryHomeSensor(SensorEntity): _LOGGER.error(f"Error processing LWT message: {e}") # 订阅 device/data topic 处理消息回调 - @callback - def data_message_received(msg): - """Handle new MQTT messages from device/data topic.""" - try: - payload = msg.payload - if isinstance(payload, bytes): - payload = payload.decode("utf-8") - - _LOGGER.debug(f"Received data message for {self._sensor_id}: {payload}") - - # 尝试解析 data_get 格式的数据 - try: - data = json.loads(payload) - # 检查是否是 data_get 格式 - if isinstance(data, dict) and data.get("cmd") == "data_get": - value = self._parse_data_get_response(data) - if value is not None: - self._attr_native_value = value - self._attr_available = True - self.async_write_ha_state() - _LOGGER.debug(f"Updated {self._sensor_id} with value: {value}") - else: - _LOGGER.debug(f"No matching data found for {self._sensor_id} in data_get response") - return - except json.JSONDecodeError: - pass - - # 兼容旧格式:尝试解析 JSON - try: - data = json.loads(payload) - # 根据传感器ID从数据中提取对应的值 - if isinstance(data, dict) and self._sensor_id in data: - value = data[self._sensor_id] - elif isinstance(data, dict) and "value" in data: - value = data["value"] - else: - value = data - except json.JSONDecodeError: - # 如果不是 JSON,直接使用原始值 - try: - value = float(payload) - except ValueError: - # 如果无法转换为数字,保持原值但设置不可用 - value = payload - self._attr_available = False - self.async_write_ha_state() - return - - # 能源传感器直接使用接收到的累积值,不进行额外计算 - # 设备端已经发送了正确的累积值 - - # 更新传感器状态 - self._attr_native_value = value - self._attr_available = True - self.async_write_ha_state() - - _LOGGER.debug(f"Updated {self._sensor_id} with value: {value}") - - except Exception as e: - _LOGGER.error(f"Error processing data message for {self._sensor_id}: {e}") +@callback +def data_message_received(msg): + """Handle new MQTT messages from device/data topic.""" + try: + payload = msg.payload + if isinstance(payload, bytes): + payload = payload.decode("utf-8") + + _LOGGER.debug(f"Received data message for {self._sensor_id}: {payload}") + + data = None + try: + data = json.loads(payload) + except json.JSONDecodeError: + data = None + + # data_get 响应,解析方式参考 data_transmission_example.py + if isinstance(data, dict) and data.get("cmd") == "data_get": + try: + target_meter_sn = str(self._meter_sn) + info = data.get("info", {}) + dev_list = info.get("dev_list", []) + for dev in dev_list: + meter_list = dev.get("meter_list", []) + for meter in meter_list: + if not isinstance(meter, (list, tuple)) or len(meter) < 2: + continue + + meter_sn = str(meter[0]) + try: + meter_value_float = float(meter[1]) + except (ValueError, TypeError): + continue + + meter_value = int(meter_value_float) if meter_value_float == int(meter_value_float) else meter_value_float + + if meter_sn != target_meter_sn: + continue + + if self._sensor_id == "grid_import": + value = abs(meter_value) if meter_value < 0 else 0 + elif self._sensor_id == "grid_export": + value = meter_value if meter_value > 0 else 0 + elif self._sensor_id == "battery_charge": + value = abs(meter_value) if meter_value < 0 else 0 + elif self._sensor_id == "battery_discharge": + value = meter_value if meter_value > 0 else 0 + else: + value = meter_value + + self._attr_native_value = value + self._attr_available = True + self.async_write_ha_state() + _LOGGER.debug(f"Updated {self._sensor_id} with value: {value}") + return + + _LOGGER.debug(f"No matching data found for {self._sensor_id} in data_get payload") + except Exception as parse_err: + _LOGGER.error(f"Error parsing data_get response: {parse_err}") + return + + # 兼容旧格式的数据 + if isinstance(data, dict): + if self._sensor_id in data: + value = data[self._sensor_id] + elif "value" in data: + value = data["value"] + else: + value = data + else: + try: + value = float(payload) + except ValueError: + self._attr_available = False + self.async_write_ha_state() + return + + self._attr_native_value = value + self._attr_available = True + self.async_write_ha_state() + _LOGGER.debug(f"Updated {self._sensor_id} with value: {value}") + + except Exception as e: + _LOGGER.error(f"Error processing data message for {self._sensor_id}: {e}") # 订阅 LWT topic 以获取设备序列号 await ha_mqtt.async_subscribe( self.hass, diff --git a/custom_components/JackeryHome/strings.json b/custom_components/jackery_home/strings.json similarity index 100% rename from custom_components/JackeryHome/strings.json rename to custom_components/jackery_home/strings.json diff --git a/custom_components/JackeryHome/translations/zh-Hans.json b/custom_components/jackery_home/translations/zh-Hans.json similarity index 100% rename from custom_components/JackeryHome/translations/zh-Hans.json rename to custom_components/jackery_home/translations/zh-Hans.json diff --git a/prepare_release.sh b/prepare_release.sh index 75a9855..bbb926b 100755 --- a/prepare_release.sh +++ b/prepare_release.sh @@ -35,7 +35,7 @@ if ! git diff-index --quiet HEAD --; then fi # 获取当前版本 -CURRENT_VERSION=$(grep -o '"version": "[^"]*"' custom_components/JackeryHome/manifest.json | cut -d'"' -f4) +CURRENT_VERSION=$(grep -o '"version": "[^"]*"' custom_components/jackery_home/manifest.json | cut -d'"' -f4) echo "📦 当前版本: $CURRENT_VERSION" echo "" @@ -50,9 +50,9 @@ fi # 更新 manifest.json 中的版本号 if [ "$NEW_VERSION" != "$CURRENT_VERSION" ]; then echo "📝 更新 manifest.json 中的版本号..." - sed -i.bak "s/\"version\": \"$CURRENT_VERSION\"/\"version\": \"$NEW_VERSION\"/" custom_components/JackeryHome/manifest.json - rm custom_components/JackeryHome/manifest.json.bak - git add custom_components/JackeryHome/manifest.json + sed -i.bak "s/\"version\": \"$CURRENT_VERSION\"/\"version\": \"$NEW_VERSION\"/" custom_components/jackery_home/manifest.json + rm custom_components/jackery_home/manifest.json.bak + git add custom_components/jackery_home/manifest.json git commit -m "版本更新至 v$NEW_VERSION" echo "✅ 版本号已更新" fi