Initial simplification
This commit is contained in:
parent
fda986dc87
commit
d4e444e3e7
63
bootstrap.py
63
bootstrap.py
|
@ -5,37 +5,28 @@ Copyright © 2021 Project Author name guillermo.gutierrezmorote@concordia.ca
|
||||||
Project Collaborator name peteryefi@gmail.com
|
Project Collaborator name peteryefi@gmail.com
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
import yaml
|
import yaml
|
||||||
|
from flasgger import LazyJSONEncoder, Swagger
|
||||||
|
from flask import Response, jsonify
|
||||||
from flask_restful import Api
|
from flask_restful import Api
|
||||||
from hub_api.city_info import CityInfo, City
|
from flask_swagger import swagger
|
||||||
from hub_api.geometry import Geometry
|
|
||||||
from hub_api.greenery_catalog import GreeneryCatalogEntries
|
import hub_api.helpers.session_helper as sh
|
||||||
from hub_api.greenery_catalog import GreeneryCatalogEntry
|
from hub_api.construction_catalog import ConstructionCatalogEntry, ConstructionCatalogEntries, ConstructionCatalogNames
|
||||||
from hub_api.greenery_catalog import GreeneryCatalogNames
|
from hub_api.greenery_catalog import GreeneryCatalogEntry, GreeneryCatalogEntries, GreeneryCatalogNames
|
||||||
from hub_api.construction_catalog import ConstructionCatalogEntries
|
|
||||||
from hub_api.construction_catalog import ConstructionCatalogEntry
|
|
||||||
from hub_api.construction_catalog import ConstructionCatalogNames
|
|
||||||
from hub_api.usage_catalog import UsageCatalogEntries
|
|
||||||
from hub_api.usage_catalog import UsageCatalogEntry
|
|
||||||
from hub_api.usage_catalog import UsageCatalogNames
|
|
||||||
from hub_api.heat_pump import HeatPump
|
|
||||||
from hub_api.lca import MaterialLCACatalog
|
|
||||||
from hub_api.lca import MaterialLCACalculations
|
|
||||||
from hub_api.construction import Construction
|
|
||||||
from hub_api.usage import Usage
|
|
||||||
from hub_api.energy_demand import EnergyDemand
|
|
||||||
from hub_api.session import SessionStart, SessionEnd, KeepSessionAlive
|
from hub_api.session import SessionStart, SessionEnd, KeepSessionAlive
|
||||||
from hub_api.uptime import Uptime
|
from hub_api.uptime import Uptime
|
||||||
from hub_api.greenery import Greenery
|
from hub_api.usage_catalog import UsageCatalogEntry, UsageCatalogEntries, UsageCatalogNames
|
||||||
from hub_api.user import User, UserLogin
|
from hub_api.user import User, UserLogin
|
||||||
from flasgger import LazyJSONEncoder, Swagger
|
|
||||||
|
|
||||||
app = flask.Flask('gamification')
|
sh.begin_time = datetime.datetime.now()
|
||||||
app.json_encoder = LazyJSONEncoder
|
app = flask.Flask('cerc_api')
|
||||||
|
app.json_provider_class = LazyJSONEncoder
|
||||||
api = Api(app)
|
api = Api(app)
|
||||||
|
|
||||||
|
|
||||||
with open("hub_api/docs/openapi-specs.yml", "r") as stream:
|
with open("hub_api/docs/openapi-specs.yml", "r") as stream:
|
||||||
swagger_config = {
|
swagger_config = {
|
||||||
"headers": [],
|
"headers": [],
|
||||||
|
@ -52,33 +43,37 @@ with open("hub_api/docs/openapi-specs.yml", "r") as stream:
|
||||||
"openapi": "3.0.0"
|
"openapi": "3.0.0"
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
Swagger(app, template=yaml.safe_load(stream), config=swagger_config)
|
sh.swagger_data = Swagger(app, template=yaml.safe_load(stream), config=swagger_config)
|
||||||
except yaml.YAMLError as exc:
|
except yaml.YAMLError as exc:
|
||||||
print(exc)
|
print(exc)
|
||||||
|
|
||||||
api.add_resource(Uptime, '/v1.4/uptime')
|
api.add_resource(Uptime, '/v1.4/uptime')
|
||||||
api.add_resource(Geometry, '/v1.4/geometry')
|
|
||||||
|
# Catalogs.
|
||||||
api.add_resource(GreeneryCatalogEntry, '/v1.4/greenery-catalog/entry')
|
api.add_resource(GreeneryCatalogEntry, '/v1.4/greenery-catalog/entry')
|
||||||
api.add_resource(GreeneryCatalogEntries, '/v1.4/greenery-catalog/entries')
|
api.add_resource(GreeneryCatalogEntries, '/v1.4/greenery-catalog/entries')
|
||||||
api.add_resource(GreeneryCatalogNames, '/v1.4/greenery-catalog/names')
|
api.add_resource(GreeneryCatalogNames, '/v1.4/greenery-catalog/names')
|
||||||
api.add_resource(ConstructionCatalogEntry, '/v1.4/construction-catalog/entry')
|
api.add_resource(ConstructionCatalogEntry, '/v1.4/construction-catalog/entry')
|
||||||
api.add_resource(ConstructionCatalogEntries, '/v1.4/construction-catalog/entries')
|
api.add_resource(ConstructionCatalogEntries, '/v1.4/construction-catalog/entries')
|
||||||
api.add_resource(ConstructionCatalogNames, '/v1.4/construction-catalog/names')
|
api.add_resource(ConstructionCatalogNames, '/v1.4/construction-catalog/names')
|
||||||
api.add_resource(Construction, '/v1.4/construction/<int:city_id>')
|
|
||||||
api.add_resource(UsageCatalogEntry, '/v1.4/usage-catalog/entry')
|
api.add_resource(UsageCatalogEntry, '/v1.4/usage-catalog/entry')
|
||||||
api.add_resource(UsageCatalogEntries, '/v1.4/usage-catalog/entries')
|
api.add_resource(UsageCatalogEntries, '/v1.4/usage-catalog/entries')
|
||||||
api.add_resource(UsageCatalogNames, '/v1.4/usage-catalog/names')
|
api.add_resource(UsageCatalogNames, '/v1.4/usage-catalog/names')
|
||||||
api.add_resource(Usage, '/v1.4/usage')
|
|
||||||
api.add_resource(EnergyDemand, '/v1.4/energy-demand/<int:city_id>')
|
# Session
|
||||||
# api.add_resource(LCA, '/v1.4/lca')
|
|
||||||
api.add_resource(MaterialLCACatalog, '/v1.4/material_lca_catalog/entries/<int:city_id>')
|
|
||||||
api.add_resource(MaterialLCACalculations, '/v1.4/material_lca_catalog/calculations/<int:city_id>')
|
|
||||||
api.add_resource(HeatPump, '/v1.4/heat-pump/<int:city_id>')
|
|
||||||
api.add_resource(User, '/v1.4/user')
|
api.add_resource(User, '/v1.4/user')
|
||||||
api.add_resource(UserLogin, '/v1.4/user/login')
|
api.add_resource(UserLogin, '/v1.4/user/login')
|
||||||
api.add_resource(SessionStart, '/v1.4/session/start')
|
api.add_resource(SessionStart, '/v1.4/session/start')
|
||||||
api.add_resource(SessionEnd, '/v1.4/session/end')
|
api.add_resource(SessionEnd, '/v1.4/session/end')
|
||||||
api.add_resource(KeepSessionAlive, '/v1.4/session/keep_alive')
|
api.add_resource(KeepSessionAlive, '/v1.4/session/keep_alive')
|
||||||
api.add_resource(CityInfo, '/v1.4/city/<int:city_id>')
|
|
||||||
api.add_resource(City, '/v1.4/city')
|
@app.route("/v1.4/spec")
|
||||||
api.add_resource(Greenery, '/v1.4/greenery')
|
def spec():
|
||||||
|
|
||||||
|
return jsonify(sh.swagger_data.config)
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def home():
|
||||||
|
return Response(headers={'Access-Control-Allow-Origin': '*'})
|
||||||
|
|
||||||
|
app.run(port=15789, host="0.0.0.0", debug=True)
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
"""
|
|
||||||
Main
|
|
||||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
||||||
Copyright © 2021 Project Author name guillermo.gutierrezmorote@concordia.ca
|
|
||||||
Project Collaborator name peteryefi@gmail.com
|
|
||||||
"""
|
|
||||||
|
|
||||||
from catalog_factories.construction_catalog_factory import ConstructionCatalogFactory
|
|
||||||
from catalog_factories.greenery_catalog_factory import GreeneryCatalogFactory
|
|
||||||
from catalog_factories.usage_catalog_factory import UsageCatalogFactory
|
|
||||||
from imports.construction_factory import ConstructionFactory
|
|
||||||
from imports.geometry_factory import GeometryFactory
|
|
||||||
from imports.life_cycle_assessment_factory import LifeCycleAssessment
|
|
||||||
# from imports.schedules_factory import SchedulesFactory
|
|
||||||
from imports.usage_factory import UsageFactory
|
|
||||||
from imports.weather_factory import WeatherFactory
|
|
||||||
from flask import Response
|
|
||||||
import hub_api.helpers.session_helper as sh
|
|
||||||
import datetime
|
|
||||||
from pathlib import Path
|
|
||||||
from bootstrap import app
|
|
||||||
|
|
||||||
sh.begin_time = datetime.datetime.now()
|
|
||||||
# initialize catalogs
|
|
||||||
sh.greenery_catalog = GreeneryCatalogFactory('nrel').catalog
|
|
||||||
sh.construction_catalog = ConstructionCatalogFactory('nrel').catalog
|
|
||||||
sh.usage_catalog = UsageCatalogFactory('comnet').catalog
|
|
||||||
|
|
||||||
# Enrich the city
|
|
||||||
data_path = (Path(__file__).parent / 'data').resolve()
|
|
||||||
rihno_path = (Path(data_path / 'dompark.3dm')).resolve()
|
|
||||||
city = GeometryFactory('rhino', rihno_path).city
|
|
||||||
|
|
||||||
for building in city.buildings:
|
|
||||||
# Rihno files have no information about the function or the year of construction
|
|
||||||
building.year_of_construction = 1995
|
|
||||||
building.function = 'industry'
|
|
||||||
building.human_readable_name = "Dompark"
|
|
||||||
|
|
||||||
ConstructionFactory('nrel', city).enrich()
|
|
||||||
UsageFactory('comnet', city).enrich()
|
|
||||||
# SchedulesFactory('comnet', city).enrich()
|
|
||||||
LifeCycleAssessment('material', city).enrich()
|
|
||||||
LifeCycleAssessment('machine', city).enrich()
|
|
||||||
LifeCycleAssessment('fuel', city).enrich()
|
|
||||||
LifeCycleAssessment('vehicle', city).enrich()
|
|
||||||
|
|
||||||
montreal_weather_file = (Path(__file__).parent / './data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw').resolve()
|
|
||||||
city.climate_file = (data_path / f'{city.climate_reference_city}.cli').resolve()
|
|
||||||
WeatherFactory('epw', city, file_name=montreal_weather_file).enrich()
|
|
||||||
|
|
||||||
# Rihno files have no information about the building location
|
|
||||||
city.name = 'Montreal'
|
|
||||||
city.climate_reference_city = 'Montreal'
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/")
|
|
||||||
def home():
|
|
||||||
return Response(headers={'Access-Control-Allow-Origin': '*'})
|
|
||||||
|
|
||||||
|
|
||||||
app.run(port=15789, host="0.0.0.0", debug=False)
|
|
|
@ -1,6 +1,6 @@
|
||||||
info:
|
info:
|
||||||
title: Gamification Swagger - OpenAPI 3.0
|
title: CERC API Swagger - OpenAPI 3.0
|
||||||
description: NextGen Cities Institute Gamification API
|
description: NextGen Cities Institute API
|
||||||
termsOfService: http://swagger.io/terms/
|
termsOfService: http://swagger.io/terms/
|
||||||
contact:
|
contact:
|
||||||
email: peteryefi@gmail.com
|
email: peteryefi@gmail.com
|
||||||
|
|
0
hub_api/docs/uptime.yml
Normal file
0
hub_api/docs/uptime.yml
Normal file
|
@ -8,6 +8,7 @@ import datetime
|
||||||
|
|
||||||
sessions = []
|
sessions = []
|
||||||
begin_time = None
|
begin_time = None
|
||||||
|
swagger_data = None
|
||||||
city = None
|
city = None
|
||||||
greenery_catalog = None
|
greenery_catalog = None
|
||||||
construction_catalog = None
|
construction_catalog = None
|
||||||
|
|
128
hub_api/lca.py
128
hub_api/lca.py
|
@ -1,128 +0,0 @@
|
||||||
"""
|
|
||||||
LCA
|
|
||||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
||||||
Copyright © 2021 Project Author name Atiya
|
|
||||||
Code contributors: Peter Yefi peteryefi@gmail.com
|
|
||||||
"""
|
|
||||||
import json
|
|
||||||
from flask import Response
|
|
||||||
from flask_restful import Resource
|
|
||||||
from lca_calculations import LcaCalculations
|
|
||||||
from itertools import groupby
|
|
||||||
from operator import itemgetter
|
|
||||||
from hub_api.helpers.auth import role_required
|
|
||||||
from hub_api.config import Config
|
|
||||||
from persistence.models import UserRoles
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MaterialLCACatalog(Resource, Config):
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_lca_value(city, nrel_id = None):
|
|
||||||
nrel_material = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "14", "15", "16", "18", "20", "21",
|
|
||||||
"22", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114"]
|
|
||||||
lca_material = ["12", "32", "21", "25", "11", "20", "40", "27", "29", "28", "19", "40", "41", "25", "32", "32", "32", "21", "41",
|
|
||||||
"21", "11", "33", "28", "11", "40", "1", "28", "41", "0", "0", "0", "0", "0", ]
|
|
||||||
keys = ['nrel_material_id', 'lca_material_id']
|
|
||||||
material_mapping = [dict(zip(keys, i)) for i in zip(nrel_material, lca_material)]
|
|
||||||
|
|
||||||
if nrel_id is None:
|
|
||||||
materials_lca = {"material_lca_catalog": []}
|
|
||||||
for mat in material_mapping:
|
|
||||||
|
|
||||||
if mat["nrel_material_id"] not in ("110", "111", "112", "113", "114"):
|
|
||||||
for material in city.lca_materials:
|
|
||||||
if(int(mat["lca_material_id"]) == material.id):
|
|
||||||
material_lca_catalog = {}
|
|
||||||
material_lca_catalog['nrel_material_id'] = mat["nrel_material_id"]
|
|
||||||
material_lca_catalog['embodied_carbon'] = material.embodied_carbon
|
|
||||||
mat_end_of_life = LcaCalculations(city).end_life_carbon(material.type)
|
|
||||||
material_lca_catalog['end_of_life_carbon'] = mat_end_of_life
|
|
||||||
materials_lca["material_lca_catalog"].append(material_lca_catalog)
|
|
||||||
|
|
||||||
else:
|
|
||||||
material_lca_catalog = {}
|
|
||||||
material_lca_catalog['nrel_material_id'] = mat["nrel_material_id"]
|
|
||||||
material_lca_catalog['embodied_carbon'] = 0.0
|
|
||||||
material_lca_catalog['end_of_life_carbon'] = 0.0
|
|
||||||
materials_lca["material_lca_catalog"].append(material_lca_catalog)
|
|
||||||
|
|
||||||
return materials_lca
|
|
||||||
|
|
||||||
else:
|
|
||||||
for mat in material_mapping:
|
|
||||||
if mat["nrel_material_id"] == str(nrel_id):
|
|
||||||
for material in city.lca_materials:
|
|
||||||
if (material.id == int(mat["lca_material_id"])):
|
|
||||||
return material.embodied_carbon, material.id, material.type, material.name, material.density
|
|
||||||
# return material.embodied_carbon
|
|
||||||
|
|
||||||
@role_required([UserRoles.Admin.value, UserRoles.Hub_Reader.value])
|
|
||||||
def get(self, city_id):
|
|
||||||
city = self.get_city(city_id)
|
|
||||||
try:
|
|
||||||
return Response(json.dumps(self.get_lca_value(city)), status=200)
|
|
||||||
except ValueError:
|
|
||||||
response = {'err_msg': f'No Catalog Available'}
|
|
||||||
return Response(json.dumps(response), status=400)
|
|
||||||
|
|
||||||
|
|
||||||
class MaterialLCACalculations(Resource, Config):
|
|
||||||
"""
|
|
||||||
LCA class
|
|
||||||
"""
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
@role_required([UserRoles.Admin.value, UserRoles.Hub_Reader.value])
|
|
||||||
def get(self, city_id):
|
|
||||||
"""
|
|
||||||
Auto-method for processing the lca request
|
|
||||||
:return: lca demand
|
|
||||||
"""
|
|
||||||
city = self.get_city(city_id)
|
|
||||||
|
|
||||||
materials_lca = {'Wall': [], 'Ground': [], 'Roof': []}
|
|
||||||
for building in city.buildings:
|
|
||||||
for internal_zone in building.internal_zones:
|
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
|
||||||
for i, layer in enumerate(thermal_boundary.layers):
|
|
||||||
material_layers_lca = {}
|
|
||||||
if layer.material.no_mass == False:
|
|
||||||
embodied_carbon, mat_id, mat_type, mat_name, mat_density = MaterialLCACatalog.get_lca_value(city, layer.material.id)
|
|
||||||
material_layers_lca['layer_name'] = f'Layer {i+1}'
|
|
||||||
material_layers_lca['nrel_material_id'] = layer.material.id
|
|
||||||
material_layers_lca['lca_material_id'] = mat_id
|
|
||||||
material_layers_lca['embodied_carbon'] = (layer.thickness * thermal_boundary.opaque_area) * mat_density * embodied_carbon
|
|
||||||
mat_end_of_life = LcaCalculations(city).end_life_carbon(mat_type)
|
|
||||||
material_end_of_life = mat_end_of_life * (layer.thickness * thermal_boundary.opaque_area) * mat_density
|
|
||||||
material_layers_lca['end_of_life_per_layer'] = material_end_of_life
|
|
||||||
materials_lca[thermal_boundary.type].append(material_layers_lca)
|
|
||||||
else:
|
|
||||||
material_layers_lca['layer_name'] = f'Layer {i+1}'
|
|
||||||
material_layers_lca['nrel_material_id'] = layer.material.id
|
|
||||||
material_layers_lca['lca_material_id'] = mat_id
|
|
||||||
material_layers_lca['embodied_carbon'] = (layer.thickness * thermal_boundary.opaque_area) * mat_density * embodied_carbon
|
|
||||||
material_layers_lca['end_of_life_per_layer'] = 0.0
|
|
||||||
materials_lca[thermal_boundary.type].append(material_layers_lca)
|
|
||||||
|
|
||||||
materials_embodied_carbon = {'Wall': [], 'Ground': [], 'Roof': []}
|
|
||||||
for key, value in materials_lca.items():
|
|
||||||
boundary_layers = sorted(value, key=itemgetter('layer_name'))
|
|
||||||
for b_layer, layer_properties in groupby(boundary_layers, key=itemgetter('layer_name')):
|
|
||||||
sum_embodied = 0.0
|
|
||||||
sum_end_of_life = 0.0
|
|
||||||
total_embodied_carbon = {}
|
|
||||||
for k in layer_properties:
|
|
||||||
sum_embodied += k["embodied_carbon"]
|
|
||||||
sum_end_of_life += k["end_of_life_per_layer"]
|
|
||||||
total_embodied_carbon['layer_name'] = b_layer
|
|
||||||
total_embodied_carbon['embodied_carbon'] = sum_embodied
|
|
||||||
total_embodied_carbon['end_of_life_carbon'] = sum_end_of_life
|
|
||||||
materials_embodied_carbon[key].append(total_embodied_carbon)
|
|
||||||
|
|
||||||
return Response(json.dumps(materials_embodied_carbon), status=200)
|
|
|
@ -6,12 +6,14 @@ Copyright © 2022 Project Author name guillermo.gutierrezmorote@concordia.ca
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from flasgger import swag_from
|
||||||
from flask import Response
|
from flask import Response
|
||||||
from flask_restful import Resource
|
from flask_restful import Resource
|
||||||
|
|
||||||
import hub_api.helpers.session_helper as sh
|
import hub_api.helpers.session_helper as sh
|
||||||
|
|
||||||
|
@swag_from('docs/uptime.yml')
|
||||||
class Uptime(Resource):
|
class Uptime(Resource):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
Loading…
Reference in New Issue
Block a user