feat: 增加能源数据模拟发送功能

- 在data_transmission_example.py中增加energy类型数据的模拟发送
- 能源数据基准从1kWh开始,每次增加0.1kWh
- 简化传感器处理逻辑,直接显示累积值而不进行计算
- 支持所有能源类型:太阳能、家庭用电、电网购买/出售、电池充放电
This commit is contained in:
不求圣剑
2025-10-15 10:49:38 +08:00
parent 792f60e29c
commit a3d46e8f7a
2 changed files with 41 additions and 48 deletions

View File

@@ -186,11 +186,8 @@ class JackeryHomeSensor(SensorEntity):
self._attr_available = False
self._data_task = None
# 能源累积相关属性
# 能源传感器标识
self._is_energy_sensor = device_class == SensorDeviceClass.ENERGY
self._last_power_value = 0.0
self._last_update_time = None
self._total_energy = 0.0
@property
def should_poll(self) -> bool:
@@ -233,9 +230,8 @@ class JackeryHomeSensor(SensorEntity):
self.async_write_ha_state()
return
# 处理能源传感器累积计算
if self._is_energy_sensor:
value = self._calculate_energy_accumulation(value)
# 能源传感器直接使用接收到的累积值,不进行额外计算
# 设备端已经发送了正确的累积值
# 更新传感器状态
self._attr_native_value = value
@@ -260,44 +256,6 @@ class JackeryHomeSensor(SensorEntity):
# 启动定时器每隔5秒向 device/data-get 发送数据获取请求
self._data_task = asyncio.create_task(self._periodic_data_request())
def _calculate_energy_accumulation(self, power_value: float) -> float:
"""计算能源累积值(从功率转换为能源)"""
import time
try:
current_time = time.time()
power_watts = float(power_value)
# 如果是第一次更新,只记录时间和功率值
if self._last_update_time is None:
self._last_update_time = current_time
self._last_power_value = power_watts
return self._total_energy
# 计算时间差(小时)
time_diff_hours = (current_time - self._last_update_time) / 3600.0
# 计算能源增量kWh
# 使用梯形积分法:平均功率 × 时间
avg_power = (self._last_power_value + power_watts) / 2.0
energy_increment = (avg_power * time_diff_hours) / 1000.0 # 转换为kWh
# 累积能源值
self._total_energy += energy_increment
# 更新记录
self._last_update_time = current_time
self._last_power_value = power_watts
_LOGGER.debug(f"Energy accumulation for {self._sensor_id}: "
f"power={power_watts}W, time_diff={time_diff_hours:.4f}h, "
f"increment={energy_increment:.6f}kWh, total={self._total_energy:.6f}kWh")
return self._total_energy
except (ValueError, TypeError) as e:
_LOGGER.error(f"Error calculating energy accumulation for {self._sensor_id}: {e}")
return self._total_energy
async def _periodic_data_request(self) -> None:
"""Periodically send data request to device/data-get topic."""