Tutorial de optimización - KPI de script personalizado, ejemplo 4 - Añadir un script Python de confort TM52 al ejemplo 3
Este ejemplo amplía el ejemplo 3 añadiendo una restricción para garantizar que se cumplen los criterios de confort estival de CIBSE TM52 , además del objetivo de optimización «Minimise % PPD Discomfort». DesignBuilder no incluye un KPI integrado de confort TM52, por lo que se añade mediante un script Python.
Se muestra el uso de 2 KPI personalizados: uno para el objetivo de falta de confort PPD y otro para la restricción TM52.
Paso 1 - Activar resultados TM52
Abre el modelo guardado del ejemplo 3 y el cuadro Opciones del modelo. En la pestaña Simulación, bajo Resultados, marca la casilla CIBSE TM52 para que DesignBuilder genere los resultados estándar TM52. Estos deberán procesarse para obtener un único valor de falta de confort para todo el edificio; escribiremos un script Python para ello en el Paso 3.
Paso 2 - Añadir una restricción
1. Abre el cuadro Ajustes paramétricos haciendo clic en el icono
de la barra de herramientas.
2. Ve a la pestaña Restricciones y añade 1 restricción nueva para la falta de confort TM52. Los pasos se describen a continuación.
TM52 Discomfort
Para crear la restricción de confort TM52 debes crear primero un resultado resumido o KPI. Haz clic en KPI de resultado para abrir la lista de resultados resumidos existentes en el panel de información. El KPI personalizado aún no aparecerá; créalo seleccionando el resultado Custom Script existente de la lista de KPI, haciendo clic en el icono Crear copia del elemento resaltado de la barra de información y editando la copia. Aplica los siguientes ajustes en el cuadro Resultado resumido.
Nota importante: El nombre «TM52 Discomfort %» introducido aquí debe coincidir con el texto escrito en el campo 0 del registro añadido a la tabla «ParamResultsTmp» del script. Puedes copiar el nombre y guardarlo en un lugar accesible para utilizarlo al escribir el script.
Guarda el KPI creado y selecciónalo en el cuadro Restricciones de optimización .
Establece el valor máximo en 1 para que el cuadro tenga este aspecto:
Paso 3 - Escribir un script Python para el KPI personalizado
La siguiente tarea es escribir el script que leerá los resultados base TM52 del archivo SQL, los procesará y los devolverá a DesignBuilder como KPI personalizado. Los pasos son:
1. Haz clic en el icono Scripts
de la barra de herramientas para abrir el gestor de scripts y marca la casilla Activar scripts .
2. Haz clic en el elemento de selección Script. En el panel de información de la derecha aparecerá una lista de scripts existentes.
3. Haz clic en la categoría Python-Script y pulsa el icono Añadir elemento nuevo de la barra de información para abrir el cuadro de edición de scripts.
4. Marca la opción Activar programa .
5. Asigna al script el nombre "TM52 Discomfort".
6. Copia y pega el siguiente script en la ventana de script.
El script lee los resultados TM52 Criteria 1, 2 y 3 y los compara con los criterios correspondientes según las reglas TM52. El área de cualquier zona que cumpla los criterios anuales globales TM52 se excluye del área total que no los cumple. El valor TM52 Discomfort % de la simulación se añade a la tabla especial «ParamResultsTmp» junto con el nombre del objetivo para que DesignBuilder lo recoja al procesar los resultados.
Los 2 resultados resumidos «TM52 Discomfort %» y «PPD Discomfort > 20%» se añaden como registros separados a la tabla «ParamResultsTmp». En un análisis más elaborado podrían añadirse más KPI.
"""
Use CIBSE TM52 results as optimisation KPI.
Required model inputs:
- Enable TM52 outputs
- Add a "Custom Script" KPI, use "TM52 Discomfort %" name
- Run a "Standard" simulation to make sure that TM52 outputs are present
The script calculates a percentage of failing TM52 relevant zones.
"""
import ctypes
import os
from db_eplusout_reader import Variable, get_results
from db_eplusout_reader.constants import *
from db_eplusout_reader.exceptions import NoResults
threshold_crit1 = 3
threshold_crit2 = 6
threshold_crit3 = 0
def show_message(title, text):
ctypes.windll.user32.MessageBoxW(0, text, title, 0)
def zone_fails_tm52(zone_name):
"""Verify if given zone meets tm52 criteria."""
outputs_path = os.path.join(api_environment.EnergyPlusFolder, "eplusout.sql")
variable1 = Variable("EMS", "CIBSE TM52 Criterion 1 {}".format(zone_name), "%")
variable2 = Variable("EMS", "CIBSE TM52 Criterion 2 {}".format(zone_name), "C")
variable3 = Variable("EMS", "CIBSE TM52 Criterion 3 {}".format(zone_name), "hr")
criterion_1_results = get_results(outputs_path, variable1, RP)
criterion_2_results = get_results(outputs_path, variable2, D)
criterion_3_results = get_results(outputs_path, variable3, RP)
criterion_1 = criterion_1_results.scalar
crit2_series = criterion_2_results.first_array
criterion_2 = max(crit2_series)
criterion_3 = criterion_3_results.scalar
counter = 0
if criterion_1 > threshold_crit1:
counter += 1
if criterion_2 > threshold_crit2:
counter += 1
if criterion_3 > threshold_crit3:
counter += 1
return counter >= 2
def after_energy_simulation():
site = api_environment.Site
fail_area = 0
total_area = 0 # area only includes TM52 zones
for block in active_building.BuildingBlocks:
for zone in block.Zones:
zone_name = zone.GetAttribute("SSEPObjectNameInOP")
try:
if zone_fails_tm52(zone_name):
fail_area += zone.FloorArea
total_area += zone.FloorArea
except NoResults:
pass
try:
percentage_area_fail = (fail_area / total_area) * 100
except ZeroDivisionError:
raise NoResults("No TM52 results found!")
# show_message("Results TM52", "{}% fails, total_area {}m2, fail_area: {}m2".format(percentage_area_fail, total_area, fail_area))
table = site.GetTable("ParamResultsTmp")
record = table.AddRecord()
record[0] = "TM52 Discomfort %"
record[1] = str(percentage_area_fail)
Consejo: Para ahorrar tiempo puedes copiar el script anterior y pegarlo en el cuadro.
Consejo: El DesignBuilderSoftware \ db-scripts repositorio Github incluye las versiones más recientes del script anterior y otros scripts de tutoriales y ejemplos de DesignBuilder.
Paso 6 - Volver a ejecutar una simulación estándar
Haz clic en la pestaña Simulación y pulsa actualizar para volver a ejecutar una simulación anual base con la opción de resultados Mensual y RunPeriod marcada.
Nota importante: Asegúrate de desactivar los resultados Diarios, horarios y subhorarios para esta simulación, de modo que las próximas simulaciones de optimización y el procesamiento de resultados sean eficientes.
Nota: El script anterior se muestra con la línea show_message comentada, pero el mensaje puede activarse eliminando el carácter «#» para mostrar los resultados de cumplimiento TM52. Cuando hayas comprobado que el script TM52 funciona correctamente, puedes eliminar o comentar la línea show_message para evitar mensajes después de cada simulación durante la optimización.
Paso 7 - Ejecutar la optimización
Ve a la pestaña Optimización + UA/SA de la pantalla Simulación y pulsa el icono Actualizar de la barra de herramientas para abrir el cuadro Opciones de cálculo de optimización. Puedes aceptar los ajustes predeterminados.
Pulsa el botón Iniciar para ejecutar las simulaciones de optimización.
Consejo: Al ejecutar optimizaciones con restricciones suele ser necesario probar más iteraciones para encontrar soluciones óptimas que cumplan los objetivos y las restricciones. Aunque la aptitud de los diseños se evalúa en parte según el cumplimiento de restricciones, la aptitud basada en objetivos tiene mayor peso para seleccionar nuevas generaciones.
Una vez que la optimización haya convergido y cierres el cuadro Opciones de cálculo, deberías ver resultados similares a los siguientes en la pantalla principal.
Los resultados muestran que, para minimizar simultáneamente la falta de confort PPD y la carga de calefacción cumpliendo TM52, los ajustes óptimos son:
-
Temperatura de consigna de calefacción próxima a 20°C.
-
Temperatura de consigna de ventilación natural próxima a 25.5°C. Los valores inferiores aumentan la calefacción y ventilación simultáneas y, por tanto, la carga de calefacción sin mejorar el confort; los superiores no proporcionan suficiente ventilación estival para cumplir la restricción TM52.
-
Se requiere un % de apertura de ventana de 100% para cumplir la restricción TM52. Los valores inferiores no proporcionan suficiente ventilación para mantener frescos a los ocupantes y cumplir los requisitos de confort estival TM52.
Al comparar estos resultados con los del ejemplo 3 sin la restricción TM52, se observa que cumplir TM52 requiere más ventilación natural, tanto en temperatura de consigna como en área de apertura de ventanas. Aunque un área de apertura de 50% y una consigna de ventilación natural de 26-27°C bastan para mantener confortable la mayor parte del edificio la mayor parte del tiempo según PPD, añadir la restricción TM52 exige mucha más ventilación. Esto implica más calefacción y ventilación simultáneas durante las estaciones intermedias y una carga de calefacción considerablemente mayor.
Para evitar la calefacción y ventilación simultáneas de las soluciones «óptimas» anteriores sería necesario introducir reglas de control más elaboradas, reduciendo así la carga de calefacción sin dejar de cumplir TM52. Por ejemplo, limitar el % de apertura de ventanas según las temperaturas exterior e interior ayudaría a reducir esa simultaneidad. Puede añadirse código EMS para conseguirlo.


