feat: enhance data transmission and sensor handling

- Added new energy data points and updated the initialization of energy variables in data_transmission_example.py.
- Improved data construction and parsing methods to handle new data formats and ensure compatibility with updated MQTT topics.
- Refined sensor logic in JackeryHome component to correctly map meter serial numbers and handle power values more robustly.
- Ensured consistent data types for meter values and improved error handling during data processing.
This commit is contained in:
不求圣剑
2025-11-18 14:45:26 +08:00
parent 054fa172f2
commit 1c3933d5e3
2 changed files with 113 additions and 79 deletions

View File

@@ -206,7 +206,13 @@ class JackeryHomeSensor(SensorEntity):
self._attr_available = False
self._data_task = None
self._device_sn = "" # 设备序列号(从 LWT 消息中获取)
self._meter_sn = METER_SN_MAP.get(sensor_id, 0) # 当前传感器的 meter_sn
# 获取 meter_sn对于功率传感器使用对应的 _power 键
if sensor_id in ["grid_import", "grid_export"]:
self._meter_sn = METER_SN_MAP.get("grid_import_power", 0)
elif sensor_id in ["battery_charge", "battery_discharge"]:
self._meter_sn = METER_SN_MAP.get("battery_charge_power", 0)
else:
self._meter_sn = METER_SN_MAP.get(sensor_id, 0) # 当前传感器的 meter_sn
# 能源传感器标识
self._is_energy_sensor = device_class == SensorDeviceClass.ENERGY
@@ -332,8 +338,8 @@ class JackeryHomeSensor(SensorEntity):
data = {
"cmd": "data_get",
"gw_sn": self._device_sn if self._device_sn else "",
"timestamp": time.time(),
"token": random.randint(1000, 9999),
"timestamp": str(int(time.time() * 1000)),
"token": str(random.randint(1000, 9999)),
"info": {
"dev_list": [
{
@@ -366,31 +372,42 @@ class JackeryHomeSensor(SensorEntity):
for meter in meter_list:
# 响应格式meter 是 [meter_sn, meter_value] 格式的列表
if isinstance(meter, list) and len(meter) >= 2:
meter_sn = meter[0]
meter_value = meter[1]
meter_sn_raw = meter[0]
meter_value_raw = meter[1]
# 检查是否匹配当前传感器的 meter_sn
if meter_sn == self._meter_sn:
# 处理 meter_sn可能是字符串或整数统一转换为整数进行比较
try:
meter_sn = int(meter_sn_raw) if isinstance(meter_sn_raw, str) else int(meter_sn_raw)
except (ValueError, TypeError):
meter_sn = meter_sn_raw
# 先转换为 float然后判断是否可以转换为 int
meter_value_float = float(meter_value_raw)
# 如果小数部分为 0则转换为 int否则保留 float
meter_value = int(meter_value_float) if meter_value_float == int(meter_value_float) else meter_value_float
# 检查是否匹配当前传感器的 meter_sn支持字符串和整数比较
if int(meter_sn) == int(self._meter_sn):
# 处理特殊逻辑(电网功率和电池功率)
if self._sensor_id == "grid_import_power":
if self._sensor_id == "grid_import":
# 电网功率:负值为购买,正值为出售
if meter_value < 0:
return abs(meter_value)
else:
return 0
elif self._sensor_id == "grid_export_power":
elif self._sensor_id == "grid_export":
# 电网功率:负值为购买,正值为出售
if meter_value > 0:
return meter_value
else:
return 0
elif self._sensor_id == "battery_charge_power":
elif self._sensor_id == "battery_charge":
# 电池功率:负值为充电,正值为放电
if meter_value < 0:
return abs(meter_value)
else:
return 0
elif self._sensor_id == "battery_discharge_power":
elif self._sensor_id == "battery_discharge":
# 电池功率:负值为充电,正值为放电
if meter_value > 0:
return meter_value