Tutorial de optimización - KPI de script personalizado, ejemplo 3 - Scripts EMS + Python para optimizar controles de confort y calefacción
Este tutorial muestra cómo encontrar el conjunto óptimo de consignas de control de calefacción y ventilación natural que minimicen simultáneamente la falta de confort PPD de Fanger y la carga de calefacción del edificio completo. Como EnergyPlus no incluye una métrica PPD adecuada para todo el edificio, se escribe un script EMS personalizado para generar un resultado «Percentage Discomfort Area» en cada simulación que caracterice la falta de confort global de todas las zonas. Al combinarlo con un KPI de script personalizado puede utilizarse como objetivo de diseño de la optimización.
El script EMS calcula «Percentage Discomfort Area» para todo el edificio en cada paso de simulación, solo en periodos ocupados, sumando la superficie de las zonas sin confort con Fanger PPD < 20% y dividiéndola entre la superficie total. El % de superficie sin confort se promedia durante el año como valor único del edificio, que se lee y procesa en un script de KPI personalizado escrito en Python. El script Python utiliza la biblioteca db_eplusout_reader suministrada con DesignBuilder para leer y procesar el resultado EMS de confort del archivo SQL de simulación y devolver el resultado a DesignBuilder después de cada simulación.
Se identifican consignas óptimas de calefacción y ventilación natural que reduzcan la carga de calefacción y los niveles de falta de confort PPD.
El principal objetivo de aprendizaje es entender cómo generar un resultado personalizado de una simulación EnergyPlus mediante EMS y utilizarlo como KPI para identificar parámetros óptimos de diseño.
Paso 1 - Crear un modelo base
1. Crea un modelo nuevo situado en London Gatwick.
2. Añade un edificio con los ajustes predeterminados y dibuja un bloque rectangular de 40m por 20m y altura de 3.5m, como se muestra a continuación.
3. Divide el bloque en varias zonas como sigue. Las zonas de esquina orientadas al SE y SW tienen ambas una superficie de 10 x 10m. Para este tutorial se pretende crear zonas que se sobrecalienten en distintos grados durante los días calurosos. La distribución exacta no es especialmente importante:
4. Abre el cuadro Opciones del modelo:
-
Selecciona la opción Ventilación natural calculada .
-
Selecciona un valor relativamente alto de 10 para Pasos de tiempo por hora , ya que nos interesa la interacción entre las consignas de calefacción y ventilación y el modelo utiliza ventilación natural calculada.
-
Selecciona la opción de resultado Fanger , ya que leeremos los resultados PPD base generados por EnergyPlus.
5. En la pestaña Actividad a nivel de edificio:
-
Carga la plantilla de actividad Generic Office Area ; suele ser la predeterminada, por lo que probablemente no necesites hacerlo.
-
Selecciona la programación de ocupación 8:00 - 18:00 Mon - Fri que encontrarás en la categoría <General>. Se selecciona porque la programación predeterminada de oficinas incluye algo de ocupación tras apagar la calefacción al final del día, para tener en cuenta la limpieza. El cambio evita comprobar el confort cuando la calefacción está apagada.
6. En la pestaña Huecos a nivel de edificio:
-
Activa Sombra de ventana y utiliza la opción predeterminada Persiana con lamas de alta reflectividad .
-
Establece % de área de apertura del acristalamiento en 50%.
8. En la pestaña Iluminación carga la plantilla LED with linear control .
9. En la pestaña HVAC:
-
Carga la plantilla HW Convectors, Nat Vent HVAC.
-
Selecciona la programación de calefacción Winter heating (Northern Hemisphere) que encontrarás en la categoría <General> .
-
Activa la opción de ventilación natural Modular áreas de apertura para reducir las áreas de apertura durante periodos que requieren calefacción y disminuir la probabilidad de calefacción y ventilación simultáneas.
Paso 2 - Ejecutar una simulación para comprobar el modelo base
Haz clic en Simulación y ejecuta varias simulaciones para comprobar el funcionamiento de la ventilación natural y comprenderlo en la práctica. Probablemente convenga simular al menos las semanas de diseño y típica de verano y la semana de diseño de invierno con resultados horarios o subhorarios. ¿Se mantiene un confort adecuado en verano? ¿Es excesiva la tasa de renovación de aire? ¿Hay calefacción y ventilación simultáneas? Ajusta el modelo y repite hasta estar satisfecho con los resultados horarios del modelo base.
Paso 3 - Configurar los objetivos de optimización
1. Abre el cuadro Ajustes paramétricos haciendo clic en el icono
de la barra de herramientas y establece Tipo de análisis en la pestaña Análisis en 2-Optimización.
2. Ve a la pestaña Objetivos y añade 2 objetivos nuevos de confort y carga de calefacción. Puedes editar los existentes o eliminarlos primero y crear 2 nuevos. Los pasos se describen a continuación.
Minimise Discomfort > 20% PPD
Para crear el objetivo «Minimise Discomfort > 20% PPD» debes crear primero un resultado resumido o KPI. Haz clic en KPI objetivo 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 «PPD Discomfort > 20%» 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 Objetivos de optimización .
Denomina el objetivo «Minimise Discomfort > 20% PPD». Este nombre es solo para tu referencia y, a diferencia del nombre del resultado resumido, no necesita coincidir con ningún otro. Selecciona la opción 1-Mín de mínimo/máximo para indicar que deseas minimizar la falta de confort. El cuadro debería parecerse a la captura siguiente.
Carga de calefacción
Crea ahora el objetivo de carga de calefacción. Es sencillo porque podemos utilizar un KPI estándar integrado.
Selecciona el KPI Carga de calefacción y denomina el objetivo «Heating load». Selecciona la opción 1-Mín de mínimo/máximo para indicar que deseas minimizarlo. El cuadro debería parecerse a la captura siguiente.
Una vez definidos ambos objetivos, la pestaña debería quedar así:
Paso 4 - Configurar las variables de optimización
Configura ahora las variables de diseño:
- Temperatura de consigna de calefacción - entre 20 y 22°C con paso de optimización de 0.1°C.
- Temperatura de consigna de ventilación natural - entre 24 y 28°C con paso de optimización de 0.1°C.
-
% de apertura de ventana exterior - entre 0 y 100% con paso de optimización de 1.
-
Sombra local con las 5 longitudes de voladizo de 0 a 2m. Es la selección predeterminada al elegir Sombra local como variable. Los voladizos solo se aplican a las superficies orientadas al sur:

