feat: 增加能源数据模拟发送功能
- 在data_transmission_example.py中增加energy类型数据的模拟发送 - 能源数据基准从1kWh开始,每次增加0.1kWh - 简化传感器处理逻辑,直接显示累积值而不进行计算 - 支持所有能源类型:太阳能、家庭用电、电网购买/出售、电池充放电
This commit is contained in:
@@ -186,11 +186,8 @@ class JackeryHomeSensor(SensorEntity):
|
|||||||
self._attr_available = False
|
self._attr_available = False
|
||||||
self._data_task = None
|
self._data_task = None
|
||||||
|
|
||||||
# 能源累积相关属性
|
# 能源传感器标识
|
||||||
self._is_energy_sensor = device_class == SensorDeviceClass.ENERGY
|
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
|
@property
|
||||||
def should_poll(self) -> bool:
|
def should_poll(self) -> bool:
|
||||||
@@ -233,9 +230,8 @@ class JackeryHomeSensor(SensorEntity):
|
|||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
return
|
return
|
||||||
|
|
||||||
# 处理能源传感器累积计算
|
# 能源传感器直接使用接收到的累积值,不进行额外计算
|
||||||
if self._is_energy_sensor:
|
# 设备端已经发送了正确的累积值
|
||||||
value = self._calculate_energy_accumulation(value)
|
|
||||||
|
|
||||||
# 更新传感器状态
|
# 更新传感器状态
|
||||||
self._attr_native_value = value
|
self._attr_native_value = value
|
||||||
@@ -260,44 +256,6 @@ class JackeryHomeSensor(SensorEntity):
|
|||||||
# 启动定时器,每隔5秒向 device/data-get 发送数据获取请求
|
# 启动定时器,每隔5秒向 device/data-get 发送数据获取请求
|
||||||
self._data_task = asyncio.create_task(self._periodic_data_request())
|
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:
|
async def _periodic_data_request(self) -> None:
|
||||||
"""Periodically send data request to device/data-get topic."""
|
"""Periodically send data request to device/data-get topic."""
|
||||||
|
|||||||
@@ -18,6 +18,16 @@ class DataTransmissionExample:
|
|||||||
self.client = None
|
self.client = None
|
||||||
self.running = False
|
self.running = False
|
||||||
|
|
||||||
|
# 初始化能源累积数据(基准从1kWh开始)
|
||||||
|
self.energy_data = {
|
||||||
|
"solar_energy": 1.0,
|
||||||
|
"home_energy": 1.0,
|
||||||
|
"grid_import_energy": 1.0,
|
||||||
|
"grid_export_energy": 1.0,
|
||||||
|
"battery_charge_energy": 1.0,
|
||||||
|
"battery_discharge_energy": 1.0,
|
||||||
|
}
|
||||||
|
|
||||||
def setup_mqtt(self):
|
def setup_mqtt(self):
|
||||||
"""设置 MQTT 客户端"""
|
"""设置 MQTT 客户端"""
|
||||||
self.client = mqtt.Client(client_id="energy_device_simulator", callback_api_version=mqtt.CallbackAPIVersion.VERSION2)
|
self.client = mqtt.Client(client_id="energy_device_simulator", callback_api_version=mqtt.CallbackAPIVersion.VERSION2)
|
||||||
@@ -77,14 +87,37 @@ class DataTransmissionExample:
|
|||||||
elif battery_power < 0: # 充电
|
elif battery_power < 0: # 充电
|
||||||
self.battery_soc = min(100, self.battery_soc + 0.3)
|
self.battery_soc = min(100, self.battery_soc + 0.3)
|
||||||
|
|
||||||
|
# 更新能源累积数据(每次增加0.1kWh)
|
||||||
|
# 根据功率值确定能源增长方向
|
||||||
|
if solar_power > 0:
|
||||||
|
self.energy_data["solar_energy"] += 0.1
|
||||||
|
if home_power > 0:
|
||||||
|
self.energy_data["home_energy"] += 0.1
|
||||||
|
if grid_import > 0:
|
||||||
|
self.energy_data["grid_import_energy"] += 0.1
|
||||||
|
if grid_export > 0:
|
||||||
|
self.energy_data["grid_export_energy"] += 0.1
|
||||||
|
if battery_charge > 0:
|
||||||
|
self.energy_data["battery_charge_energy"] += 0.1
|
||||||
|
if battery_discharge > 0:
|
||||||
|
self.energy_data["battery_discharge_energy"] += 0.1
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
# 功率数据(实时监测)
|
||||||
"solar_power": round(solar_power, 2),
|
"solar_power": round(solar_power, 2),
|
||||||
"home_power": round(home_power, 2),
|
"home_power": round(home_power, 2),
|
||||||
"grid_import": round(grid_import, 2),
|
"grid_import": round(grid_import, 2),
|
||||||
"grid_export": round(grid_export, 2),
|
"grid_export": round(grid_export, 2),
|
||||||
"battery_charge": round(battery_charge, 2),
|
"battery_charge": round(battery_charge, 2),
|
||||||
"battery_discharge": round(battery_discharge, 2),
|
"battery_discharge": round(battery_discharge, 2),
|
||||||
"battery_soc": round(self.battery_soc, 1)
|
"battery_soc": round(self.battery_soc, 1),
|
||||||
|
# 能源数据(累积值)
|
||||||
|
"solar_energy": round(self.energy_data["solar_energy"], 3),
|
||||||
|
"home_energy": round(self.energy_data["home_energy"], 3),
|
||||||
|
"grid_import_energy": round(self.energy_data["grid_import_energy"], 3),
|
||||||
|
"grid_export_energy": round(self.energy_data["grid_export_energy"], 3),
|
||||||
|
"battery_charge_energy": round(self.energy_data["battery_charge_energy"], 3),
|
||||||
|
"battery_discharge_energy": round(self.energy_data["battery_discharge_energy"], 3),
|
||||||
}
|
}
|
||||||
|
|
||||||
def send_device_data(self):
|
def send_device_data(self):
|
||||||
@@ -157,8 +190,10 @@ def main():
|
|||||||
print("这个示例演示了以下功能:")
|
print("这个示例演示了以下功能:")
|
||||||
print("1. 监听 device/data-get 请求")
|
print("1. 监听 device/data-get 请求")
|
||||||
print("2. 响应请求并发送设备数据到 device/data")
|
print("2. 响应请求并发送设备数据到 device/data")
|
||||||
print("3. 模拟真实的能源监控数据")
|
print("3. 模拟真实的能源监控数据(功率 + 能源累积)")
|
||||||
print("4. 每秒5次的数据获取频率(由 Home Assistant 集成触发)")
|
print("4. 功率数据:实时变化的功率值")
|
||||||
|
print("5. 能源数据:累积值,基准从1kWh开始,每次增加0.1kWh")
|
||||||
|
print("6. 每5秒的数据获取频率(由 Home Assistant 集成触发)")
|
||||||
print()
|
print()
|
||||||
|
|
||||||
# 创建示例实例
|
# 创建示例实例
|
||||||
|
|||||||
Reference in New Issue
Block a user