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:
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -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
|
||||||
|
|||||||
@@ -251,67 +251,91 @@ 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
|
||||||
"""Handle new MQTT messages from device/data topic."""
|
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:
|
try:
|
||||||
payload = msg.payload
|
target_meter_sn = str(self._meter_sn)
|
||||||
if isinstance(payload, bytes):
|
info = data.get("info", {})
|
||||||
payload = payload.decode("utf-8")
|
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
|
||||||
|
|
||||||
_LOGGER.debug(f"Received data message for {self._sensor_id}: {payload}")
|
meter_sn = str(meter[0])
|
||||||
|
try:
|
||||||
|
meter_value_float = float(meter[1])
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
continue
|
||||||
|
|
||||||
# 尝试解析 data_get 格式的数据
|
meter_value = int(meter_value_float) if meter_value_float == int(meter_value_float) else meter_value_float
|
||||||
try:
|
|
||||||
data = json.loads(payload)
|
if meter_sn != target_meter_sn:
|
||||||
# 检查是否是 data_get 格式
|
continue
|
||||||
if isinstance(data, dict) and data.get("cmd") == "data_get":
|
|
||||||
value = self._parse_data_get_response(data)
|
if self._sensor_id == "grid_import":
|
||||||
if value is not None:
|
value = abs(meter_value) if meter_value < 0 else 0
|
||||||
self._attr_native_value = value
|
elif self._sensor_id == "grid_export":
|
||||||
self._attr_available = True
|
value = meter_value if meter_value > 0 else 0
|
||||||
self.async_write_ha_state()
|
elif self._sensor_id == "battery_charge":
|
||||||
_LOGGER.debug(f"Updated {self._sensor_id} with value: {value}")
|
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:
|
else:
|
||||||
_LOGGER.debug(f"No matching data found for {self._sensor_id} in data_get response")
|
value = meter_value
|
||||||
return
|
|
||||||
except json.JSONDecodeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# 兼容旧格式:尝试解析 JSON
|
self._attr_native_value = value
|
||||||
try:
|
self._attr_available = True
|
||||||
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()
|
self.async_write_ha_state()
|
||||||
|
_LOGGER.debug(f"Updated {self._sensor_id} with value: {value}")
|
||||||
return
|
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
|
||||||
|
|
||||||
# 更新传感器状态
|
# 兼容旧格式的数据
|
||||||
self._attr_native_value = value
|
if isinstance(data, dict):
|
||||||
self._attr_available = True
|
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()
|
self.async_write_ha_state()
|
||||||
|
return
|
||||||
|
|
||||||
_LOGGER.debug(f"Updated {self._sensor_id} with value: {value}")
|
self._attr_native_value = value
|
||||||
|
self._attr_available = True
|
||||||
except Exception as e:
|
self.async_write_ha_state()
|
||||||
_LOGGER.error(f"Error processing data message for {self._sensor_id}: {e}")
|
_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 以获取设备序列号
|
# 订阅 LWT topic 以获取设备序列号
|
||||||
await ha_mqtt.async_subscribe(
|
await ha_mqtt.async_subscribe(
|
||||||
self.hass,
|
self.hass,
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user