Files
tianpu-ems/scripts/seed_data.py
Du Wenbo f53a610a19 Initial commit: Tianpu Zero-Carbon EMS Platform
Full-stack energy management system for Tianpu Daxing campus.
- Frontend: React 19 + TypeScript + Ant Design + ECharts
- Backend: FastAPI + SQLAlchemy + PostgreSQL/TimescaleDB
- Features: PV monitoring, heat pump management, carbon tracking, alarms, reports

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:36:06 +08:00

193 lines
13 KiB
Python

"""种子数据 - 天普园区设备信息和初始用户"""
import asyncio
import sys
sys.path.insert(0, "../backend")
from app.core.database import async_session
from app.core.security import hash_password
from app.models.user import User, Role
from app.models.device import Device, DeviceType, DeviceGroup
from app.models.carbon import EmissionFactor
from app.models.report import ReportTemplate
async def seed():
async with async_session() as session:
# 1. 角色
roles = [
Role(name="admin", display_name="园区管理员", description="平台最高管理者,负责全局配置和用户管理"),
Role(name="energy_manager", display_name="能源主管", description="负责园区能源运行管理和优化决策"),
Role(name="area_manager", display_name="区域负责人", description="负责特定区域或建筑的能源管理"),
Role(name="operator", display_name="设备运维员", description="负责设备日常运维和故障处理"),
Role(name="analyst", display_name="财务分析员", description="负责能源成本分析和财务报表"),
Role(name="visitor", display_name="普通访客", description="仅查看公开信息"),
]
session.add_all(roles)
# 2. 默认用户
users = [
User(username="admin", hashed_password=hash_password("admin123"), full_name="系统管理员", role="admin", email="admin@tianpu.com"),
User(username="energy_mgr", hashed_password=hash_password("tianpu123"), full_name="能源主管", role="energy_manager", email="energy@tianpu.com"),
User(username="operator1", hashed_password=hash_password("tianpu123"), full_name="运维工程师", role="operator", email="op1@tianpu.com"),
]
session.add_all(users)
# 3. 设备类型
device_types = [
DeviceType(code="pv_inverter", name="光伏逆变器", icon="solar-panel",
data_fields=["power", "daily_energy", "total_energy", "dc_voltage", "ac_voltage", "temperature", "fault_code"]),
DeviceType(code="heat_pump", name="空气源热泵", icon="heat-pump",
data_fields=["power", "cop", "inlet_temp", "outlet_temp", "flow_rate", "outdoor_temp", "mode"]),
DeviceType(code="solar_thermal", name="光热集热器", icon="solar-thermal",
data_fields=["heat_output", "collector_temp", "irradiance", "pump_status"]),
DeviceType(code="battery", name="储能系统", icon="battery",
data_fields=["power", "soc", "voltage", "current", "temperature", "cycle_count"]),
DeviceType(code="meter", name="智能电表", icon="meter",
data_fields=["power", "energy", "voltage", "current", "power_factor", "frequency"]),
DeviceType(code="sensor", name="温湿度传感器", icon="sensor",
data_fields=["temperature", "humidity"]),
DeviceType(code="heat_meter", name="热量表", icon="heat-meter",
data_fields=["heat_power", "heat_energy", "flow_rate", "supply_temp", "return_temp"]),
DeviceType(code="water_meter", name="水表", icon="water-meter",
data_fields=["flow_rate", "total_flow"]),
]
session.add_all(device_types)
# 4. 设备分组
groups = [
DeviceGroup(id=1, name="光伏系统", location="天普大楼屋顶"),
DeviceGroup(id=2, name="热泵系统", location="天普大楼机房"),
DeviceGroup(id=3, name="电力计量", location="天普大楼配电室"),
DeviceGroup(id=4, name="环境监测", location="天普大楼各楼层"),
]
session.add_all(groups)
# Flush to satisfy foreign key constraints before inserting devices
await session.flush()
# 5. 天普实际设备
devices = [
# 光伏逆变器 - 3台华为SUN2000-110KTL-M0
Device(name="东楼逆变器1", code="INV-01", device_type="pv_inverter", group_id=1,
model="SUN2000-110KTL-M0", manufacturer="华为", rated_power=110,
location="东楼屋顶", protocol="http_api", collect_interval=15,
connection_params={"api_type": "fusionsolar", "station_code": "NE=12345"}),
Device(name="东楼逆变器2", code="INV-02", device_type="pv_inverter", group_id=1,
model="SUN2000-110KTL-M0", manufacturer="华为", rated_power=110,
location="东楼屋顶", protocol="http_api", collect_interval=15),
Device(name="西楼逆变器1", code="INV-03", device_type="pv_inverter", group_id=1,
model="SUN2000-110KTL-M0", manufacturer="华为", rated_power=110,
location="西楼屋顶", protocol="http_api", collect_interval=15),
# 热泵机组 - 4台
Device(name="热泵机组1", code="HP-01", device_type="heat_pump", group_id=2,
rated_power=35, location="大楼机房", protocol="modbus_rtu", collect_interval=15,
connection_params={"dtu_id": "2225000009", "slave_id": 1}),
Device(name="热泵机组2", code="HP-02", device_type="heat_pump", group_id=2,
rated_power=35, location="大楼机房", protocol="modbus_rtu", collect_interval=15,
connection_params={"dtu_id": "2225000009", "slave_id": 2}),
Device(name="热泵机组3", code="HP-03", device_type="heat_pump", group_id=2,
rated_power=35, location="大楼机房", protocol="modbus_rtu", collect_interval=15,
connection_params={"dtu_id": "2225000009", "slave_id": 3}),
Device(name="热泵机组4", code="HP-04", device_type="heat_pump", group_id=2,
rated_power=35, location="大楼机房", protocol="modbus_rtu", collect_interval=15,
connection_params={"dtu_id": "2225000009", "slave_id": 4}),
# 电表
Device(name="关口电表(余电上网)", code="METER-GRID", device_type="meter", group_id=3,
model="威胜", serial_number="3462847657", location="配电室", protocol="dlt645", collect_interval=60,
connection_params={"dtu_id": "infrared", "ratio": 1000}),
Device(name="并网电表(光伏总发电)", code="METER-PV", device_type="meter", group_id=3,
model="杭州炬华", serial_number="3422994056", location="配电室", protocol="dlt645", collect_interval=60,
connection_params={"dtu_id": "infrared", "ct_ratio": "600/5"}),
Device(name="热泵电表", code="METER-HP", device_type="meter", group_id=3,
location="机房热泵控制柜", protocol="modbus_rtu", collect_interval=60,
connection_params={"dtu_id": "2225000003"}),
Device(name="循环水泵电表", code="METER-PUMP", device_type="meter", group_id=3,
location="机房水泵配电柜", protocol="modbus_rtu", collect_interval=60,
connection_params={"dtu_id": "2225000002"}),
# 热量表
Device(name="主管热量表", code="HM-01", device_type="heat_meter", group_id=2,
location="机房中部主管", protocol="modbus_rtu", collect_interval=60,
connection_params={"dtu_id": "2225000001"}),
# 温湿度传感器
Device(name="一楼东厅温湿度", code="TH-01", device_type="sensor", group_id=4,
location="大楼一楼东厅", protocol="mqtt", collect_interval=60,
connection_params={"dtu_id": "2225000007"}, metadata_={"area": "一楼东展厅风管上"}),
Device(name="一楼西厅温湿度", code="TH-02", device_type="sensor", group_id=4,
location="大楼一楼西厅", protocol="mqtt", collect_interval=60,
connection_params={"dtu_id": "2225000006"}, metadata_={"area": "一楼西厅中西风管上"}),
Device(name="二楼西厅温湿度", code="TH-03", device_type="sensor", group_id=4,
location="大楼二楼西厅", protocol="mqtt", collect_interval=60,
connection_params={"dtu_id": "2225000005"}, metadata_={"area": "财务门口西侧"}),
Device(name="二楼东厅温湿度", code="TH-04", device_type="sensor", group_id=4,
location="大楼二楼东厅", protocol="mqtt", collect_interval=60,
connection_params={"dtu_id": "2225000004"}, metadata_={"area": "英豪对过"}),
Device(name="机房室外温湿度", code="TH-05", device_type="sensor", group_id=4,
location="机房热泵控制柜", protocol="mqtt", collect_interval=60,
connection_params={"dtu_id": "2225000008"}, metadata_={"area": "机房门口", "type": "outdoor"}),
# 水表
Device(name="补水水表", code="WM-01", device_type="water_meter", group_id=2,
location="机房软水器补水管", protocol="image", collect_interval=300,
connection_params={"type": "smart_capture"}),
]
session.add_all(devices)
# 6. 碳排放因子
factors = [
EmissionFactor(name="华北电网排放因子", energy_type="electricity", factor=0.8843,
unit="kWh", scope=2, region="north_china", source="生态环境部2023", year=2023),
EmissionFactor(name="天然气排放因子", energy_type="natural_gas", factor=2.162,
unit="", scope=1, source="IPCC 2006", year=2006),
EmissionFactor(name="柴油排放因子", energy_type="diesel", factor=2.63,
unit="L", scope=1, source="IPCC 2006", year=2006),
EmissionFactor(name="光伏减排因子", energy_type="pv_generation", factor=0.8843,
unit="kWh", scope=2, region="north_china", source="等量替代电网电力", year=2023),
EmissionFactor(name="热泵节能减排因子", energy_type="heat_pump_saving", factor=0.8843,
unit="kWh", scope=2, region="north_china", source="相比电加热节省的电量", year=2023),
]
session.add_all(factors)
# 7. 预置报表模板
templates = [
ReportTemplate(name="日报", report_type="daily", is_system=True,
fields=[{"key": "total_consumption", "label": "总用电量", "unit": "kWh"},
{"key": "pv_generation", "label": "光伏发电量", "unit": "kWh"},
{"key": "self_use_rate", "label": "自消纳率", "unit": "%"},
{"key": "heatpump_energy", "label": "热泵用电", "unit": "kWh"},
{"key": "avg_cop", "label": "平均COP"},
{"key": "carbon_emission", "label": "碳排放", "unit": "kgCO2"}]),
ReportTemplate(name="月报", report_type="monthly", is_system=True,
fields=[{"key": "total_consumption", "label": "总用电量", "unit": "kWh"},
{"key": "pv_generation", "label": "光伏发电量", "unit": "kWh"},
{"key": "grid_import", "label": "电网购电", "unit": "kWh"},
{"key": "cost", "label": "电费", "unit": ""},
{"key": "carbon_emission", "label": "碳排放", "unit": "tCO2"},
{"key": "carbon_reduction", "label": "碳减排", "unit": "tCO2"}],
time_granularity="day"),
ReportTemplate(name="设备运行报告", report_type="custom", is_system=True,
fields=[{"key": "device_name", "label": "设备名称"},
{"key": "operating_hours", "label": "运行时长", "unit": "h"},
{"key": "energy_consumption", "label": "能耗", "unit": "kWh"},
{"key": "avg_power", "label": "平均功率", "unit": "kW"},
{"key": "alarm_count", "label": "告警次数"}]),
]
session.add_all(templates)
await session.commit()
print("Seed data inserted successfully!")
print(f" - {len(roles)} roles")
print(f" - {len(users)} users (admin/admin123)")
print(f" - {len(device_types)} device types")
print(f" - {len(groups)} device groups")
print(f" - {len(devices)} devices")
print(f" - {len(factors)} emission factors")
print(f" - {len(templates)} report templates")
if __name__ == "__main__":
asyncio.run(seed())