"""
DB tables / SQLAlchemy ORM classes for motorized individual travel
"""
from sqlalchemy import (
Boolean,
Column,
DateTime,
Float,
ForeignKey,
Integer,
SmallInteger,
String,
)
from sqlalchemy.dialects.postgresql import REAL
from sqlalchemy.ext.declarative import declarative_base
from egon.data.datasets.mv_grid_districts import MvGridDistricts
from egon.data.datasets.scenario_parameters import EgonScenario
# from sqlalchemy.orm import relationship
Base = declarative_base()
[docs]class EgonEvPool(Base):
"""
Class definition of table demand.egon_ev_pool.
Each row is one EV, uniquely defined by either (`ev_id`) or
(`rs7_id`, `type`, `simbev_id`).
Columns
-------
ev_id:
Unique id of EV
rs7_id:
id of RegioStar7 region
type:
type of EV, one of
* bev_mini
* bev_medium
* bev_luxury
* phev_mini
* phev_medium
* phev_luxury
simbev_ev_id:
id of EV as exported by simBEV
"""
__tablename__ = "egon_ev_pool"
__table_args__ = {"schema": "demand"}
scenario = Column(String, ForeignKey(EgonScenario.name), primary_key=True)
ev_id = Column(Integer, primary_key=True)
rs7_id = Column(SmallInteger)
type = Column(String(11))
simbev_ev_id = Column(Integer)
# trips = relationship(
# "EgonEvTrip", cascade="all, delete", back_populates="ev"
# )
# mvgds = relationship(
# "EgonEvMvGridDistrict", cascade="all, delete", back_populates="ev"
# )
[docs]class EgonEvTrip(Base):
"""
Class definition of table demand.egon_ev_trip.
Each row is one event of a specific electric vehicle which is
uniquely defined by `rs7_id`, `ev_id` and `event_id`.
Columns
-------
scenario:
Scenario
event_id:
Unique id of EV event
egon_ev_pool_ev_id:
id of EV, references EgonEvPool.ev_id
simbev_event_id:
id of EV event, unique within a specific EV dataset
location:
Location of EV event, one of
* "0_work"
* "1_business"
* "2_school"
* "3_shopping"
* "4_private/ridesharing"
* "5_leisure"
* "6_home"
* "7_charging_hub"
* "driving"
use_case:
Use case of EV event, one of
* "public" (public charging)
* "home" (private charging at 6_home)
* "work" (private charging at 0_work)
* <empty> (driving events)
charging_capacity_nominal:
Nominal charging capacity in kW
charging_capacity_grid:
Charging capacity at grid side in kW,
includes efficiency of charging infrastructure
charging_capacity_battery:
Charging capacity at battery side in kW,
includes efficiency of car charger
soc_start:
State of charge at start of event
soc_start:
State of charge at end of event
charging_demand:
Energy demand during parking/charging event in kWh.
0 if no charging takes place.
park_start:
Start timestep of parking event (15min interval, e.g. 4 = 1h)
park_end:
End timestep of parking event (15min interval)
drive_start:
Start timestep of driving event (15min interval)
drive_end:
End timestep of driving event (15min interval)
consumption:
Energy demand during driving event in kWh
Notes
-----
pgSQL's REAL is sufficient for floats as simBEV rounds output to 4 digits.
"""
__tablename__ = "egon_ev_trip"
__table_args__ = {"schema": "demand"}
# scenario = Column(
# String, ForeignKey(EgonEvPool.scenario), primary_key=True
# )
scenario = Column(String, ForeignKey(EgonScenario.name), primary_key=True)
event_id = Column(Integer, primary_key=True)
# egon_ev_pool_ev_id = Column(
# Integer, ForeignKey(EgonEvPool.ev_id), nullable=False, index=True
# )
egon_ev_pool_ev_id = Column(Integer, nullable=False, index=True)
simbev_event_id = Column(Integer)
location = Column(String(21))
use_case = Column(String(8))
charging_capacity_nominal = Column(REAL)
charging_capacity_grid = Column(REAL)
charging_capacity_battery = Column(REAL)
soc_start = Column(REAL)
soc_end = Column(REAL)
charging_demand = Column(REAL)
park_start = Column(Integer)
park_end = Column(Integer)
drive_start = Column(Integer)
drive_end = Column(Integer)
consumption = Column(REAL)
# __table_args__ = (
# ForeignKeyConstraint([scenario, egon_ev_pool_ev_id],
# [EgonEvPool.scenario, EgonEvPool.ev_id]),
# {"schema": "demand"},
# )
# ev = relationship("EgonEvPool", back_populates="trips")
[docs]class EgonEvCountRegistrationDistrict(Base):
"""
Class definition of table demand.egon_ev_count_registration_district.
Contains electric vehicle counts per registration district.
"""
__tablename__ = "egon_ev_count_registration_district"
__table_args__ = {"schema": "demand"}
scenario = Column(String, ForeignKey(EgonScenario.name), primary_key=True)
scenario_variation = Column(String, primary_key=True)
ags_reg_district = Column(Integer, primary_key=True)
reg_district = Column(String)
bev_mini = Column(Integer)
bev_medium = Column(Integer)
bev_luxury = Column(Integer)
phev_mini = Column(Integer)
phev_medium = Column(Integer)
phev_luxury = Column(Integer)
[docs]class EgonEvCountMunicipality(Base):
"""
Class definition of table demand.egon_ev_count_municipality.
Contains electric vehicle counts per municipality.
"""
__tablename__ = "egon_ev_count_municipality"
__table_args__ = {"schema": "demand"}
scenario = Column(String, ForeignKey(EgonScenario.name), primary_key=True)
scenario_variation = Column(String, primary_key=True)
ags = Column(Integer, primary_key=True)
bev_mini = Column(Integer)
bev_medium = Column(Integer)
bev_luxury = Column(Integer)
phev_mini = Column(Integer)
phev_medium = Column(Integer)
phev_luxury = Column(Integer)
rs7_id = Column(SmallInteger)
[docs]class EgonEvCountMvGridDistrict(Base):
"""
Class definition of table demand.egon_ev_count_mv_grid_district.
Contains electric vehicle counts per MV grid district.
"""
__tablename__ = "egon_ev_count_mv_grid_district"
__table_args__ = {"schema": "demand"}
scenario = Column(String, ForeignKey(EgonScenario.name), primary_key=True)
scenario_variation = Column(String, primary_key=True)
bus_id = Column(
Integer, ForeignKey(MvGridDistricts.bus_id), primary_key=True
)
bev_mini = Column(Integer)
bev_medium = Column(Integer)
bev_luxury = Column(Integer)
phev_mini = Column(Integer)
phev_medium = Column(Integer)
phev_luxury = Column(Integer)
rs7_id = Column(SmallInteger)
[docs]class EgonEvMvGridDistrict(Base):
"""
Class definition of table demand.egon_ev_mv_grid_district.
Contains list of electric vehicles per MV grid district.
"""
__tablename__ = "egon_ev_mv_grid_district"
__table_args__ = {"schema": "demand"}
id = Column(Integer, primary_key=True)
scenario = Column(String, ForeignKey(EgonScenario.name), index=True)
scenario_variation = Column(String, index=True)
bus_id = Column(Integer, ForeignKey(MvGridDistricts.bus_id), index=True)
# egon_ev_pool_ev_id = Column(Integer, ForeignKey(EgonEvPool.ev_id))
egon_ev_pool_ev_id = Column(Integer, nullable=False)
# ev = relationship("EgonEvPool", back_populates="mvgds")