diff --git a/config/config.default.yaml b/config/config.default.yaml index 73a89a5ee..2ee23ef9b 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -499,7 +499,7 @@ sector: EV_lower_degree_factor: 0.98 EV_upper_degree_factor: 0.63 bev_dsm: true - bev_availability: 0.5 + bev_dsm_availability: 0.5 bev_energy: 0.05 bev_charge_efficiency: 0.9 bev_charge_rate: 0.011 diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 71e149fed..ba87e2d7d 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -40,13 +40,13 @@ EV_lower_degree_factor,--,float,Share increase in energy demand in electric vehi EV_upper_degree_factor,--,float,Share increase in energy demand in electric vehicles (EV) for each degree difference between the hot environment and the maximum temperature. bev_dsm,--,"{true, false}",Add the option for battery electric vehicles (BEV) to participate in demand-side management (DSM) ,,, -bev_availability,--,float,The share for battery electric vehicles (BEV) that are able to do demand side management (DSM) +bev_dsm_availability,--,float,The share for battery electric vehicles (BEV) that are able to do demand side management (DSM) bev_energy,--,float,The average size of battery electric vehicles (BEV) in MWh bev_charge_efficiency,--,float,Battery electric vehicles (BEV) charge and discharge efficiency bev_charge_rate,MWh,float,The power consumption for one electric vehicle (EV) in MWh. Value derived from 3-phase charger with 11 kW. bev_avail_max,--,float,The maximum share plugged-in availability for passenger electric vehicles. bev_avail_mean,--,float,The average share plugged-in availability for passenger electric vehicles. -v2g,--,"{true, false}",Allows feed-in to grid from EV battery +v2g,--,"{true, false}","Allows feed-in to grid from EV battery. This is only enabled if BEV demand-side management is enabled, and the share of vehicles participating is V2G is given by `bev_dsm_availability`." land_transport_fuel_cell _share,--,Dictionary with planning horizons as keys.,The share of vehicles that uses fuel cells in a given year land_transport_electric _share,--,Dictionary with planning horizons as keys.,The share of vehicles that uses electric vehicles (EV) in a given year land_transport_ice _share,--,Dictionary with planning horizons as keys.,The share of vehicles that uses internal combustion engines (ICE) in a given year. What is not EV or FCEV is oil-fuelled ICE. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index f9fb8ccf0..c62580266 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -103,6 +103,8 @@ Upcoming Release * Updated osm-prebuilt base network to version 0.5, for changelog, see https://zenodo.org/records/13981528 +* Bugfix: vehicle-to-grid dispatch capacity is now limited by the fraction of vehicles participating in demand-side-management, halving the dispatch capacity under the default demand-side management participation rate of 0.5. + PyPSA-Eur 0.13.0 (13th September 2024) ====================================== diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index f0012bf79..b9d7e842a 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1831,25 +1831,11 @@ def add_EVs( efficiency=options["bev_charge_efficiency"], ) - if options["v2g"]: - n.add( - "Link", - spatial.nodes, - suffix=" V2G", - bus1=spatial.nodes, - bus0=spatial.nodes + " EV battery", - p_nom=p_nom, - carrier="V2G", - p_max_pu=avail_profile.loc[n.snapshots, spatial.nodes], - lifetime=1, - efficiency=options["bev_charge_efficiency"], - ) - if options["bev_dsm"]: e_nom = ( number_cars * options["bev_energy"] - * options["bev_availability"] + * options["bev_dsm_availability"] * electric_share ) @@ -1865,6 +1851,20 @@ def add_EVs( e_min_pu=dsm_profile.loc[n.snapshots, spatial.nodes], ) + if options["v2g"]: + n.add( + "Link", + spatial.nodes, + suffix=" V2G", + bus1=spatial.nodes, + bus0=spatial.nodes + " EV battery", + p_nom=p_nom * options["bev_dsm_availability"], + carrier="V2G", + p_max_pu=avail_profile.loc[n.snapshots, spatial.nodes], + lifetime=1, + efficiency=options["bev_charge_efficiency"], + ) + def add_fuel_cell_cars(n, p_set, fuel_cell_share, temperature): car_efficiency = options["transport_fuel_cell_efficiency"]