Abschlussworkshop open_eGo 30. Okt. 2018

Session

open_eGo-Logo

In [1]:
__copyright__ = "Reiner Lemoine Institut gGmbH"
__license__   = "GNU Affero General Public License Version 3 (AGPL-3.0)"
__url__       = "https://github.com/openego/eDisGo/blob/master/LICENSE"
__author__    = "nesnoj"

1 Einstieg

DINGO (DIstribution Network GeneratOr) generiert synthetische Verteilnetze auf der Mittel -und Niederspannungsebene.

Für das vorliegende Notebook wird DINGO in der Version 0.1.10 benötigt. Für die Erstellung werden Daten von der OpenEnergy Platform (OEP) benötigt.

Anmerkung zum Plotting: Optional: Damit in den Plots eine Hintergrundkarte geladen werden kann, wird das Paket contextily benötigt, welches nicht in den erforderlichen Paketen der setup.py enthalten ist (Installation per pip install contextily).

Mit %%capture kann DINGOs Ausgabe in diesem Notebook zugunsten der Übersichtlichkeit unterdrückt werden (auskommentieren, um alle Ausgaben anzuzeigen).

In [2]:
%%capture

from ding0.core import NetworkDing0
from ding0.tools.logger import setup_logger
from ding0.tools.results import save_nd_to_pickle
from ding0.tools.plots import plot_mv_topology
from egoio.tools import db
from sqlalchemy.orm import sessionmaker
import oedialect

# create new network
nd = NetworkDing0(name='network')
# set ID of MV grid district
mv_grid_districts = [460]

2 Annahmen anpassen

DINGO verfügt über einen config-Ordner, in dem alle relevanten Konfigurationen vorgenommen werden können. Hierzu zählen beispielsweise die zu verwendenden DB-Tabellen auf der OEP, Betriebsmittel und zulässige Spannungsbänder. Die Konfiguration wird beim Start ausgelesen und in die NetworkDing0-Instanz geschrieben.

Die Konfiguration umfasst:

In [3]:
for key, cfg in nd.config.items():
    print('[ {k} ]'.format(k=key))
    for param, val in cfg.items():
        print('    {k}: {v}'.format(k=param, v=val))
[ config ]
    config_dir: .ding0
    db_config_file: db_config.cfg
[ equipment ]
    equipment_mv_parameters_trafos: equipment-parameters_MV_transformers.csv
    equipment_mv_parameters_cables: equipment-parameters_MV_cables.csv
    equipment_mv_parameters_lines: equipment-parameters_MV_overhead_lines.csv
    equipment_lv_parameters_trafos: equipment-parameters_LV_transformers.csv
    equipment_lv_parameters_cables: equipment-parameters_LV_cables.csv
[ model_grids ]
    model_grids_lv_string_properties: model_grids-lv_string_properties.csv
    model_grids_lv_apartment_string: model_grids-lv_relation_apartment_string.csv
[ output ]
    animation_file_prefix: mv-routing_ani_
    nd_pickle: ding0_grids_{}.pkl
    edges_stats: mvgd_edges_stats_{}.csv
    nodes_stats: mvgd_nodes_stats_{}.csv
[ model_draft ]
    mv_grid_districts: EgoGridMvGriddistrict
    lv_load_areas: EgoDemandLoadarea
    lv_grid_district: EgoGridLvGriddistrict
    mv_stations: EgoGridHvmvSubstation
    lv_stations: EgoGridMvlvSubstation
    re_generators: t_ego_supply_res_powerplant_sq_mview
    conv_generators: t_ego_supply_conv_powerplant_sq_mview
[ versioned ]
    mv_grid_districts: EgoDpMvGriddistrict
    lv_load_areas: EgoDpLoadarea
    lv_grid_district: EgoDpLvGriddistrict
    mv_stations: EgoDpHvmvSubstation
    lv_stations: EgoDpMvlvSubstation
    re_generators: t_ego_dp_res_powerplant_sq_mview
    conv_generators: t_ego_dp_conv_powerplant_sq_mview
    version: v0.4.5
[ input_data_source ]
    input_data: versioned
[ mv_routing ]
    operator_diff_round_digits: 3
    conn_diff_tolerance: 0.0001
    load_area_threshold: 1
    load_area_count_per_ring: 20
    max_half_ring_length: 28
