diff --git a/README.md b/README.md index fca25428..02b68d10 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # CoBMo - Control-oriented Building Model -The Control-oriented Building Model (CoBMo) is a building modelling framework catering specifically for the formulation of MPC problems for thermal building systems. CoBMo provides a mathematical model which expresses the relationship between the electric load of the thermal building systems and the indoor air climate with consideration for interactions of the building with its environment, its occupants and appliances. To this end, CoBMo currently implements models for 1) the thermal comfort of building occupants as well as 2) the indoor air quality. +[![DOI](https://zenodo.org/badge/173782015.svg)](https://zenodo.org/badge/latestdoi/173782015) + +The Control-oriented Building Model (CoBMo) is a building modelling framework catering specifically for the formulation of MPC problems for thermal building systems by keeping all model equations in the linear, i.e., convex, domain. CoBMo provides a mathematical model which expresses the relationship between the electric load of the thermal building systems and the indoor air climate with consideration for interactions of the building with its environment, its occupants and appliances. To this end, CoBMo currently implements models for 1) the thermal comfort of building occupants as well as 2) the indoor air quality. ## Documentation @@ -9,7 +11,7 @@ The preliminary CoBMo documentation is located at: [cobmo.readthedocs.io](https: ## Installation 1. Check requirements: - - Python 3.6 + - Python 3.7 - [Gurobi Optimizer](http://www.gurobi.com/) 2. Clone or download repository. 3. In your Python environment, run `pip install -e path_to_cobmo_repository`. diff --git a/cobmo/building.py b/cobmo/building.py index 4fb4cf48..c2d50981 100644 --- a/cobmo/building.py +++ b/cobmo/building.py @@ -15,25 +15,16 @@ class Building(object): """ def __init__(self, conn, scenario_name): + """Initialize building model for given `scenario_name`.""" + # Obtain scenario name. self.scenario_name = scenario_name - """Initialize building model for given `scenario_name`.""" + + # Instantiate model variables. + self.disturbance_timeseries = pd.DataFrame() + self.electricity_price_timeseries = pd.DataFrame() # Load building model definition. - # TODO: Wrap into dedicated function and resample based on timesteps. - self.electricity_prices = ( - pd.read_sql( - """ - SELECT * FROM electricity_price_timeseries - WHERE price_type=( - SELECT price_type from building_scenarios - WHERE scenario_name='{}' - ) - """.format(scenario_name), - conn - ) - ) - self.electricity_prices.index = pd.to_datetime(self.electricity_prices['time']) self.building_scenarios = ( pd.read_sql( """ @@ -42,7 +33,7 @@ def __init__(self, conn, scenario_name): JOIN building_linearization_types USING (linearization_type) LEFT JOIN building_storage_types USING (building_storage_type) WHERE scenario_name='{}' - """.format(scenario_name), + """.format(self.scenario_name), conn ) ) @@ -547,6 +538,7 @@ def __init__(self, conn, scenario_name): # Define timeseries. self.load_disturbance_timeseries(conn) + self.load_electricity_price_timeseries(conn) self.define_output_constraint_timeseries(conn) # Convert to time discrete model. @@ -3640,6 +3632,39 @@ def load_disturbance_timeseries(self, conn): axis='columns', ).rename_axis('disturbance_name', axis='columns') + def load_electricity_price_timeseries(self, conn): + if pd.isnull(self.building_scenarios['price_type'][0]): + # If no price_type defined, generate a flat price signal. + self.electricity_price_timeseries = ( + pd.DataFrame( + [[None, 1.0]], + columns=['price_type', 'price'], + index=self.set_timesteps + ) + ) + else: + self.electricity_price_timeseries = ( + pd.read_sql( + """ + SELECT * FROM electricity_price_timeseries + WHERE price_type=( + SELECT price_type from building_scenarios + WHERE scenario_name='{}' + ) + """.format(self.scenario_name), + conn, + index_col='time', + parse_dates=['time'] + ) + ) + + # Reindex / interpolate to match set_timesteps. + self.electricity_price_timeseries.reindex( + self.set_timesteps + ).interpolate( + 'quadratic' + ) + def define_output_constraint_timeseries(self, conn): """ - Generate minimum/maximum constraint timeseries based on `building_zone_constraint_profiles`. diff --git a/cobmo/config.py b/cobmo/config.py index 4e24eee9..df300600 100644 --- a/cobmo/config.py +++ b/cobmo/config.py @@ -14,7 +14,7 @@ # Optimization solver settings. solver_name = 'gurobi' # Must be valid input string for Pyomo's `SolverFactory`. -solver_output = True # If True, activate verbose solver output. +solver_output = False # If True, activate verbose solver output. # Logger settings. logging_level = logging.DEBUG diff --git a/cobmo/controller.py b/cobmo/controller.py index 07c5921e..ddad9e77 100644 --- a/cobmo/controller.py +++ b/cobmo/controller.py @@ -14,7 +14,14 @@ def __init__( self, conn, building, - problem_type='operation' # Choices: 'operation', 'storage_planning', 'storage_planning_baseline' + problem_type='operation', + # Choices: 'operation', 'storage_planning', 'storage_planning_baseline', 'load_reduction', + # 'price_sensitivity' + output_timeseries_reference=None, + load_reduction_start_time=None, + load_reduction_end_time=None, + price_sensitivity_factor=None, + price_sensitivity_timestep=None, ): """Initialize controller object based on given `building` object. @@ -23,6 +30,15 @@ def __init__( time_start = time.clock() self.building = building self.problem_type = problem_type + self.output_timeseries_reference = output_timeseries_reference + self.load_reduction_start_time = load_reduction_start_time + self.load_reduction_end_time = load_reduction_end_time + self.price_sensitivity_factor = price_sensitivity_factor + self.price_sensitivity_timestep = price_sensitivity_timestep + + # Copy `electricity_price_timeseries` to allow local modifications. + self.electricity_price_timeseries = self.building.electricity_price_timeseries.copy() + self.problem = pyo.ConcreteModel() self.solver = pyo.SolverFactory(cobmo.config.solver_name) self.result = None @@ -60,6 +76,11 @@ def __init__( if self.problem_type == 'storage_planning_baseline': # Force storage size to zero for baseline case. self.problem.variable_storage_size = [0.0] + if self.problem_type == 'load_reduction': + self.problem.variable_load_reduction = pyo.Var( + [0], + domain=pyo.NonNegativeReals + ) # Define constraints. self.problem.constraints = pyo.ConstraintList() @@ -183,6 +204,31 @@ def __init__( * 1.0e100 # Large constant as replacement for infinity. ) + # Demand side flexibility auxiliary constraints. + elif self.problem_type == 'load_reduction': + for timestep in self.building.set_timesteps: + if ( + (timestep >= self.load_reduction_start_time) + and (timestep < self.load_reduction_end_time) + ): + # TODO: Introduce total electric demand in building outputs. + self.problem.constraints.add( + sum( + self.problem.variable_output_timeseries[timestep, output] + if (('electric_power' in output) and not ('storage_to_zone' in output)) else 0.0 + for output in self.building.set_outputs + ) + == + ( + (1.0 - (self.problem.variable_load_reduction[0] / 100.0)) + * sum( + self.output_timeseries_reference.loc[timestep, output] + if (('electric_power' in output) and not ('storage_to_zone' in output)) else 0.0 + for output in self.building.set_outputs + ) + ) + ) + # Define components of the objective. self.operation_cost = 0.0 self.investment_cost = 0.0 @@ -196,18 +242,29 @@ def __init__( * self.building.building_scenarios['storage_lifetime'][0] # Storage lifetime in years. * 14.0 # 14 levels at CREATE Tower. # TODO: Check if considered properly in storage size. ) + elif self.problem_type == 'load_reduction': + # Adjust weight of operation cost when running load reduction problem. + # - Workaround for unrealistic demand when not considering operation cost at all. + # - This is a tuning parameter (has impact on load reduction result). + self.operation_cost_factor = 1.0e-6 else: # No scaling needed if not running planning problem. self.operation_cost_factor = 1.0 + # Modify price for price sensitivity evaluation. + if self.problem_type == 'price_sensitivity': + self.electricity_price_timeseries.at[self.price_sensitivity_timestep, 'price'] *= ( + self.price_sensitivity_factor + ) + # Operation cost (OPEX). for timestep in self.building.set_timesteps: for output in self.building.set_outputs: if ('electric_power' in output) and not ('storage_to_zone' in output): self.operation_cost += ( self.problem.variable_output_timeseries[timestep, output] - * timestep_delta.seconds / 3600.0 / 1000.0 # Ws in kWh. - * self.building.electricity_prices.loc[timestep, 'price'] + * timestep_delta.seconds / 3600.0 / 1000.0 # W in kWh. + * self.electricity_price_timeseries.loc[timestep, 'price'] * self.operation_cost_factor ) @@ -233,6 +290,9 @@ def __init__( + self.problem.variable_storage_exists[0] # No unit. * self.building.building_scenarios['storage_planning_fixed_installation_cost'][0] # In SGD. ) + elif self.problem_type == 'load_reduction': + # TODO: Introduce dedicated cost for demand side flexibility indicators. + self.investment_cost -= self.problem.variable_load_reduction[0] # In percent. # Define objective. self.problem.objective = pyo.Objective( diff --git a/cobmo/database_schema.sql b/cobmo/database_schema.sql index a539d0a1..a6cbb38d 100644 --- a/cobmo/database_schema.sql +++ b/cobmo/database_schema.sql @@ -1,202 +1,200 @@ BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS "building_blind_types" ( - "blind_type" TEXT, - "blind_efficiency" TEXT + "blind_type" TEXT, + "blind_efficiency" TEXT ); CREATE TABLE IF NOT EXISTS "building_hvac_ahu_types" ( - "hvac_ahu_type" TEXT, - "ahu_cooling_type" TEXT, - "ahu_heating_type" TEXT, - "ahu_dehumidification_type" TEXT, - "ahu_return_air_heat_recovery_type" TEXT, - "ahu_supply_air_temperature_setpoint" TEXT, - "ahu_supply_air_relative_humidity_setpoint" TEXT, - "ahu_fan_efficiency" TEXT, - "ahu_cooling_efficiency" TEXT, - "ahu_heating_efficiency" TEXT, - "ahu_return_air_heat_recovery_efficiency" TEXT + "hvac_ahu_type" TEXT, + "ahu_cooling_type" TEXT, + "ahu_heating_type" TEXT, + "ahu_dehumidification_type" TEXT, + "ahu_return_air_heat_recovery_type" TEXT, + "ahu_supply_air_temperature_setpoint" TEXT, + "ahu_supply_air_relative_humidity_setpoint" TEXT, + "ahu_fan_efficiency" TEXT, + "ahu_cooling_efficiency" TEXT, + "ahu_heating_efficiency" TEXT, + "ahu_return_air_heat_recovery_efficiency" TEXT ); CREATE TABLE IF NOT EXISTS "building_hvac_generic_types" ( - "hvac_generic_type" TEXT, - "generic_heating_efficiency" TEXT, - "generic_cooling_efficiency" TEXT + "hvac_generic_type" TEXT, + "generic_heating_efficiency" TEXT, + "generic_cooling_efficiency" TEXT ); CREATE TABLE IF NOT EXISTS "building_hvac_tu_types" ( - "hvac_tu_type" TEXT, - "tu_cooling_type" TEXT, - "tu_heating_type" TEXT, - "tu_air_intake_type" TEXT, - "tu_supply_air_temperature_setpoint" TEXT, - "tu_fan_efficiency" TEXT, - "tu_cooling_efficiency" TEXT, - "tu_heating_efficiency" TEXT + "hvac_tu_type" TEXT, + "tu_cooling_type" TEXT, + "tu_heating_type" TEXT, + "tu_air_intake_type" TEXT, + "tu_supply_air_temperature_setpoint" TEXT, + "tu_fan_efficiency" TEXT, + "tu_cooling_efficiency" TEXT, + "tu_heating_efficiency" TEXT ); CREATE TABLE IF NOT EXISTS "building_internal_gain_timeseries" ( - "internal_gain_type" TEXT, - "time" TEXT, - "internal_gain_occupancy" REAL, - "internal_gain_appliances" REAL + "internal_gain_type" TEXT, + "time" TEXT, + "internal_gain_occupancy" REAL, + "internal_gain_appliances" REAL ); CREATE TABLE IF NOT EXISTS "building_internal_gain_types" ( - "internal_gain_type" TEXT, - "internal_gain_occupancy_factor" TEXT, - "internal_gain_appliances_factor" TEXT + "internal_gain_type" TEXT, + "internal_gain_occupancy_factor" TEXT, + "internal_gain_appliances_factor" TEXT ); CREATE TABLE IF NOT EXISTS "building_linearization_types" ( - "linearization_type" TEXT, - "linearization_zone_air_temperature_heat" TEXT, - "linearization_zone_air_temperature_cool" TEXT, - "linearization_surface_temperature" TEXT, - "linearization_exterior_surface_temperature" TEXT, - "linearization_internal_gain_occupancy" TEXT, - "linearization_internal_gain_appliances" TEXT, - "linearization_ambient_air_temperature" TEXT, - "linearization_sky_temperature" TEXT, - "linearization_ambient_air_humidity_ratio" TEXT, - "linearization_zone_air_humidity_ratio" TEXT, - "linearization_irradiation" TEXT, - "linearization_co2_concentration" TEXT, - "linearization_ventilation_rate_per_square_meter" TEXT + "linearization_type" TEXT, + "linearization_zone_air_temperature_heat" TEXT, + "linearization_zone_air_temperature_cool" TEXT, + "linearization_surface_temperature" TEXT, + "linearization_exterior_surface_temperature" TEXT, + "linearization_internal_gain_occupancy" TEXT, + "linearization_internal_gain_appliances" TEXT, + "linearization_ambient_air_temperature" TEXT, + "linearization_sky_temperature" TEXT, + "linearization_ambient_air_humidity_ratio" TEXT, + "linearization_zone_air_humidity_ratio" TEXT, + "linearization_irradiation" TEXT, + "linearization_co2_concentration" TEXT, + "linearization_ventilation_rate_per_square_meter" TEXT ); CREATE TABLE IF NOT EXISTS "building_parameter_sets" ( - "parameter_set" TEXT, - "parameter_name" TEXT, - "parameter_value" REAL, - "parameter_unit" TEXT, - "parameter_comment" TEXT + "parameter_set" TEXT, + "parameter_name" TEXT, + "parameter_value" REAL, + "parameter_unit" TEXT, + "parameter_comment" TEXT ); CREATE TABLE IF NOT EXISTS "building_scenarios" ( - "scenario_name" TEXT, - "building_name" TEXT, - "parameter_set" TEXT, - "linearization_type" TEXT, - "demand_controlled_ventilation_type" TEXT, - "co2_model_type" TEXT, - "humidity_model_type" TEXT, - "heating_cooling_session" TEXT, - "price_type" TEXT, - "time_start" TEXT, - "time_end" TEXT, - "time_step" TEXT + "scenario_name" TEXT, + "building_name" TEXT, + "parameter_set" TEXT, + "linearization_type" TEXT, + "demand_controlled_ventilation_type" TEXT, + "co2_model_type" TEXT, + "humidity_model_type" TEXT, + "heating_cooling_session" TEXT, + "price_type" TEXT, + "time_start" TEXT, + "time_end" TEXT, + "time_step" TEXT ); CREATE TABLE IF NOT EXISTS "building_storage_types" ( - "building_storage_type" TEXT, - "storage_size" REAL, - "storage_round_trip_efficiency" REAL, + "building_storage_type" TEXT, + "storage_size" REAL, + "storage_round_trip_efficiency" REAL, "storage_battery_depth_of_discharge" REAL, - "storage_sensible_temperature_delta" REAL, + "storage_sensible_temperature_delta" REAL, "storage_lifetime" REAL, "storage_planning_energy_installation_cost" REAL, "storage_planning_power_installation_cost" REAL, "storage_planning_fixed_installation_cost" REAL ); CREATE TABLE IF NOT EXISTS "building_surface_types" ( - "surface_type" TEXT, - "heat_capacity" TEXT, - "thermal_resistance_surface" TEXT, - "irradiation_gain_coefficient" TEXT, - "emissivity" TEXT, - "window_type" TEXT, - "window_wall_ratio" TEXT, - "sky_view_factor" TEXT + "surface_type" TEXT, + "heat_capacity" TEXT, + "thermal_resistance_surface" TEXT, + "irradiation_gain_coefficient" TEXT, + "emissivity" TEXT, + "window_type" TEXT, + "window_wall_ratio" TEXT, + "sky_view_factor" TEXT ); CREATE TABLE IF NOT EXISTS "building_surfaces_adiabatic" ( - "building_name" TEXT, - "zone_name" TEXT, - "surface_name" TEXT, - "surface_type" TEXT, - "surface_area" TEXT, - "surface_comment" TEXT + "building_name" TEXT, + "zone_name" TEXT, + "surface_name" TEXT, + "surface_type" TEXT, + "surface_area" TEXT, + "surface_comment" TEXT ); CREATE TABLE IF NOT EXISTS "building_surfaces_exterior" ( - "building_name" TEXT, - "zone_name" TEXT, - "direction_name" TEXT, - "surface_name" TEXT, - "surface_type" TEXT, - "surface_area" TEXT, - "surface_comment" TEXT + "building_name" TEXT, + "zone_name" TEXT, + "direction_name" TEXT, + "surface_name" TEXT, + "surface_type" TEXT, + "surface_area" TEXT, + "surface_comment" TEXT ); CREATE TABLE IF NOT EXISTS "building_surfaces_interior" ( - "building_name" TEXT, - "zone_name" TEXT, - "zone_adjacent_name" TEXT, - "surface_name" TEXT, - "surface_type" TEXT, - "surface_area" TEXT, - "surface_comment" TEXT + "building_name" TEXT, + "zone_name" TEXT, + "zone_adjacent_name" TEXT, + "surface_name" TEXT, + "surface_type" TEXT, + "surface_area" TEXT, + "surface_comment" TEXT ); CREATE TABLE IF NOT EXISTS "building_window_types" ( - "window_type" TEXT, - "thermal_resistance_window" TEXT, - "irradiation_gain_coefficient_window" TEXT, - "emissivity_window" TEXT + "window_type" TEXT, + "thermal_resistance_window" TEXT, + "irradiation_gain_coefficient_window" TEXT, + "emissivity_window" TEXT ); CREATE TABLE IF NOT EXISTS "building_zone_constraint_profiles" ( - "zone_constraint_profile" TEXT, - "from_weekday" INTEGER, - "from_time" TEXT, - "minimum_air_temperature" TEXT, - "maximum_air_temperature" TEXT, - "minimum_fresh_air_flow_per_area" TEXT, - "minimum_fresh_air_flow_per_person" TEXT, - "maximum_co2_concentration" TEXT, - "minimum_fresh_air_flow_per_area_no_dcv" TEXT, - "minimum_relative_humidity" TEXT, - "maximum_relative_humidity" TEXT + "zone_constraint_profile" TEXT, + "from_weekday" INTEGER, + "from_time" TEXT, + "minimum_air_temperature" TEXT, + "maximum_air_temperature" TEXT, + "minimum_fresh_air_flow_per_area" TEXT, + "minimum_fresh_air_flow_per_person" TEXT, + "maximum_co2_concentration" TEXT, + "minimum_fresh_air_flow_per_area_no_dcv" TEXT, + "minimum_relative_humidity" TEXT, + "maximum_relative_humidity" TEXT ); CREATE TABLE IF NOT EXISTS "building_zone_types" ( - "zone_type" TEXT, - "heat_capacity" TEXT, - "base_surface_type" TEXT, - "ceiling_surface_type" TEXT, - "infiltration_rate" TEXT, - "internal_gain_type" TEXT, - "window_type" TEXT, - "blind_type" TEXT, - "hvac_generic_type" TEXT, - "hvac_ahu_type" TEXT, - "hvac_tu_type" TEXT, - "zone_constraint_profile" TEXT + "zone_type" TEXT, + "heat_capacity" TEXT, + "base_surface_type" TEXT, + "ceiling_surface_type" TEXT, + "infiltration_rate" TEXT, + "internal_gain_type" TEXT, + "window_type" TEXT, + "blind_type" TEXT, + "hvac_generic_type" TEXT, + "hvac_ahu_type" TEXT, + "hvac_tu_type" TEXT, + "zone_constraint_profile" TEXT ); CREATE TABLE IF NOT EXISTS "building_zones" ( - "building_name" TEXT, - "zone_name" TEXT, - "zone_type" TEXT, - "zone_height" TEXT, - "zone_area" TEXT, - "zone_comment" TEXT + "building_name" TEXT, + "zone_name" TEXT, + "zone_type" TEXT, + "zone_height" TEXT, + "zone_area" TEXT, + "zone_comment" TEXT ); CREATE TABLE IF NOT EXISTS "buildings" ( - "building_name" TEXT, - "weather_type" TEXT, - "building_storage_type" TEXT + "building_name" TEXT, + "weather_type" TEXT, + "building_storage_type" TEXT ); CREATE TABLE IF NOT EXISTS "electricity_price_timeseries" ( - "scenario_name" TEXT, - "price_type" TEXT, - "time" TEXT, - "price" REAL, - "price_unit" TEXT + "price_type" TEXT, + "time" TEXT, + "price" REAL ); CREATE TABLE IF NOT EXISTS "weather_timeseries" ( - "weather_type" TEXT, - "time" TEXT, - "ambient_air_temperature" REAL, - "sky_temperature" REAL, - "ambient_air_humidity_ratio" REAL, - "irradiation_horizontal" REAL, - "irradiation_east" REAL, - "irradiation_south" REAL, - "irradiation_west" REAL, - "irradiation_north" REAL + "weather_type" TEXT, + "time" TEXT, + "ambient_air_temperature" REAL, + "sky_temperature" REAL, + "ambient_air_humidity_ratio" REAL, + "irradiation_horizontal" REAL, + "irradiation_east" REAL, + "irradiation_south" REAL, + "irradiation_west" REAL, + "irradiation_north" REAL ); CREATE TABLE IF NOT EXISTS "weather_types" ( - "weather_type" TEXT, - "time_zone" TEXT, - "latitude" REAL, - "longitude" REAL, - "temperature_difference_sky_ambient" REAL + "weather_type" TEXT, + "time_zone" TEXT, + "latitude" REAL, + "longitude" REAL, + "temperature_difference_sky_ambient" REAL ); COMMIT; diff --git a/data/building_scenarios.csv b/data/building_scenarios.csv index e643a54a..977e70f7 100644 --- a/data/building_scenarios.csv +++ b/data/building_scenarios.csv @@ -2,4 +2,5 @@ scenario_name,building_name,parameter_set,linearization_type,demand_controlled_v scenario_default,create_level_8_4a,parameters_default,linearization_default,,,,,wholesale_market,2017-01-02T00:00:00,2017-01-03T00:00:00,00:30:00 scenario_full,create_level_8_4a,parameters_default,linearization_default,demand_controlled_ventilation_default,co2_model_default,humidity_model_default,cooling,wholesale_market,2017-01-02T00:00:00,2017-01-03T00:00:00,00:30:00 validation_1zone_no_window_no_mass,validation_1zone_no_window_no_mass,parameters_default,linearization_default,,,,,,2017-01-01T00:00:00,2017-02-01T00:00:00,00:30:00 -validation_1zone_no_window,validation_1zone_no_window,parameters_default,linearization_default,,,,,,2017-01-01T00:00:00,2017-02-01T00:00:00,00:30:00 \ No newline at end of file +validation_1zone_no_window,validation_1zone_no_window,parameters_default,linearization_default,,,,,,2017-01-01T00:00:00,2017-02-01T00:00:00,00:30:00 +paper_pesgm_2020,create_level_8_4a,parameters_default,linearization_default,,,,,,2017-01-02T00:00:00,2017-01-03T00:00:00,00:30:00 \ No newline at end of file diff --git a/data/building_zone_constraint_profiles.csv b/data/building_zone_constraint_profiles.csv index 3b87647a..a756e3a5 100644 --- a/data/building_zone_constraint_profiles.csv +++ b/data/building_zone_constraint_profiles.csv @@ -1,4 +1,4 @@ zone_constraint_profile,from_weekday,from_time,minimum_air_temperature,maximum_air_temperature,minimum_fresh_air_flow_per_area,minimum_fresh_air_flow_per_person,maximum_co2_concentration,minimum_fresh_air_flow_per_area_no_dcv,minimum_relative_humidity,maximum_relative_humidity -zone_constraint_default,0,0:00:00,5,35,0,0,3000,0,0,100 -zone_constraint_default,0,6:30:00,18,23,0.0006,0.0025,1000,0.0014,0,70 +zone_constraint_default,0,00:00:00,5,35,0,0,3000,0,0,100 +zone_constraint_default,0,06:30:00,18,23,0.0006,0.0025,1000,0.0014,0,70 zone_constraint_default,0,18:00:00,5,35,0,0,3000,0,0,100 diff --git a/data/building_zone_types.csv b/data/building_zone_types.csv index 9c52814f..d90772cb 100644 --- a/data/building_zone_types.csv +++ b/data/building_zone_types.csv @@ -1,4 +1,4 @@ zone_type,heat_capacity,base_surface_type,ceiling_surface_type,infiltration_rate,internal_gain_type,window_type,blind_type,hvac_generic_type,hvac_ahu_type,hvac_tu_type,zone_constraint_profile validation_zone_empty,heat_capacity_zone,,,infiltration_rate,internal_gain_default,,,hvac_generic_default,,,zone_constraint_default -open_space_zone,heat_capacity_zone,base_ceiling,base_ceiling,infiltration_rate,internal_gain_default,,,,hvac_ahu_default,hvac_tu_default,zone_constraint_default -group_office_zone,heat_capacity_zone,base_ceiling,base_ceiling,infiltration_rate,internal_gain_default,,,,hvac_ahu_default,hvac_tu_default,zone_constraint_default +create_level_8_open_plan_office,heat_capacity_zone,base_ceiling,base_ceiling,infiltration_rate,internal_gain_default,,,,hvac_ahu_default,,zone_constraint_default +create_level_8_group_office,heat_capacity_zone,base_ceiling,base_ceiling,infiltration_rate,internal_gain_default,,,,hvac_ahu_default,,zone_constraint_default diff --git a/data/building_zones.csv b/data/building_zones.csv index 7ade74ed..d0d56b6e 100644 --- a/data/building_zones.csv +++ b/data/building_zones.csv @@ -1,168 +1,168 @@ building_name,zone_name,zone_type,zone_height,zone_area,zone_comment -create_level_8_1a,zone1,open_space_zone,4.8,754.0,754 -create_level_8_2a,zone1,open_space_zone,4.8,367.0,367 -create_level_8_2a,zone2,open_space_zone,4.8,373.0,373 -create_level_8_3a,zone1,open_space_zone,4.8,303.0,303 -create_level_8_3a,zone2,open_space_zone,4.8,373.0,373 -create_level_8_3a,zone3,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_4a,zone1,open_space_zone,4.8,295.0,295 -create_level_8_4a,zone2,open_space_zone,4.8,282.0,282 -create_level_8_4a,zone3,group_office_zone,3.0,68.2968,3.98*17.16 -create_level_8_4a,zone4,group_office_zone,3.0,95.36,4*23.84 -create_level_8_4b,zone1,open_space_zone,4.8,250.0,250 -create_level_8_4b,zone2,open_space_zone,4.8,358.0,358 -create_level_8_4b,zone3,open_space_zone,4.8,80.0,80 -create_level_8_4b,zone4,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_5a,zone1,open_space_zone,4.8,235.0,235 -create_level_8_5a,zone2,open_space_zone,4.8,282.0,282 -create_level_8_5a,zone3,group_office_zone,3.0,68.2968,3.98*17.16 -create_level_8_5a,zone4,group_office_zone,3.0,95.36,4*23.84 -create_level_8_5a,zone5,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_6a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_6a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_6a,zone3,group_office_zone,3.0,68.2968,3.98*17.16 -create_level_8_6a,zone4,group_office_zone,3.0,95.36,4*23.84 -create_level_8_6a,zone5,open_space_zone,4.8,80.0,80 -create_level_8_6a,zone6,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_6b,zone1,open_space_zone,4.8,295.0,295 -create_level_8_6b,zone2,open_space_zone,4.8,282.0,282 -create_level_8_6b,zone3,group_office_zone,3.0,41.7502,3.98*(7.29+3.2) -create_level_8_6b,zone4,group_office_zone,3.0,25.3924,3.98*(3.2+3.18) -create_level_8_6b,zone5,group_office_zone,3.0,51.8,4*(3.25+3.2+6.5) -create_level_8_6b,zone6,group_office_zone,3.0,41.96,4*(3.2+7.29) -create_level_8_7a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_7a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_7a,zone3,group_office_zone,3.0,68.2968,3.98*17.16 -create_level_8_7a,zone4,group_office_zone,3.0,95.36,4*23.84 -create_level_8_7a,zone5,open_space_zone,4.8,52.0,52 -create_level_8_7a,zone6,open_space_zone,4.8,28.0,28 -create_level_8_7a,zone7,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_7b,zone1,open_space_zone,4.8,235.0,235 -create_level_8_7b,zone2,open_space_zone,4.8,282.0,282 -create_level_8_7b,zone3,group_office_zone,3.0,41.7502,3.98*(7.29+3.2) -create_level_8_7b,zone4,group_office_zone,3.0,25.3924,3.98*(3.2+3.18) -create_level_8_7b,zone5,group_office_zone,3.0,51.8,4*(3.25+3.2+6.5) -create_level_8_7b,zone6,group_office_zone,3.0,41.96,4*(3.2+7.29) -create_level_8_7b,zone7,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_8a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_8a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_8a,zone3,group_office_zone,3.0,68.2968,3.98*17.16 -create_level_8_8a,zone4,group_office_zone,3.0,95.36,4*23.84 -create_level_8_8a,zone5,group_office_zone,3.0,51.8,4*(3.25+3.2+6.5) -create_level_8_8a,zone6,group_office_zone,3.0,41.96,4*(3.2+7.29) -create_level_8_8a,zone7,open_space_zone,4.8,80.0,80 -create_level_8_8a,zone8,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_9a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_9a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_9a,zone3,group_office_zone,3.0,68.2968,3.98*17.16 -create_level_8_9a,zone4,group_office_zone,3.0,95.36,4*23.84 -create_level_8_9a,zone5,group_office_zone,3.0,51.8,4*(3.25+3.2+6.5) -create_level_8_9a,zone6,group_office_zone,3.0,41.96,4*(3.2+7.29) -create_level_8_9a,zone7,open_space_zone,4.8,52.0,52 -create_level_8_9a,zone8,open_space_zone,4.8,28.0,28 -create_level_8_9a,zone9,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_9b,zone1,open_space_zone,4.8,235.0,235 -create_level_8_9b,zone2,open_space_zone,4.8,282.0,282 -create_level_8_9b,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_9b,zone4,group_office_zone,3.0,25.472,3.98*(3.2+3.2) -create_level_8_9b,zone5,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_9b,zone6,group_office_zone,3.0,25.8,4*(3.25+3.2) -create_level_8_9b,zone7,group_office_zone,3.0,38.8,4*(6.5+3.2) -create_level_8_9b,zone8,group_office_zone,3.0,29.16,4*7.29 -create_level_8_9b,zone9,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_10a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_10a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_10a,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_10a,zone4,group_office_zone,3.0,25.472,3.98*(3.2+3.2) -create_level_8_10a,zone5,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_10a,zone6,group_office_zone,3.0,25.8,4*(3.25+3.2) -create_level_8_10a,zone7,group_office_zone,3.0,38.8,4*(6.5+3.2) -create_level_8_10a,zone8,group_office_zone,3.0,29.16,4*7.29 -create_level_8_10a,zone9,open_space_zone,4.8,80.0,80 -create_level_8_10a,zone10,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_11a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_11a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_11a,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_11a,zone4,group_office_zone,3.0,25.472,3.98*(3.2+3.2) -create_level_8_11a,zone5,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_11a,zone6,group_office_zone,3.0,25.8,4*(3.25+3.2) -create_level_8_11a,zone7,group_office_zone,3.0,38.8,4*(6.5+3.2) -create_level_8_11a,zone8,group_office_zone,3.0,29.16,4*7.29 -create_level_8_11a,zone9,open_space_zone,4.8,52.0,52 -create_level_8_11a,zone10,open_space_zone,4.8,28.0,28 -create_level_8_11a,zone11,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_11b,zone1,open_space_zone,4.8,235.0,235 -create_level_8_11b,zone2,open_space_zone,4.8,282.0,282 -create_level_8_11b,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_11b,zone4,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_11b,zone5,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_11b,zone6,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_11b,zone7,group_office_zone,3.0,25.8,4*(3.25+3.2) -create_level_8_11b,zone8,group_office_zone,3.0,26.0,4*6.5 -create_level_8_11b,zone9,group_office_zone,3.0,12.8,4*3.2 -create_level_8_11b,zone10,group_office_zone,3.0,29.16,4*7.29 -create_level_8_11b,zone11,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_11c,zone1,open_space_zone,4.8,295.0,295 -create_level_8_11c,zone2,open_space_zone,4.8,282.0,282 -create_level_8_11c,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_11c,zone4,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_11c,zone5,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_11c,zone6,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_11c,zone7,group_office_zone,3.0,13.0,4*3.25 -create_level_8_11c,zone8,group_office_zone,3.0,12.8,4*3.2 -create_level_8_11c,zone9,group_office_zone,3.0,26.0,4*6.5 -create_level_8_11c,zone10,group_office_zone,3.0,12.8,4*3.2 -create_level_8_11c,zone11,group_office_zone,3.0,29.16,4*7.29 -create_level_8_12a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_12a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_12a,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_12a,zone4,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_12a,zone5,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_12a,zone6,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_12a,zone7,group_office_zone,3.0,25.8,4*(3.25+3.2) -create_level_8_12a,zone8,group_office_zone,3.0,26.0,4*6.5 -create_level_8_12a,zone9,group_office_zone,3.0,12.8,4*3.2 -create_level_8_12a,zone10,group_office_zone,3.0,29.16,4*7.29 -create_level_8_12a,zone11,open_space_zone,4.8,80.0,80 -create_level_8_12a,zone12,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_12b,zone1,open_space_zone,4.8,235.0,235 -create_level_8_12b,zone2,open_space_zone,4.8,282.0,282 -create_level_8_12b,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_12b,zone4,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_12b,zone5,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_12b,zone6,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_12b,zone7,group_office_zone,3.0,13.0,4*3.25 -create_level_8_12b,zone8,group_office_zone,3.0,12.8,4*3.2 -create_level_8_12b,zone9,group_office_zone,3.0,26.0,4*6.5 -create_level_8_12b,zone10,group_office_zone,3.0,12.8,4*3.2 -create_level_8_12b,zone11,group_office_zone,3.0,29.16,4*7.29 -create_level_8_12b,zone12,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_13a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_13a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_13a,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_13a,zone4,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_13a,zone5,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_13a,zone6,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_13a,zone7,group_office_zone,3.0,13.0,4*3.25 -create_level_8_13a,zone8,group_office_zone,3.0,12.8,4*3.2 -create_level_8_13a,zone9,group_office_zone,3.0,26.0,4*6.5 -create_level_8_13a,zone10,group_office_zone,3.0,12.8,4*3.2 -create_level_8_13a,zone11,group_office_zone,3.0,29.16,4*7.29 -create_level_8_13a,zone12,open_space_zone,4.8,80.0,80 -create_level_8_13a,zone13,open_space_zone,4.8,64.2712,9.98*6.44 -create_level_8_14a,zone1,open_space_zone,4.8,178.464,17.16*10.4 -create_level_8_14a,zone2,open_space_zone,4.8,248.8896,10.44*23.84 -create_level_8_14a,zone3,group_office_zone,3.0,29.0142,3.98*7.29 -create_level_8_14a,zone4,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_14a,zone5,group_office_zone,3.0,12.736,3.98*3.2 -create_level_8_14a,zone6,group_office_zone,3.0,12.6564,3.98*3.18 -create_level_8_14a,zone7,group_office_zone,3.0,13.0,4*3.25 -create_level_8_14a,zone8,group_office_zone,3.0,12.8,4*3.2 -create_level_8_14a,zone9,group_office_zone,3.0,26.0,4*6.5 -create_level_8_14a,zone10,group_office_zone,3.0,12.8,4*3.2 -create_level_8_14a,zone11,group_office_zone,3.0,29.16,4*7.29 -create_level_8_14a,zone12,open_space_zone,4.8,52.0,52 -create_level_8_14a,zone13,open_space_zone,4.8,28.0,28 -create_level_8_14a,zone14,open_space_zone,4.8,64.2712,9.98*6.44 +create_level_8_1a,zone1,create_level_8_open_plan_office,4.8,754.0,754 +create_level_8_2a,zone1,create_level_8_open_plan_office,4.8,367.0,367 +create_level_8_2a,zone2,create_level_8_open_plan_office,4.8,373.0,373 +create_level_8_3a,zone1,create_level_8_open_plan_office,4.8,303.0,303 +create_level_8_3a,zone2,create_level_8_open_plan_office,4.8,373.0,373 +create_level_8_3a,zone3,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_4a,zone1,create_level_8_open_plan_office,4.8,295.0,295 +create_level_8_4a,zone2,create_level_8_open_plan_office,4.8,282.0,282 +create_level_8_4a,zone3,create_level_8_group_office,3.0,68.2968,3.98*17.16 +create_level_8_4a,zone4,create_level_8_group_office,3.0,95.36,4*23.84 +create_level_8_4b,zone1,create_level_8_open_plan_office,4.8,250.0,250 +create_level_8_4b,zone2,create_level_8_open_plan_office,4.8,358.0,358 +create_level_8_4b,zone3,create_level_8_open_plan_office,4.8,80.0,80 +create_level_8_4b,zone4,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_5a,zone1,create_level_8_open_plan_office,4.8,235.0,235 +create_level_8_5a,zone2,create_level_8_open_plan_office,4.8,282.0,282 +create_level_8_5a,zone3,create_level_8_group_office,3.0,68.2968,3.98*17.16 +create_level_8_5a,zone4,create_level_8_group_office,3.0,95.36,4*23.84 +create_level_8_5a,zone5,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_6a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_6a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_6a,zone3,create_level_8_group_office,3.0,68.2968,3.98*17.16 +create_level_8_6a,zone4,create_level_8_group_office,3.0,95.36,4*23.84 +create_level_8_6a,zone5,create_level_8_open_plan_office,4.8,80.0,80 +create_level_8_6a,zone6,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_6b,zone1,create_level_8_open_plan_office,4.8,295.0,295 +create_level_8_6b,zone2,create_level_8_open_plan_office,4.8,282.0,282 +create_level_8_6b,zone3,create_level_8_group_office,3.0,41.7502,3.98*(7.29+3.2) +create_level_8_6b,zone4,create_level_8_group_office,3.0,25.3924,3.98*(3.2+3.18) +create_level_8_6b,zone5,create_level_8_group_office,3.0,51.8,4*(3.25+3.2+6.5) +create_level_8_6b,zone6,create_level_8_group_office,3.0,41.96,4*(3.2+7.29) +create_level_8_7a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_7a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_7a,zone3,create_level_8_group_office,3.0,68.2968,3.98*17.16 +create_level_8_7a,zone4,create_level_8_group_office,3.0,95.36,4*23.84 +create_level_8_7a,zone5,create_level_8_open_plan_office,4.8,52.0,52 +create_level_8_7a,zone6,create_level_8_open_plan_office,4.8,28.0,28 +create_level_8_7a,zone7,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_7b,zone1,create_level_8_open_plan_office,4.8,235.0,235 +create_level_8_7b,zone2,create_level_8_open_plan_office,4.8,282.0,282 +create_level_8_7b,zone3,create_level_8_group_office,3.0,41.7502,3.98*(7.29+3.2) +create_level_8_7b,zone4,create_level_8_group_office,3.0,25.3924,3.98*(3.2+3.18) +create_level_8_7b,zone5,create_level_8_group_office,3.0,51.8,4*(3.25+3.2+6.5) +create_level_8_7b,zone6,create_level_8_group_office,3.0,41.96,4*(3.2+7.29) +create_level_8_7b,zone7,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_8a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_8a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_8a,zone3,create_level_8_group_office,3.0,68.2968,3.98*17.16 +create_level_8_8a,zone4,create_level_8_group_office,3.0,95.36,4*23.84 +create_level_8_8a,zone5,create_level_8_group_office,3.0,51.8,4*(3.25+3.2+6.5) +create_level_8_8a,zone6,create_level_8_group_office,3.0,41.96,4*(3.2+7.29) +create_level_8_8a,zone7,create_level_8_open_plan_office,4.8,80.0,80 +create_level_8_8a,zone8,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_9a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_9a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_9a,zone3,create_level_8_group_office,3.0,68.2968,3.98*17.16 +create_level_8_9a,zone4,create_level_8_group_office,3.0,95.36,4*23.84 +create_level_8_9a,zone5,create_level_8_group_office,3.0,51.8,4*(3.25+3.2+6.5) +create_level_8_9a,zone6,create_level_8_group_office,3.0,41.96,4*(3.2+7.29) +create_level_8_9a,zone7,create_level_8_open_plan_office,4.8,52.0,52 +create_level_8_9a,zone8,create_level_8_open_plan_office,4.8,28.0,28 +create_level_8_9a,zone9,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_9b,zone1,create_level_8_open_plan_office,4.8,235.0,235 +create_level_8_9b,zone2,create_level_8_open_plan_office,4.8,282.0,282 +create_level_8_9b,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_9b,zone4,create_level_8_group_office,3.0,25.472,3.98*(3.2+3.2) +create_level_8_9b,zone5,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_9b,zone6,create_level_8_group_office,3.0,25.8,4*(3.25+3.2) +create_level_8_9b,zone7,create_level_8_group_office,3.0,38.8,4*(6.5+3.2) +create_level_8_9b,zone8,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_9b,zone9,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_10a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_10a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_10a,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_10a,zone4,create_level_8_group_office,3.0,25.472,3.98*(3.2+3.2) +create_level_8_10a,zone5,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_10a,zone6,create_level_8_group_office,3.0,25.8,4*(3.25+3.2) +create_level_8_10a,zone7,create_level_8_group_office,3.0,38.8,4*(6.5+3.2) +create_level_8_10a,zone8,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_10a,zone9,create_level_8_open_plan_office,4.8,80.0,80 +create_level_8_10a,zone10,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_11a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_11a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_11a,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_11a,zone4,create_level_8_group_office,3.0,25.472,3.98*(3.2+3.2) +create_level_8_11a,zone5,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_11a,zone6,create_level_8_group_office,3.0,25.8,4*(3.25+3.2) +create_level_8_11a,zone7,create_level_8_group_office,3.0,38.8,4*(6.5+3.2) +create_level_8_11a,zone8,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_11a,zone9,create_level_8_open_plan_office,4.8,52.0,52 +create_level_8_11a,zone10,create_level_8_open_plan_office,4.8,28.0,28 +create_level_8_11a,zone11,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_11b,zone1,create_level_8_open_plan_office,4.8,235.0,235 +create_level_8_11b,zone2,create_level_8_open_plan_office,4.8,282.0,282 +create_level_8_11b,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_11b,zone4,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_11b,zone5,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_11b,zone6,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_11b,zone7,create_level_8_group_office,3.0,25.8,4*(3.25+3.2) +create_level_8_11b,zone8,create_level_8_group_office,3.0,26.0,4*6.5 +create_level_8_11b,zone9,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_11b,zone10,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_11b,zone11,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_11c,zone1,create_level_8_open_plan_office,4.8,295.0,295 +create_level_8_11c,zone2,create_level_8_open_plan_office,4.8,282.0,282 +create_level_8_11c,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_11c,zone4,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_11c,zone5,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_11c,zone6,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_11c,zone7,create_level_8_group_office,3.0,13.0,4*3.25 +create_level_8_11c,zone8,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_11c,zone9,create_level_8_group_office,3.0,26.0,4*6.5 +create_level_8_11c,zone10,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_11c,zone11,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_12a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_12a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_12a,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_12a,zone4,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_12a,zone5,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_12a,zone6,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_12a,zone7,create_level_8_group_office,3.0,25.8,4*(3.25+3.2) +create_level_8_12a,zone8,create_level_8_group_office,3.0,26.0,4*6.5 +create_level_8_12a,zone9,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_12a,zone10,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_12a,zone11,create_level_8_open_plan_office,4.8,80.0,80 +create_level_8_12a,zone12,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_12b,zone1,create_level_8_open_plan_office,4.8,235.0,235 +create_level_8_12b,zone2,create_level_8_open_plan_office,4.8,282.0,282 +create_level_8_12b,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_12b,zone4,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_12b,zone5,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_12b,zone6,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_12b,zone7,create_level_8_group_office,3.0,13.0,4*3.25 +create_level_8_12b,zone8,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_12b,zone9,create_level_8_group_office,3.0,26.0,4*6.5 +create_level_8_12b,zone10,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_12b,zone11,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_12b,zone12,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_13a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_13a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_13a,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_13a,zone4,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_13a,zone5,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_13a,zone6,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_13a,zone7,create_level_8_group_office,3.0,13.0,4*3.25 +create_level_8_13a,zone8,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_13a,zone9,create_level_8_group_office,3.0,26.0,4*6.5 +create_level_8_13a,zone10,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_13a,zone11,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_13a,zone12,create_level_8_open_plan_office,4.8,80.0,80 +create_level_8_13a,zone13,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 +create_level_8_14a,zone1,create_level_8_open_plan_office,4.8,178.464,17.16*10.4 +create_level_8_14a,zone2,create_level_8_open_plan_office,4.8,248.8896,10.44*23.84 +create_level_8_14a,zone3,create_level_8_group_office,3.0,29.0142,3.98*7.29 +create_level_8_14a,zone4,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_14a,zone5,create_level_8_group_office,3.0,12.736,3.98*3.2 +create_level_8_14a,zone6,create_level_8_group_office,3.0,12.6564,3.98*3.18 +create_level_8_14a,zone7,create_level_8_group_office,3.0,13.0,4*3.25 +create_level_8_14a,zone8,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_14a,zone9,create_level_8_group_office,3.0,26.0,4*6.5 +create_level_8_14a,zone10,create_level_8_group_office,3.0,12.8,4*3.2 +create_level_8_14a,zone11,create_level_8_group_office,3.0,29.16,4*7.29 +create_level_8_14a,zone12,create_level_8_open_plan_office,4.8,52.0,52 +create_level_8_14a,zone13,create_level_8_open_plan_office,4.8,28.0,28 +create_level_8_14a,zone14,create_level_8_open_plan_office,4.8,64.2712,9.98*6.44 validation_1zone_no_window_no_mass,zone_1,validation_zone_empty,4,25,5*5 validation_1zone_no_window,zone_1,validation_zone_empty,4,25,5*5 \ No newline at end of file diff --git a/data/electricity_price_timeseries.csv b/data/electricity_price_timeseries.csv index b60ebd2c..e78483da 100644 --- a/data/electricity_price_timeseries.csv +++ b/data/electricity_price_timeseries.csv @@ -1,295 +1,295 @@ -scenario_name,price_type,time,price,price_unit -scenario_default,wholesale_market,2017-01-02 00:00:00.000,0.08013,$/kWh -scenario_default,wholesale_market,2017-01-02 00:30:00.000,0.07951, -scenario_default,wholesale_market,2017-01-02 01:00:00.000,0.07701, -scenario_default,wholesale_market,2017-01-02 01:30:00.000,0.0748, -scenario_default,wholesale_market,2017-01-02 02:00:00.000,0.07384, -scenario_default,wholesale_market,2017-01-02 02:30:00.000,0.07381, -scenario_default,wholesale_market,2017-01-02 03:00:00.000,0.06947, -scenario_default,wholesale_market,2017-01-02 03:30:00.000,0.06734, -scenario_default,wholesale_market,2017-01-02 04:00:00.000,0.06511, -scenario_default,wholesale_market,2017-01-02 04:30:00.000,0.06513, -scenario_default,wholesale_market,2017-01-02 05:00:00.000,0.07041, -scenario_default,wholesale_market,2017-01-02 05:30:00.000,0.07344, -scenario_default,wholesale_market,2017-01-02 06:00:00.000,0.07231, -scenario_default,wholesale_market,2017-01-02 06:30:00.000,0.07231, -scenario_default,wholesale_market,2017-01-02 07:00:00.000,0.07381, -scenario_default,wholesale_market,2017-01-02 07:30:00.000,0.07496, -scenario_default,wholesale_market,2017-01-02 08:00:00.000,0.07802, -scenario_default,wholesale_market,2017-01-02 08:30:00.000,0.07976, -scenario_default,wholesale_market,2017-01-02 09:00:00.000,0.08319, -scenario_default,wholesale_market,2017-01-02 09:30:00.000,0.08767, -scenario_default,wholesale_market,2017-01-02 10:00:00.000,0.08892, -scenario_default,wholesale_market,2017-01-02 10:30:00.000,0.08768, -scenario_default,wholesale_market,2017-01-02 11:00:00.000,0.08768, -scenario_default,wholesale_market,2017-01-02 11:30:00.000,0.08406, -scenario_default,wholesale_market,2017-01-02 12:00:00.000,0.08263, -scenario_default,wholesale_market,2017-01-02 12:30:00.000,0.08406, -scenario_default,wholesale_market,2017-01-02 13:00:00.000,0.08559, -scenario_default,wholesale_market,2017-01-02 13:30:00.000,0.08559, -scenario_default,wholesale_market,2017-01-02 14:00:00.000,0.08559, -scenario_default,wholesale_market,2017-01-02 14:30:00.000,0.08424, -scenario_default,wholesale_market,2017-01-02 15:00:00.000,0.08418, -scenario_default,wholesale_market,2017-01-02 15:30:00.000,0.08255, -scenario_default,wholesale_market,2017-01-02 16:00:00.000,0.08263, -scenario_default,wholesale_market,2017-01-02 16:30:00.000,0.08248, -scenario_default,wholesale_market,2017-01-02 17:00:00.000,0.08399, -scenario_default,wholesale_market,2017-01-02 17:30:00.000,0.08406, -scenario_default,wholesale_market,2017-01-02 18:00:00.000,0.08768, -scenario_default,wholesale_market,2017-01-02 18:30:00.000,0.08945, -scenario_default,wholesale_market,2017-01-02 19:00:00.000,0.09039, -scenario_default,wholesale_market,2017-01-02 19:30:00.000,0.09041, -scenario_default,wholesale_market,2017-01-02 20:00:00.000,0.09048, -scenario_default,wholesale_market,2017-01-02 20:30:00.000,0.09047, -scenario_default,wholesale_market,2017-01-02 21:00:00.000,0.08971, -scenario_default,wholesale_market,2017-01-02 21:30:00.000,0.08893, -scenario_default,wholesale_market,2017-01-02 22:00:00.000,0.08424, -scenario_default,wholesale_market,2017-01-02 22:30:00.000,0.07962, -scenario_default,wholesale_market,2017-01-02 23:00:00.000,0.08557, -scenario_default,wholesale_market,2017-01-02 23:30:00.000,0.08008, -scenario_default,wholesale_market,2017-01-03 00:00:00.000,0.08008, -scenario_default,retailer_peak_offpeak,2017-01-02 00:00:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 00:30:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 01:00:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 01:30:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 02:00:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 02:30:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 03:00:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 03:30:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 04:00:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 04:30:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 05:00:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 05:30:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 06:00:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 06:30:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 07:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 07:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 08:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 08:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 09:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 09:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 10:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 10:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 11:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 11:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 12:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 12:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 13:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 13:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 14:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 14:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 15:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 15:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 16:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 16:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 17:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 17:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 18:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 18:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 19:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 19:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 20:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 20:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 21:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 21:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 22:00:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 22:30:00.000,0.202, -scenario_default,retailer_peak_offpeak,2017-01-02 23:00:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-02 23:30:00.000,0.1616, -scenario_default,retailer_peak_offpeak,2017-01-03 00:00:00.000,0.1616, -scenario_default,wholesale_squeezed_20,2017-01-02 00:00:00.000,0.08093, -scenario_default,wholesale_squeezed_20,2017-01-02 00:30:00.000,0.0808, -scenario_default,wholesale_squeezed_20,2017-01-02 01:00:00.000,0.0803, -scenario_default,wholesale_squeezed_20,2017-01-02 01:30:00.000,0.07986, -scenario_default,wholesale_squeezed_20,2017-01-02 02:00:00.000,0.07967, -scenario_default,wholesale_squeezed_20,2017-01-02 02:30:00.000,0.07966, -scenario_default,wholesale_squeezed_20,2017-01-02 03:00:00.000,0.07879, -scenario_default,wholesale_squeezed_20,2017-01-02 03:30:00.000,0.07837, -scenario_default,wholesale_squeezed_20,2017-01-02 04:00:00.000,0.07792, -scenario_default,wholesale_squeezed_20,2017-01-02 04:30:00.000,0.07793, -scenario_default,wholesale_squeezed_20,2017-01-02 05:00:00.000,0.07898, -scenario_default,wholesale_squeezed_20,2017-01-02 05:30:00.000,0.07959, -scenario_default,wholesale_squeezed_20,2017-01-02 06:00:00.000,0.07936, -scenario_default,wholesale_squeezed_20,2017-01-02 06:30:00.000,0.07936, -scenario_default,wholesale_squeezed_20,2017-01-02 07:00:00.000,0.07966, -scenario_default,wholesale_squeezed_20,2017-01-02 07:30:00.000,0.07989, -scenario_default,wholesale_squeezed_20,2017-01-02 08:00:00.000,0.0805, -scenario_default,wholesale_squeezed_20,2017-01-02 08:30:00.000,0.08085, -scenario_default,wholesale_squeezed_20,2017-01-02 09:00:00.000,0.08154, -scenario_default,wholesale_squeezed_20,2017-01-02 09:30:00.000,0.08243, -scenario_default,wholesale_squeezed_20,2017-01-02 10:00:00.000,0.08268, -scenario_default,wholesale_squeezed_20,2017-01-02 10:30:00.000,0.08244, -scenario_default,wholesale_squeezed_20,2017-01-02 11:00:00.000,0.08244, -scenario_default,wholesale_squeezed_20,2017-01-02 11:30:00.000,0.08171, -scenario_default,wholesale_squeezed_20,2017-01-02 12:00:00.000,0.08143, -scenario_default,wholesale_squeezed_20,2017-01-02 12:30:00.000,0.08171, -scenario_default,wholesale_squeezed_20,2017-01-02 13:00:00.000,0.08202, -scenario_default,wholesale_squeezed_20,2017-01-02 13:30:00.000,0.08202, -scenario_default,wholesale_squeezed_20,2017-01-02 14:00:00.000,0.08202, -scenario_default,wholesale_squeezed_20,2017-01-02 14:30:00.000,0.08175, -scenario_default,wholesale_squeezed_20,2017-01-02 15:00:00.000,0.08174, -scenario_default,wholesale_squeezed_20,2017-01-02 15:30:00.000,0.08141, -scenario_default,wholesale_squeezed_20,2017-01-02 16:00:00.000,0.08143, -scenario_default,wholesale_squeezed_20,2017-01-02 16:30:00.000,0.0814, -scenario_default,wholesale_squeezed_20,2017-01-02 17:00:00.000,0.0817, -scenario_default,wholesale_squeezed_20,2017-01-02 17:30:00.000,0.08171, -scenario_default,wholesale_squeezed_20,2017-01-02 18:00:00.000,0.08244, -scenario_default,wholesale_squeezed_20,2017-01-02 18:30:00.000,0.08279, -scenario_default,wholesale_squeezed_20,2017-01-02 19:00:00.000,0.08298, -scenario_default,wholesale_squeezed_20,2017-01-02 19:30:00.000,0.08298, -scenario_default,wholesale_squeezed_20,2017-01-02 20:00:00.000,0.083, -scenario_default,wholesale_squeezed_20,2017-01-02 20:30:00.000,0.08299, -scenario_default,wholesale_squeezed_20,2017-01-02 21:00:00.000,0.08284, -scenario_default,wholesale_squeezed_20,2017-01-02 21:30:00.000,0.08269, -scenario_default,wholesale_squeezed_20,2017-01-02 22:00:00.000,0.08175, -scenario_default,wholesale_squeezed_20,2017-01-02 22:30:00.000,0.08082, -scenario_default,wholesale_squeezed_20,2017-01-02 23:00:00.000,0.08201, -scenario_default,wholesale_squeezed_20,2017-01-02 23:30:00.000,0.08092, -scenario_default,wholesale_squeezed_20,2017-01-03 00:00:00.000,0.08092, -scenario_default,wholesale_squeezed_40,2017-01-02 00:00:00.000,0.08073, -scenario_default,wholesale_squeezed_40,2017-01-02 00:30:00.000,0.08048, -scenario_default,wholesale_squeezed_40,2017-01-02 01:00:00.000,0.07948, -scenario_default,wholesale_squeezed_40,2017-01-02 01:30:00.000,0.07859, -scenario_default,wholesale_squeezed_40,2017-01-02 02:00:00.000,0.07821, -scenario_default,wholesale_squeezed_40,2017-01-02 02:30:00.000,0.07820, -scenario_default,wholesale_squeezed_40,2017-01-02 03:00:00.000,0.07646, -scenario_default,wholesale_squeezed_40,2017-01-02 03:30:00.000,0.07561, -scenario_default,wholesale_squeezed_40,2017-01-02 04:00:00.000,0.07472, -scenario_default,wholesale_squeezed_40,2017-01-02 04:30:00.000,0.07473, -scenario_default,wholesale_squeezed_40,2017-01-02 05:00:00.000,0.07684, -scenario_default,wholesale_squeezed_40,2017-01-02 05:30:00.000,0.07805, -scenario_default,wholesale_squeezed_40,2017-01-02 06:00:00.000,0.07760, -scenario_default,wholesale_squeezed_40,2017-01-02 06:30:00.000,0.07760, -scenario_default,wholesale_squeezed_40,2017-01-02 07:00:00.000,0.07820, -scenario_default,wholesale_squeezed_40,2017-01-02 07:30:00.000,0.07866, -scenario_default,wholesale_squeezed_40,2017-01-02 08:00:00.000,0.07988, -scenario_default,wholesale_squeezed_40,2017-01-02 08:30:00.000,0.08058, -scenario_default,wholesale_squeezed_40,2017-01-02 09:00:00.000,0.08195, -scenario_default,wholesale_squeezed_40,2017-01-02 09:30:00.000,0.08374, -scenario_default,wholesale_squeezed_40,2017-01-02 10:00:00.000,0.08424, -scenario_default,wholesale_squeezed_40,2017-01-02 10:30:00.000,0.08375, -scenario_default,wholesale_squeezed_40,2017-01-02 11:00:00.000,0.08375, -scenario_default,wholesale_squeezed_40,2017-01-02 11:30:00.000,0.08230, -scenario_default,wholesale_squeezed_40,2017-01-02 12:00:00.000,0.08173, -scenario_default,wholesale_squeezed_40,2017-01-02 12:30:00.000,0.08230, -scenario_default,wholesale_squeezed_40,2017-01-02 13:00:00.000,0.08291, -scenario_default,wholesale_squeezed_40,2017-01-02 13:30:00.000,0.08291, -scenario_default,wholesale_squeezed_40,2017-01-02 14:00:00.000,0.08291, -scenario_default,wholesale_squeezed_40,2017-01-02 14:30:00.000,0.08237, -scenario_default,wholesale_squeezed_40,2017-01-02 15:00:00.000,0.08235, -scenario_default,wholesale_squeezed_40,2017-01-02 15:30:00.000,0.08169, -scenario_default,wholesale_squeezed_40,2017-01-02 16:00:00.000,0.08173, -scenario_default,wholesale_squeezed_40,2017-01-02 16:30:00.000,0.08167, -scenario_default,wholesale_squeezed_40,2017-01-02 17:00:00.000,0.08227, -scenario_default,wholesale_squeezed_40,2017-01-02 17:30:00.000,0.08230, -scenario_default,wholesale_squeezed_40,2017-01-02 18:00:00.000,0.08375, -scenario_default,wholesale_squeezed_40,2017-01-02 18:30:00.000,0.08445, -scenario_default,wholesale_squeezed_40,2017-01-02 19:00:00.000,0.08483, -scenario_default,wholesale_squeezed_40,2017-01-02 19:30:00.000,0.08484, -scenario_default,wholesale_squeezed_40,2017-01-02 20:00:00.000,0.08487, -scenario_default,wholesale_squeezed_40,2017-01-02 20:30:00.000,0.08486, -scenario_default,wholesale_squeezed_40,2017-01-02 21:00:00.000,0.08456, -scenario_default,wholesale_squeezed_40,2017-01-02 21:30:00.000,0.08425, -scenario_default,wholesale_squeezed_40,2017-01-02 22:00:00.000,0.08237, -scenario_default,wholesale_squeezed_40,2017-01-02 22:30:00.000,0.08052, -scenario_default,wholesale_squeezed_40,2017-01-02 23:00:00.000,0.08290, -scenario_default,wholesale_squeezed_40,2017-01-02 23:30:00.000,0.08071, -scenario_default,wholesale_squeezed_40,2017-01-03 00:00:00.000,0.08071, -scenario_default,wholesale_squeezed_60,2017-01-02 00:00:00.000,0.0805, -scenario_default,wholesale_squeezed_60,2017-01-02 00:30:00.000,0.0802, -scenario_default,wholesale_squeezed_60,2017-01-02 01:00:00.000,0.0787, -scenario_default,wholesale_squeezed_60,2017-01-02 01:30:00.000,0.0773, -scenario_default,wholesale_squeezed_60,2017-01-02 02:00:00.000,0.0768, -scenario_default,wholesale_squeezed_60,2017-01-02 02:30:00.000,0.0767, -scenario_default,wholesale_squeezed_60,2017-01-02 03:00:00.000,0.0741, -scenario_default,wholesale_squeezed_60,2017-01-02 03:30:00.000,0.0729, -scenario_default,wholesale_squeezed_60,2017-01-02 04:00:00.000,0.0715, -scenario_default,wholesale_squeezed_60,2017-01-02 04:30:00.000,0.0715, -scenario_default,wholesale_squeezed_60,2017-01-02 05:00:00.000,0.0747, -scenario_default,wholesale_squeezed_60,2017-01-02 05:30:00.000,0.0765, -scenario_default,wholesale_squeezed_60,2017-01-02 06:00:00.000,0.0758, -scenario_default,wholesale_squeezed_60,2017-01-02 06:30:00.000,0.0758, -scenario_default,wholesale_squeezed_60,2017-01-02 07:00:00.000,0.0767, -scenario_default,wholesale_squeezed_60,2017-01-02 07:30:00.000,0.0774, -scenario_default,wholesale_squeezed_60,2017-01-02 08:00:00.000,0.0793, -scenario_default,wholesale_squeezed_60,2017-01-02 08:30:00.000,0.0803, -scenario_default,wholesale_squeezed_60,2017-01-02 09:00:00.000,0.0824, -scenario_default,wholesale_squeezed_60,2017-01-02 09:30:00.000,0.0851, -scenario_default,wholesale_squeezed_60,2017-01-02 10:00:00.000,0.0858, -scenario_default,wholesale_squeezed_60,2017-01-02 10:30:00.000,0.0851, -scenario_default,wholesale_squeezed_60,2017-01-02 11:00:00.000,0.0851, -scenario_default,wholesale_squeezed_60,2017-01-02 11:30:00.000,0.0829, -scenario_default,wholesale_squeezed_60,2017-01-02 12:00:00.000,0.0820, -scenario_default,wholesale_squeezed_60,2017-01-02 12:30:00.000,0.0829, -scenario_default,wholesale_squeezed_60,2017-01-02 13:00:00.000,0.0838, -scenario_default,wholesale_squeezed_60,2017-01-02 13:30:00.000,0.0838, -scenario_default,wholesale_squeezed_60,2017-01-02 14:00:00.000,0.0838, -scenario_default,wholesale_squeezed_60,2017-01-02 14:30:00.000,0.0830, -scenario_default,wholesale_squeezed_60,2017-01-02 15:00:00.000,0.0830, -scenario_default,wholesale_squeezed_60,2017-01-02 15:30:00.000,0.0820, -scenario_default,wholesale_squeezed_60,2017-01-02 16:00:00.000,0.0820, -scenario_default,wholesale_squeezed_60,2017-01-02 16:30:00.000,0.0819, -scenario_default,wholesale_squeezed_60,2017-01-02 17:00:00.000,0.0828, -scenario_default,wholesale_squeezed_60,2017-01-02 17:30:00.000,0.0829, -scenario_default,wholesale_squeezed_60,2017-01-02 18:00:00.000,0.0851, -scenario_default,wholesale_squeezed_60,2017-01-02 18:30:00.000,0.0861, -scenario_default,wholesale_squeezed_60,2017-01-02 19:00:00.000,0.0867, -scenario_default,wholesale_squeezed_60,2017-01-02 19:30:00.000,0.0867, -scenario_default,wholesale_squeezed_60,2017-01-02 20:00:00.000,0.0867, -scenario_default,wholesale_squeezed_60,2017-01-02 20:30:00.000,0.0867, -scenario_default,wholesale_squeezed_60,2017-01-02 21:00:00.000,0.0863, -scenario_default,wholesale_squeezed_60,2017-01-02 21:30:00.000,0.0858, -scenario_default,wholesale_squeezed_60,2017-01-02 22:00:00.000,0.0830, -scenario_default,wholesale_squeezed_60,2017-01-02 22:30:00.000,0.0802, -scenario_default,wholesale_squeezed_60,2017-01-02 23:00:00.000,0.0838, -scenario_default,wholesale_squeezed_60,2017-01-02 23:30:00.000,0.0805, -scenario_default,wholesale_squeezed_60,2017-01-03 00:00:00.000,0.0805, -scenario_default,wholesale_squeezed_80,2017-01-02 00:00:00.000,0.08033, -scenario_default,wholesale_squeezed_80,2017-01-02 00:30:00.000,0.07983, -scenario_default,wholesale_squeezed_80,2017-01-02 01:00:00.000,0.07783, -scenario_default,wholesale_squeezed_80,2017-01-02 01:30:00.000,0.07606, -scenario_default,wholesale_squeezed_80,2017-01-02 02:00:00.000,0.07530, -scenario_default,wholesale_squeezed_80,2017-01-02 02:30:00.000,0.07527, -scenario_default,wholesale_squeezed_80,2017-01-02 03:00:00.000,0.07180, -scenario_default,wholesale_squeezed_80,2017-01-02 03:30:00.000,0.07010, -scenario_default,wholesale_squeezed_80,2017-01-02 04:00:00.000,0.06831, -scenario_default,wholesale_squeezed_80,2017-01-02 04:30:00.000,0.06833, -scenario_default,wholesale_squeezed_80,2017-01-02 05:00:00.000,0.07255, -scenario_default,wholesale_squeezed_80,2017-01-02 05:30:00.000,0.07498, -scenario_default,wholesale_squeezed_80,2017-01-02 06:00:00.000,0.07407, -scenario_default,wholesale_squeezed_80,2017-01-02 06:30:00.000,0.07407, -scenario_default,wholesale_squeezed_80,2017-01-02 07:00:00.000,0.07527, -scenario_default,wholesale_squeezed_80,2017-01-02 07:30:00.000,0.07619, -scenario_default,wholesale_squeezed_80,2017-01-02 08:00:00.000,0.07864, -scenario_default,wholesale_squeezed_80,2017-01-02 08:30:00.000,0.08003, -scenario_default,wholesale_squeezed_80,2017-01-02 09:00:00.000,0.08278, -scenario_default,wholesale_squeezed_80,2017-01-02 09:30:00.000,0.08636, -scenario_default,wholesale_squeezed_80,2017-01-02 10:00:00.000,0.08736, -scenario_default,wholesale_squeezed_80,2017-01-02 10:30:00.000,0.08637, -scenario_default,wholesale_squeezed_80,2017-01-02 11:00:00.000,0.08637, -scenario_default,wholesale_squeezed_80,2017-01-02 11:30:00.000,0.08347, -scenario_default,wholesale_squeezed_80,2017-01-02 12:00:00.000,0.08233, -scenario_default,wholesale_squeezed_80,2017-01-02 12:30:00.000,0.08347, -scenario_default,wholesale_squeezed_80,2017-01-02 13:00:00.000,0.08470, -scenario_default,wholesale_squeezed_80,2017-01-02 13:30:00.000,0.08470, -scenario_default,wholesale_squeezed_80,2017-01-02 14:00:00.000,0.08470, -scenario_default,wholesale_squeezed_80,2017-01-02 14:30:00.000,0.08362, -scenario_default,wholesale_squeezed_80,2017-01-02 15:00:00.000,0.08357, -scenario_default,wholesale_squeezed_80,2017-01-02 15:30:00.000,0.08226, -scenario_default,wholesale_squeezed_80,2017-01-02 16:00:00.000,0.08233, -scenario_default,wholesale_squeezed_80,2017-01-02 16:30:00.000,0.08221, -scenario_default,wholesale_squeezed_80,2017-01-02 17:00:00.000,0.08342, -scenario_default,wholesale_squeezed_80,2017-01-02 17:30:00.000,0.08347, -scenario_default,wholesale_squeezed_80,2017-01-02 18:00:00.000,0.08637, -scenario_default,wholesale_squeezed_80,2017-01-02 18:30:00.000,0.08778, -scenario_default,wholesale_squeezed_80,2017-01-02 19:00:00.000,0.08854, -scenario_default,wholesale_squeezed_80,2017-01-02 19:30:00.000,0.08855, -scenario_default,wholesale_squeezed_80,2017-01-02 20:00:00.000,0.08861, -scenario_default,wholesale_squeezed_80,2017-01-02 20:30:00.000,0.08860, -scenario_default,wholesale_squeezed_80,2017-01-02 21:00:00.000,0.08799, -scenario_default,wholesale_squeezed_80,2017-01-02 21:30:00.000,0.08737, -scenario_default,wholesale_squeezed_80,2017-01-02 22:00:00.000,0.08362, -scenario_default,wholesale_squeezed_80,2017-01-02 22:30:00.000,0.07992, -scenario_default,wholesale_squeezed_80,2017-01-02 23:00:00.000,0.08468, -scenario_default,wholesale_squeezed_80,2017-01-02 23:30:00.000,0.08029, -scenario_default,wholesale_squeezed_80,2017-01-03 00:00:00.000,0.08029, +price_type,time,price +wholesale_market,2017-01-02T00:00:00,0.08013 +wholesale_market,2017-01-02T00:30:00,0.07951 +wholesale_market,2017-01-02T01:00:00,0.07701 +wholesale_market,2017-01-02T01:30:00,0.0748 +wholesale_market,2017-01-02T02:00:00,0.07384 +wholesale_market,2017-01-02T02:30:00,0.07381 +wholesale_market,2017-01-02T03:00:00,0.06947 +wholesale_market,2017-01-02T03:30:00,0.06734 +wholesale_market,2017-01-02T04:00:00,0.06511 +wholesale_market,2017-01-02T04:30:00,0.06513 +wholesale_market,2017-01-02T05:00:00,0.07041 +wholesale_market,2017-01-02T05:30:00,0.07344 +wholesale_market,2017-01-02T06:00:00,0.07231 +wholesale_market,2017-01-02T06:30:00,0.07231 +wholesale_market,2017-01-02T07:00:00,0.07381 +wholesale_market,2017-01-02T07:30:00,0.07496 +wholesale_market,2017-01-02T08:00:00,0.07802 +wholesale_market,2017-01-02T08:30:00,0.07976 +wholesale_market,2017-01-02T09:00:00,0.08319 +wholesale_market,2017-01-02T09:30:00,0.08767 +wholesale_market,2017-01-02T10:00:00,0.08892 +wholesale_market,2017-01-02T10:30:00,0.08768 +wholesale_market,2017-01-02T11:00:00,0.08768 +wholesale_market,2017-01-02T11:30:00,0.08406 +wholesale_market,2017-01-02T12:00:00,0.08263 +wholesale_market,2017-01-02T12:30:00,0.08406 +wholesale_market,2017-01-02T13:00:00,0.08559 +wholesale_market,2017-01-02T13:30:00,0.08559 +wholesale_market,2017-01-02T14:00:00,0.08559 +wholesale_market,2017-01-02T14:30:00,0.08424 +wholesale_market,2017-01-02T15:00:00,0.08418 +wholesale_market,2017-01-02T15:30:00,0.08255 +wholesale_market,2017-01-02T16:00:00,0.08263 +wholesale_market,2017-01-02T16:30:00,0.08248 +wholesale_market,2017-01-02T17:00:00,0.08399 +wholesale_market,2017-01-02T17:30:00,0.08406 +wholesale_market,2017-01-02T18:00:00,0.08768 +wholesale_market,2017-01-02T18:30:00,0.08945 +wholesale_market,2017-01-02T19:00:00,0.09039 +wholesale_market,2017-01-02T19:30:00,0.09041 +wholesale_market,2017-01-02T20:00:00,0.09048 +wholesale_market,2017-01-02T20:30:00,0.09047 +wholesale_market,2017-01-02T21:00:00,0.08971 +wholesale_market,2017-01-02T21:30:00,0.08893 +wholesale_market,2017-01-02T22:00:00,0.08424 +wholesale_market,2017-01-02T22:30:00,0.07962 +wholesale_market,2017-01-02T23:00:00,0.08557 +wholesale_market,2017-01-02T23:30:00,0.08008 +wholesale_market,2017-01-03T00:00:00,0.08008 +retailer_peak_offpeak,2017-01-02T00:00:00,0.1616 +retailer_peak_offpeak,2017-01-02T00:30:00,0.1616 +retailer_peak_offpeak,2017-01-02T01:00:00,0.1616 +retailer_peak_offpeak,2017-01-02T01:30:00,0.1616 +retailer_peak_offpeak,2017-01-02T02:00:00,0.1616 +retailer_peak_offpeak,2017-01-02T02:30:00,0.1616 +retailer_peak_offpeak,2017-01-02T03:00:00,0.1616 +retailer_peak_offpeak,2017-01-02T03:30:00,0.1616 +retailer_peak_offpeak,2017-01-02T04:00:00,0.1616 +retailer_peak_offpeak,2017-01-02T04:30:00,0.1616 +retailer_peak_offpeak,2017-01-02T05:00:00,0.1616 +retailer_peak_offpeak,2017-01-02T05:30:00,0.1616 +retailer_peak_offpeak,2017-01-02T06:00:00,0.1616 +retailer_peak_offpeak,2017-01-02T06:30:00,0.1616 +retailer_peak_offpeak,2017-01-02T07:00:00,0.202 +retailer_peak_offpeak,2017-01-02T07:30:00,0.202 +retailer_peak_offpeak,2017-01-02T08:00:00,0.202 +retailer_peak_offpeak,2017-01-02T08:30:00,0.202 +retailer_peak_offpeak,2017-01-02T09:00:00,0.202 +retailer_peak_offpeak,2017-01-02T09:30:00,0.202 +retailer_peak_offpeak,2017-01-02T10:00:00,0.202 +retailer_peak_offpeak,2017-01-02T10:30:00,0.202 +retailer_peak_offpeak,2017-01-02T11:00:00,0.202 +retailer_peak_offpeak,2017-01-02T11:30:00,0.202 +retailer_peak_offpeak,2017-01-02T12:00:00,0.202 +retailer_peak_offpeak,2017-01-02T12:30:00,0.202 +retailer_peak_offpeak,2017-01-02T13:00:00,0.202 +retailer_peak_offpeak,2017-01-02T13:30:00,0.202 +retailer_peak_offpeak,2017-01-02T14:00:00,0.202 +retailer_peak_offpeak,2017-01-02T14:30:00,0.202 +retailer_peak_offpeak,2017-01-02T15:00:00,0.202 +retailer_peak_offpeak,2017-01-02T15:30:00,0.202 +retailer_peak_offpeak,2017-01-02T16:00:00,0.202 +retailer_peak_offpeak,2017-01-02T16:30:00,0.202 +retailer_peak_offpeak,2017-01-02T17:00:00,0.202 +retailer_peak_offpeak,2017-01-02T17:30:00,0.202 +retailer_peak_offpeak,2017-01-02T18:00:00,0.202 +retailer_peak_offpeak,2017-01-02T18:30:00,0.202 +retailer_peak_offpeak,2017-01-02T19:00:00,0.202 +retailer_peak_offpeak,2017-01-02T19:30:00,0.202 +retailer_peak_offpeak,2017-01-02T20:00:00,0.202 +retailer_peak_offpeak,2017-01-02T20:30:00,0.202 +retailer_peak_offpeak,2017-01-02T21:00:00,0.202 +retailer_peak_offpeak,2017-01-02T21:30:00,0.202 +retailer_peak_offpeak,2017-01-02T22:00:00,0.202 +retailer_peak_offpeak,2017-01-02T22:30:00,0.202 +retailer_peak_offpeak,2017-01-02T23:00:00,0.1616 +retailer_peak_offpeak,2017-01-02T23:30:00,0.1616 +retailer_peak_offpeak,2017-01-03T00:00:00,0.1616 +wholesale_squeezed_20,2017-01-02T00:00:00,0.08093 +wholesale_squeezed_20,2017-01-02T00:30:00,0.0808 +wholesale_squeezed_20,2017-01-02T01:00:00,0.0803 +wholesale_squeezed_20,2017-01-02T01:30:00,0.07986 +wholesale_squeezed_20,2017-01-02T02:00:00,0.07967 +wholesale_squeezed_20,2017-01-02T02:30:00,0.07966 +wholesale_squeezed_20,2017-01-02T03:00:00,0.07879 +wholesale_squeezed_20,2017-01-02T03:30:00,0.07837 +wholesale_squeezed_20,2017-01-02T04:00:00,0.07792 +wholesale_squeezed_20,2017-01-02T04:30:00,0.07793 +wholesale_squeezed_20,2017-01-02T05:00:00,0.07898 +wholesale_squeezed_20,2017-01-02T05:30:00,0.07959 +wholesale_squeezed_20,2017-01-02T06:00:00,0.07936 +wholesale_squeezed_20,2017-01-02T06:30:00,0.07936 +wholesale_squeezed_20,2017-01-02T07:00:00,0.07966 +wholesale_squeezed_20,2017-01-02T07:30:00,0.07989 +wholesale_squeezed_20,2017-01-02T08:00:00,0.0805 +wholesale_squeezed_20,2017-01-02T08:30:00,0.08085 +wholesale_squeezed_20,2017-01-02T09:00:00,0.08154 +wholesale_squeezed_20,2017-01-02T09:30:00,0.08243 +wholesale_squeezed_20,2017-01-02T10:00:00,0.08268 +wholesale_squeezed_20,2017-01-02T10:30:00,0.08244 +wholesale_squeezed_20,2017-01-02T11:00:00,0.08244 +wholesale_squeezed_20,2017-01-02T11:30:00,0.08171 +wholesale_squeezed_20,2017-01-02T12:00:00,0.08143 +wholesale_squeezed_20,2017-01-02T12:30:00,0.08171 +wholesale_squeezed_20,2017-01-02T13:00:00,0.08202 +wholesale_squeezed_20,2017-01-02T13:30:00,0.08202 +wholesale_squeezed_20,2017-01-02T14:00:00,0.08202 +wholesale_squeezed_20,2017-01-02T14:30:00,0.08175 +wholesale_squeezed_20,2017-01-02T15:00:00,0.08174 +wholesale_squeezed_20,2017-01-02T15:30:00,0.08141 +wholesale_squeezed_20,2017-01-02T16:00:00,0.08143 +wholesale_squeezed_20,2017-01-02T16:30:00,0.0814 +wholesale_squeezed_20,2017-01-02T17:00:00,0.0817 +wholesale_squeezed_20,2017-01-02T17:30:00,0.08171 +wholesale_squeezed_20,2017-01-02T18:00:00,0.08244 +wholesale_squeezed_20,2017-01-02T18:30:00,0.08279 +wholesale_squeezed_20,2017-01-02T19:00:00,0.08298 +wholesale_squeezed_20,2017-01-02T19:30:00,0.08298 +wholesale_squeezed_20,2017-01-02T20:00:00,0.083 +wholesale_squeezed_20,2017-01-02T20:30:00,0.08299 +wholesale_squeezed_20,2017-01-02T21:00:00,0.08284 +wholesale_squeezed_20,2017-01-02T21:30:00,0.08269 +wholesale_squeezed_20,2017-01-02T22:00:00,0.08175 +wholesale_squeezed_20,2017-01-02T22:30:00,0.08082 +wholesale_squeezed_20,2017-01-02T23:00:00,0.08201 +wholesale_squeezed_20,2017-01-02T23:30:00,0.08092 +wholesale_squeezed_20,2017-01-03T00:00:00,0.08092 +wholesale_squeezed_40,2017-01-02T00:00:00,0.08073 +wholesale_squeezed_40,2017-01-02T00:30:00,0.08048 +wholesale_squeezed_40,2017-01-02T01:00:00,0.07948 +wholesale_squeezed_40,2017-01-02T01:30:00,0.07859 +wholesale_squeezed_40,2017-01-02T02:00:00,0.07821 +wholesale_squeezed_40,2017-01-02T02:30:00,0.07820 +wholesale_squeezed_40,2017-01-02T03:00:00,0.07646 +wholesale_squeezed_40,2017-01-02T03:30:00,0.07561 +wholesale_squeezed_40,2017-01-02T04:00:00,0.07472 +wholesale_squeezed_40,2017-01-02T04:30:00,0.07473 +wholesale_squeezed_40,2017-01-02T05:00:00,0.07684 +wholesale_squeezed_40,2017-01-02T05:30:00,0.07805 +wholesale_squeezed_40,2017-01-02T06:00:00,0.07760 +wholesale_squeezed_40,2017-01-02T06:30:00,0.07760 +wholesale_squeezed_40,2017-01-02T07:00:00,0.07820 +wholesale_squeezed_40,2017-01-02T07:30:00,0.07866 +wholesale_squeezed_40,2017-01-02T08:00:00,0.07988 +wholesale_squeezed_40,2017-01-02T08:30:00,0.08058 +wholesale_squeezed_40,2017-01-02T09:00:00,0.08195 +wholesale_squeezed_40,2017-01-02T09:30:00,0.08374 +wholesale_squeezed_40,2017-01-02T10:00:00,0.08424 +wholesale_squeezed_40,2017-01-02T10:30:00,0.08375 +wholesale_squeezed_40,2017-01-02T11:00:00,0.08375 +wholesale_squeezed_40,2017-01-02T11:30:00,0.08230 +wholesale_squeezed_40,2017-01-02T12:00:00,0.08173 +wholesale_squeezed_40,2017-01-02T12:30:00,0.08230 +wholesale_squeezed_40,2017-01-02T13:00:00,0.08291 +wholesale_squeezed_40,2017-01-02T13:30:00,0.08291 +wholesale_squeezed_40,2017-01-02T14:00:00,0.08291 +wholesale_squeezed_40,2017-01-02T14:30:00,0.08237 +wholesale_squeezed_40,2017-01-02T15:00:00,0.08235 +wholesale_squeezed_40,2017-01-02T15:30:00,0.08169 +wholesale_squeezed_40,2017-01-02T16:00:00,0.08173 +wholesale_squeezed_40,2017-01-02T16:30:00,0.08167 +wholesale_squeezed_40,2017-01-02T17:00:00,0.08227 +wholesale_squeezed_40,2017-01-02T17:30:00,0.08230 +wholesale_squeezed_40,2017-01-02T18:00:00,0.08375 +wholesale_squeezed_40,2017-01-02T18:30:00,0.08445 +wholesale_squeezed_40,2017-01-02T19:00:00,0.08483 +wholesale_squeezed_40,2017-01-02T19:30:00,0.08484 +wholesale_squeezed_40,2017-01-02T20:00:00,0.08487 +wholesale_squeezed_40,2017-01-02T20:30:00,0.08486 +wholesale_squeezed_40,2017-01-02T21:00:00,0.08456 +wholesale_squeezed_40,2017-01-02T21:30:00,0.08425 +wholesale_squeezed_40,2017-01-02T22:00:00,0.08237 +wholesale_squeezed_40,2017-01-02T22:30:00,0.08052 +wholesale_squeezed_40,2017-01-02T23:00:00,0.08290 +wholesale_squeezed_40,2017-01-02T23:30:00,0.08071 +wholesale_squeezed_40,2017-01-03T00:00:00,0.08071 +wholesale_squeezed_60,2017-01-02T00:00:00,0.0805 +wholesale_squeezed_60,2017-01-02T00:30:00,0.0802 +wholesale_squeezed_60,2017-01-02T01:00:00,0.0787 +wholesale_squeezed_60,2017-01-02T01:30:00,0.0773 +wholesale_squeezed_60,2017-01-02T02:00:00,0.0768 +wholesale_squeezed_60,2017-01-02T02:30:00,0.0767 +wholesale_squeezed_60,2017-01-02T03:00:00,0.0741 +wholesale_squeezed_60,2017-01-02T03:30:00,0.0729 +wholesale_squeezed_60,2017-01-02T04:00:00,0.0715 +wholesale_squeezed_60,2017-01-02T04:30:00,0.0715 +wholesale_squeezed_60,2017-01-02T05:00:00,0.0747 +wholesale_squeezed_60,2017-01-02T05:30:00,0.0765 +wholesale_squeezed_60,2017-01-02T06:00:00,0.0758 +wholesale_squeezed_60,2017-01-02T06:30:00,0.0758 +wholesale_squeezed_60,2017-01-02T07:00:00,0.0767 +wholesale_squeezed_60,2017-01-02T07:30:00,0.0774 +wholesale_squeezed_60,2017-01-02T08:00:00,0.0793 +wholesale_squeezed_60,2017-01-02T08:30:00,0.0803 +wholesale_squeezed_60,2017-01-02T09:00:00,0.0824 +wholesale_squeezed_60,2017-01-02T09:30:00,0.0851 +wholesale_squeezed_60,2017-01-02T10:00:00,0.0858 +wholesale_squeezed_60,2017-01-02T10:30:00,0.0851 +wholesale_squeezed_60,2017-01-02T11:00:00,0.0851 +wholesale_squeezed_60,2017-01-02T11:30:00,0.0829 +wholesale_squeezed_60,2017-01-02T12:00:00,0.0820 +wholesale_squeezed_60,2017-01-02T12:30:00,0.0829 +wholesale_squeezed_60,2017-01-02T13:00:00,0.0838 +wholesale_squeezed_60,2017-01-02T13:30:00,0.0838 +wholesale_squeezed_60,2017-01-02T14:00:00,0.0838 +wholesale_squeezed_60,2017-01-02T14:30:00,0.0830 +wholesale_squeezed_60,2017-01-02T15:00:00,0.0830 +wholesale_squeezed_60,2017-01-02T15:30:00,0.0820 +wholesale_squeezed_60,2017-01-02T16:00:00,0.0820 +wholesale_squeezed_60,2017-01-02T16:30:00,0.0819 +wholesale_squeezed_60,2017-01-02T17:00:00,0.0828 +wholesale_squeezed_60,2017-01-02T17:30:00,0.0829 +wholesale_squeezed_60,2017-01-02T18:00:00,0.0851 +wholesale_squeezed_60,2017-01-02T18:30:00,0.0861 +wholesale_squeezed_60,2017-01-02T19:00:00,0.0867 +wholesale_squeezed_60,2017-01-02T19:30:00,0.0867 +wholesale_squeezed_60,2017-01-02T20:00:00,0.0867 +wholesale_squeezed_60,2017-01-02T20:30:00,0.0867 +wholesale_squeezed_60,2017-01-02T21:00:00,0.0863 +wholesale_squeezed_60,2017-01-02T21:30:00,0.0858 +wholesale_squeezed_60,2017-01-02T22:00:00,0.0830 +wholesale_squeezed_60,2017-01-02T22:30:00,0.0802 +wholesale_squeezed_60,2017-01-02T23:00:00,0.0838 +wholesale_squeezed_60,2017-01-02T23:30:00,0.0805 +wholesale_squeezed_60,2017-01-03T00:00:00,0.0805 +wholesale_squeezed_80,2017-01-02T00:00:00,0.08033 +wholesale_squeezed_80,2017-01-02T00:30:00,0.07983 +wholesale_squeezed_80,2017-01-02T01:00:00,0.07783 +wholesale_squeezed_80,2017-01-02T01:30:00,0.07606 +wholesale_squeezed_80,2017-01-02T02:00:00,0.07530 +wholesale_squeezed_80,2017-01-02T02:30:00,0.07527 +wholesale_squeezed_80,2017-01-02T03:00:00,0.07180 +wholesale_squeezed_80,2017-01-02T03:30:00,0.07010 +wholesale_squeezed_80,2017-01-02T04:00:00,0.06831 +wholesale_squeezed_80,2017-01-02T04:30:00,0.06833 +wholesale_squeezed_80,2017-01-02T05:00:00,0.07255 +wholesale_squeezed_80,2017-01-02T05:30:00,0.07498 +wholesale_squeezed_80,2017-01-02T06:00:00,0.07407 +wholesale_squeezed_80,2017-01-02T06:30:00,0.07407 +wholesale_squeezed_80,2017-01-02T07:00:00,0.07527 +wholesale_squeezed_80,2017-01-02T07:30:00,0.07619 +wholesale_squeezed_80,2017-01-02T08:00:00,0.07864 +wholesale_squeezed_80,2017-01-02T08:30:00,0.08003 +wholesale_squeezed_80,2017-01-02T09:00:00,0.08278 +wholesale_squeezed_80,2017-01-02T09:30:00,0.08636 +wholesale_squeezed_80,2017-01-02T10:00:00,0.08736 +wholesale_squeezed_80,2017-01-02T10:30:00,0.08637 +wholesale_squeezed_80,2017-01-02T11:00:00,0.08637 +wholesale_squeezed_80,2017-01-02T11:30:00,0.08347 +wholesale_squeezed_80,2017-01-02T12:00:00,0.08233 +wholesale_squeezed_80,2017-01-02T12:30:00,0.08347 +wholesale_squeezed_80,2017-01-02T13:00:00,0.08470 +wholesale_squeezed_80,2017-01-02T13:30:00,0.08470 +wholesale_squeezed_80,2017-01-02T14:00:00,0.08470 +wholesale_squeezed_80,2017-01-02T14:30:00,0.08362 +wholesale_squeezed_80,2017-01-02T15:00:00,0.08357 +wholesale_squeezed_80,2017-01-02T15:30:00,0.08226 +wholesale_squeezed_80,2017-01-02T16:00:00,0.08233 +wholesale_squeezed_80,2017-01-02T16:30:00,0.08221 +wholesale_squeezed_80,2017-01-02T17:00:00,0.08342 +wholesale_squeezed_80,2017-01-02T17:30:00,0.08347 +wholesale_squeezed_80,2017-01-02T18:00:00,0.08637 +wholesale_squeezed_80,2017-01-02T18:30:00,0.08778 +wholesale_squeezed_80,2017-01-02T19:00:00,0.08854 +wholesale_squeezed_80,2017-01-02T19:30:00,0.08855 +wholesale_squeezed_80,2017-01-02T20:00:00,0.08861 +wholesale_squeezed_80,2017-01-02T20:30:00,0.08860 +wholesale_squeezed_80,2017-01-02T21:00:00,0.08799 +wholesale_squeezed_80,2017-01-02T21:30:00,0.08737 +wholesale_squeezed_80,2017-01-02T22:00:00,0.08362 +wholesale_squeezed_80,2017-01-02T22:30:00,0.07992 +wholesale_squeezed_80,2017-01-02T23:00:00,0.08468 +wholesale_squeezed_80,2017-01-02T23:30:00,0.08029 +wholesale_squeezed_80,2017-01-03T00:00:00,0.08029 diff --git a/docs/api.md b/docs/api.md index 93fa7012..195c6105 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,17 +1,41 @@ -# API Reference +# API reference -``` automodule:: cobmo.main - :members: +``` warning:: + This reference is work in progress. ``` -``` automodule:: cobmo.utils +## `cobmo.building` + +``` automodule:: cobmo.building :members: ``` -``` automodule:: cobmo.building +## `cobmo.config` + +``` automodule:: cobmo.config :members: ``` +## `cobmo.controller` + ``` automodule:: cobmo.controller :members: ``` + +## `cobmo.database_interface` + +``` automodule:: cobmo.database_interface + :members: +``` + +## `cobmo.plots` + +``` automodule:: cobmo.plots + :members: +``` + +## `cobmo.utils` + +``` automodule:: cobmo.utils + :members: +``` diff --git a/docs/conf.py b/docs/conf.py index 9e75a9ba..6084ad76 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -35,6 +35,7 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ + 'sphinx_markdown_tables', # TODO: `sphinx_markdown_tables` doesn't support Readthedocs PDF properly. 'sphinx.ext.napoleon', 'sphinx.ext.autodoc', 'sphinx.ext.mathjax' diff --git a/docs/contributing.md b/docs/contributing.md index 52e54ec7..3143d901 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -3,11 +3,11 @@ If you are keen to contribute to this project, please follow these guidelines: - Before making any change, please first discuss via issue or email with the owners of this repository. -- Development is based on Python 3.6. +- Development is based on Python 3.7. - Git branches follow the [GitFlow principle](https://nvie.com/posts/a-successful-git-branching-model/). - Release versioning follows the [Semantic Versioning principle](https://semver.org/). -## Git Branches +## Git branches Based on the [GitFlow principle](https://nvie.com/posts/a-successful-git-branching-model/) there are the following branches: @@ -15,14 +15,14 @@ Based on the [GitFlow principle](https://nvie.com/posts/a-successful-git-branchi 2. `development` - This branch is intended as the main branch for development or improvement of features. Anyone can send pull requests to `develop`. 3. `feature/xxx` - This branch is dedicated to developing feature `xxx`. The idea is to keep development or improvement works separate from the main `develop` branch. Once the work is finished, a pull request is created for feature `xxx` to be merged back into the `develop` branch. -## Release Versioning +## Release versioning Every time the `master` branch changes, a new version number is defined according to the [Semantic Versioning principle](https://semver.org/): 1. New releases cause a changing version number in the first digit for major changes and in the second digit for minor changes (e.g. from 0.1.13 -> 0.2.0). 2. Bugfixes cause a changing version number in the third digit (eg. from 0.1.12 -> 0.1.13) -## Style Guide +## Style guide - Follow the [PEP 8 Style Guide](https://www.python.org/dev/peps/pep-0008/) and check [this PEP8 Explainer](https://realpython.com/python-pep8/). - Variable / function / object / class / module names: diff --git a/docs/data.md b/docs/data.md index faeec9b7..e8a0dca0 100644 --- a/docs/data.md +++ b/docs/data.md @@ -1 +1,317 @@ -# Database Reference +# Data reference + +``` warning:: + This reference is work in progress. +``` + +## `building_blind_types` + +Window blind characteristics. *Currently not used.* + +| Column | Unit | Description | +| --- |:---:| --- | +| `blind_type` | | Unique type identifier. | +| `blind_efficiency` | - | Blind efficiency (absorbed irradiation / incident irradiation). | + +## `building_hvac_ahu_types` + +Air handling unit (AHU) set points and characteristics. + +| Column | Unit | Description | +| --- |:---:| --- | +| `hvac_ahu_type` | | Unique type identifier. | +| `ahu_cooling_type` | | *Currently not used.* | +| `ahu_heating_type` | | *Currently not used.* | +| `ahu_dehumidification_type` | | *Currently not used.* | +| `ahu_return_air_heat_recovery_type` | | *Currently not used.* | +| `ahu_supply_air_temperature_setpoint` | °C | Supply air temperature at outlet of AHU towards zone. | +| `ahu_supply_air_relative_humidity_setpoint` | % | Supply air relative humidity at outlet of AHU towards zone. | +| `ahu_fan_efficiency` | J/kg | Fan efficiency (electric power / air mass flow rate). | +| `ahu_cooling_efficiency` | - | Chiller plant efficiency (thermal power / electrical power). | +| `ahu_heating_efficiency` | - | Heating plant efficiency (thermal power / electrical power). | +| `ahu_return_air_heat_recovery_efficiency` | - | Recovery efficiency (recovered power / available power). | + +## `building_hvac_generic_types` + +Generic HVAC system characteristics. + +| Column | Unit | Description | +| --- |:---:| --- | +| `hvac_generic_type` | | Unique type identifier. | +| `generic_heating_efficiency` | - | Heating efficiency (thermal power / electric power). | +| `generic_cooling_efficiency` | - | Cooling efficiency (thermal power / electric power). | + +## `building_hvac_tu_types` + +Terminal unit (TU) set points and characteristics. + +| Column | Unit | Description | +| --- |:---:| --- | +| `hvac_tu_type` | | Unique type identifier. | +| `tu_cooling_type` | | *Currently not used.* | +| `tu_heating_type` | | *Currently not used.* | +| `tu_air_intake_type` | | *Currently not used.* | +| `tu_supply_air_temperature_setpoint` | °C | Supply air temperature at outlet of TU towards zone. | +| `tu_fan_efficiency` | J/kg | Fan efficiency (electric power / air mass flow rate). | +| `tu_cooling_efficiency` | - | Chiller plant efficiency (thermal power / electrical power). | +| `tu_heating_efficiency` | - | Heating plant efficiency (thermal power / electrical power). | + +## `building_internal_gain_timeseries` + +Time series of internal gains. + +| Column | Unit | Description | +| --- |:---:| --- | +| `internal_gain_type` | | Type identifier as defined in `building_internal_gain_types`. | +| `time` | | Timestamp according to ISO 8601. | +| `internal_gain_occupancy` | W/m² | Internal gains related to occupants.| +| `internal_gain_appliances` | W/m² | Internal gains related to appliances. | + +## `building_internal_gain_types` + +Internal gain type definitions. + +| Column | Unit | Description | +| --- |:---:| --- | +| `internal_gain_type` | | Unique type identifier. | +| `internal_gain_occupancy_factor` | - | Occupancy gains scaling factor. | +| `internal_gain_appliances_factor` | - | Appliance gains scaling factor. | + +## `building_linearization_types` + +Linearization point definitions. + +| Column | Unit | Description | +| --- |:---:| --- | +| `linearization_type` | | Unique type identifier. | +| `linearization_zone_air_temperature_heat` | °C | | +| `linearization_zone_air_temperature_cool` | °C | | +| `linearization_surface_temperature` | °C | | +| `linearization_exterior_surface_temperature` | °C | | +| `linearization_internal_gain_occupancy` | W/m² | | +| `linearization_internal_gain_appliances` | W/m² | | +| `linearization_ambient_air_temperature` | °C | | +| `linearization_sky_temperature` | °C | | +| `linearization_ambient_air_humidity_ratio` | kg/kg | Absolute humidity (mass of water / mass of air). | +| `linearization_zone_air_humidity_ratio` | kg/kg | Absolute humidity (mass of water / mass of air). | +| `linearization_irradiation` | W/m² | | +| `linearization_co2_concentration` | ppm | | +| `linearization_ventilation_rate_per_square_meter` | m/s | | + +## `building_parameter_sets` + +Parameter definitions, which includes constants and user-defined parameters. + +In all tables, a `parameter_name` string can be used to define numerical parameters in place of numerical values. During building model setup, those strings will be parsed from the `building_parameter_sets` table to obtain the corresponding numerical values. + +| Column | Unit | Description | +| --- |:---:| --- | +| `parameter_set` | | Parameter set identifier. | +| `parameter_name` | | Parameter name string. | +| `parameter_value` | various | Numerical value. | +| `parameter_unit` | | Comment field for the parameter unit. | +| `parameter_comment` | | Comment field for further explanations. | + +## `building_scenarios` + +Building scenario definitions. + +| Column | Unit | Description | +| --- |:---:| --- | +| `scenario_name` | | Unique scenario identifier. | +| `building_name` | | Building identifier as defined in `buildings`. | +| `parameter_set` | | Parameter set identifier as defined in `building_parameter_sets`. | +| `linearization_type` | | Type identifier as defined in `building_linearization_types`. | +| `demand_controlled_ventilation_type` | | *Currently not used.* | +| `co2_model_type` | | *Currently not used.* | +| `humidity_model_type` | | *Currently not used.* | +| `heating_cooling_session` | | *Currently not used.* | +| `price_type` | | Type identifier as defined in `electricity_price_timeseries`. | +| `time_start` | | Timestamp according to ISO 8601. | +| `time_end` | | Timestamp according to ISO 8601. | +| `time_step` | | Time step length in seconds. | + +## `building_storage_types` + +Storage characteristics. + +| Column | Unit | Description | +| --- |:---:| --- | +| `building_storage_type` | | Unique type identifier. | +| `storage_size` | m³ or kWh | Volume of sensible thermal storage or electric energy capacity of battery storage. | +| `storage_round_trip_efficiency` | - | Round trip efficiency (discharged energy / charged energy). | +| `storage_battery_depth_of_discharge` | - | Maximum utilizable battery storage capacity (utilized capacity / total capacity). | +| `storage_sensible_temperature_delta` | K | Temperature difference between the supply and return water temperature of sensible thermal storage. | +| `storage_lifetime` | years | Storage lifetime. *Only used for storage planning problems.* | +| `storage_planning_energy_installation_cost` | SGD/m³ or SGD/kWh | Investment cost per installed energy capacity. *Only used for storage planning problems.* | +| `storage_planning_power_installation_cost` | SGD/kW | Investment cost per installed power capacity. *Only used for storage planning problems.* | +| `storage_planning_fixed_installation_cost` | SGD | Investment cost per installed storage unit. *Only used for storage planning problems.* | + +## `building_surface_types` + +Surface type characteristics. + +| Column | Unit | Description | +| --- |:---:| --- | +| `surface_type` | | Unique type identifier. | +| `heat_capacity` | J/(m³K) | Specific heat capacity. | +| `thermal_resistance_surface` | m²K/W | Specific thermal resistance. | +| `irradiation_gain_coefficient` | - | Irradiation gain coefficient (absorbed irradiation / incident irradiation). | +| `emissivity` | - | Emissivity factor. | +| `window_type` | | Type identifier as defined in `building_window_types`. | +| `window_wall_ratio` | - | Window surface area / total surface area. | +| `sky_view_factor` | - | Sky view factor. | + +## `building_surfaces_adiabatic` + +Adiabatic surfaces geometry. + +| Column | Unit | Description | +| --- |:---:| --- | +| `building_name` | | Building identifier as defined in `buildings`. | +| `zone_name` | | Zone identifier as defined in `building_zones`. | +| `surface_name` | | Unique surface identifier. | +| `surface_type` | | Type identifier as defined in `building_surface_types`. | +| `surface_area` | m² | Surface area. | +| `surface_comment` | | Explanatory comment, e.g., description of the geometry. | + +## `building_surfaces_exterior` + +Exterior surfaces geometry. + +| Column | Unit | Description | +| --- |:---:| --- | +| `building_name` | | Building identifier as defined in `buildings`. | +| `zone_name` | | Zone identifier as defined in `building_zones`. | +| `direction_name` | | Direction name (`horizontal`, `east`, `south`, `west`, `north`). | +| `surface_name` | | Unique surface identifier. | +| `surface_type` | | Type identifier as defined in `building_surface_types`. | +| `surface_area` | m² | Surface area. | +| `surface_comment` | | Explanatory comment, e.g., description of the geometry. | + +## `building_surfaces_interior` + +Interior surfaces geometry. + +| Column | Unit | Description | +| --- |:---:| --- | +| `building_name` | | Building identifier as defined in `buildings`. | +| `zone_name` | | Zone on primary side identifier as defined in `building_zones`. | +| `zone_adjacent_name` | | Zone on secondary side identifier as defined in `building_zones`. | +| `surface_name` | | Unique surface identifier. | +| `surface_type` | | Type identifier as defined in `building_surface_types`. | +| `surface_area` | m² | Surface area. | +| `surface_comment` | | Explanatory comment, e.g., description of the geometry. | + +## `building_window_types` + +Window characteristics. + +| Column | Unit | Description | +| --- |:---:| --- | +| `window_type` | | Unique type identifier. | +| `thermal_resistance_window` | m²K/W | Specific thermal resistance. | +| `irradiation_gain_coefficient_window` | - | Irradiation gain coefficient (absorbed irradiation / incident irradiation). | +| `emissivity_window` | - | Emissivity factor. | + +## `building_zone_constraint_profiles` + +Constraint profile definitions. + +The constraint profile time series is constructed by obtaining the appropriate value for each `minimum_air_temperature`, `maximum_air_temperature`, etc. based on `from_time` and `from_weekday`. Each constraint is kept constant at the given value for any daytime greater than or equal to `from_time` and any weekday greater than or equal to `from_weekday` until the next defined `from_time` or `from_weekday`. Note that the daily profile time series is repeated for any weekday greater than or equal to `from_weekday` until the next defined `from_weekday`. The initial value for each `zone_constraint_profile` must start at `from_time = 00:00:00` and `from_weekday = 0`. + +| Column | Unit | Description | +| --- |:---:| --- | +| `zone_constraint_profile` | | Constraint profile identifier. | +| `from_weekday` | | Start weekday number (0 - Monday ... 6 - Sunday). | | +| `from_time` | | Start time in HH:MM:SS format. | | +| `minimum_air_temperature` | °C | | +| `maximum_air_temperature` | °C | | +| `minimum_fresh_air_flow_per_area` | m/s | | +| `minimum_fresh_air_flow_per_person` | m³/s/person | | +| `maximum_co2_concentration` | ppm | | +| `minimum_fresh_air_flow_per_area_no_dcv` | m/s | | +| `minimum_relative_humidity` | % | | +| `maximum_relative_humidity` | % | | + + +## `building_zone_types` + +Zone type characteristics. + +| Column | Unit | Description | +| --- |:---:| --- | +| `zone_type` | | Unique type identifier.| +| `heat_capacity` | J/(m³K) | Specific heat capacity. | +| `base_surface_type` | | Type identifier of the base surface as defined in `building_surface_types`. The base surface is automatically generated based on the `zone_area`. | +| `ceiling_surface_type` | | Type identifier of the ceiling surface as defined in `building_surface_types`. The ceiling surface is automatically generated based on the `zone_area`. | +| `infiltration_rate` | 1/h | Infiltration rate. | +| `internal_gain_type` | | Type identifier as defined in `building_internal_gain_types`. | +| `window_type` | | Type identifier as defined in `building_window_types`. | +| `blind_type` | | Type identifier as defined in `building_blind_types`. *Currently not used.* | +| `hvac_generic_type` | | Type identifier as defined in `building_hvac_generic_types`. | +| `hvac_ahu_type` | | Type identifier as defined in `building_hvac_ahu_types`. | +| `hvac_tu_type` | | Type identifier as defined in `building_hvac_tu_types`. | +| `zone_constraint_profile` | | Constraint profile identifier as defined in `building_zone_constraint_profiles`. | + +## `building_zones` + +Zone geometry. + +| Column | Unit | Description | +| --- |:---:| --- | +| `building_name` | | Building identifier as defined in `buildings`. | +| `zone_name` | | Unique zone identifier. | +| `zone_type` | | Type identifier as defined in `building_zone_types`. | +| `zone_height` | m | Zone height (clear interior height from base to ceiling). | +| `zone_area` | m² | Zone area (interior area excluding surfaces). | +| `zone_comment` | | Explanatory comment, e.g., description of the geometry. | + +## `buildings` + +Building definition. + +| Column | Unit | Description | +| --- |:---:| --- | +| `building_name` | | Unique building identifier.| +| `weather_type` | | Type identifier as defined in `weather_types`. | +| `building_storage_type` | | Type identifier as defined in `building_storage_types`. | + +## `electricity_price_timeseries` + +Electricity price time series definition. + +| Column | Unit | Description | +| --- |:---:| --- | +| `price_type` | | Price type identifier. | +| `time` | | Timestamp according to ISO 8601. | +| `price` | SGD | *Currently only in SGD* | + +## `weather_timeseries` + +Weather time series definition. + +| Column | Unit | Description | +| --- |:---:| --- | +| `weather_type` | | Type identifier as defined in `weather_types`. | +| `time` | | Timestamp according to ISO 8601. | +| `ambient_air_temperature` | °C | Ambient air dry-bulb temperature. | +| `sky_temperature` | °C | Equivalent sky temperature. | +| `ambient_air_humidity_ratio` | kg/kg | Ambient air absolute humidity (mass of water / mass of air). | +| `irradiation_horizontal` | W/m² | Irradiation onto a horizontal surface. | +| `irradiation_east` | W/m² | Irradiation onto a vertical surface oriented towards East. | +| `irradiation_south` | W/m² | Irradiation onto a vertical surface oriented towards South. | +| `irradiation_west` | W/m² | Irradiation onto a vertical surface oriented towards West. | +| `irradiation_north` | W/m² | Irradiation onto a vertical surface oriented towards North. | + +## `weather_types` + +Additional weather and site information. + +| Column | Unit | Description | +| --- |:---:| --- | +| `weather_type` | | Unique type identifier. | +| `time_zone` | | Time zone indicator according to ISO 8601. | +| `latitude` | | Latitude of the weather station. | +| `longitude` | | Longitude of the weather station. | +| `temperature_difference_sky_ambient` | K | *To be revised.* | diff --git a/docs/index.md b/docs/index.md index c5f9fd41..a733a49a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # CoBMo - Control-oriented Building Model -The Control-oriented Building Model (CoBMo) is a building modelling framework catering specifically for the formulation of MPC problems for thermal building systems. CoBMo provides a mathematical model which expresses the relationship between the electric load of the thermal building systems and the indoor air climate with consideration for interactions of the building with its environment, its occupants and appliances. To this end, CoBMo currently implements models for 1) the thermal comfort of building occupants as well as 2) the indoor air quality. +The Control-oriented Building Model (CoBMo) is a building modelling framework catering specifically for the formulation of MPC problems for thermal building systems by keeping all model equations in the linear, i.e., convex, domain. CoBMo provides a mathematical model which expresses the relationship between the electric load of the thermal building systems and the indoor air climate with consideration for interactions of the building with its environment, its occupants and appliances. To this end, CoBMo currently implements models for 1) the thermal comfort of building occupants as well as 2) the indoor air quality. ## Contents @@ -8,7 +8,7 @@ The Control-oriented Building Model (CoBMo) is a building modelling framework ca :maxdepth: 2 intro - data api + data contributing ``` diff --git a/docs/intro.md b/docs/intro.md index a8b87174..e807d5c3 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -1,14 +1,14 @@ -# Getting Started +# Getting started ## Installation 1. Check requirements: - - Python 3.6 + - Python 3.7 - [Gurobi Optimizer](http://www.gurobi.com/) 2. Clone or download repository. 3. In your Python environment, run `pip install -e path_to_cobmo_repository`. -### Alternative Installation +### Alternative installation If you are running into errors when installing or running CoBMo, this may be due to incompatibility with new versions of package dependencies, which have yet to be discovered and fixed. As a workaround, try installing CoBMo in an tested Anaconda environment via the the provided `environment.yml`, which represents the latest Anaconda Python environment in which CoBMo was tested and is expected to work. @@ -24,6 +24,28 @@ If you are running into errors when installing or running CoBMo, this may be due Please also create an issue on Github if you run into problems with the normal installation procedure. ``` +## Examples + +The `examples` directory contains several run scripts which demonstrate possible usages of CoBMo: + +- `run_example.py`: Example run script for using the building model. +- `run_storage_planning_example.py`: Run script for single simulation / optimization of sensible thermal or battery storage. +- `run_storage_planning_battery_cases.py`: Run script for BES cases lifetime. +- `run_validation.py`: Run script for building model validation. +- `run_evaluation_load_reduction.py`: Run script for evaluating demand side flexibility in terms of load reduction. +- `run_evaluation_price_sensitivity.py`: Run script for evaluating demand side flexibility in terms of price sensitivity. + +## Papers + +The following papers have been prepared with CoBMo: + +- Anthony Vautrin, Sebastian Troitzsch, Srikkanth Ramachandran, and Thomas Hamacher (2019). **Demand Controlled Ventilation for Electric Demand Side Flexibility.** IBPSA Building Simulation Conference. + - A preliminary implementation of CoBMo was used to prepare the results for this paper. + - The related scripts are currently not included in the repository. +- [Submitted.] Sebastian Troitzsch, and Thomas Hamacher. **Control-oriented Thermal Building Modelling.** + - CoBMo [version 0.3.0](https://github.com/TUMCREATE-ESTL/cobmo/releases/tag/0.3.0) was used to prepare the results for this paper. + - The related scripts are [`examples/run_evaluation_load_reduction.py`](https://github.com/TUMCREATE-ESTL/cobmo/blob/0.3.0/examples/run_evaluation_load_reduction.py) and [`examples/run_evaluation_price_sensitivity.py`](https://github.com/TUMCREATE-ESTL/cobmo/blob/0.3.0/examples/run_evaluation_price_sensitivity.py). + ## Contributing If you are keen to contribute to this project, please see [Contributing](contributing.md). diff --git a/docs/readthedocs.yml b/docs/readthedocs.yml index 8b18104e..6e85688f 100644 --- a/docs/readthedocs.yml +++ b/docs/readthedocs.yml @@ -14,7 +14,8 @@ formats: all # Optionally set the version of Python and requirements required to build your docs python: - version: 3.6 + version: 3.7 install: + - requirements: docs/requirements.txt - method: pip path: . \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 00000000..40cca8bd --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1 @@ +sphinx_markdown_tables \ No newline at end of file diff --git a/environment.yml b/environment.yml index c93f84e0..d03abd21 100644 --- a/environment.yml +++ b/environment.yml @@ -2,31 +2,51 @@ name: cobmo channels: - defaults dependencies: - - certifi=2019.6.16=py36_0 - - pip=19.1.1=py36_0 - - python=3.6.8=h9f7ef89_7 - - setuptools=41.0.1=py36_0 - - sqlite=3.29.0=he774522_0 + - ca-certificates=2019.10.16=0 + - certifi=2019.9.11=py37_0 + - openssl=1.1.1d=he774522_3 + - pip=19.3.1=py37_0 + - python=3.7.5=h8c8aaf0_0 + - setuptools=41.6.0=py37_0 + - sqlite=3.30.1=he774522_0 - vc=14.1=h0510ff6_4 - - vs2015_runtime=14.15.26706=h3a45250_4 - - wheel=0.33.4=py36_0 - - wincertstore=0.2=py36h7fe50ca_0 + - vs2015_runtime=14.16.27012=hf0eaf9b_0 + - wheel=0.33.6=py37_0 + - wincertstore=0.2=py37_0 - pip: - appdirs==1.4.3 + - bokeh==1.4.0 - chardet==3.0.4 + - colorcet==2.0.2 - coolprop==6.2.1 + - cycler==0.10.0 + - holoviews==1.12.6 + - hvplot==0.5.2 - idna==2.8 + - jinja2==2.10.3 + - kiwisolver==1.1.0 + - markupsafe==1.1.1 + - matplotlib==3.1.1 - nose==1.3.7 - - numpy==1.16.4 - - pandas==0.24.2 + - numpy==1.17.4 + - packaging==19.2 + - pandas==0.25.3 + - param==1.9.2 + - pillow==6.2.1 - ply==3.11 - pvlib==0.6.3 - - pyomo==5.6.6 - - python-dateutil==2.8.0 - - pytz==2019.1 - - pyutilib==5.7.1 + - pyct==0.4.6 + - pyomo==5.6.7 + - pyparsing==2.4.5 + - python-dateutil==2.8.1 + - pytz==2019.3 + - pyutilib==5.7.2 + - pyviz-comms==0.7.2 + - pyyaml==5.1.2 - requests==2.22.0 - - scipy==1.3.0 - - six==1.12.0 - - urllib3==1.25.3 + - scipy==1.3.2 + - seaborn==0.9.0 + - six==1.13.0 + - tornado==6.0.3 + - urllib3==1.25.6 diff --git a/examples/run_evaluation_load_reduction.py b/examples/run_evaluation_load_reduction.py new file mode 100644 index 00000000..0c4befb9 --- /dev/null +++ b/examples/run_evaluation_load_reduction.py @@ -0,0 +1,224 @@ +"""Run script for evaluating demand side flexibility in terms of load reduction.""" + +import hvplot +import hvplot.pandas +import numpy as np +import os +import pandas as pd + +import cobmo.building +import cobmo.controller +import cobmo.database_interface +import cobmo.utils + + +# Set `scenario_name`. +scenario_name = 'paper_pesgm_2020' + +# Set results path and create the directory. +results_path = os.path.join(cobmo.config.results_path, 'run_evaluation_load_reduction_' + cobmo.config.timestamp) +os.mkdir(results_path) +os.mkdir(os.path.join(results_path, 'plots')) +os.mkdir(os.path.join(results_path, 'details')) + +# Obtain a connection to the database. +conn = cobmo.database_interface.connect_database() + +# Define the building model (main function of the CoBMo toolbox). +# - Generates the building model for given `scenario_name` based on the building definitions in the `data` directory. +building = cobmo.building.Building( + conn=conn, + scenario_name=scenario_name +) + +# Save building model matrices to CSV for debugging. +building.state_matrix.to_csv(os.path.join(results_path, 'building_state_matrix.csv')) +building.control_matrix.to_csv(os.path.join(results_path, 'building_control_matrix.csv')) +building.disturbance_matrix.to_csv(os.path.join(results_path, 'building_disturbance_matrix.csv')) +building.state_output_matrix.to_csv(os.path.join(results_path, 'building_state_output_matrix.csv')) +building.control_output_matrix.to_csv(os.path.join(results_path, 'building_control_output_matrix.csv')) +building.disturbance_output_matrix.to_csv(os.path.join(results_path, 'building_disturbance_output_matrix.csv')) +building.disturbance_timeseries.to_csv(os.path.join(results_path, 'building_disturbance_timeseries.csv')) + +# Run controller for baseline case. +controller_baseline = cobmo.controller.Controller( + conn=conn, + building=building +) +( + control_timeseries_baseline, + state_timeseries_baseline, + output_timeseries_baseline, + operation_cost_baseline, + investment_cost_baseline, # Zero when running (default) operation problem. + storage_size_baseline # Zero when running (default) operation problem. +) = controller_baseline.solve() + +# Print operation cost for debugging. +print("operation_cost_baseline = {}".format(operation_cost_baseline)) + +# Save controller timeseries to CSV for debugging. +control_timeseries_baseline.to_csv(os.path.join(results_path, 'control_timeseries_baseline.csv')) +state_timeseries_baseline.to_csv(os.path.join(results_path, 'state_timeseries_baseline.csv')) +output_timeseries_baseline.to_csv(os.path.join(results_path, 'output_timeseries_baseline.csv')) + +# Instantiate load reduction iteration variables. +set_time_duration = ( + pd.Index([ + pd.to_timedelta('{}h'.format(time_duration)) + for time_duration in np.arange(0.5, 6.5, 0.5) + ]) +) +set_timesteps = building.set_timesteps +load_reduction_energy_results = pd.DataFrame( + None, + set_timesteps, + set_time_duration +) +load_reduction_power_results = pd.DataFrame( + None, + set_timesteps, + set_time_duration +) +load_reduction_percent_results = pd.DataFrame( + None, + set_timesteps, + set_time_duration +) + +# Iterate load reduction calculation. +for time_duration in set_time_duration: + for timestep in set_timesteps: + if (timestep + time_duration) > building.set_timesteps[-1]: + break # Interrupt loop if end time goes beyond building model time horizon. + elif ( + output_timeseries_baseline.loc[timestep, output_timeseries_baseline.columns.str.contains('electric_power')] + == 0.0 + ).all(): + continue # Skip loop if there is no baseline demand in the start timestep (no reduction possible). + else: + # Print status info. + print("Calculate load reduction for: time_duration = {} / timestep = {}".format(time_duration, timestep)) + + # Run controller for load reduction case. + controller_load_reduction = cobmo.controller.Controller( + conn=conn, + building=building, + problem_type='load_reduction', + output_timeseries_reference=output_timeseries_baseline, + load_reduction_start_time=timestep, + load_reduction_end_time=timestep + time_duration + ) + ( + control_timeseries_load_reduction, + state_timeseries_load_reduction, + output_timeseries_load_reduction, + operation_cost_load_reduction, + investment_cost_load_reduction, # Represents load reduction. + storage_size_load_reduction + ) = controller_load_reduction.solve() + + # Save controller timeseries to CSV for debugging. + control_timeseries_load_reduction.to_csv(os.path.join( + results_path, 'details', '{} - {} control_timeseries.csv'.format(time_duration, timestep).replace(':', '-') + )) + control_timeseries_load_reduction.to_csv(os.path.join( + results_path, 'details', '{} - {} state_timeseries.csv'.format(time_duration, timestep).replace(':', '-') + )) + control_timeseries_load_reduction.to_csv(os.path.join( + results_path, 'details', '{} - {} output_timeseriesd.csv'.format(time_duration, timestep).replace(':', '-') + )) + + # Plot demand comparison for debugging. + electric_power_comparison = pd.concat( + [ + output_timeseries_baseline.loc[:, output_timeseries_baseline.columns.str.contains('electric_power')].sum(axis=1), + output_timeseries_load_reduction.loc[:, output_timeseries_load_reduction.columns.str.contains('electric_power')].sum(axis=1), + ], + keys=[ + 'baseline', + 'load_reduction', + ], + names=[ + 'type' + ], + axis=1 + ) + + # Hvplot has no default options. + # Workaround: Pass this dict to every new plot. + hvplot_default_options = dict(width=1500, height=300) + + electric_power_plot = ( + electric_power_comparison.stack().rename('electric_power').reset_index() + ).hvplot.step( + x='time', + y='electric_power', + by=['type'], + **hvplot_default_options + ) + + # Define layout and labels / render plots. + hvplot.save( + ( + electric_power_plot + ).redim.label( + time="Date / time", + electric_power="Electric power [W]", + ), + # ).cols(1), + # Plots open in are also stored in results directory. + filename=os.path.join( + results_path, 'plots', '{} - {}.html'.format(time_duration, timestep).replace(':', '-') + ) + ) + + # Calculate results. + # TODO: Move timestep_delta into building model. + timestep_delta = building.set_timesteps[1] - building.set_timesteps[0] + baseline_energy = ( + output_timeseries_baseline.loc[ + timestep:(timestep + time_duration), + output_timeseries_baseline.columns.str.contains('electric_power') + ].sum().sum() + * timestep_delta.seconds / 3600.0 / 1000.0 # W in kWh. + ) + load_reduction_percent = - investment_cost_load_reduction # In percent. + load_reduction_energy = ( + (load_reduction_percent / 100.0) + * baseline_energy + ) # in kWh. + load_reduction_power = ( + load_reduction_energy + / (time_duration.total_seconds() / 3600.0) # kWh in kW. + ) + + # Print results. + print("load_reduction_energy = {}".format(load_reduction_energy)) + print("load_reduction_power = {}".format(load_reduction_power)) + print("load_reduction_percent = {}".format(load_reduction_percent)) + + # Store results. + load_reduction_energy_results.at[timestep, time_duration] = load_reduction_energy + load_reduction_power_results.at[timestep, time_duration] = load_reduction_power + load_reduction_percent_results.at[timestep, time_duration] = load_reduction_percent + +# Aggregate load reduction results. +load_reduction_energy_mean = load_reduction_energy_results.mean() +load_reduction_power_mean = load_reduction_power_results.mean() +load_reduction_percent_mean = load_reduction_percent_results.mean() + +# Print load reduction results for debugging. +print("load_reduction_percent_results = \n{}".format(load_reduction_percent_results)) +print("load_reduction_percent_mean = \n{}".format(load_reduction_percent_mean)) + +# Save results to CSV. +load_reduction_energy_results.to_csv(os.path.join(results_path, 'load_reduction_energy_results.csv')) +load_reduction_power_results.to_csv(os.path.join(results_path, 'load_reduction_power_results.csv')) +load_reduction_percent_results.to_csv(os.path.join(results_path, 'load_reduction_percent_results.csv')) +load_reduction_energy_mean.to_csv(os.path.join(results_path, 'load_reduction_energy_mean.csv')) +load_reduction_power_mean.to_csv(os.path.join(results_path, 'load_reduction_power_mean.csv')) +load_reduction_percent_mean.to_csv(os.path.join(results_path, 'load_reduction_percent_mean.csv')) + +# Print results path for debugging. +print("Results are stored in: " + results_path) diff --git a/examples/run_evaluation_price_sensitivity.py b/examples/run_evaluation_price_sensitivity.py new file mode 100644 index 00000000..edc31395 --- /dev/null +++ b/examples/run_evaluation_price_sensitivity.py @@ -0,0 +1,196 @@ +"""Run script for evaluating demand side flexibility in terms of price sensitivity.""" + +import hvplot +import hvplot.pandas +import numpy as np +import os +import pandas as pd + +import cobmo.building +import cobmo.controller +import cobmo.database_interface +import cobmo.utils + + +# Set `scenario_name`. +scenario_name = 'paper_pesgm_2020' + +# Set results path and create the directory. +results_path = os.path.join(cobmo.config.results_path, 'run_evaluation_price_sensitivity_' + cobmo.config.timestamp) +os.mkdir(results_path) +os.mkdir(os.path.join(results_path, 'plots')) +os.mkdir(os.path.join(results_path, 'details')) + +# Obtain a connection to the database. +conn = cobmo.database_interface.connect_database() + +# Define the building model (main function of the CoBMo toolbox). +# - Generates the building model for given `scenario_name` based on the building definitions in the `data` directory. +building = cobmo.building.Building( + conn=conn, + scenario_name=scenario_name +) + +# Save building model matrices to CSV for debugging. +building.state_matrix.to_csv(os.path.join(results_path, 'building_state_matrix.csv')) +building.control_matrix.to_csv(os.path.join(results_path, 'building_control_matrix.csv')) +building.disturbance_matrix.to_csv(os.path.join(results_path, 'building_disturbance_matrix.csv')) +building.state_output_matrix.to_csv(os.path.join(results_path, 'building_state_output_matrix.csv')) +building.control_output_matrix.to_csv(os.path.join(results_path, 'building_control_output_matrix.csv')) +building.disturbance_output_matrix.to_csv(os.path.join(results_path, 'building_disturbance_output_matrix.csv')) +building.disturbance_timeseries.to_csv(os.path.join(results_path, 'building_disturbance_timeseries.csv')) + +# Run controller for baseline case. +controller_baseline = cobmo.controller.Controller( + conn=conn, + building=building +) +( + control_timeseries_baseline, + state_timeseries_baseline, + output_timeseries_baseline, + operation_cost_baseline, + investment_cost_baseline, # Zero when running (default) operation problem. + storage_size_baseline # Zero when running (default) operation problem. +) = controller_baseline.solve() + +# Print operation cost for debugging. +print("operation_cost_baseline = {}".format(operation_cost_baseline)) + +# Save controller timeseries to CSV for debugging. +control_timeseries_baseline.to_csv(os.path.join(results_path, 'control_timeseries_baseline.csv')) +state_timeseries_baseline.to_csv(os.path.join(results_path, 'state_timeseries_baseline.csv')) +output_timeseries_baseline.to_csv(os.path.join(results_path, 'output_timeseries_baseline.csv')) + +# Instantiate load reduction iteration variables. +set_price_factors = pd.Index(np.concatenate([np.arange(0.0, 1.0, 0.25), np.arange(1.0, 25.0, 5.0)])) +set_timesteps = building.set_timesteps +load_change_percent_results = pd.DataFrame( + None, + set_timesteps, + set_price_factors +) + +# Iterate load reduction calculation. +for price_factor in set_price_factors: + for timestep in set_timesteps: + # TODO: Check if this condition is necessary. + if ( + output_timeseries_baseline.loc[timestep, output_timeseries_baseline.columns.str.contains('electric_power')] + == 0.0 + ).all(): + continue # Skip loop if there is no baseline demand in the start timestep (no reduction possible). + else: + # Print status info. + print("Calculate price sensitivity for: price_factor = {} / timestep = {}".format(price_factor, timestep)) + + # Run controller for load reduction case. + controller_price_sensitivity = cobmo.controller.Controller( + conn=conn, + building=building, + problem_type='price_sensitivity', + price_sensitivity_factor=price_factor, + price_sensitivity_timestep=timestep + ) + ( + control_timeseries_price_sensitivity, + state_timeseries_price_sensitivity, + output_timeseries_price_sensitivity, + operation_cost_price_sensitivity, + investment_cost_price_sensitivity, # Represents load reduction. + storage_size_price_sensitivity + ) = controller_price_sensitivity.solve() + + # Save controller timeseries to CSV for debugging. + control_timeseries_price_sensitivity.to_csv(os.path.join( + results_path, 'details', '{} - {} control_timeseries.csv'.format(price_factor, timestep).replace(':', '-') + )) + state_timeseries_price_sensitivity.to_csv(os.path.join( + results_path, 'details', '{} - {} state_timeseries.csv'.format(price_factor, timestep).replace(':', '-') + )) + output_timeseries_price_sensitivity.to_csv(os.path.join( + results_path, 'details', '{} - {} output_timeseriesd.csv'.format(price_factor, timestep).replace(':', '-') + )) + + # Plot demand comparison for debugging. + electric_power_comparison = pd.concat( + [ + output_timeseries_baseline.loc[:, output_timeseries_baseline.columns.str.contains('electric_power')].sum(axis=1), + output_timeseries_price_sensitivity.loc[:, output_timeseries_price_sensitivity.columns.str.contains('electric_power')].sum(axis=1), + ], + keys=[ + 'baseline', + 'price_sensitivity', + ], + names=[ + 'type' + ], + axis=1 + ) + + # Hvplot has no default options. + # Workaround: Pass this dict to every new plot. + hvplot_default_options = dict(width=1500, height=300) + + electric_power_plot = ( + electric_power_comparison.stack().rename('electric_power').reset_index() + ).hvplot.step( + x='time', + y='electric_power', + by=['type'], + **hvplot_default_options + ) + + # Define layout and labels / render plots. + hvplot.save( + ( + electric_power_plot + ).redim.label( + time="Date / time", + electric_power="Electric power [W]", + ), + # ).cols(1), + # Plots open in are also stored in results directory. + filename=os.path.join( + results_path, 'plots', '{} - {}.html'.format(price_factor, timestep).replace(':', '-') + ) + ) + + # Calculate results. + baseline_power = ( + output_timeseries_baseline.loc[ + timestep, + output_timeseries_baseline.columns.str.contains('electric_power') + ].sum() + ) + price_sensitivity_power = ( + output_timeseries_price_sensitivity.loc[ + timestep, + output_timeseries_price_sensitivity.columns.str.contains('electric_power') + ].sum() + ) + load_change_percent = ( + (price_sensitivity_power - baseline_power) + / baseline_power + * 100.0 + ) # In percent. + + # Print results. + print("load_change_percent = {}".format(load_change_percent)) + + # Store results. + load_change_percent_results.at[timestep, price_factor] = load_change_percent + +# Aggregate load reduction results. +load_change_percent_mean = load_change_percent_results.mean() + +# Print load reduction results for debugging. +print("load_change_percent_results = \n{}".format(load_change_percent_results)) +print("load_change_percent_mean = \n{}".format(load_change_percent_mean)) + +# Save results to CSV. +load_change_percent_results.to_csv(os.path.join(results_path, 'load_change_percent_results.csv')) +load_change_percent_mean.to_csv(os.path.join(results_path, 'load_change_percent_mean.csv')) + +# Print results path for debugging. +print("Results are stored in: " + results_path) diff --git a/setup.py b/setup.py index d0d4fbbd..d97936f4 100644 --- a/setup.py +++ b/setup.py @@ -1,13 +1,11 @@ -""" -Building model installation script -""" +"""Installation script.""" -from setuptools import setup, find_packages +import setuptools -setup( +setuptools.setup( name='cobmo', - version='0.1', - py_modules=find_packages(), + version='0.3.0', + py_modules=setuptools.find_packages(), install_requires=[ 'CoolProp==6.2.1', 'hvplot',