Esempio n. 1
0
def MPC(Nachbar, PrHoBin, Season, fore_method, InputChoice, TimeSeriesIn,
        Haushalt, IncentiveLO, IncentiveER, Abregel):
    plt.close("all")

    #-----------------------------------------------
    # ---------------  INPUT DATA  -----------------
    #-----------------------------------------------
    Delta_t = 10  # 10 min bins

    Saison = Season
    if Saison == "Winter":
        #   start_date = '1/5/2013'    # th load 40,56 , el. laod 10,91
        #   end_date = '1/6/2013'
        start_date = '1/10/2013'  # th. load 85, el. Load 11,41
        end_date = '1/11/2013'
    elif Saison == "Uebergang":
        # start_date = '4/8/2013'     # th. load 85, el. Load 11,41
        # end_date = '4/9/2013'
        start_date = '3/26/2013'  # th Load 93, el. Load 10,9
        end_date = '3/27/2013'
    # start_date = '4/17/2013'
    # end_date = '4/18/2013'
    # start_date = '4/19/2013'    # th. Load 40,6 ,  el. Load 10,9
    # end_date = '4/20/2013'
    elif Saison == "Sommer":
        #start_date = '8/4/2013'
        #end_date = '8/5/2013'
        start_date = '8/11/2013'
        end_date = '8/12/2013'
