diff --git a/custom_components/JackeryHome/sensor.py b/custom_components/JackeryHome/sensor.py index b2c2120..de4cfa8 100644 --- a/custom_components/JackeryHome/sensor.py +++ b/custom_components/JackeryHome/sensor.py @@ -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.""" diff --git a/data_transmission_example.py b/data_transmission_example.py index e61e444..4eb1d15 100644 --- a/data_transmission_example.py +++ b/data_transmission_example.py @@ -18,6 +18,16 @@ class DataTransmissionExample: self.client = None 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): """设置 MQTT 客户端""" 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: # 充电 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 { + # 功率数据(实时监测) "solar_power": round(solar_power, 2), "home_power": round(home_power, 2), "grid_import": round(grid_import, 2), "grid_export": round(grid_export, 2), "battery_charge": round(battery_charge, 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): @@ -157,8 +190,10 @@ def main(): print("这个示例演示了以下功能:") print("1. 监听 device/data-get 请求") print("2. 响应请求并发送设备数据到 device/data") - print("3. 模拟真实的能源监控数据") - print("4. 每秒5次的数据获取频率(由 Home Assistant 集成触发)") + print("3. 模拟真实的能源监控数据(功率 + 能源累积)") + print("4. 功率数据:实时变化的功率值") + print("5. 能源数据:累积值,基准从1kWh开始,每次增加0.1kWh") + print("6. 每5秒的数据获取频率(由 Home Assistant 集成触发)") print() # 创建示例实例