Una vez definidas las variables anteriores, la pestaña Variables debería quedar así:
Paso 5 - Escribir un script EMS para calcular el % de superficie sin confort Fanger
El script EMS utilizado en este ejemplo se muestra a continuación. Sigue estos pasos para configurarlo:
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. Abre la categoría EMS y haz clic en el icono Añadir elemento nuevo de la barra de herramientas para crear un script.
4. Introduce el nombre "Fanger % Discomfort Area",
5. Activa el programa.
6. Copia el script siguiente y pégalo en el área de texto del script.
Comprueba ahora que entiendes cómo funciona el script EMS.
El script configura un sensor en cada zona ocupada para leer Fanger PPD. Al final de cada paso de zona durante los periodos ocupados, se compara con el umbral de 20%. Si el % PPD supera el umbral de confort, toda la zona se considera no confortable y su superficie se añade al total. La superficie total sin confort se divide entre la superficie total de todas las zonas ocupadas para obtener el % de falta de confort ponderado por superficie del edificio. Los resultados de % de falta de confort de cada paso se promedian durante toda la simulación para obtener una única métrica denominada «Percentage Discomfort Area» en el archivo SQL.
<ForAllOccupiedZones>
EnergyManagementSystem:Sensor,
<LoopZoneVariableName>OccSchedule_PPD,
<LoopZoneAttribute OccupancySchedule>,
Schedule Value;
EnergyManagementSystem:Sensor,
PPD_<LoopZoneVariableName>,
PEOPLE <LoopZoneIDFName>,
Zone Thermal Comfort Fanger Model PPD;
EnergyManagementSystem:InternalVariable,
Area_<LoopZoneVariableName>,
<LoopZoneIDFName>,
Zone Floor Area;
<LoopNextZone>
EnergyManagementSystem:ProgramCallingManager,
Fanger PPD Discomfort Area,
EndOfZoneTimestepBeforeZoneReporting,
FangerDiscomfortArea;
EnergyManagementSystem:GlobalVariable,
PercentageDiscomfortArea;
EnergyManagementSystem:OutputVariable,
Percentage Discomfort Area [%],
PercentageDiscomfortArea,
Averaged,
ZoneTimeStep;
EnergyManagementSystem:Program,
FangerDiscomfortArea,
SET SumNumerator = 0,
SET SumDenominator = 0,
<ForAllOccupiedZones>,
IF <LoopZoneVariableName>OccSchedule_PPD > 0.25,
IF PPD_<LoopZoneVariableName> > 20,
SET SumNumerator = SumNumerator + Area_<LoopZoneVariableName>,
ENDIF,
SET SumDenominator = SumDenominator + Area_<LoopZoneVariableName>,
ENDIF,
<LoopNextZone>
IF SumDenominator > 0,
SET PercentageDiscomfortArea = (SumNumerator / SumDenominator)*100,
ENDIF;
! provide outputs based on DB output settings
<If BuildingAttribute TimesteplyOutput = 1 Then>
Output:Variable, *, Percentage Discomfort Area, timestep;
<Endif>
<If BuildingAttribute HourlyOutput = 1 Then>
Output:Variable, *, Percentage Discomfort Area, hourly;
<Endif>
<If BuildingAttribute DailyOutput = 1 Then>
Output:Variable, *, Percentage Discomfort Area, daily;
<Endif>
<If BuildingAttribute MonthlyOutput = 1 Then>
Output:Variable, *, Percentage Discomfort Area, monthly;
<Endif>
Output:Variable, *, Percentage Discomfort Area, RunPeriod;
Paso 6 - Escribir un script Python para el KPI personalizado
La siguiente tarea es escribir el script que leerá del archivo SQL los resultados EMS «Percentage Discomfort Area», 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. La casilla Activar scripts ya debería estar marcada.
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 un script existente de 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.
4. Introduce el nombre "Python Script: PPD Discomfort > 20%", activa el programa y copia y pega el script siguiente en el área de texto.
El script funciona así: después de cada simulación abre el archivo SQL y lee el resultado EMS «Percentage Discomfort Area» del edificio para RunPeriod. Este valor de % de falta de confort ponderado por superficie indica el % del tiempo anual en que el edificio no era confortable. Se convierte en horas dividiendo por 100 para convertir el % en una fracción y multiplicando por 8760 horas anuales. Después se escribe en la tabla especial «ParamResultsTmp» junto con el nombre del objetivo para que DesignBuilder lo recoja al procesar los resultados.
from db_eplusout_reader import Variable, get_results
from db_eplusout_reader.constants import *
from datetime import datetime
# ensure that SQLite outputs are generated
def before_energy_idf_generation():
site = api_environment.Site
for building in site.Buildings:
building.SetAttribute("SSSQLiteOP", "1")
def after_energy_simulation():
file = api_environment.EnergyPlusFolder + r"eplusout.sql"
variables = Variable("EMS", "Percentage Discomfort Area", "")
results = get_results(file, variables=variables, alike=True, frequency=RP)
discomfort_hrs = results.scalar
site = api_environment.Site
table = site.GetTable("ParamResultsTmp")
record = table.AddRecord()
record[0] = "PPD Discomfort > 20%"
record[1] = str(discomfort_hrs)
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 Simulación y pulsa actualizar para volver a ejecutar una simulación anual base con 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 lo más eficientes posible.
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 para este tutorial.
Pulsa el botón Iniciar para ejecutar las simulaciones de optimización.
Una vez que la optimización haya convergido y cierres el cuadro Opciones de cálculo, deberías ver resultados similares a los siguientes. Según la velocidad del equipo y el número de núcleos, las simulaciones necesarias pueden tardar algún tiempo.
Los resultados indican que, para minimizar tanto la energía de calefacción como la falta de confort PPD anual, los ajustes óptimos son:
-
Temperatura de consigna de calefacción de 20°C.
-
Temperatura de consigna de ventilación natural cercana a 26°C. Los valores inferiores aumentan la probabilidad de 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 para mantener el confort en verano.
-
% de apertura de ventana cercano a 45%. Los valores inferiores no proporcionan suficiente ventilación para mantener frescos a los ocupantes en verano y los superiores aumentan la frecuencia de calefacción y ventilación simultáneas.
-
Se favorecen voladizos de 0 a 1.0m en la fachada sur.