# elif Saison == "Sommer":
#    start_date = '7/11/2013'  #  peak shaving, 60% analyse
#    end_date = '7/12/2013'       # 2,31/9.86
    elif Saison == "all":
        # start_date = '4/1/2013'
        # end_date = '12/30/2013'
        start_date = '1/2/2013'
        end_date = '12/30/2013'
    else:
        print "Fehler in Saison-Auswahl"

    INOUT_string = str(PrHoBin/6.)+'_'+Saison+'_'+fore_method+'_'+InputChoice+'_'\
        +TimeSeriesIn+'_'+Haushalt+'_'+ IncentiveLO+'_'+ IncentiveER+'_'+Abregel+'_'+Nachbar

    if Saison == 'Uebergang' and PrHoBin > 143:
        PrHoBin = 1000000
        INOUT_string = str(144/6.)+'_'+Saison+'_'+fore_method+'_'+InputChoice+'_'\
            +TimeSeriesIn+'_'+Haushalt+'_'+ IncentiveLO+'_'+ IncentiveER+'_'+Abregel+'_'+Nachbar

    date_year = '1/1/2013'
    #-----------------------------------------------

    print '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'
    print '%                                                  %'
    print '%         Optimierung von CHP, TES, GASboiler      %'
    print '%       PV, Battery nach KOSTEN, Perfekte Prognose %'
    print '%                                                  %'
    print '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'

    # -- Get number of days
    helpdf = pd.date_range(start_date, end_date, freq='D')
    numberOfdays = len(helpdf)
    if numberOfdays <= 0:
        print 'ERROR: Dates are wrong. Please check. Calculating days in August....'
        start_date = '8/11/2013'
        end_date = '8/12/2013'

    if Delta_t == 10:
        TimeStepSize = '10min'
        BIN = 144 * numberOfdays
        year_bins = 52560
        PrHoBinRange = range(0, PrHoBin)  # PredHorizonBin
    else:
        print 'ERROR: Implemented only for 10 min Bins.'

    print 'Calculating the time period: ', start_date, 'to', end_date
    print 'for', numberOfdays, 'days'
    print 'Year: ', date_year
    year_stamps = pd.date_range(date_year,
                                periods=year_bins,
                                freq=TimeStepSize)
    #print os.getcwd() # Prints the working directory

    # -------------------------------------------------------------------------
    # Get Input Parameter
    # -------------------------------------------------------------------------
    #    PV und Lastzeitreihen
    if Haushalt == 'EFH':
        if TimeSeriesIn == 'VDE':
            PVava_TOT_df, LoadAll_TOT_df, P_Load_max, P_PV_max = \
                        ipv.Input_PV_Load_VDE_EFH(Delta_t, TimeStepSize,year_stamps, Nachbar)
        elif TimeSeriesIn == 'LPG':
            PVava_TOT_df, LoadAll_TOT_df, P_Load_max, P_PV_max = \
            ipv.Input_PV_Load_LPG_EFH(Delta_t, TimeStepSize,year_stamps)
        elif TimeSeriesIn == 'LPG_Lab':
            PVava_TOT_df, LoadAll_TOT_df, P_Load_max, P_PV_max = \
            ipv.Input_PV_Load_LPG_Lab(Delta_t, TimeStepSize,year_stamps)
        else:  # default ist VDE
            print 'ERROR - TimeSeriesIN EFH'
            #  PVava_TOT_df, LoadAll_TOT_df, P_Load_max, P_PV_max = \
            #  ipv.Input_PV_Load_VDE_EFH(Delta_t, TimeStepSize,year_stamps)

            # Components
        if InputChoice == 'Default' and TimeSeriesIn == "LPG_Lab":
            Battery, Auxilary, ThermalStorage, \
            CHP, Costs, CO2 = ipv.inputvaluesDefault_EFH_Lab(Delta_t, TimeStepSize,year_stamps)
        elif InputChoice == 'Default':
            Battery, Auxilary, ThermalStorage, \
            CHP, Costs, CO2 = ipv.inputvaluesDefault_EFH(Delta_t, TimeStepSize,year_stamps)
        elif InputChoice == 'ohneFIT':
            Battery, Auxilary, ThermalStorage, \
            CHP, Costs, CO2 = ipv.inputvaluesOHNE_Verg_EFH(Delta_t, TimeStepSize,year_stamps)
        else:  #default
            #       Battery, Auxilary, ThermalStorage, \
            #       CHP, Costs = ipv.inputvaluesDefault_EFH(Delta_t, TimeStepSize,year_stamps)
            print 'ERROR - InChoice EFH'

    elif Haushalt == 'MFH':
        if TimeSeriesIn == 'VDE':  # will not be implemented
            PVava_TOT_df, LoadAll_TOT_df, P_Load_max, P_PV_max = \
                        ipv.Input_PV_Load_VDE_MFH(Delta_t, TimeStepSize,year_stamps)
        elif TimeSeriesIn == 'LPG':
            PVava_TOT_df, LoadAll_TOT_df, P_Load_max, P_PV_max = \
            ipv.Input_PV_Load_LPG_MFH(Delta_t, TimeStepSize,year_stamps)
        else:  # default ist VDE
            #    PVava_TOT_df, LoadAll_TOT_df, P_Load_max, P_PV_max = \
            #    ipv.Input_PV_Load_VDE_MFH(Delta_t, TimeStepSize,year_stamps)
            print 'ERROR - InChoice MFH'
        # Components
        if InputChoice == 'Default':
            Battery, Auxilary, ThermalStorage, \
            CHP, Costs, CO2 = ipv.inputvaluesDefault_MFH(Delta_t, TimeStepSize,year_stamps)
        elif InputChoice == 'ohneFIT':
            Battery, Auxilary, ThermalStorage, \
            CHP, Costs, CO2 = ipv.inputvaluesOHNE_Verg_MFH(Delta_t, TimeStepSize,year_stamps)
        else:  #default
            #            Battery, Auxilary, ThermalStorage, \
            #            CHP, Costs = ipv.inputvaluesDefault_MFH(Delta_t, TimeStepSize,year_stamps)
            print 'ERROR - TimeSeriesIN MFH'
    else:  #(default)
        print 'ERROR - Haushalt '

    day_stamps_date = pd.date_range(start_date, periods=BIN, freq=TimeStepSize)

    # -------------------------------------------------------------------------
    #  Preiszeitreihe als Dataframe   EPEX und PV Vergütung
    # -------------------------------------------------------------------------
    if IncentiveLO == 'LOoff':
        PreisProfilLO = Costs['C_grid_el'] * pd.DataFrame(
            np.ones(BIN), index=day_stamps_date)
    elif IncentiveLO == 'LOon':
        PreisProfilLO = ipv.PreisProfile(Delta_t, TimeStepSize, year_stamps,
                                         date_year)
    elif IncentiveLO == 'LOart':
        PreisProfilLO = Costs['C_grid_el'] * ipv.ArtPreisProfileLO(
            Delta_t, TimeStepSize, year_stamps, date_year, year_bins)
    else:  #PreisProfil = pd.DataFrame(Costs['C_grid_el']*np.ones(BIN))
        print 'ERROR - Incentive'

    if IncentiveER == 'ERoff':
        PreisProfilER = Costs['C_PV_FIT'] * pd.DataFrame(np.ones(BIN),
                                                         index=day_stamps_date)
    elif IncentiveER == 'ERart':
        PreisProfilER = Costs['C_PV_FIT'] * ipv.ArtPreisProfileER(
            Delta_t, TimeStepSize, year_stamps, date_year, year_bins)
    elif IncentiveER == 'ERon':
        PreisProfilER = ipv.PreisProfile(Delta_t, TimeStepSize, year_stamps,
                                         date_year)
    else:  #PreisProfil = pd.DataFrame(Costs['C_grid_el']*np.ones(BIN))
        print 'ERROR - Incentive'

    print start_date, end_date
    PreisPlotER = PreisProfilER[start_date:end_date]
    PreisPlotLO = PreisProfilLO[start_date:end_date]
    PreisProfilER.plot()
    PreisProfilLO.plot()

    if IncentiveER == 'ERoff' or IncentiveLO == 'LOoff':
        print("No time dependent prices used")
    else:
        PreisPlotLO.plot(title='Strompreis')
        PreisPlotER.plot(title='Feed-In Tarif')
    #print PreisProfil.values
    PreisPlotER.to_csv('RESULTS\Result_Opti_Fore_PreisProfil_ER_' +
                       INOUT_string + '_10.csv')
    PreisPlotLO.to_csv('RESULTS\Result_Opti_Fore_PreisProfil_LO_' +
                       INOUT_string + '_10.csv')

    # -------------------------------------------------------------------------

    # -------------------------------------------------------------------------
    # REAL VALUES ---------PREPARE for TWO Identical Days !!!!!! Tanja 25.6.2018
    # -------------------------------------------------------------------------
    # ---- Load
    LoadTestOrig = LoadAll_TOT_df[start_date:end_date]
    LoadTest = deepcopy(LoadTestOrig[:144])
    LoadPeriodReal = LoadTest.append(LoadTest)
    #print LoadPeriodReal
    LoadPeriodReal.index = LoadTestOrig.index
    # ---- PV
    PVTestOrig = PVava_TOT_df[start_date:end_date]
    PVTest = deepcopy(PVTestOrig[:144])
    PVavaPeriodReal = PVTest.append(PVTest)
    PVavaPeriodReal.index = PVTestOrig.index
    # -------------------------------------------------------------------------
    # for comparison use may be forecast values from AdHoc and AdHocV
    # -------------------------------------------------------------------------
    #    if fore_method == 'Persistenz':
    #        LoadPeriodReal = fore.TagesPersistenz(LoadAll_TOT_df, day_stamps_date, BIN)#
    #        PVavaPeriodReal = fore.TagesPersistenz(PVava_TOT_df, day_stamps_date, BIN)
    #    elif fore_method == 'Mittel':
    #        LoadPeriodReal = fore.DreiTageRunAverage(LoadAll_TOT_df, day_stamps_date, BIN)
    #        PVavaPeriodReal = fore.DreiTageRunAverage(PVava_TOT_df, day_stamps_date, BIN)
    #    elif fore_method == 'Perfekt':
    #        LoadPeriodReal = fore.TagesPersistenz(LoadAll_TOT_df, day_stamps_date, BIN)#
    #        PVavaPeriodReal = fore.TagesPersistenz(PVava_TOT_df, day_stamps_date, BIN)
    #    else:
    #        print "ERROR: Forcast Method not correct !"
    # -------------------------------------------------------------------------
    # FORECAST  Values
    # -------------------------------------------------------------------------
    LoadPeriodFore = LoadPeriodReal
    LoadPeriodFore.plot(title='Load')
    PVavaPeriodFore = PVavaPeriodReal
    PVavaPeriodFore.plot(title='PV')
    # not implemented ! see OptFlex - AdHoc und AdhocV

    # -------------------------------------------------------------------------
    # Prepare: Ausgabe Dataframes
    # -------------------------------------------------------------------------
    #BAT
    SOCbatEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['SOC battery'])
    PbattcharEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['Battery charging'])
    PbattdisEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['Battery dis-charging'])
    Result_BAT_End = pd.concat([
        PVavaPeriodReal, -LoadPeriodReal['ELoad'], SOCbatEnd, PbattcharEnd,
        PbattdisEnd
    ],
                               axis=1)
    #Grid
    GridImpEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['Grid Import'])
    GridExpEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['Grid Export'])
    Result_Grid_End = pd.concat(
        [PVavaPeriodReal, -LoadPeriodReal['ELoad'], GridImpEnd, GridExpEnd],
        axis=1)
    #TES
    SOCTESEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['SOC TES'])
    PTEScharEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['TES charging'])
    PTESdisEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['TES dis-charging'])
    Result_TES_End = pd.concat([PVavaPeriodReal,-LoadPeriodReal['QLoad1']-LoadPeriodReal['QLoad2'], \
                SOCTESEnd, PTEScharEnd, PTESdisEnd], axis=1)
    # Result_TES_End = pd.concat([-LoadPeriodReal['QLoad1'], \
    #             -LoadPeriodReal['QLoad2'],SOCTESEnd, PTEScharEnd, PTESdisEnd], axis=1)
    CompTime = pd.DataFrame(np.zeros(BIN),
                            index=day_stamps_date,
                            columns=['Computational Time'])

    #CHP
    CHPelEnd = pd.DataFrame(np.zeros(BIN),
                            index=day_stamps_date,
                            columns=['CHP el'])
    CHPthEnd = pd.DataFrame(np.zeros(BIN),
                            index=day_stamps_date,
                            columns=['CHP th'])
    CHPscloadEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['CHP load self'])
    CHPscbattEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['CHP batt self'])
    CHPexpEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['CHP Export'])
    CHPonoffEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['CHP on_off'])
    CHPGas = pd.DataFrame(np.zeros(BIN),
                          index=day_stamps_date,
                          columns=['CHP Gas'])
    CHP2QLoad = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['CHP th2load'])
    CHP2TES = pd.DataFrame(np.zeros(BIN),
                           index=day_stamps_date,
                           columns=['CHP th2TES'])
    Result_CHP_End = pd.concat([-LoadPeriodReal['ELoad'], -LoadPeriodReal['QLoad1']-LoadPeriodReal['QLoad2'],\
                            CHPelEnd, CHPthEnd, CHPscloadEnd,CHPscbattEnd, CHPexpEnd,\
                            CHPonoffEnd, CHPGas, CHP2QLoad ,CHP2TES], axis=1)
    #Heat
    AuxEnd = pd.DataFrame(np.zeros(BIN),
                          index=day_stamps_date,
                          columns=['Aux Gasbrenner'])
    AuxGasEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['Aux Gas'])
    Result_Heat_End = pd.concat([
        -LoadPeriodReal['QLoad1'] - LoadPeriodReal['QLoad2'], AuxEnd, CHPthEnd,
        PTESdisEnd, SOCTESEnd, AuxGasEnd
    ],
                                axis=1)

    # ---------- PV ----------
    PVselfconbattEnd = pd.DataFrame(np.zeros(BIN),
                                    index=day_stamps_date,
                                    columns=['PV batt selfcon'])
    PVselfconloadEnd = pd.DataFrame(np.zeros(BIN),
                                    index=day_stamps_date,
                                    columns=['PV load selfcon'])
    PVexportEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['PV Grid export'])
    PVsumEnd = pd.DataFrame(np.zeros(BIN),
                            index=day_stamps_date,
                            columns=['PV Summe'])
    Result_PV_End = pd.concat([PVavaPeriodReal, -LoadPeriodReal['ELoad'],\
                PVselfconloadEnd,PVselfconbattEnd, PVexportEnd,PVsumEnd], axis=1)

    # ----  Corrections for MPC
    # Not implemente !

    # -------------------------------------------------------------------------
    # ------------  MPC Loop --------------------------------------------------
    # -------------------------------------------------------------------------
    ELoadF = LoadPeriodFore['ELoad'].values
    Q1LoadF = LoadPeriodFore['QLoad1'].values
    Q2LoadF = LoadPeriodFore['QLoad2'].values
    PVavaFore = PVavaPeriodFore[
        'PV 2013, Kassel, 10min'].values  #PV2013, Kassel, 10min
    PPER = PreisProfilER[0].values
    PPLO = PreisProfilLO[0].values

    maxx = len(LoadPeriodFore) - PrHoBin
    t1 = ti.clock()
    if len(LoadPeriodFore) - PrHoBin < 0:
        print 'Prediction Horizon out of Range!!!'
        #if something is wrong, do not optimize
        # dummy is providing default dataframes as results
        Opt_Result = opt.OptFlex_optimierer_dummy(day_stamps_date, BIN)
    else:
        minn = 0
        #
        maxx = 144
        #maxx = 77
        for timestep in range(minn, maxx):
            print[Result_PV_End.index[timestep]]
            print PrHoBin, timestep, maxx, Saison, fore_method, InputChoice,\
                    TimeSeriesIn,Haushalt,IncentiveLO, IncentiveER, Abregel, Nachbar
            # -----------------------------------------------------------------
            # ------------------ Initialize for the next step ---------------------
            # -----------------------------------------------------------------
            Load = {i: ELoadF[i + timestep]
                    for i in PrHoBinRange}
            P_sh_th = {i: Q1LoadF[i + timestep]
                       for i in PrHoBinRange}
            P_dhw_th = {i: Q2LoadF[i + timestep]
                        for i in PrHoBinRange}
            P_PV_ava = {i: PVavaFore[i + timestep]
                        for i in PrHoBinRange}
            PreisProfilER_cut = {i: PPER[i + timestep]
                                 for i in PrHoBinRange}
            PreisProfilLO_cut = {i: PPLO[i + timestep]
                                 for i in PrHoBinRange}
            #==============================================================================
            # -----------------------------------------------------------------
            # -------------------  Optimze ----------------------------------------    Opt_Result['b_CHP_on'][Opt_Result.index[0]]
            # -----------------------------------------------------------------
            #==============================================================================
            horizon_stamps = day_stamps_date[timestep:PrHoBin + timestep]
            Opt_Result = opt.OptFlex_optimierer(horizon_stamps, PrHoBin, Load,
                                                P_PV_max, P_Load_max, P_sh_th,
                                                P_dhw_th, P_PV_ava, Battery,
                                                Auxilary, ThermalStorage, CHP,
                                                Costs, CO2, PreisProfilER_cut,
                                                PreisProfilLO_cut, Abregel)
            #print Opt_Result.ix[0]
            # --- Einzelplots ----Test Prediction Horizon --------------------
            #==============================================================================
            #             Result_el_df = pd.concat([-LoadPeriodFore['ELoad'],
            #                                    -Opt_Result['P_Grid_import'],
            #                                     Opt_Result['P_Grid_export'],
            #                                     Opt_Result['SOC_batt']/50,
            #                                    -Opt_Result['P_batt_dis'],
            #                                     Opt_Result['P_batt_char'],
            #                                    -Opt_Result['P_CHP2load'],
            #                                    -Opt_Result['P_CHP_el'],
            #                                    -Opt_Result['P_CHP_el_exp'], ],axis=1)
            #             Result_th_df = pd.concat([-LoadPeriodFore['QLoad1']*2,
            #                                    -Opt_Result['P_aux_th'],
            #                                    -Opt_Result['P_TES_dis'],
            #                                     Opt_Result['P_TES_char'],
            #                                     Opt_Result['SOC_TES']/50,
            #                                     Opt_Result['P_CHP_th'],
            #                                     Opt_Result['b_CHP_on'],
            #                                      ],axis=1)
            #             Result_PV_Grid = pd.concat([-PVavaPeriodFore['PV 2013, Kassel, 10min'],
            #                                    -LoadPeriodReal['ELoad'],
            #                                    -Opt_Result['P_Grid_import'],
            #                                     Opt_Result['P_Grid_export'],
            #                                     Opt_Result['P_PV_exp'],
            #                                     Opt_Result['P_CHP_el_exp'], ],axis=1)
            #             if timestep==1 or timestep==maxx*0.5 or timestep==maxx-1:
            #                 #plt.figure(title=')
            #                 Result_el_df.plot(title='elek')
            #                 #plt.figure()
            #                 Result_th_df.plot(title='therm')
            #                 Result_PV_Grid.plot(title='PV_Grid')
            #             if timestep==38:
            #                 Result_el_df.plot(title='elek')
            #                 Result_th_df.plot(title='therm')
            #                 Result_PV_Grid.plot(title='PV_Grid')
            #==============================================================================

            #if timestep==2 or timestep==max*0.5+1 or timestep==max-1:
            #   Result_th_df.plot()

            # -----------------------------------------------------------------
            # check and correct forecast schedule
            # -----------------------------------------------------------------
            #  not implemented

            # -----------------------------------------------------------------
            # --- Sammle Eintröge[0] für Gesamtergebnis -----------------------
            # -----------------------------------------------------------------
            # Battery
            Result_BAT_End['SOC battery'][Result_BAT_End.index[timestep]] \
                     = Opt_Result['SOC_batt'][Opt_Result.index[0]]
            Result_BAT_End['Battery charging'][Result_BAT_End.index[timestep]] \
                     = Opt_Result['P_batt_char'][Opt_Result.index[0]]
            Result_BAT_End['Battery dis-charging'][Result_BAT_End.index[timestep]] \
                     = Opt_Result['P_batt_dis'][Opt_Result.index[0]]
            # Grid
            Result_Grid_End['Grid Import'][Result_Grid_End.index[timestep]] \
                    = Opt_Result['P_Grid_import'][Opt_Result.index[0]]
            Result_Grid_End['Grid Export'][Result_Grid_End.index[timestep]] \
                    = Opt_Result['P_Grid_export'][Opt_Result.index[0]]
            # Aux Gasbrenner
            if Opt_Result['P_aux_th'][Opt_Result.index[0]] >= 1e-4:
                Result_Heat_End['Aux Gasbrenner'][Result_Heat_End.index[timestep]] \
                    = Opt_Result['P_aux_th'][Opt_Result.index[0]]
                Result_Heat_End['Aux Gas'][Result_Heat_End.index[timestep]] \
                    = Opt_Result['P_aux_gas'][Opt_Result.index[0]]
            elif Opt_Result['P_aux_th'][Opt_Result.index[0]] < 1e-4:
                Result_Heat_End['Aux Gasbrenner'][Result_Heat_End.index[timestep]] \
                    = 0
                Result_Heat_End['Aux Gas'][Result_Heat_End.index[timestep]] \
                    = 0
            else:
                print "Error -- Aux-Value out of range !!!"
            Result_Heat_End['TES dis-charging'][Result_Heat_End.index[timestep]] \
                     = Opt_Result['P_TES_dis'][Opt_Result.index[0]]
            Result_Heat_End['SOC TES'][Result_Heat_End.index[timestep]] \
                     = Opt_Result['SOC_TES'][Opt_Result.index[0]]
            Result_Heat_End['CHP th'][Result_Heat_End.index[timestep]] \
                     = Opt_Result['P_CHP_th'][Opt_Result.index[0]]
            # Thermal Storage
            Result_TES_End['SOC TES'][Result_TES_End.index[timestep]] \
                     = Opt_Result['SOC_TES'][Opt_Result.index[0]]
            Result_TES_End['TES charging'][Result_TES_End.index[timestep]] \
                     = Opt_Result['P_TES_char'][Opt_Result.index[0]]
            Result_TES_End['TES dis-charging'][Result_TES_End.index[timestep]] \
                     = Opt_Result['P_TES_dis'][Opt_Result.index[0]]
            #CHP
            Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]] \
                     = Opt_Result['P_CHP_th'][Opt_Result.index[0]]
            Result_CHP_End['CHP el'][Result_CHP_End.index[timestep]] \
                     = Opt_Result['P_CHP_el'][Opt_Result.index[0]]
            Result_CHP_End['CHP Export'][Result_CHP_End.index[timestep]] \
                     = Opt_Result['P_CHP_el_exp'][Opt_Result.index[0]]
            Result_CHP_End['CHP load self'][Result_CHP_End.index[timestep]] \
                     = Opt_Result['P_CHP2load'][Opt_Result.index[0]]
            Result_CHP_End['CHP batt self'][Result_CHP_End.index[timestep]] \
                     = Opt_Result['P_CHP2batt'][Opt_Result.index[0]]
            Result_CHP_End['CHP Gas'][Result_CHP_End.index[timestep]] \
                     = Opt_Result['P_CHP_gas'][Opt_Result.index[0]]
            #-- see if-else below to avoid 1.0000000000000002 or 0.99999999999433 TMK 19.12.2016
            #Result_CHP_End['CHP on_off'][Result_CHP_End.index[timestep]] \
            #         = Opt_Result['b_CHP_on'][Opt_Result.index[0]]

            # -----------------------------------------------------------------
            # ----------------Re-Initialize SOC for the next step -----------------
            # -----------------------------------------------------------------
            Battery['SOC_batt_ini'] = Opt_Result['SOC_batt'][
                Opt_Result.index[0]]
            ThermalStorage['SOC_TES_ini'] = Opt_Result['SOC_TES'][
                Opt_Result.index[0]]
            if Opt_Result['b_CHP_on'][Opt_Result.index[0]] == 1 or Opt_Result[
                    'b_CHP_on'][Opt_Result.index[0]] == 0:
                CHP['b_CHP_on_ini'] = Opt_Result['b_CHP_on'][
                    Opt_Result.index[0]]
                Result_CHP_End['CHP on_off'][Result_CHP_End.index[timestep]] \
                     = Opt_Result['b_CHP_on'][Opt_Result.index[0]]
            elif Opt_Result['b_CHP_on'][
                    Opt_Result.index[0]] < 1.1 and Opt_Result['b_CHP_on'][
                        Opt_Result.index[0]] > 0.9:
                CHP['b_CHP_on_ini'] = 1
                Result_CHP_End['CHP on_off'][
                    Result_CHP_End.index[timestep]] = 1
            elif Opt_Result['b_CHP_on'][
                    Opt_Result.index[0]] < 0.1 and Opt_Result['b_CHP_on'][
                        Opt_Result.index[0]] > -0.1:
                CHP['b_CHP_on_ini'] = 0
                Result_CHP_End['CHP on_off'][
                    Result_CHP_End.index[timestep]] = 0
            else:
                print("ERROR  -   CHP['b_CHP_on_ini']",
                      Opt_Result['b_CHP_on'][Opt_Result.index[0]])

            CHP['b_CHP_ini_1'] = Result_CHP_End['CHP on_off'][
                Result_CHP_End.index[timestep - 2]]
            CHP['b_CHP_ini_2'] = Result_CHP_End['CHP on_off'][
                Result_CHP_End.index[timestep - 1]]
            CHP['b_CHP_ini_3'] = Result_CHP_End['CHP on_off'][
                Result_CHP_End.index[timestep]]
            # print ("Cost:2", CHP['b_CHP_on_ini'], CHP['b_CHP_ini_1'], CHP['b_CHP_ini_2'], CHP['b_CHP_ini_3'])
            # -------- Calculate CHP2Qload and CHP2Qstor  ------------------------
            # ------------ FORE only ----------------
            if Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]] > 0:
                QProfileFore = LoadPeriodFore['QLoad1'][Result_CHP_End.index[timestep]]\
                             + LoadPeriodFore['QLoad2'][Result_CHP_End.index[timestep]]
                if Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]\
                    > QProfileFore:
                    Result_CHP_End['CHP th2load'][Result_CHP_End.index[timestep]]\
                         = QProfileFore
                    Result_CHP_End['CHP th2TES'][Result_CHP_End.index[timestep]]\
                         = Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]\
                         - QProfileFore
                elif Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]\
                    <= QProfileFore:
                    Result_CHP_End['CHP th2load'][Result_CHP_End.index[timestep]]\
                         = Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]
                    Result_CHP_End['CHP th2TES'][Result_CHP_End.index[timestep]]\
                         = 0
            #----------------------------------------------------------------