[ mv_connect ]
    load_area_sat_load_threshold: 100
    load_area_sat_string_load_threshold: 1000
    load_area_sat_conn_dist_weight: 1
    load_area_sat_string_length_threshold: 2000
    load_area_sat_conn_dist_ring_mod: 100
    load_area_stat_conn_dist_ring_mod: 300
    load_area_sat_buffer_radius: 2000
    load_area_sat_buffer_radius_inc: 1000
    generator_buffer_radius: 2000
    generator_buffer_radius_inc: 1000
[ assumptions ]
    load_density_threshold: 1
    voltage_per_km_threshold: 15
    load_factor_mv_trans_lc_normal: 0.6
    load_factor_mv_line_lc_normal: 0.6
    load_factor_mv_cable_lc_normal: 0.6
    load_factor_mv_trans_lc_malfunc: 1.0
    load_factor_mv_line_lc_malfunc: 1.0
    load_factor_mv_cable_lc_malfunc: 1.0
    load_factor_mv_trans_fc_normal: 1.0
    load_factor_mv_line_fc_normal: 1.0
    load_factor_mv_cable_fc_normal: 1.0
    load_factor_lv_trans_lc_normal: 1.0
    load_factor_lv_cable_lc_normal: 1.0
    load_factor_lv_trans_fc_normal: 1.0
    load_factor_lv_cable_fc_normal: 1.0
    cos_phi_load: 0.97
    cos_phi_gen: 1
    lv_nominal_voltage: 400
    apartment_house_branch_ratio: 1.5
    population_per_apartment: 2.3
    branch_line_length_retail_industrial: 400
    branch_line_length_agricultural: 800
    max_lv_branch_line: 290
    lv_ria_branch_connection_distance: 30
    branch_detour_factor: 1.3
    load_in_generation_case: 0
    generation_in_load_case: 0
    lv_max_v_level_lc_diff_normal: 0.05
    lv_max_v_level_fc_diff_normal: 0.03
[ mv_routing_tech_constraints ]
    mv_half_ring_count_max: 8
    mv_station_v_level_operation: 1.0
    mv_max_v_level_lc_diff_normal: 0.05
    mv_max_v_level_fc_diff_normal: 0.02
    mv_max_v_level_lc_diff_malfunc: 0.10
[ geo ]
    srid: 4326
[ powerflow ]
    test_grid_stability_scenario: Status Quo
    resolution: H
    start_hour: 0
    end_hour: 2
[ random ]
    seed: 431265572719

3 Datenbankverbindung aufbauen

DINGO verwendet Module des ego.io-Package für den Zugriff auf die OpenEnergy Platform. Für den hier verwendeten Lesebetrieb ist kein Account auf der OEP erforderlich.

(Für Schreibzugriffe wird hingegen ein Account benötigt. section bezieht sich auf die Sektion in der ego.io-Konfiguration, in welcher die Verbindung konfiguriert wird.)

In [4]:
engine = db.connection(section='oedb_dialect')
session = sessionmaker(bind=engine)()

4 DINGO ausführen

DINGO kann in einem Schritt ausgeführt werden, in dem die entsprechende Methode von NetworkDing0 aufgerufen wird:

In [5]:
#nd.run_ding0(session=session,
#             mv_grid_districts_no=mv_grid_districts)

Stattdessen wollen wir jedoch ein wenig ins Detail gehen:

5 DINGO ausführen - en Detail

Einzelschritte der Methode NetworkDing0.run_ding0()

5.1 Daten importieren

In [6]:
nd.import_mv_grid_districts(session,
                            mv_grid_districts_no=mv_grid_districts)
nd.import_generators(session)

5.2 Netze parametrieren und Import validieren

In [7]:
nd.mv_parametrize_grid()
nd.validate_grid_districts()
Out[7]:
[]

5.3 NS-Netze generieren

In [8]:
nd.build_lv_grids()

5.4 MS-Netze generieren

In [9]:
nd.mv_routing()
In [10]:
grid = nd._mv_grid_districts[0].mv_grid

# enable jupyter interactive plotting
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize'] = (8, 8)
matplotlib.rcParams['figure.dpi'] = 300
In [11]:
plot_mv_topology(grid, subtitle='Routing completed')