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.
This commit is contained in:
不求圣剑
2025-11-18 15:37:19 +08:00
parent 176f457328
commit 2d22a25006
11 changed files with 96 additions and 72 deletions

View File

@@ -2,7 +2,7 @@
## Project Structure & Module Organization ## Project Structure & Module Organization
- Energy simulator lives at `main.py`; MQTT examples under `data_transmission_example.py`. - 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. - 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. - Tests currently consist of targeted scripts such as `test_mqtt.py`; add new suites beside related modules.

View File

@@ -90,11 +90,11 @@ jackery_home/
``` ```
3. **更新版本号** 3. **更新版本号**
编辑 `custom_components/JackeryHome/manifest.json` 中的版本号 编辑 `custom_components/jackery_home/manifest.json` 中的版本号
4. **提交版本更新** 4. **提交版本更新**
```bash ```bash
git add custom_components/JackeryHome/manifest.json git add custom_components/jackery_home/manifest.json
git commit -m "版本更新至 v1.0.0" git commit -m "版本更新至 v1.0.0"
``` ```

View File

@@ -18,7 +18,7 @@
本项目包含两个主要部分: 本项目包含两个主要部分:
1. **MQTT 模拟器** (`main.py`) - 模拟发送能源监控数据到 MQTT broker 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) 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 3. 重启 Home Assistant
4. 按照上述"配置集成"步骤进行配置 4. 按照上述"配置集成"步骤进行配置
@@ -161,7 +161,7 @@ entities:
### 核心文件 ### 核心文件
- `main.py`: MQTT 传感器模拟器主程序 - `main.py`: MQTT 传感器模拟器主程序
- `custom_components/JackeryHome/`: Home Assistant 自定义集成 - `custom_components/jackery_home/`: Home Assistant 自定义集成
- `__init__.py`: 集成入口 - `__init__.py`: 集成入口
- `manifest.json`: 集成元数据 - `manifest.json`: 集成元数据
- `sensor.py`: 传感器平台实现 - `sensor.py`: 传感器平台实现
@@ -199,7 +199,7 @@ entities:
## 文档 ## 文档
- [**HACS 发布指南**](HACS_PUBLISHING_GUIDE.md) - 如何发布到 HACS - [**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 2. 提交更改并推送到 GitHub
3. 创建新的 Git tag如 `v1.0.1` 3. 创建新的 Git tag如 `v1.0.1`
4. 在 GitHub 创建 Release 4. 在 GitHub 创建 Release

View File

@@ -251,8 +251,9 @@ class JackeryHomeSensor(SensorEntity):
_LOGGER.error(f"Error processing LWT message: {e}") _LOGGER.error(f"Error processing LWT message: {e}")
# 订阅 device/data topic 处理消息回调 # 订阅 device/data topic 处理消息回调
@callback
def data_message_received(msg): @callback
def data_message_received(msg):
"""Handle new MQTT messages from device/data topic.""" """Handle new MQTT messages from device/data topic."""
try: try:
payload = msg.payload payload = msg.payload
@@ -261,57 +262,80 @@ class JackeryHomeSensor(SensorEntity):
_LOGGER.debug(f"Received data message for {self._sensor_id}: {payload}") _LOGGER.debug(f"Received data message for {self._sensor_id}: {payload}")
# 尝试解析 data_get 格式的数据 data = None
try: try:
data = json.loads(payload) data = json.loads(payload)
# 检查是否是 data_get 格式 except json.JSONDecodeError:
data = None
# data_get 响应,解析方式参考 data_transmission_example.py
if isinstance(data, dict) and data.get("cmd") == "data_get": if isinstance(data, dict) and data.get("cmd") == "data_get":
value = self._parse_data_get_response(data) try:
if value is not None: 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_native_value = value
self._attr_available = True self._attr_available = True
self.async_write_ha_state() self.async_write_ha_state()
_LOGGER.debug(f"Updated {self._sensor_id} with value: {value}") _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 return
except json.JSONDecodeError:
pass
# 兼容旧格式:尝试解析 JSON _LOGGER.debug(f"No matching data found for {self._sensor_id} in data_get payload")
try: except Exception as parse_err:
data = json.loads(payload) _LOGGER.error(f"Error parsing data_get response: {parse_err}")
# 根据传感器ID从数据中提取对应的值 return
if isinstance(data, dict) and self._sensor_id in data:
# 兼容旧格式的数据
if isinstance(data, dict):
if self._sensor_id in data:
value = data[self._sensor_id] value = data[self._sensor_id]
elif isinstance(data, dict) and "value" in data: elif "value" in data:
value = data["value"] value = data["value"]
else: else:
value = data value = data
except json.JSONDecodeError: else:
# 如果不是 JSON直接使用原始值
try: try:
value = float(payload) value = float(payload)
except ValueError: except ValueError:
# 如果无法转换为数字,保持原值但设置不可用
value = payload
self._attr_available = False self._attr_available = False
self.async_write_ha_state() self.async_write_ha_state()
return return
# 能源传感器直接使用接收到的累积值,不进行额外计算
# 设备端已经发送了正确的累积值
# 更新传感器状态
self._attr_native_value = value self._attr_native_value = value
self._attr_available = True self._attr_available = True
self.async_write_ha_state() self.async_write_ha_state()
_LOGGER.debug(f"Updated {self._sensor_id} with value: {value}") _LOGGER.debug(f"Updated {self._sensor_id} with value: {value}")
except Exception as e: except Exception as e:
_LOGGER.error(f"Error processing data message for {self._sensor_id}: {e}") _LOGGER.error(f"Error processing data message for {self._sensor_id}: {e}")
# 订阅 LWT topic 以获取设备序列号 # 订阅 LWT topic 以获取设备序列号
await ha_mqtt.async_subscribe( await ha_mqtt.async_subscribe(
self.hass, self.hass,

View File

@@ -35,7 +35,7 @@ if ! git diff-index --quiet HEAD --; then
fi 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 "📦 当前版本: $CURRENT_VERSION"
echo "" echo ""
@@ -50,9 +50,9 @@ fi
# 更新 manifest.json 中的版本号 # 更新 manifest.json 中的版本号
if [ "$NEW_VERSION" != "$CURRENT_VERSION" ]; then if [ "$NEW_VERSION" != "$CURRENT_VERSION" ]; then
echo "📝 更新 manifest.json 中的版本号..." echo "📝 更新 manifest.json 中的版本号..."
sed -i.bak "s/\"version\": \"$CURRENT_VERSION\"/\"version\": \"$NEW_VERSION\"/" custom_components/JackeryHome/manifest.json sed -i.bak "s/\"version\": \"$CURRENT_VERSION\"/\"version\": \"$NEW_VERSION\"/" custom_components/jackery_home/manifest.json
rm custom_components/JackeryHome/manifest.json.bak rm custom_components/jackery_home/manifest.json.bak
git add custom_components/JackeryHome/manifest.json git add custom_components/jackery_home/manifest.json
git commit -m "版本更新至 v$NEW_VERSION" git commit -m "版本更新至 v$NEW_VERSION"
echo "✅ 版本号已更新" echo "✅ 版本号已更新"
fi fi