Files

53 lines
2.4 KiB
Python
Raw Permalink Normal View History

from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, JSON
from sqlalchemy.sql import func
from app.core.database import Base
class EnergyCategory(Base):
"""能耗分项类别"""
__tablename__ = "energy_categories"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(100), nullable=False) # HVAC, 照明, 动力, 特殊
code = Column(String(50), unique=True, nullable=False) # hvac, lighting, power, special
parent_id = Column(Integer, ForeignKey("energy_categories.id"))
sort_order = Column(Integer, default=0)
icon = Column(String(100))
color = Column(String(20)) # hex color for charts
created_at = Column(DateTime(timezone=True), server_default=func.now())
class EnergyData(Base):
"""时序能耗采集数据 - 使用TimescaleDB hypertable"""
__tablename__ = "energy_data"
id = Column(Integer, primary_key=True, autoincrement=True)
device_id = Column(Integer, ForeignKey("devices.id"), nullable=False, index=True)
timestamp = Column(DateTime(timezone=True), nullable=False, index=True)
data_type = Column(String(50), nullable=False) # power, energy, temperature, flow, etc.
value = Column(Float, nullable=False)
unit = Column(String(20)) # kW, kWh, ℃, m³/h, etc.
quality = Column(Integer, default=0) # 0=good, 1=interpolated, 2=suspect
raw_data = Column(JSON) # 原始完整数据包
class EnergyDailySummary(Base):
"""每日能耗汇总"""
__tablename__ = "energy_daily_summary"
id = Column(Integer, primary_key=True, autoincrement=True)
device_id = Column(Integer, ForeignKey("devices.id"), nullable=False, index=True)
date = Column(DateTime(timezone=True), nullable=False, index=True)
energy_type = Column(String(50), nullable=False) # electricity, heat, water, gas
total_consumption = Column(Float, default=0) # 总消耗
total_generation = Column(Float, default=0) # 总产出
peak_power = Column(Float) # 最大功率
min_power = Column(Float) # 最小功率
avg_power = Column(Float) # 平均功率
operating_hours = Column(Float) # 运行小时数
avg_cop = Column(Float) # 平均COP (热泵)
avg_temperature = Column(Float) # 平均温度
cost = Column(Float) # 费用
carbon_emission = Column(Float) # 碳排放 kgCO2
created_at = Column(DateTime(timezone=True), server_default=func.now())