Changes in version 0.16.3 (2025-04-22) New features - Now install_eplus() can choose the installer most suitable for current OS version (#579). - Now install_eplus() gains a new portable parameter. If set to TRUE, it the zip (on Windows) and tar.gz (on macOS and Linux) file provided for EnergyPlus v8.8 and above and directly uncompressed it into the target directory (#583). Bug fixes - Provide more meaningful error messages when installing unsupported EnergyPlus version (#590). - Give correct error messages when querying multiple IdfObjects with both class and object info given (#594). - Fix AMY EPW file parsing (#596). Changes in version 0.16.2 (2023-08-25) Bug fixes - Support design condition specs from ASHRAE HOF 2021 (#571). - Use NA_character_ instead of NA for numeric_version() (#572). New features - Update weather database for OneBuilding (#574). Changes in version 0.16.1 (2023-06-19) Bug fixes - Fix edge cases of IDF/IDD parsing (#566). Internal refactor - Use character input for numeric_version() (#565). - Skips tests that need IDD downloading on CRAN (#561). Changes in version 0.16.0 (2023-05-17) New features - Add support for EnergyPlus v22.1 (#517). - Add support for EnergyPlus v22.2 (#530). - Add support for EnergyPlus v23.1 (#548). - Update weather database (#519). - Add support Space in IdfGeometry. Results from IdfGeometry$area(), IdfGeometry$tilt() and IdfGeometry$azimuth() now include a new column space indicating the spaces where the surfaces are attached to. IdfGeometry$view() and IdfViewer$show() now can render by spaces (#535). Bug fixes - IdfGeometry$convert() now work for EnergyPlus v9.6 and above (#536). - Now IMF files can be handled correctly (#537). - Now idf$add(), idf$set() and other methods accept any list inputs on the RHS instead of explicitly restricting to list() (#545). Internal refactor - Use testthat 3rd edition for parallel testing (#478). - Update minimal {data.table} version requirement to 1.14.6 to fix (#415). - Remove {crayon} and {progress} dependencies (#432). - Move {hms} to Suggest (#557). Changes in version 0.15.3 (2022-11-20) Bug fixes - Fix EPW parsing error due to an update of lubridate (#532). Changes in version 0.15.2 (2022-08-19) New features - A new encoding parameter has been added in read_idf(), use_idd() and read_epw(). The default value is unknown which indicates that the input file is native encoded (#515). - Now validate_level option is respected when parsing EPW files. This makes it possible to parse EPW files with non-standard EPW header values, which is useful when only the core EPW data is needed (#520). E.g: with_option(list(validate_level = "none"), read_epw(YOUR_EPW_PATH)) Bug fixes - Now IdfGeometry$coord_system() can correctly work. The coordinate system type can also be "world". "absolute" input now is automatically converted to "world" to be compatible with EnergyPlus. IdfGeometry$coord_system() now returns itself by default, instead of the parent Idf object. This enables to check the modified coordinate systems by printing the IdfGeometry (#506 #507). - Fix Idf$load() when input is a single string without any new line (\n) (#510). - Fix IdfViewer$snapshot() for PNG output. A new parameter webshot has been added in IdfViewer$snapshot() with default value being FALSE (#509). - Now IdfSchedule$... <- val works (#512). - Fix the error of invalid datetime in Epw$data() when data of Feb 28 is from a leap year while the EPW did not contain any leap year data (#552). Documentation - Regenerate package documentation to fix CRAN NOTES on HTML manuals (#525). Changes in version 0.15.1 (2022-01-21) Bug fixes - Fix ParametricJob$cases() when multiple objects are specified on the LHS in ParametricJob$param() (#492). - Fix install_eplus(9.1) on Linux (#494, #495). - Now ParametricJob$run() can correctly use weather file when only one parametric model exists (#497). Minor changes - Compatibility changes for incoming {units} v0.8 (#499). Changes in version 0.15.0 (2021-11-17) New features - Idd$path() is added to show the path of IDD parsed (#442). - Add epw data sources from climate.onebuilding.org for download_weather(). type will always be "all" for those sources (#453). - Add a new "stat" option in type in download_weather() (#453). - Idf$is_valid_id() and Idf$is_valid_name() gain a new argument named class defaulting to NULL to check the validity of object IDs and names again a specific class. - Add support for EnergyPlus v9.5 (#438). - Add support for EnergyPlus v9.6 (#460). - Internal function locate_eplus() has been exported to enable user to find all available EnergyPlus without restarting R (#477). - uninstall_eplus() has been added to enable uninstall EnergyPlus from R on all platform (#477). - Now force re-installation of EnergyPlus install_eplus(force = TRUE) has been updated to support all platforms, including macOS (#477). - install_eplus() has been updated to behave smarter on macOS (#477). - run_idf() and run_multi() have been refactored to mimic the Epl-run.bat procedure. It supports to call the Basement and Slab processors. Now the requirement of EnergyPlus >=v8.3 for running simulations has been dropped Now simulations with FMU, including obFMU are supported. (#467). - HVAC-Diagram will be called when running simulations to make sure the svg output of HVAC diagram can be generated. Therefore, hvac_diagram() has been deprecated and will be removed in next major version (#467). - Functions path_eplus() and path_eplus_*() have been added to help specify file paths under EnergyPlus installation directory (#467). - A new Idf method $external_deps() is added to extra any external file resources specified in the IDF that are needed for simulation, e.g. schedule files (#467). - Now Idf$save(external = TRUE) and Idf$run(copy_external) save external file dependencies based on the results of Idf$external_deps() (#467). - A new EplusJob method $list_files() is added to list all inputs and output files for current simulation (#467). - A new argument readvars can be specified in EplusJob$run() and EplusGroupJob$run(). Setting it to FALSE will disable to run ReadVarsESO post-processor and thus no CSVs will be generated for Report variables and meters. This can speed up simulations significantly if there are hundreds of outputs in the model. Setting it to FALSE will not affect any data extraction functionalities in eplusr, as it uses the SQLite output instead of the CSVs (#467). - Now .() can also be used as an alias as list() in Idf$add() and Idf$set() (#445). idf$add(Output_Variable = .("*", "zone mean air temperature")) # is equivalent to idf$add(Output_Variable = list("*", "zone mean air temperature")) - A new argument names can be specified in ParametricJob$models() to rename the parametric models created (#487). - A new interface for creating parametric models has been introduced using ParametricJob$param(). It takes parameter definitions in list format, which is similar to Idf$set() except that each field is not assigned with a single value, but a vector of any length, indicating the levels of each parameter. For example, the code block below defines 3 parameters (#487): - Field Fan Total Efficiency in object named Supply Fan 1 in class Fan:VariableVolume class, with 10 levels being 0.1 to 1.0 with a 0.1 step. - Field Thickness in all objects in class Material, with 10 levels being 0.01 to 0.1 m with a 0.1 m step. - Field Conductivity in all objects in class Material, with 10 levels being 0.1 to 1.0 W/m-K with a 0.1 W/m-K step. param$param( `Supply Fan 1` = list(Fan_Total_Efficiency = seq(0.1, 1.0, 0.1)), Material := list(Thickness = seq(0.01, 0.1, 0.1), Conductivity = seq(0.1, 1.0, 0.1)) ) - ParametricJob$cases() is added to get a summary of parametric models and parameter values. It returns a data.table giving you the indices and names of the parametric models, and all parameter values used to create those models.For parametric models created using ParametricJob$param(), the column names will be the same as what you specified in .names. For the case of ParametricJob$apply_measure(), this will be the argument names of the measure functions (#487). - Now .names in ParametricJob$apply_measure() can be a single character. In this case, it will be used as the prefix of all parametric models. The models will be named in the pattern .names_X where X is the model index (#487). Break changes - hvac_diagram() has been deprecated as HVAC-Diagram will always be called after EnergyPlus simulation. If you still want to generate HVAC svg diagram manually, please use HVAC_Diagram() instead (#467). Minor changes - When type is "all" in download_weather(), the ZIP file will be downloaded instead of downloading both EPW and DDY files (#453). - EplusJob$output_dir() now use backslash in the returned path on Windows (#467). - Better error message when no arguments are given to the measure function in ParametricJob$apply_measure() (#487). Bug fixes - Fix the year value calculation when first day of a run period is holiday (#450). - Fix download_weather() file downloading URL (#452). - Fix EplusSql$report_data(..., wide = TRUE) when Do HVAC Sizing Simulation for Sizing Periods is set to Yes in SimulationControl (#461). - Now read_idf() and other functions that read files from disk can use stringi::stri_enc_detect() to fix encoding issue (#467). - Now ParametricJob$run(dir = NULL) will always use the seed model directory (#483). Changes in version 0.14.2 (2021-05-28) New features - IddObject$output() is added to extract all possible outputs of current class. All outputs are extracted from the LaTeX source file of "Input Output Reference" for EnergyPlus v9.5.0 and later. So empty result will always be returned for Idd version lower than v9.5. It is possible that there are some mistakes introduced when extracting the output variables. Also, some outputs are only available if certain fields are set. Even they are listed in the results, it does not mean that the Idf can report all of them. It is strongly suggested to check the RDD and MDD file for correctness (#427). Example: idd <- use_idd(8.8) idd$Lights$outputs() Break changes - Autocompletion is enabled by registering a S3 .DollarNames method. Option autocomplete is deprecated. A warning is issued if you try to set it in eplusr_option(). Also, with_speed() is deprecated and falls back to without_checking() when called (#417). Bug fixes - Fixed wrong transition of FuelFactors from v9.2 to v9.3 (#420). - Fixed Idf$del error when both sources and referees are given (#433). - Fixed the error that EplusGroupJob$tabular_data(..., wide = TRUE) did not return the index column (#449). Minor changes - Better error and verbose messages (#422, #423). - The default mouse mode for wheel has been changed to "pull". Changes in version 0.14.1 (2021-02-25) Minor changes - Compatible changes for units v0.7-0 (#410). Changes in version 0.14.0 (2021-01-07) New features - Epw$save() gets a new option format_digit. If TRUE, the trailing digits in EPW data will be formatted in the same way as Weather Converter (#323). - Add EnergyPlus v9.3 and v9.4 support (#343, #347, #369). - Now ParametricJob$apply_measure() will give a nice progress bar when parametric models are creating (#378). - A new argument separate is added in EplusGroupJob$run() and ParametricJob$run() with default value being TRUE. If set to FALSE, all models are saved in dir when simulation, instead of creating a folder for each model and running simulation there (#381). - When extracting grouped simulation results using $report_data_dict(), $report_data() and etc in EplusGroupJob and ParametricJob class, a new column index is added which contains the indices of simulated models (#388). This is because when the same model runs with different weather files, the original case column cannot be used as an identifier. Major changes - Now eplusr will always use the SQLite output for data extraction instead of using the CSV output. In EnergyPlus v9.3 and above, ReadVarsESO is deprecated and EnergyPlus itself will generate CSV directly. CSVs for variables and meters are always separated in this way. Together with the newly introduced Output:Control:Files which can be set to disable CSV output, it becomes very cumbersome to continuously support the CSV for data extraction (#307). Minor changes - Now rgl and decido package has been moved from Imports to Suggests, since they are only used in the IdfViewer class for 3D visualization which is not the main focus of this package (368). - run_multi() now gets a new argument expand_obj to control whether ExpandObjects should be called before simulation or not. Because there is a known issue of ExpandObjects on Linux system (https://github.com/NREL/EnergyPlus/issues/8376), here we want to avoid unnecessary calls of ExpandObjects as possible. Also, EplusJob$run() and EplusGroupJob$run() now will detect if there are any HVACTemplate:* objects and set the expand_obj flag properly (#377). Bug fixes - When .empty is FALSE, Idf$set() and Idf$update() will keep fields if there are not the last fields (#310). - Year fields are correctly calculated for EnergyPlus v9.1 and above (#312). - Fix coordinate system alignment in IdfGeometry class (#314). - Fix time matching in EplusSql$report_data() (#315). - EPW COMMENT1 and COMMENT2 are now parsed as a single string (#318). - Preserve input year values in Epw$set() (#322). - Additional columns in Epw$set() and Epw$add() input are now removed (#320). - Now Epw$abnormal_data() can keep columns that contains abnormal data when keep_all is FALSE (#326). - Epw$save() now formats the header in the same way as Weather Converter (#328). - Epw$comment1() and Epw$comment2() now accepts NULL as input, which will remove the comments. And NULL is returned if no comments are found (#330). - Fix the error when the first field is not in the input in Idf$update() (#332). - Fix the error in EplusJob$report_data() caused by incomplete EnvironmentPeriods table in EnergyPlus SQL output (#336). - Make sure Day of Week for Start Day is reset to empty if UseWeatherFile was used in transition from v8.9 to v9.0 (#338). - Fix the error in EplusJob$report_data() when multiple reporting frequencies exist in the CSV output (#340). - Fix simulation error when FMU files are given in relative paths (#344). Now all objects that reference to external files can be correctly copied into output directory when copy_external is set to TRUE. - Fix the error when using an Idf as input in Idf$insert() (#348). - Sub-hourly EPW files are supported (#351). - Fix invalid references introduced by setting field values to empty (#355). - Fix the error message in EplusGroupJob when no CSV output was found (#357). - Fix false positive warnings when resolving IDF external file dependencies (#366). - Empty string input, e.g. " " in Idf$add() and Idf$set() are now correctly converted to NAs (#370). - Now empty comments are kept in IdfObject$comment() (#372). - Fix IdfGeometry$print() when no building object exists (#395). - Now IdfGeometry$round_digits() also applies to Zone class (#397). - read_epw() now accepts date rewind in TYPICAL/EXTREME PERIODS header (#401). - Fix c.EpwDate() error (#403). - Fix IdfScheduleCompact$set() evaluate issue when called in nested environment (#405). - Now IdfScheduleCompact$type_limits() works properly when setting new type limits (#407). Changes in version 0.13.0 (2020-08-28) New features - Idf$add() and Idf$set() have new features: # refer to field using '..' idf$add(Material = list(..1 = "mat", ..7 = 0.95)) idf$set(mat = list(..6 = 0.5)) # using vector field values idf$add(Material := list(..1 = sprintf("mat%i", 1:10))) idf$set(c(sprintf("mat%i", 1:10)) := list(..6 = runif(10))) - Idf$to_table() gains a new parameter force. The default value is FALSE. If TRUE, you can convert object data from any classes into a wide data.table. This may be useful when you know that target classes have the exact same fields, e.g. Ceiling:Adiabatic and Floor:Adiabatic (#202). - A new method Idf$purge() has been added (#223). It can be used to delete any resource objects that are not referenced by other objects. Here resource objects indicate all objects that can be referenced by other objects, e.g. all schedules. $purge() will ignore any inputs that are not resources. If inputs contain objects from multiple classes, references among them are also taken into account, which means purging is performed hierarchically. If both materials and constructions are specified, the latter will be purged first, because it is possible that input constructions reference input materials. Idf$purge() makes it quite straightforward to perform IDF cleaning. Actions like removing all materials, constructions and schedules can be easily achieved via Idf$purge(class = c("Material", "Construction"), group = "Schedules") - New methods Idf$duplicatd() and Idf$unique() have been added. They can be used to detect and remove duplicated objects, respectively. Here duplicated objects refer to objects whose field values are the same except the names. Object comments are ignored during comparison. These two methods can be useful when doing model cleaning (#227). - Now if class is set to NULL in Idf$definition(), the underlying Idd object is returned (#237). - Internal helper functions with_option(), with_silent(), with_verbose(), with_speed() and without_checking() have been exported. They can be used to evaluate an expression with temporary eplusr options (#240). - Now Idf$insert() can directly take an Idf object or a list of Idf objects as input. And also Version objects in input will be directly skipped instead of giving an error (#245). - A new option all has been added in IdfObject$print() with default being FALSE. If TRUE, all fields defined in [Idd] are printed even they do not exist in current object (#247). - New S3 methods of == for all classes are added, i.e. ==.Idf, ==.IdfObject, ==.Idd, ==.IddObject, ==.Epw, ==.EplusJob, ==.EplusSql, ==.EplusGroupJob, ==.ParametricJob. The negate methods are also added. This makes it quite easy to check the equality of R6 objects of these types (#250). - A new Generic function reload() is added. eplusr relies heavily on the data.table package. The core data of all main classes in eplusr are saved as data.tables. This introduces a problem when loading saved Idf objects or other class objects via an *.RDS and *.RData file on disk: the stored data.tables lose their column over-allocation. reload() is a helper function that calls data.table::setDT() on all internal data.tables to make sure they are initialized properly. It is recommended to call reload() on each Idd, Idf and other class object in eplusr loaded with readRDS() or load(), to make sure all eplusr's functionaries works properly (#251). - The implementation of EplusSql$report_data() has been refactored, resulting in a ~200% speed-up (#259). - Now day_type in EplusSql$report_data() has a few new options (#259): - "Weekday": All working days, i.e. from Monday to Friday - "Weekend": Saturday and Sunday - "DesignDay": Equivalent to "SummerDesignDay" plus "WinterDesignDay" - "CustomDay": CustomDay1 and CustomDay2 - "SpecialDay": Equivalent to "DesignDay" plus "CustomDay" - "NormalDay": Equivalent to "Weekday" and "Weekend" plus "Holiday" - Some internal functions have been exported. They are mainly useful for developers to handle internal IDD and IDF data more efficiently (#260). - A new IdfScheduleCompact class is introduced. A constructor function schedule_compact() is added. IdfScheduleCompact class provides more detailed methods to add, modify and extract schedule values. For more details, see vignette("schedule") (#256). - New IdfGeometry and IdfViewer classes are introduced. IdfGeometry is designed to extract data for all geometry objects and perform geometric operations on them, while IdfViewer is to view IDF geometry in 3D using the rgl package in a similar way as OpenStudio SketchUp Plugin. Idf$geometry() and Idf$view() methods are added to directly create an IdfGeometry and IdfViewer object based on current Idf object, respectively (#296). - A plot.Idf method is added which is basically a wrapper of Idf$view() (#296). - Now eplusr can utilize the CSV output for report data extraction. Benefiting from the fantastic data.table::fread, this approach can be as 3~10X faster compared to the SQLite approach. eplusr will still use the SQLite if the CSV output is not available. Major changes - The algorithm of object/field/value relation extraction has been completed refactored. Now it can correctly detect object recursive-reference and it's faster (#222, #223). All relation-related methods now have an unified interface: X$method(which, direction, object = NULL, class = NULL, group = NULL, depth = NULL, keep = FALSE) Where which is a class index or object ID, direction is the target relation direction to extract. All results can be further constrained via 3 extra arguments, i.e. object, class and object. object only applicable to Idf and IdfObject. The depth argument is used to control the depth for searching recursive relations. Default value is 0L, which means no recursive relations will be detected, while NULL means to search all possible recursive relations. A new keep parameter with default value FALSE has been added. If TRUE, all input fields will be returned, even they may not have any relations. This is the default behavior of v0.12.0 and before. In this version, only fields that have relation with other objects will be returned. With this update, it is possible, for example, to directly know the structure of an air loop by using idf$object_relation("AnAirLoop", depth = NULL) Moreover, a new argument class_ref can be specified in methods of value-relation extraction. It can be used to specify how to handle class-name-references. Class name references refer to references in like field Component 1 Object Type in Branch objects. Their value refers to other many class names of objects, instaed of referring to specific field values. There are 3 options in total, i.e. "none", "both" and "all", with "both" being the default. - "none": just ignore class-name-references. It is a reasonable option, as for most cases, class-name-references always come along with field value references. Ignoring class-name-references will not impact the most part of the relation structure. - "both": only include class-name-references if this object also reference field values of the same one. For example, if the value of field Component 1 Object Type is Coil:Heating:Water, only the object that is referenced in the next field Component 1 Name is treated as referenced by Component 1 Object Type. This is the default option. - "all": include all class-name-references. For example, if the value of field Component 1 Object Type is Coil:Heating:Water, all objects in Coil:Heating:Water will be treated as referenced by that field. This is the most aggressive option. - read_epw() will proceed parsing for non-standard EPW header format (#236). - Now EplusSql$report_data() will set the year values of day type SummerDesignDay and WinterDesignDay to current year and the day_type value will be left unchanged (#258). - Now read_idf() will always make sure all necessary fields are added during parsing (#267). - [[.IdfObject now only accept standard field names. No underscore-style names are allowed. - The suffix of automatically created names in Idf$dup() has been changed from _X to X. - The warning parameter in read_epw(), Epw$add() and Epw$set() has been deprecated (#298). Minor changes - EplusJob, EplusGroupJob and ParametricJob will not parse input EPW files, but only validate their existences and store the paths (#215) - period parameter in EplusSql$report_data() now works as expected (#259). - run_idf() and run_multi() now return additional element/column called - version which contain the versions of EnergyPlus that are called during simulations - format.Idd() now returns a single line string in format