#
#            if Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]>0:
#                QProfileReal = LoadPeriodReal['QLoad1'][Result_CHP_End.index[timestep]]\
#                             + LoadPeriodReal['QLoad2'][Result_CHP_End.index[timestep]]
#                if Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]\
#                    > QProfileReal:
#                    Result_CHP_End['CHP th2load'][Result_CHP_End.index[timestep]]\
#                         = QProfileReal
#                    Result_CHP_End['CHP th2TES'][Result_CHP_End.index[timestep]]\
#                         = Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]\
#                    - QProfileReal
#                elif Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]\
#                    <= QProfileReal:
#                    Result_CHP_End['CHP th2load'][Result_CHP_End.index[timestep]]\
#                         = Result_CHP_End['CHP th'][Result_CHP_End.index[timestep]]
#                    Result_CHP_End['CHP th2TES'][Result_CHP_End.index[timestep]]\
#                         = 0
#            #---------------------------------------------------------------------

# PV
            Result_PV_End['PV batt selfcon'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV2batt'][Opt_Result.index[0]]
            Result_PV_End['PV load selfcon'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV2load'][Opt_Result.index[0]]
            Result_PV_End['PV Grid export'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV_exp'][Opt_Result.index[0]]

    if len(LoadPeriodFore) - PrHoBin < 0:
        print 'CompTime not possible!'
    else:
        t2 = ti.clock()
        CompTime['Computational Time'][timestep] = t2 - t1

    # -----------------------------------------------------------------
    # ----- Figures and Plotting  -------------------------------------
    # -----------------------------------------------------------------
    if len(LoadPeriodFore) - PrHoBin < 0:
        print "Cplex crash"
    else:
        # nach modified script: Jan von Appen
        Plotc = 3
        # nach modified script: Jan von Appen
        Plotc_back = pl.Plotting(Result_Grid_End, Result_BAT_End, Result_PV_End,\
        Result_CHP_End, Result_Heat_End, Result_TES_End, \
        PVavaPeriodFore, P_PV_max, P_Load_max, LoadPeriodFore, \
        Battery, Costs, start_date, end_date, Plotc, 'Fore', maxx,\
        PrHoBin, INOUT_string)


#==============================================================================
#     Result_Grid_End.plot(title='Grid')
#     Result_BAT_End.plot(title='Battery')
#     Result_Heat_End.plot(title='Heat')
#     Result_TES_End.plot(title='Thermal Storage')
#     Result_CHP_End.plot(title='CHP')
#
#
#==============================================================================

# -----------------------------------------------------------------
# ------ KPIs -----------------------------------------------------
# -----------------------------------------------------------------
    if len(LoadPeriodFore) - PrHoBin < 0:
        print "Fehler! No plotting!"
        kpi.Calc_KPI_dummy('Fore', 144, CompTime, INOUT_string)
    else:
        kpi.Calc_KPI(Result_BAT_End, Result_PV_End, Result_Grid_End,\
        Result_CHP_End, Result_TES_End, Result_Heat_End,\
        LoadPeriodFore, PVavaPeriodFore, Costs, PrHoBin, maxx,Delta_t, \
        Battery, CHP, Auxilary, 'Fore', CompTime,INOUT_string,CO2)
    # -----------------------------------------------------------------
    # ------- Save to File --------------------------------------
    # -----------------------------------------------------------------
    Result_Grid_End.to_csv('RESULTS\Result_Opti_Fore_Grid_' + INOUT_string +
                           '_10.csv')
    Result_PV_End.to_csv('RESULTS\Result_Opti_Fore_PV_' + INOUT_string +
                         '_10.csv')
    Result_BAT_End.to_csv('RESULTS\Result_Opti_Fore_BAT_' + INOUT_string +
                          '_10.csv')
    Result_CHP_End.to_csv('RESULTS\Result_Opti_Fore_CHP_' + INOUT_string +
                          '_10.csv')
    Result_TES_End.to_csv('RESULTS\Result_Opti_Fore_TES_' + INOUT_string +
                          '_10.csv')
    Result_Heat_End.to_csv('RESULTS\Result_Opti_Fore_Heat_' + INOUT_string +
                           '_10.csv')
    LoadPeriodFore.to_csv('RESULTS\Load_' + INOUT_string + '_10.csv')
    print "The End!"
    return 0
Esempio n. 2
0
def MPC():
    plt.close("all")

    #-----------------------------------------------
    # ---------------  INPUT DATA  -----------------
    #-----------------------------------------------
    Delta_t = 10  # 10 min bins
    start_date = '6/2/2013'
    end_date = '6/3/2013'
    date_year = '1/1/2013'
    PrHoBin = 72
    #-----------------------------------------------

    print('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
    print('%                                                  %')
    print('%         Optimierung von TES, GASboiler      %')
    print('%         PV, Battery, EHeater nach KOSTEN         %')
    print('%                                                  %')
    print('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')

    # -- Get number of days
    helpdf = pd.date_range(start_date, end_date, freq='D')
    numberOfdays = len(helpdf)
    if numberOfdays <= 0:
        print(
            'ERROR: Dates are wrong. Please check. Calculating days in August....'
        )
        start_date = '8/11/2013'
        end_date = '8/12/2013'

    if Delta_t == 10:
        TimeStepSize = '10min'
        BIN = 144 * numberOfdays
        year_bins = 52560
        PrHoBinRange = range(0, PrHoBin)  # PredHorizonBin
    else:
        print('ERROR: Implemented only for 10 min Bins.')

    print('Calculating the time period: ', start_date, 'to', end_date)
    print('for', numberOfdays, 'days')
    print('Year: ', date_year)
    year_stamps = pd.date_range(date_year,
                                periods=year_bins,
                                freq=TimeStepSize)

    # -------------------------------------------------------------------------
    # Get Input Parameter
    # -------------------------------------------------------------------------
    #   PVava_TOT_df, LoadAll_TOT_df, P_Load_max, P_PV_max, Battery, Auxilary, ThermalStorage, \
    #   Costs, EHeater = ipv.inputvalues_VDE_EFH(Delta_t, TimeStepSize,year_stamps)

    #    if inputFile == "VDE":
    PVava_TOT_df, P_PV_max,P_Load_max, LoadAll_TOT_df, Battery, Auxilary, ThermalStorage,\
    EHeater, Costs = ipv.inputvalues_VDE_EFH(Delta_t, TimeStepSize,year_stamps)
    #
    #    elif inputFile == "LPG":
    #        PVava_TOT_df, P_PV_max,P_Load_max, LoadAll_TOT_df, Battery, Costs \
    #        = ipv.inputvalues_LPG_EFH(Delta_t, TimeStepSize,year_stamps)
    #    else:
    #        print (("ERROR ---- inputFile in Main is not correct")

    # -------------------------------------------------------------------------
    # REAL VALUES
    # -------------------------------------------------------------------------
    day_stamps_date = pd.date_range(start_date, periods=BIN, freq=TimeStepSize)
    # ---- Load
    LoadPeriodReal = LoadAll_TOT_df[start_date:end_date]
    # ---- PV
    PVavaPeriodReal = PVava_TOT_df[start_date:end_date]

    # -------------------------------------------------------------------------
    # NO FORECAST  Values
    # -------------------------------------------------------------------------
    LoadPeriodFore = LoadPeriodReal
    PVavaPeriodFore = PVavaPeriodReal

    # -------------------------------------------------------------------------
    # Prepare: Ausgabe Dataframes
    # -------------------------------------------------------------------------
    #BAT
    SOCbatEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['SOC battery'])
    PbattcharEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['Battery charging'])
    PbattdisEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['Battery dis-charging'])
    Result_BAT_End = pd.concat([
        PVavaPeriodReal, -LoadPeriodReal['ELoad'], SOCbatEnd, PbattcharEnd,
        PbattdisEnd
    ],
                               axis=1)
    #Grid
    GridImpEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['Grid Import'])
    GridExpEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['Grid Export'])
    Result_Grid_End = pd.concat(
        [PVavaPeriodReal, -LoadPeriodReal['ELoad'], GridImpEnd, GridExpEnd],
        axis=1)
    #TES
    SOCTESEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['SOC TES'])
    PTEScharEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['TES charging'])
    PTESdisEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['TES dis-charging'])
    Result_TES_End = pd.concat([PVavaPeriodReal,-LoadPeriodReal['QLoad1']*2, \
                SOCTESEnd, PTEScharEnd, PTESdisEnd], axis=1)
    # Result_TES_End = pd.concat([-LoadPeriodReal['QLoad1'], \
    #             -LoadPeriodReal['QLoad2'],SOCTESEnd, PTEScharEnd, PTESdisEnd], axis=1)

    #Heat
    AuxEnd = pd.DataFrame(np.zeros(BIN),
                          index=day_stamps_date,
                          columns=['Aux Gasbrenner'])
    EHeaterelEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['EHeater el'])
    EHeaterthEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['EHeater th'])

    Result_Heat_End = pd.concat([
        -LoadPeriodReal['QLoad1'] * 2, AuxEnd, EHeaterthEnd, EHeaterelEnd,
        PTESdisEnd, SOCTESEnd
    ],
                                axis=1)

    # ---------- PV ----------
    #PVEnd = pd.DataFrame(np.zeros(BIN), index=day_stamps, columns=['PV'])
    PVselfconbattEnd = pd.DataFrame(np.zeros(BIN),
                                    index=day_stamps_date,
                                    columns=['PV batt selfcon'])
    PVselfconloadEnd = pd.DataFrame(np.zeros(BIN),
                                    index=day_stamps_date,
                                    columns=['PV load selfcon'])
    PVexportEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['PV Grid export'])
    PVsumEnd = pd.DataFrame(np.zeros(BIN),
                            index=day_stamps_date,
                            columns=['PV Summe'])
    Result_PV_End = pd.concat([PVavaPeriodReal, -LoadPeriodReal['ELoad'],\
                                -EHeaterelEnd, \
                             PVselfconloadEnd,PVselfconbattEnd, PVexportEnd,PVsumEnd], axis=1)

    #==============================================================================
    # -------------------------------------------------------------------------
    # ------------  MPC Loop --------------------------------------------------
    # -------------------------------------------------------------------------
    ELoadF = LoadPeriodFore['ELoad'].values
    Q1LoadF = LoadPeriodFore['QLoad1'].values
    Q2LoadF = LoadPeriodFore['QLoad2'].values
    PVavaFore = PVavaPeriodFore[
        'PV 2013, Kassel, 10min'].values  #PV2013, Kassel, 10min
    #PVavaReal = PVavaPeriodFore['PV 2013, Kassel, 10min'].values #PV2013, Kassel, 10min

    maxx = len(LoadPeriodFore) - PrHoBin
    if len(LoadPeriodFore) - PrHoBin < 0:
        print('Prediction Horizon out of Range!!!')
    else:
        maxx = 160  #144
        for timestep in range(0, maxx):
            print(timestep, maxx)
            # -----------------------------------------------------------------
            # ------------------ Initialize for the next step ---------------------
            # -----------------------------------------------------------------
            Load = {i: ELoadF[i + timestep]
                    for i in PrHoBinRange}
            P_sh_th = {i: Q1LoadF[i + timestep]
                       for i in PrHoBinRange}
            P_dhw_th = {i: Q2LoadF[i + timestep]
                        for i in PrHoBinRange}
            P_PV_ava = {i: PVavaFore[i + timestep]
                        for i in PrHoBinRange}
            # -----------------------------------------------------------------
            # -------------------  Optimze ----------------------------------------
            # -----------------------------------------------------------------
            horizon_stamps = day_stamps_date[timestep:PrHoBin + timestep]
            Opt_Result = opt.OptFlex_optimierer(horizon_stamps, PrHoBin, Load,
                                                P_PV_max, P_Load_max, P_sh_th,
                                                P_dhw_th, P_PV_ava, Battery,
                                                Auxilary, ThermalStorage,
                                                EHeater, Costs)

            # -----------------------------------------------------------------
            # -----  Prepare Variable Results   -------------------------------
            # -----------------------------------------------------------------

            #==============================================================================
            #             # --- Einzelplots ----Test Prediction Horizon --------------------
            #             Result_el_df = pd.concat([-LoadPeriodFore['ELoad'],
            #                                    -Opt_Result['P_Grid_import'],
            #                                     Opt_Result['P_Grid_export'],
            #                                     Opt_Result['SOC_batt']/50,
            #                                    -Opt_Result['P_batt_dis'],
            #                                     Opt_Result['P_batt_char'],
            #                                    -Opt_Result['P_CHP2load'],
            #                                    -Opt_Result['P_CHP_el'],
            #                                    -Opt_Result['P_CHP_el_exp'], ],axis=1)
            #             Result_th_df = pd.concat([-LoadPeriodFore['QLoad1']*2,
            #                                    -Opt_Result['P_aux_th'],
            #                                    -Opt_Result['P_TES_dis'],
            #                                     Opt_Result['P_TES_char'],
            #                                     Opt_Result['SOC_TES']/50,
            #                                     Opt_Result['P_CHP_th'],
            #                                      ],axis=1)
            #             Result_PV_Grid = pd.concat([-PVavaPeriodFore['PV 2013, Kassel, 10min'],
            #                                    -LoadPeriodReal['ELoad'],
            #                                    -Opt_Result['P_Grid_import'],
            #                                     Opt_Result['P_Grid_export'],
            #                                     Opt_Result['P_PV_exp'],
            #                                     Opt_Result['P_CHP_el_exp'], ],axis=1)
            #             if timestep==1 or timestep==maxx*0.5 or timestep==maxx-1:
            #                 #plt.figure(title=')
            #                 Result_el_df.plot(title='elek')
            #                 #plt.figure()
            #                 Result_th_df.plot(title='therm')
            #                 Result_PV_Grid.plot(title='PV_Grid')
            #             if timestep==38:
            #                 Result_el_df.plot(title='elek')
            #                 Result_th_df.plot(title='therm')
            #                 Result_PV_Grid.plot(title='PV_Grid')
            #
            #             #if timestep==2 or timestep==max*0.5+1 or timestep==max-1:
            #              #   Result_th_df.plot()
            #==============================================================================

            # -----------------------------------------------------------------
            # ----------------Re-Initialize SOC for the next step -----------------
            # -----------------------------------------------------------------
            Battery['SOC_batt_ini'] = Opt_Result['SOC_batt'][
                Opt_Result.index[0]]
            ThermalStorage['SOC_TES_ini'] = Opt_Result['SOC_TES'][
                Opt_Result.index[0]]
            #     print (" ------------>  SOC"
            #     print (Opt_Result['SOC_batt']
            #     print (Battery['SOC_batt_ini'], ThermalStorage['SOC_TES_ini']

            # -----------------------------------------------------------------
            # --- Sammle Eintröge[0] für Gesamtergebnis -----------------------
            # -----------------------------------------------------------------
            # Battery
            Result_BAT_End['SOC battery'][Result_BAT_End.index[timestep]] \
                     = Opt_Result['SOC_batt'][Opt_Result.index[0]]
            Result_BAT_End['Battery charging'][Result_BAT_End.index[timestep]] \
                     = Opt_Result['P_batt_char'][Opt_Result.index[0]]
            Result_BAT_End['Battery dis-charging'][Result_BAT_End.index[timestep]] \
                     = Opt_Result['P_batt_dis'][Opt_Result.index[0]]
            # Grid
            Result_Grid_End['Grid Import'][Result_Grid_End.index[timestep]] \
                    = Opt_Result['P_Grid_import'][Opt_Result.index[0]]
            Result_Grid_End['Grid Export'][Result_Grid_End.index[timestep]] \
                    = Opt_Result['P_Grid_export'][Opt_Result.index[0]]
            # Aux Gasbrenner & EHeater
            Result_Heat_End['Aux Gasbrenner'][Result_Heat_End.index[timestep]] \
                    = Opt_Result['P_aux_th'][Opt_Result.index[0]]
            Result_Heat_End['TES dis-charging'][Result_Heat_End.index[timestep]] \
                     = Opt_Result['P_TES_dis'][Opt_Result.index[0]]
            Result_Heat_End['SOC TES'][Result_Heat_End.index[timestep]] \
                     = Opt_Result['SOC_TES'][Opt_Result.index[0]]
            Result_Heat_End['EHeater th'][Result_Heat_End.index[timestep]] \
                     = Opt_Result['P_eheater_th'][Opt_Result.index[0]]
            Result_Heat_End['EHeater el'][Result_Heat_End.index[timestep]] \
                     = Opt_Result['P_eheater_el'][Opt_Result.index[0]]
            # Thermal Storage
            Result_TES_End['SOC TES'][Result_TES_End.index[timestep]] \
                     = Opt_Result['SOC_TES'][Opt_Result.index[0]]
            Result_TES_End['TES charging'][Result_TES_End.index[timestep]] \
                     = Opt_Result['P_TES_char'][Opt_Result.index[0]]
            Result_TES_End['TES dis-charging'][Result_TES_End.index[timestep]] \
                     = Opt_Result['P_TES_dis'][Opt_Result.index[0]]

            # PV
            #Result_PV_End['PV'][Result_PV_End.index[timestep]] \
            #        = Opt_Result['P_PV'][Opt_Result.index[0]]
            Result_PV_End['PV batt selfcon'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV2batt'][Opt_Result.index[0]]
            Result_PV_End['PV load selfcon'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV2load'][Opt_Result.index[0]]
            Result_PV_End['PV Grid export'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV_exp'][Opt_Result.index[0]]

    # -----------------------------------------------------------------
    # ----- Figures and Plotting  -------------------------------------
    # -----------------------------------------------------------------
    # nach modified script: Jan von Appen
    Plotc = 3
    # nach modified script: Jan von Appen
    Plotc_back = pl.Plotting(Result_Grid_End, Result_BAT_End, Result_PV_End,\
    Result_Heat_End, Result_TES_End, \
    PVavaPeriodFore, P_PV_max, P_Load_max, LoadPeriodFore, \
    Battery, Costs, EHeater, start_date, end_date, Plotc, 'Fore', maxx)
    #Battery, Costs, start_date, end_date, Plotc, 'Fore', maxx)
    #==============================================================================
    #     Result_Grid_End.plot(title='Grid')
    #     Result_BAT_End.plot(title='Battery')
    #     Result_Heat_End.plot(title='Heat')
    #     Result_TES_End.plot(title='Thermal Storage')
    #     Result_CHP_End.plot(title='CHP')
    #
    #
    #==============================================================================

    # -----------------------------------------------------------------
    # ------ KPIs -----------------------------------------------------
    # -----------------------------------------------------------------
    print('KPI_END are calculated with Forecast values !!!')
    # without ad-hoc, Fahrplan only
    kpi.Calc_KPI(Result_BAT_End, Result_PV_End, Result_Grid_End,\
    Result_TES_End, Result_Heat_End,\
    LoadPeriodFore, PVavaPeriodFore, Costs, PrHoBin, maxx,Delta_t,\
    Battery, Auxilary, EHeater,'Fore')
    #Battery, Auxilary,'Fore')
    # -----------------------------------------------------------------
    # ------- Save to File --------------------------------------
    # -----------------------------------------------------------------
    Result_Grid_End.to_csv('Results\Kosten_Result_Grid_End.csv')
    Result_PV_End.to_csv('Results\Kosten_Result_PV_End.csv')
    Result_BAT_End.to_csv('Results\Kosten_Results_BAT_End.csv')
    Result_TES_End.to_csv('Results\Kosten_Results_TES_End.csv')
    Result_Heat_End.to_csv('Results\Kosten_Results_Heat_End.csv')

    print("The End!")
    return 0
Esempio n. 3
0
def MPC():
    plt.close("all")

    #-----------------------------------------------
    # ---------------  INPUT DATA  -----------------
    #-----------------------------------------------
    Delta_t = 10  # 10 min bins
    start_date = '8/2/2013'
    end_date = '8/3/2013'
    date_year = '1/1/2013'
    PrHoBin = 72  #72;     # Prediction Horizon
    #inputFile = "LPG"  # Load Profile IWES
    inputFile = "VDE"  # Load Profile VDE
    #-----------------------------------------------

    print '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'
    print '%                                                  %'
    print '%         Optimierung von PV-Battery   Microgrid   %'
    print '%                        28.4.2017                 %'
    print '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'

    # -- Get number of days
    helpdf = pd.date_range(start_date, end_date, freq='D')
    numberOfdays = len(helpdf)
    if numberOfdays <= 0:
        print 'ERROR: Dates are wrong. Please check. Calculating days in August....'
        start_date = '8/11/2013'
        end_date = '8/12/2013'

    if Delta_t == 10:
        TimeStepSize = '10min'
        BIN = 144 * numberOfdays
        year_bins = 52560
        PrHoBinRange = range(0, PrHoBin)  # PredHorizonBin
    else:
        print 'ERROR: Implemented only for 10 min Bins.'

    print 'Calculating the time period: ', start_date, 'to', end_date
    print 'for', numberOfdays, 'days'
    print 'Year: ', date_year
    year_stamps = pd.date_range(date_year,
                                periods=year_bins,
                                freq=TimeStepSize)

    # -------------------------------------------------------------------------
    # Get Input Parameter
    # -------------------------------------------------------------------------
    if inputFile == "VDE":
        PVava_TOT_df, P_PV_max,P_Load_max, LoadAll_TOT_df, Battery, Costs \
        = ipv.inputvalues_VDE_EFH(Delta_t, TimeStepSize,year_stamps)
    elif inputFile == "LPG":
        PVava_TOT_df, P_PV_max,P_Load_max, LoadAll_TOT_df, Battery, Costs \
        = ipv.inputvalues_LPG_EFH(Delta_t, TimeStepSize,year_stamps)
    else:
        print("ERROR ---- inputFile in Main is not correct")

    # -------------------------------------------------------------------------
    # REAL VALUES
    # -------------------------------------------------------------------------
    day_stamps_date = pd.date_range(start_date, periods=BIN, freq=TimeStepSize)
    # ---- Load
    LoadPeriodReal = LoadAll_TOT_df[start_date:end_date]
    # ---- PV
    PVavaPeriodReal = PVava_TOT_df[start_date:end_date]

    # -------------------------------------------------------------------------
    # FORECAST  Values -- Tagespersistenz
    # -------------------------------------------------------------------------
    print 'Forecast-Method: Tagespersistenz.'
    # -- Use for Tagespersistenz
    day_stamps_fore = day_stamps_date - pd.DateOffset(days=1)
    date_fore = day_stamps_fore[0].strftime('%m/%d/%Y')
    date_fore_end = day_stamps_fore[BIN - 1].strftime('%m/%d/%Y')
    #print date_fore, date_fore_end
    # ----  Load
    LPF = LoadAll_TOT_df[date_fore:date_fore_end]
    LoadPeriodFore = LPF.set_index(day_stamps_date)  # Re-index

    # ----- PV
    PVPF = PVava_TOT_df[date_fore:date_fore_end]
    PVavaPeriodFore = PVPF.set_index(day_stamps_date)  # Re-index
    #print day_stamps_fore
    #print day_stamps_date

    # -------------------------------------------------------------------------
    # --- Plot differenz Forecast-Real Values
    #PV_LOAD_R_F = pd.concat([PVavaPeriodReal-PVavaPeriodFore,
    #                         LoadPeriodReal['ELoad']-LoadPeriodFore['ELoad']], axis=1)
    #PV_LOAD_R_F.plot(title="real-forecast")

    # -------------------------------------------------
    #  Prepare Output and Results Dataframes
    # -------------------------------------------------
    SOCbatEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['SOC battery'])
    PbattcharEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['Battery charging'])
    PbattdisEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['Battery dis-charging'])
    #    Result_BAT_End = pd.concat([PVavaPeriodReal, -LoadPeriodReal['ELoad'],
    #                            SOCbatEnd, PbattcharEnd, PbattdisEnd], axis=1)
    Result_BAT_End = pd.concat([
        PVavaPeriodFore, -LoadPeriodFore['ELoad'], SOCbatEnd, PbattcharEnd,
        PbattdisEnd
    ],
                               axis=1)

    GridImpEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['Grid Import'])
    GridExpEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['Grid Export'])
    Result_Grid_End = pd.concat(
        [PVavaPeriodFore, -LoadPeriodFore['ELoad'], GridImpEnd, GridExpEnd],
        axis=1)
    #    Result_Grid_End = pd.concat([PVavaPeriodReal, -LoadPeriodReal['ELoad'],
    #                            GridImpEnd, GridExpEnd], axis=1)

    #PVEnd = pd.DataFrame(np.zeros(BIN), index=day_stamps, columns=['PV'])
    # PVselfconEnd = pd.DataFrame(np.zeros(BIN), index=day_stamps, columns=['PV selfcon'])
    PVselfconbattEnd = pd.DataFrame(np.zeros(BIN),
                                    index=day_stamps_date,
                                    columns=['PV batt selfcon'])
    PVselfconloadEnd = pd.DataFrame(np.zeros(BIN),
                                    index=day_stamps_date,
                                    columns=['PV load selfcon'])
    PVexportEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['PV Grid export'])
    Result_PV_End = pd.concat([PVavaPeriodFore, -LoadPeriodFore['ELoad'],\
#                             PVEnd,

                             PVselfconbattEnd,PVselfconloadEnd, PVexportEnd], axis=1)
    #    Result_PV_End = pd.concat([PVavaPeriodReal, -LoadPeriodReal['ELoad'],\
    #      PVEnd,
    #                             PVselfconEnd, PVexportEnd], axis=1)

    #Corrections for MPC
    LoadKorrEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['Load Diff'])
    PVCorrEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['PV Diff'])
    CorrBatDissEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrBatDiss'])
    CorrBattSOCEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrBatSOC'])
    CorrGridImpEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrGridImp'])
    CorrPVexpEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['CorrPVexp'])
    CorrGridexpEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrGridexp'])
    CorrPVscEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['CorrPVsc'])
    Result_Corr_End = pd.concat([LoadKorrEnd, PVCorrEnd, CorrBatDissEnd,CorrBattSOCEnd,\
                      CorrGridImpEnd, CorrPVexpEnd, CorrGridexpEnd, CorrPVscEnd])
    # -------------------------------------------------------------------------
    # ------------  MPC Loop --------------------------------------------------
    # -------------------------------------------------------------------------
    ELoadF = LoadPeriodFore['ELoad'].values
    Q1LoadF = LoadPeriodFore['QLoad1'].values
    Q2LoadF = LoadPeriodFore['QLoad2'].values
    PVavaFore = PVavaPeriodFore[
        'PV 2013, Kassel, 10min'].values  #PV2013, Kassel, 10min
    #PVavaReal = PVavaPeriodFore['PV 2013, Kassel, 10min'].values #PV2013, Kassel, 10min

    maxx = len(PVavaPeriodFore) - PrHoBin
    if len(PVavaPeriodFore) - PrHoBin < 0:
        print 'Prediction Horizon out of Range!!!'
    else:
        #  maxx = 144  # uncomment for 1 day only
        for timestep in range(0, maxx):
            print timestep, maxx, BIN  #, [Result_Corr_End.index[timestep]]
            # -----------------------------------------------------------------
            # ------------------ Initialize for the next step ---------------------
            # -----------------------------------------------------------------
            Load = {i: ELoadF[i + timestep]
                    for i in PrHoBinRange}
            P_sh_th = {i: Q1LoadF[i + timestep]
                       for i in PrHoBinRange}
            P_dhw_th = {i: Q2LoadF[i + timestep]
                        for i in PrHoBinRange}
            P_PV_ava = {i: PVavaFore[i + timestep]
                        for i in PrHoBinRange}

            # -----------------------------------------------------------------
            # -------------------  Optimze ----------------------------------------
            # -----------------------------------------------------------------
            horizon_stamps = day_stamps_date[timestep:PrHoBin + timestep]
            Opt_Result=opt.OptFlex_optimierer(
                       horizon_stamps, PrHoBin, P_PV_ava, P_PV_max, P_Load_max,\
                       Load, P_sh_th, P_dhw_th,Battery, Costs)

            # -----------------------------------------------------------------
            # -----  Prepare Variable Results   -------------------------------
            # -----------------------------------------------------------------

            #==============================================================================
            #           # --- Einzelplots ----Test Prediction Horizon --------------------
            #             Result_df = pd.concat([PVavaPeriodFore, -LoadPeriodFore['ELoad'],
            #                                    -Opt_Result['P_Grid_import'],
            #                                    Opt_Result['P_Grid_export'],
            #                                    Opt_Result['SOC_batt']/50,
            #                                    -Opt_Result['P_batt_dis'],
            #                                   # Opt_Result['P_batt_char'],\
            #                                   # -Opt_Result['P_PV_exp'],
            #                                    -Opt_Result['P_PV2load']], axis=1)
            #            if timestep==1 or timestep==maxx*0.5 or timestep==maxx-1:
            #                 Result_df.plot()
            #                 #print Opt_Result['P_PV']
            #
            #==============================================================================
            # -----------------------------------------------------------------
            # check and correct forecast schedule
            # -----------------------------------------------------------------
            #CorrTerms = cor.Correct_MPC(Opt_Result, PVavaPeriodReal, PVavaPeriodFore,
            #                            LoadPeriodReal, LoadPeriodFore, Battery)
            CorrTerms = cor.Correct_MPC_dummy(Opt_Result, PVavaPeriodReal,
                                              PVavaPeriodFore, LoadPeriodReal,
                                              LoadPeriodFore, Battery)
            # Correction after MPC
            Result_Corr_End['Load Diff'][
                Result_Corr_End.index[timestep]] = CorrTerms['LoadDiff']
            Result_Corr_End['PV Diff'][
                Result_Corr_End.index[timestep]] = CorrTerms['PVDiff']
            #Result_Corr_End['Battery diss'][Result_PV_End.index[timestep]] = CorrTerms['BatDiss']
            Result_Corr_End['CorrBatDiss'][Result_Corr_End.index[timestep]] \
                     = CorrTerms['CorrBatDiss']
            Result_Corr_End['CorrBatSOC'][Result_Corr_End.index[timestep]] \
                     = CorrTerms['CorrBatSOC']
            Result_Corr_End['CorrGridImp'][Result_Corr_End.index[timestep]] \
                     = CorrTerms['CorrGridImp']
            Result_Corr_End['CorrGridexp'][Result_Corr_End.index[timestep]] \
                     = CorrTerms['CorrGridexp']
            Result_Corr_End['CorrPVexp'][Result_Corr_End.index[timestep]] \
                     = CorrTerms['CorrPVexp']
            Result_Corr_End['CorrPVsc'][Result_Corr_End.index[timestep]] \
                     = CorrTerms['CorrPVsc']

            # -----------------------------------------------------------------
            # ------------------ Initialize for the next step -----------------
            # -----------------------------------------------------------------
            Battery['SOC_batt_ini'] = Opt_Result['SOC_batt'][Opt_Result.index[0]]\
                          +CorrTerms['CorrBatSOC']

            # --- Gesamtergebnis -------- Variablen --------------------------
            # Battery
            Result_BAT_End['SOC battery'][Result_BAT_End.index[timestep]] \
                      = (Opt_Result['SOC_batt'][Opt_Result.index[0]]\
                          +CorrTerms['CorrBatSOC'])
            Result_BAT_End['Battery charging'][Result_BAT_End.index[timestep]] \
                     = Opt_Result['P_batt_char'][Opt_Result.index[0]]\
                         +CorrTerms['CorrBatChar']
            Result_BAT_End['Battery dis-charging'][Result_BAT_End.index[timestep]] \
                     = (Opt_Result['P_batt_dis'][Opt_Result.index[0]]\
                         +CorrTerms['CorrBatDiss'])

            # PV
            Result_PV_End['PV batt selfcon'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV2batt'][Opt_Result.index[0]]
            Result_PV_End['PV load selfcon'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV2load'][Opt_Result.index[0]]
            Result_PV_End['PV Grid export'][Result_PV_End.index[timestep]] \
                    = Opt_Result['P_PV_exp'][Opt_Result.index[0]]\
                          +CorrTerms['CorrPVexp']

            # Grid
            Result_Grid_End['Grid Import'][Result_Grid_End.index[timestep]] \
                    = (Opt_Result['P_Grid_import'][Opt_Result.index[0]]\
                          +CorrTerms['CorrGridImp'])
            Result_Grid_End['Grid Export'][Result_Grid_End.index[timestep]] \
                    = Opt_Result['P_Grid_export'][Opt_Result.index[0]]\
                          +CorrTerms['CorrGridexp']
            #----------------------------

    # -----------------------------------------------------------------
    # ----- File Output  -------------------------------------
    # -----------------------------------------------------------------
    #Result_df = pd.concat([PVavaPeriodFore, -LoadPeriodFore['ELoad'],\
    #Result_Grid_End, Result_BAT_End, Result_PV_End])
    #d = pd.HDFStore('Result_PV_Battery_OptFlex.h5')
    #d.close()
    # -----------------------------------------------------------------
    # ----- Figures and Plotting  -------------------------------------
    # -----------------------------------------------------------------


#==============================================================================
#     Result_Grid_End.plot(title='Grid')
#     Result_BAT_End.plot(title='Battery')
#     Result_PV_End.plot(title='PV')
#     Result_Corr_End.plot(title='Correction')
#==============================================================================
# ---------- Plotting nach Jan --------------------------------------
    pl.Plotting(Result_Grid_End, Result_BAT_End, Result_PV_End,\
    PVavaPeriodReal,PVavaPeriodFore, P_PV_max, P_Load_max, LoadPeriodReal, \
    LoadPeriodFore, Battery, Costs, start_date, end_date, maxx)

    # -----------------------------------------------------------------
    # ------ KPIs -----------------------------------------------------
    # -----------------------------------------------------------------
    kpi.Calc_KPI(Result_BAT_End, Result_PV_End, Result_Grid_End,\
    LoadPeriodReal, PVavaPeriodFore, Costs, PrHoBin, maxx, Battery, Delta_t)

    Result_Grid_End.to_csv('Results\Kosten_Result_Grid_End.csv')
    Result_PV_End.to_csv('Results\Kosten_Result_PV_End.csv')
    Result_BAT_End.to_csv('Results\Kosten_Results_BAT_End.csv')

    print "The End!"
    return 0
Esempio n. 4
0
def MPC():
    plt.close("all")

    #-----------------------------------------------
    # ---------------  INPUT DATA  -----------------
    #-----------------------------------------------
    Delta_t = 10  # 10 min bins
    start_date = '8/3/2013'
    end_date = '8/5/2013'
    date_year = '1/1/2013'
    PrHoBin = 144  #72;      144 = 24 Stunden
    #-----------------------------------------------

    print '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'
    print '%                                                  %'
    print '%         Optimierung von PV-Battery nach KOSTEN   %'
    print '%                          plus adhoc              %'
    print '%                                                  %'
    print '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'

    # -- Get number of days
    helpdf = pd.date_range(start_date, end_date, freq='D')
    numberOfdays = len(helpdf)
    if numberOfdays <= 0:
        print 'ERROR: Dates are wrong. Please check. Calculating days in August....'
        start_date = '8/11/2013'
        end_date = '8/12/2013'

    if Delta_t == 10:
        TimeStepSize = '10min'
        BIN = 144 * numberOfdays
        year_bins = 52560
        PrHoBinRange = range(0, PrHoBin)  # PredHorizonBin
    else:
        print 'ERROR: Implemented only for 10 min Bins.'

    print 'Calculating the time period: ', start_date, 'to', end_date
    print 'for', numberOfdays, 'days'
    print 'Year: ', date_year
    year_stamps = pd.date_range(date_year,
                                periods=year_bins,
                                freq=TimeStepSize)

    # -------------------------------------------------------------------------
    # Get Input Parameter
    # -------------------------------------------------------------------------
    PVava_TOT_df, P_PV_max,P_Load_max, LoadAll_TOT_df, Battery, Costs \
    = ipv.inputvaluesEFH(Delta_t, TimeStepSize,year_stamps)

    # -------------------------------------------------------------------------
    # REAL VALUES
    # -------------------------------------------------------------------------
    day_stamps_date = pd.date_range(start_date, periods=BIN, freq=TimeStepSize)
    # ---- Load
    LoadPeriodReal = LoadAll_TOT_df[start_date:end_date]
    # ---- PV
    PVavaPeriodReal = PVava_TOT_df[start_date:end_date]

    # -------------------------------------------------------------------------
    # FORECAST  Values -- Tagespersistenz
    # -------------------------------------------------------------------------
    print 'Forecast-Method: Tagespersistenz.'
    # -- Use for Tagespersistenz
    day_stamps_fore = day_stamps_date - pd.DateOffset(days=1)
    date_fore = day_stamps_fore[0].strftime('%m/%d/%Y')
    date_fore_end = day_stamps_fore[BIN - 1].strftime('%m/%d/%Y')
    #print date_fore, date_fore_end
    # ----  Load
    LPF = LoadAll_TOT_df[date_fore:date_fore_end]
    LoadPeriodFore = LPF.set_index(day_stamps_date)  # Re-index

    # ----- PV
    PVPF = PVava_TOT_df[date_fore:date_fore_end]
    PVavaPeriodFore = PVPF.set_index(day_stamps_date)  # Re-index
    #print day_stamps_fore
    #print day_stamps_date

    # -------------------------------------------------------------------------
    # --- Plot differenz Forecast-Real Values
    PV_LOAD_R_F = pd.concat([
        PVavaPeriodReal - PVavaPeriodFore,
        LoadPeriodReal['ELoad'] - LoadPeriodFore['ELoad']
    ],
                            axis=1)
    # PV_LOAD_R_F.plot(title="real-forecast")

    # -------------------------------------------------
    #  Prepare Output and Results Dataframes
    # -------------------------------------------------
    SOCbatEnd = pd.DataFrame(np.zeros(BIN),
                             index=day_stamps_date,
                             columns=['SOC battery'])
    PbattcharEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['Battery charging'])
    PbattdisEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['Battery dis-charging'])

    GridImpEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['Grid Import'])
    GridExpEnd = pd.DataFrame(np.zeros(BIN),
                              index=day_stamps_date,
                              columns=['Grid Export'])

    #PVEnd = pd.DataFrame(np.zeros(BIN), index=day_stamps, columns=['PV'])
    # PVselfconEnd = pd.DataFrame(np.zeros(BIN), index=day_stamps, columns=['PV selfcon'])
    PVselfconbattEnd = pd.DataFrame(np.zeros(BIN),
                                    index=day_stamps_date,
                                    columns=['PV batt selfcon'])
    PVselfconloadEnd = pd.DataFrame(np.zeros(BIN),
                                    index=day_stamps_date,
                                    columns=['PV load selfcon'])
    PVexportEnd = pd.DataFrame(np.zeros(BIN),
                               index=day_stamps_date,
                               columns=['PV Grid export'])

    #Corrections for MPC
    #LoadKorrEnd = pd.DataFrame(np.zeros(BIN), index=day_stamps_date, columns=['Load Diff'])
    #PVCorrEnd = pd.DataFrame(np.zeros(BIN), index=day_stamps_date, columns=['PV Diff'])
    CorrBatDissEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrBattDis'])
    CorrBatChEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['CorrBattCh'])
    CorrBattSOCEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrBatSOC'])
    CorrGridImpEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrGridImp'])
    CorrPVexpEnd = pd.DataFrame(np.zeros(BIN),
                                index=day_stamps_date,
                                columns=['CorrPVexp'])
    CorrGridexpEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrGridExp'])
    CorrPV2BattEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrPV2Batt'])
    CorrPV2LoadEnd = pd.DataFrame(np.zeros(BIN),
                                  index=day_stamps_date,
                                  columns=['CorrPV2Load'])

    # PV-Load-Forecast Values
    Result_GridFore_End = pd.concat(
        [PVavaPeriodFore, -LoadPeriodFore['ELoad'], GridImpEnd, GridExpEnd],
        axis=1)
    Result_BATFore_End = pd.concat([
        PVavaPeriodFore, -LoadPeriodFore['ELoad'], SOCbatEnd, PbattcharEnd,
        PbattdisEnd
    ],
                                   axis=1)
    Result_PVFore_End = pd.concat([PVavaPeriodFore, -LoadPeriodFore['ELoad'],\
# #                             PVEnd,

                              PVselfconbattEnd,PVselfconloadEnd, PVexportEnd], axis=1)
    # PV-Load Real Values
    Result_BAT_End = pd.concat([
        PVavaPeriodReal, -LoadPeriodReal['ELoad'], SOCbatEnd, PbattcharEnd,
        PbattdisEnd
    ],
                               axis=1)
    Result_Grid_End = pd.concat(
        [PVavaPeriodReal, -LoadPeriodReal['ELoad'], GridImpEnd, GridExpEnd],
        axis=1)
    Result_PV_End = pd.concat([PVavaPeriodReal, -LoadPeriodReal['ELoad'],\
                               #      PVEnd,

                             PVselfconbattEnd,PVselfconloadEnd, PVexportEnd], axis=1)
    Result_Corr_End = pd.concat([CorrBatDissEnd,CorrBattSOCEnd,\
                      CorrGridImpEnd, CorrPVexpEnd, CorrGridexpEnd, CorrPV2BattEnd, \
                      CorrPV2LoadEnd, CorrBatChEnd])

    # -------------------------------------------------------------------------
    # ------------  MPC Loop --------------------------------------------------
    # -------------------------------------------------------------------------
    ELoadF = LoadPeriodFore['ELoad'].values
    Q1LoadF = LoadPeriodFore['QLoad1'].values
    Q2LoadF = LoadPeriodFore['QLoad2'].values
    ELoadR = LoadPeriodReal['ELoad'].values
    Q1LoadR = LoadPeriodReal['QLoad1'].values
    Q2LoadR = LoadPeriodReal['QLoad2'].values
    PVavaFore = PVavaPeriodFore[
        'PV 2013, Kassel, 10min'].values  #PV2013, Kassel, 10min
    PVavaReal = PVavaPeriodReal[
        'PV 2013, Kassel, 10min'].values  #PV2013, Kassel, 10min

    #    maxx = len(PVavaPeriodFore)-PrHoBin
    maxx = PrHoBin
    for loop in range(0, numberOfdays - 1):
        if len(PVavaPeriodFore) - PrHoBin < 0:
            print 'Prediction Horizon out of Range!!!'
        else:
            # maxx = 10

            for timestep in range(0, maxx):
                print loop, timestep, maxx, loop * timestep + timestep, [
                    Result_Corr_End.index[timestep]
                ]
                # -----------------------------------------------------------------
                # ------------------ Initialize for the next step ---------------------
                # -----------------------------------------------------------------
                Load = {
                    i: ELoadF[i + timestep + loop * PrHoBin]
                    for i in PrHoBinRange
                }
                P_sh_th = {
                    i: Q1LoadF[i + timestep + loop * PrHoBin]
                    for i in PrHoBinRange
                }
                P_dhw_th = {
                    i: Q2LoadF[i + timestep + loop * PrHoBin]
                    for i in PrHoBinRange
                }
                P_PV_ava = {
                    i: PVavaFore[i + timestep + loop * PrHoBin]
                    for i in PrHoBinRange
                }

                # -----------------------------------------------------------------
                # -------------------  Optimze ----------------------------------------
                # -----------------------------------------------------------------
                horizon_stamps = day_stamps_date[timestep:PrHoBin + timestep]
                if timestep == 0:
                    Opt_Result=opt.OptFlex_optimierer(
                               horizon_stamps, PrHoBin, P_PV_ava, P_PV_max, P_Load_max,\
                               Load, P_sh_th, P_dhw_th,Battery, Costs)
            # else:
            # print "Using same Prediction..."

            # -----------------------------------------------------------------
            # -----  Prepare Variable Results   -------------------------------
            # -----------------------------------------------------------------

            # --- Einzelplots ----Test Prediction Horizon --------------------
            #Result_df = pd.concat([PVavaPeriodFore, -LoadPeriodFore['ELoad'],
            #Result_df = pd.concat([PVavaPeriodReal, -LoadPeriodReal['ELoad'],
                Load_df = pd.DataFrame.from_dict(Load, orient='index')
                PV_df = pd.DataFrame.from_dict(P_PV_ava, orient='index')
                PV_df.index = horizon_stamps
                PV_df.columns = ['PV']
                Load_df.index = horizon_stamps
                Load_df.columns = ['Load']

                Result_df = pd.concat(
                    [
                        PV_df,
                        -Load_df,
                        -Opt_Result['P_Grid_import'],
                        Opt_Result['P_Grid_export'],
                        Opt_Result['SOC_batt'] / 50,
                        -Opt_Result['P_batt_dis'],
                        # Opt_Result['P_batt_char'],\
                        # -Opt_Result['P_PV_exp'],
                        -Opt_Result['P_PV2load']
                    ],
                    axis=1)
                #if timestep==1 or timestep==maxx*0.5 or timestep==maxx-1:
                #    if timestep==1 :
                #       print "timestep for plot: ", timestep
                #      Result_df.plot()
                #print Opt_Result['P_PV']

                # --- Gesamtergebnis -------- Variablen --------------------------
                # Battery
                Result_BAT_End['SOC battery'][Result_BAT_End.index[timestep]+loop*PrHoBin] \
                          = Opt_Result['SOC_batt'][Opt_Result.index[timestep]]
                Result_BAT_End['Battery charging'][Result_BAT_End.index[timestep+loop*PrHoBin]] \
                         = Opt_Result['P_batt_char'][Opt_Result.index[timestep]]
                Result_BAT_End['Battery dis-charging'][Result_BAT_End.index[timestep+loop*PrHoBin]] \
                         = Opt_Result['P_batt_dis'][Opt_Result.index[timestep]]

                # PV
                Result_PV_End['PV batt selfcon'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_PV2batt'][Opt_Result.index[timestep]]
                Result_PV_End['PV load selfcon'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_PV2load'][Opt_Result.index[timestep]]
                Result_PV_End['PV Grid export'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_PV_exp'][Opt_Result.index[timestep]]

                # Grid
                Result_Grid_End['Grid Import'][Result_Grid_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_Grid_import'][Opt_Result.index[timestep]]
                Result_Grid_End['Grid Export'][Result_Grid_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_Grid_export'][Opt_Result.index[timestep]]
                #----------------------------

                # -----------------------------------------------------------------
                # check and correct forecast schedule
                # -----------------------------------------------------------------
                CorrTerms = cor.AdHoc_MPC(Result_BAT_End, Result_PV_End,\
                Result_Grid_End, PVavaPeriodFore['PV 2013, Kassel, 10min'], PVavaReal[timestep],\
                LoadPeriodFore['ELoad'], timestep, Battery, \
                    ELoadR[timestep], Q1LoadR[timestep], Q2LoadR[timestep])
                #CorrTerms = cor.Correct_MPC_dummy(Opt_Result, PVavaPeriodReal, PVavaPeriodFore,
                #                            LoadPeriodReal, LoadPeriodFore, Battery)

                # Correction after MPC

                Result_Corr_End['CorrBattDis'][Result_Corr_End.index[timestep]] \
                         = CorrTerms['CorrBattDis']
                Result_Corr_End['CorrBattCh'][Result_Corr_End.index[timestep]] \
                         = CorrTerms['CorrBattCh']
                Result_Corr_End['CorrBatSOC'][Result_Corr_End.index[timestep]] \
                         = CorrTerms['CorrBatSOC']
                Result_Corr_End['CorrGridImp'][Result_Corr_End.index[timestep]] \
                         = CorrTerms['CorrGridImp']
                Result_Corr_End['CorrGridExp'][Result_Corr_End.index[timestep]] \
                         = CorrTerms['CorrGridExp']
                Result_Corr_End['CorrPVexp'][Result_Corr_End.index[timestep]] \
                         = CorrTerms['CorrPVexp']
                Result_Corr_End['CorrPV2Batt'][Result_Corr_End.index[timestep]] \
                         = CorrTerms['CorrPV2Batt']
                Result_Corr_End['CorrPV2Load'][Result_Corr_End.index[timestep]] \
                         = CorrTerms['CorrPV2Load']

                # -----------------------------------------------------------------
                # ------------------ Initialize for the next step -----------------
                # -----------------------------------------------------------------
                Battery['SOC_batt_ini'] = CorrTerms['CorrBatSOC']

                # --- Gesamtergebnis -------- Variablen --------------------------
                # Battery
                Result_BAT_End['SOC battery'][Result_BAT_End.index[timestep+loop*PrHoBin]] \
                          = CorrTerms['CorrBatSOC']
                Result_BAT_End['Battery charging'][Result_BAT_End.index[timestep+loop*PrHoBin]] \
                         = CorrTerms['CorrBattCh']
                Result_BAT_End['Battery dis-charging'][Result_BAT_End.index[timestep+loop*PrHoBin]] \
                         = CorrTerms['CorrBattDis']

                Result_BATFore_End['SOC battery'][Result_BAT_End.index[timestep+loop*PrHoBin]] \
                          = Opt_Result['SOC_batt'][Opt_Result.index[timestep]]
                Result_BATFore_End['Battery charging'][Result_BAT_End.index[timestep+loop*PrHoBin]] \
                         = Opt_Result['P_batt_char'][Opt_Result.index[timestep]]
                Result_BATFore_End['Battery dis-charging'][Result_BAT_End.index[timestep+loop*PrHoBin]] \
                         = Opt_Result['P_batt_dis'][Opt_Result.index[timestep]]

                # PV
                Result_PV_End['PV batt selfcon'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = CorrTerms['CorrPV2Batt']
                Result_PV_End['PV load selfcon'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = CorrTerms['CorrPV2Load']
                Result_PV_End['PV Grid export'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = CorrTerms['CorrPVexp']

                Result_PVFore_End['PV batt selfcon'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_PV2batt'][Opt_Result.index[timestep]]
                Result_PVFore_End['PV load selfcon'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_PV2load'][Opt_Result.index[timestep]]
                Result_PVFore_End['PV Grid export'][Result_PV_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_PV_exp'][Opt_Result.index[timestep]]

                # Grid
                Result_Grid_End['Grid Import'][Result_Grid_End.index[timestep+loop*PrHoBin]] \
                        = CorrTerms['CorrGridImp']
                Result_Grid_End['Grid Export'][Result_Grid_End.index[timestep+loop*PrHoBin]] \
                        = CorrTerms['CorrGridExp']

                Result_GridFore_End['Grid Import'][Result_Grid_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_Grid_import'][Opt_Result.index[timestep]]
                Result_GridFore_End['Grid Export'][Result_Grid_End.index[timestep+loop*PrHoBin]] \
                        = Opt_Result['P_Grid_export'][Opt_Result.index[timestep]]
                #----------------------------

    # -----------------------------------------------------------------
    # ----- Figures and Plotting  -------------------------------------
    # -----------------------------------------------------------------


#==============================================================================
# s
#==============================================================================
#==============================================================================
#     Result_GridFore_End.plot(title='Grid Forecast')
#     Result_BATFore_End.plot(title='Battery Forecast')
#     Result_PVFore_End.plot(title='PV Forecast')
#
#     Result_Corr_End.plot(title='Correction')
#
#==============================================================================
    Plotc = 3
    # ---------- Plotting nach Jan --------------------------------------
    Plotc_back = pl.Plotting(Result_Grid_End, Result_BAT_End, Result_PV_End,\
    PVavaPeriodReal, P_PV_max, P_Load_max, LoadPeriodReal, \
    Battery, Costs, start_date, end_date, Plotc, 'Real')

    Plotc = Plotc_back
    Plotc_back = pl.Plotting(Result_GridFore_End, Result_BATFore_End, Result_PVFore_End,\
    PVavaPeriodFore, P_PV_max, P_Load_max, LoadPeriodFore, \
    Battery, Costs, start_date, end_date, Plotc, 'Fore')

    # -----------------------------------------------------------------
    # ------ KPIs -----------------------------------------------------
    # -----------------------------------------------------------------

    # without ad-hoc, Fahrplan only
    kpi.Calc_KPI(Result_BATFore_End, Result_PVFore_End, Result_GridFore_End,\
    LoadPeriodFore, PVavaPeriodFore, Costs, PrHoBin, maxx, Battery, Delta_t, 'Fore')

    # # with ad-hoc, with Real PV and Real Load
    kpi.Calc_KPI(Result_BAT_End, Result_PV_End, Result_Grid_End,\
    LoadPeriodReal, PVavaPeriodReal, Costs, PrHoBin, maxx, Battery, Delta_t, 'Real')

    # -----------------------------------------------------------------
    # ----- File Output  -------------------------------------
    # -----------------------------------------------------------------

    Result_Grid_End.to_csv('OUTPUT\Kosten_Result_Grid_End.csv')
    Result_PV_End.to_csv('OUTPUT\Kosten_Result_PV_End.csv')
    Result_BAT_End.to_csv('OUTPUT\Kosten_Results_BAT_End.csv')
    Result_GridFore_End.to_csv('OUTPUT\Kosten_Result_GridFore_End.csv')
    Result_PVFore_End.to_csv('OUTPUT\Kosten_Result_PVFore_End.csv')
    Result_BATFore_End.to_csv('OUTPUT\Kosten_Results_BATFore_End.csv')

    print "The End!"
    return 0