En entregas anteriores (I y II) hemos visto la funcionalidad original del módulo de Scripting de DesignBuilder, que consiste en aprovechar las herramientas del módulo EMS de EnergyPlus para ampliar la potencia de nuestras simulaciones.
Lo que vamos a explicar ahora es otro tipo de posibilidad que se enmarca dentro de la categoría de Scripting dado que se basa en la posibilidad de desarrollar Scripts o pequeños programas que interactúan con nuestro modelo.
En este caso, la interacción consiste en modificar el fichero idf que genera DesignBuilder para incorporar funcionalidades que DesignBuilder no incluye o implementar cambios de forma mucho más rápida y eficiente que a través de su introducción dentro del propio interfaz del programa.
Estos Scripts pueden programarse en Python o en C#.
En Python hacen uso de la librería Eppy, cuya documentación puedes consultar aquí.
No voy a profundizar más allá en Eppy dado que personalmente utilizo la librería EpNet y el lenguaje C# por un motivo evidente: yo soy su desarrollador.
EpNet
EpNet proporciona funcionalidades muy similares a Eppy, con la ventaja de que pueden interactuar de forma directa con el modelo interno de DesignBuilder. Es decir, pueden modificar tanto el idf que genera DesignBuilder como párametros dentro del propio programa (sí, has leído bien). Esta posibilidad de modificar parámetros de DesignBuilder a partir de un programa está en una fase prematura de desarrollo, pero promete ser una API completa que posibilitará la integración de plugins y extensiones programadas por terceros en futuras versiones del programa.
Otra gran ventaja que tiene EpNet respecto a Eppy es que yo soy su desarrollador. Y por tanto, estoy continuamente haciendo correcciones, implementando nuevas funcionalidades y escribiendo Scripts propios que compartiré con la comunidad de usuarios.
No te voy a mentir, utilizar EpNet puede resultar sencillo para quien conozca EnergyPlus y sepa programar en C# (lenguaje de programación estrella de Microsoft, que se apoya en toda la potencia de la plataforma .NET). Sin embargo, para quien no haya programado antes (el caso de muchos de los usuarios) no está exento de cierta complejidad. Lo que sí estará al alcance de cualquiera será cargar y utilizar un Script desarrollado por otro, sin necesidad de saber cómo programarlo.
Un ejemplo
Si has llegado hasta aquí pero no aún te quedan dudas espero que con un ejemplo quede algo más clara la foto.
Imagina que has dibujado manualmente un gran número de ventanas en tu modelo y ahora quieres reducir el área acristalada en un 80%. Podrías redibujar todas las ventanas (o probar el nuevo escalado de ventanas de la v5.2) pero existe una opción más rápida, mediante un script, en la que modificamos la cota del alfeizar y por tanto el área de las ventanas. Este método tiene la ventaja de que puedes cambiar el porcentaje con un mínimo esfuerzo.
El código del script sería:
foreach (var ventana in Idf["FenestrationSurface:Detailed"]) { var escala = 0.8; var altura = ventana[21].Number - ventana[12].Number; var nuevaCotaZ = ventana[12].Number + escala * altura; ventana[18].Number = ventana[21].Number = nuevaCotaZ; }
Sencillo, ¿verdad?
Con Idf[«tipo de objeto»] obtenemos una lista de objetos de este tipo en el idf.
Con ventana[21].Number obtenemos el valor numérico del campo 21 del objeto (al que hemos llamado ventana en el bucle iterativo foreach).
Podemos obtener el valor de un campo de un objeto del idf con objeto[«nombre del campo»] o bien objeto[numero de campo, 0..n] seleccionando la propiedad Number o Value en función de que sea un número o un valor de texto.
Este es un ejemplo muy básico pero las posibilidades para modificar un idf son muy grandes, pudiendo introducir nuevos elementos, modificar valores en función de condiciones o de otros valores, importar datos de ficheros externos, o de resultados calculados anteriormente, etc.
Aún me falta publicar un manual al respecto pero todo llegará (cualquier duda que tengas al respecto puedes preguntármela mientras tanto en los comentarios).
Modificando el modelo de DesignBuilder
La segunda posibilidad que permite el scripting en C# es la de acceder y modificar parámetros del propio DesignBuilder, de forma que los cambios no se realizan en el idf antes de simular sino que se recogen en el propio modelo de DesignBuilder. A día de hoy se pueden hacer bastantes cosas a este respecto, pero estamos limitados por las opciones actuales del programa (mientras que modificando el idf podemos acceder a cualquier funcionalidad de EnergyPlus).
Un ejemplo de script muy sencillo que interactúa directamente con DesignBuilder es el siguiente:
Site sitio = D.getSite(); foreach (Building edificio in sitio.getBuildingIterator()) { var renovaciones = double.Parse(edificio.getAttribute("InfiltrationValue"),CultureInfo.InvariantCulture); var renovacionesMitad = (renovaciones/2).ToString(CultureInfo.InvariantCulture); edificio.setAttribute("InfiltrationValue", renovacionesMitad); }
Este script divide entre dos las renovaciones por infiltración de todas las zonas del edificio y el cambio lo veremos actualizado en el propio interfaz del programa.
Los objetos de tipo Site, Building o los procedimientos getAttribute/setAttribute forman parte de la API de DesignBuilder.
Las posibilidades de esta nueva funcionalidad van a ser muy grandes si bien aún queda por hacer (entre otras cuestiones documentar su uso) por lo que de momento queda en manos de usuarios avanzados con conocimientos de programación. Es previsible que DesignBuilder u otros (como yo) vayamos publicando scripts para facilitar ciertas tareas o que sirvan de ejemplo para ir aprendiendo a utilizar estas herramientas.
Bueno, espero que tras estos 3 artículos dedicados al módulo de Scripting, te hayan quedado más claras las grandes posibilidades del mismo y si aún te queda alguna duda puedes dejármela en los comentarios.
¡Ánimo y a probar el Scripting!