File size: 3,973 Bytes
0cd8655
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""Wide ventilation telemetry snapshots and optimization results (O10–O13)."""
from datetime import datetime
from sqlalchemy import (
    Column,
    Integer,
    String,
    Float,
    Boolean,
    DateTime,
    Text,
    ForeignKey,
    Index,
)
from database.base import Base


class HvacTelemetryDB(Base):
    __tablename__ = "hvac_telemetry"
    id = Column(Integer, primary_key=True, autoincrement=True)
    timestamp = Column(DateTime, default=datetime.utcnow, index=True, nullable=False)
    site_id = Column(String, default="SKYLINE-BLR")
    ahu_id = Column(String, default="AHU-01")
    zone_id = Column(String, nullable=True)
    outdoor_temp_c = Column(Float, nullable=True)
    outdoor_rh_percent = Column(Float, nullable=True)
    outdoor_enthalpy_kjkg = Column(Float, nullable=True)
    return_temp_c = Column(Float, nullable=True)
    return_rh_percent = Column(Float, nullable=True)
    return_enthalpy_kjkg = Column(Float, nullable=True)
    supply_air_temp_c = Column(Float, nullable=True)
    supply_airflow_cfm = Column(Float, nullable=True)
    mixed_air_temp_c = Column(Float, nullable=True)
    damper_percent = Column(Float, nullable=True)
    co2_ppm = Column(Float, nullable=True)
    co_ppm = Column(Float, nullable=True)
    fan_power_kw = Column(Float, nullable=True)
    chiller_power_kw = Column(Float, nullable=True)
    total_hvac_power_kw = Column(Float, nullable=True)
    occupancy = Column(Float, nullable=True)
    occupied = Column(Boolean, nullable=True)
    schedule_state = Column(String, nullable=True)
    return_airflow_cfm = Column(Float, nullable=True)
    quality = Column(String, default="GOOD")
    source = Column(String, default="DEMO")
    site_name = Column(String, nullable=True)
    site_location = Column(String, nullable=True)
    plant_label = Column(String, nullable=True)
    building_area_sqft = Column(Float, nullable=True)

    __table_args__ = (
        Index("ix_hvac_tel_site_ts", "site_id", "timestamp"),
        Index("ix_hvac_tel_ahu_ts", "ahu_id", "timestamp"),
        Index("ix_hvac_tel_zone_ts", "zone_id", "timestamp"),
        Index("ix_hvac_tel_source", "source"),
    )


class HvacOptimizationResultDB(Base):
    __tablename__ = "hvac_optimization_results"
    id = Column(Integer, primary_key=True, autoincrement=True)
    opportunity_id = Column(String, ForeignKey("hvac_opportunities.id"), nullable=False, index=True)
    telemetry_id = Column(Integer, ForeignKey("hvac_telemetry.id"), nullable=True, index=True)
    current_value = Column(Float, nullable=True)
    optimized_value = Column(Float, nullable=True)
    energy_savings_kw = Column(Float, nullable=True)
    daily_savings_kwh = Column(Float, nullable=True)
    confidence = Column(Float, nullable=True)
    guardrail_pass = Column(Boolean, nullable=True)
    recommendation = Column(String, nullable=True)
    rationale = Column(Text, nullable=True)
    status = Column(String, nullable=True)
    payload_json = Column(Text, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, index=True)

    __table_args__ = (Index("ix_hvac_opt_opp_ts", "opportunity_id", "created_at"),)


class HvacOptimizationCandidateDB(Base):
    __tablename__ = "hvac_optimization_candidates"
    id = Column(Integer, primary_key=True, autoincrement=True)
    optimization_result_id = Column(Integer, ForeignKey("hvac_optimization_results.id"), nullable=False, index=True)
    candidate_id = Column(String, nullable=False)
    damper_position_percent = Column(Float, nullable=True)
    mixed_air_temp_c = Column(Float, nullable=True)
    chiller_power_kw = Column(Float, nullable=True)
    free_cooling_kw = Column(Float, nullable=True)
    economizer_mode = Column(String, nullable=True)
    outdoor_air_cfm = Column(Float, nullable=True)
    decision = Column(String, nullable=True)
    rejection_reason = Column(String, nullable=True)