diff --git a/.gitignore b/.gitignore index b89ed9e..7f1984f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.test.pdf -Report.tex +Report.pdf report.html outfiles/* +build/* diff --git a/Makefile b/Makefile index 9bbabc1..ea4c053 100644 --- a/Makefile +++ b/Makefile @@ -1,48 +1,29 @@ PDF_TITLE ?= "Report.pdf" TEX_TITLE ?= "Report.tex" HTML_TITLE ?= "report.html" -OUT_FILE ?= "Report.md" -OUT_DIR ?= "${PWD}/outfiles" +BUILD_DIR ?= "${PWD}/build" PDF_TEST_TITLE ?= "Report.test.pdf" -.PHONY: gen -gen: - @OUT_FILE="${OUT_DIR}/${OUT_FILE}" ./scripts/gen.sh - .PHONY: pdf -pdf: gen - @pandoc --pdf-engine=xelatex \ - -H resources/head.tex \ - -H "${OUT_DIR}/footer.tex" \ - -o ${PDF_TITLE} \ - "${OUT_DIR}/${OUT_FILE}" \ - resources/Definitions.md \ +pdf: ansible + @./scripts/gen.sh "${BUILD_DIR}" "${PWD}/${PDF_TITLE}" \ && open ${PDF_TITLE} \ && osascript ./scripts/notify.scpt -.PHONY: pdf-test -pdf-test: - @pandoc --pdf-engine=xelatex \ - -H resources/head.tex \ - -H "${OUT_DIR}/footer.tex" \ - -o "${OUT_DIR}/${PDF_TEST_TITLE}" \ - "${OUT_DIR}/${OUT_FILE}" \ - resources/Definitions.md - .PHONY: tex tex: gen @pandoc \ -H resources/head.tex \ - -H "${OUT_DIR}/footer.tex" \ - -o "${OUT_DIR}/${TEX_TITLE}" \ - "${OUT_DIR}/${OUT_FILE}" + -H "${BUILD_DIR}/footer.tex" \ + -o "${BUILD_DIR}/${TEX_TITLE}" \ + "${BUILD_DIR}/${OUT_FILE}" .PHONY: html html: gen @pandoc \ - -o "${OUT_DIR}/${HTML_TITLE}" \ - "${OUT_DIR}/${OUT_FILE}" \ - && open "${OUT_DIR}/${HTML_TITLE}" + -o "${BUILD_DIR}/${HTML_TITLE}" \ + "${BUILD_DIR}/${OUT_FILE}" \ + && open "${BUILD_DIR}/${HTML_TITLE}" .PHONY: install install: @@ -56,17 +37,20 @@ install: ansible: @cd ./ansible && \ ansible-playbook playbook.yaml \ - --extra-vars "output_path=${OUT_DIR}" + --extra-vars "build_dir=${BUILD_DIR}" .PHONY: ansible-vault-example ansible-vault-example: @cd ./ansible && \ ansible-playbook playbook.yaml \ - --extra-vars "output_path=${OUT_DIR}" + --extra-vars "build_dir=${BUILD_DIR}" --extra-vars "@group_vars/vault_example/vars.yaml" \ --extra-vars "@group_vars/vault_example/vault.yaml" \ -@.PHONY: clean +.PHONY: link +link: + @ln -sfv ./ansible/roles/report/templates/Report.md + +.PHONY: clean clean: - @rm -rf outfiles - @mkdir outfiles + @rm -rf "${BUILD_DIR}" diff --git a/Report.md b/Report.md deleted file mode 100644 index 210f157..0000000 --- a/Report.md +++ /dev/null @@ -1,305 +0,0 @@ ---- -title: ${DOCUMENT_TITLE} -author: ${AUTHOR_NAME} -date: \today{} -mainfont: Avenir Next -documentclass: article -fontsize: 12pt -# NOTE: The applegreen is a custom color defined in resources/head.tex -linkcolor: applegreen -urlcolor: applegreen -abstract: | - **Prepared For:** - - ${CUSTOMER_NAME} - - ${CUSTOMER_STREET} - ${CUSTOMER_CITY_STATE_ZIP} - - ```{=latex} - \begin{center} - ``` - - \ - \ - \ - - [![logo](${LOGO_IMAGE}){ width=30% }](${COMPANY_WEBSITE}) - - ```{=latex} - \end{center} - ``` ---- - - - -# Contents - -1. [Introduction](#home-performance-report) - 1. [Your Goals](#your-goals) -1. [Leakage](#how-leaky-is-your-house) -1. [Observations](#observations) - 1. [HVAC](#hvac-observations) - 1. [Home](#home-observations) -1. [Load Calculations](#load-calculations) - 1. [Your Loads](#your-loads) -1. [Airflow Assessment](#airflow-assessment) - 1. [Your Static Measurements](#your-static-measurements) - 1. [Static Pressure Forecast](#static-measurements-forecast) -1. [Summary](#summary) -1. [Definitions](#definitions) - 1. [CFM50] - 1. [IAQ] - 1. [LAIR] - 1. [Load Calculation][load-calculation] - 1. [Shell][shell] - 1. [SHR] - 1. [TESP] - 1. [WC][wc] - -# Home Performance Report - -Thank you for having us to your home for a home performance assessment. I hope that it was -beneficial. We learned a lot about your home and your goals during the brief visit. So, let’s jump -in to some of the things discovered. - -Below is a summary of your goals, house measurements, and our budget discussion as well as my -observations and some recommendations. As part of the service we ran load calculations that help -determine the right sized HVAC for your home as it stand and with some upgrades. Those are attached -as are bids for replacements. - -Once you read the report you’ll have 3 options: do nothing, pick and choose upgrades, or do more -planning for more difficult goals or complex projects. These options are discussed at the end of the -report as well as our leanings for your home. - -\goalsimage - -## Your goals: - - - - - - -1. Add air conditioning. - -# How Leaky Is Your House - - - -One of the main objectives was to perform a blower door test and load calculations for the home. We -discovered that the blower door number was -${HOME_LEAKAGE} [CFM50] for the approximately ${HOME_SQUARE_FEET} \squarefoot (${HOME_LAIR} [LAIR]). -A leaky home, most often, is an uncomfortable and uncontrollable home. - -> _Air leakage tends to have one of the largest impacts on the load of a home._ -> -> - _Around 1:1 homes begin to be more controllable / comfortable_ -> - _Your home is ${HOME_LEAKAGE}:${HOME_SQUARE_FEET} \squarefoot for a ratio of ${HOME_LAIR}_ -> - _Leaky homes are very difficult to maintain comfort with HVAC alone._ - -# Observations - -The below sections are observations about the current HVAC system and the home. - -## HVAC Observations - - - -1. Current furnace is sized appropriately based on the load of the home. -1. Current duct system is not sized adequately for the system. - 1. Filter is too small for the system. - 1. Return sizing is not adequate. - 1. Supply sizing is marginal. - 1. Current static pressure is already high. - 1. These problems may become worse when AC is installed. - -## Home Observations - - - -1. The house leakage is high for the size of the home. -1. May be hard to control comfort without [shell] improvements. - -# Load Calculations - -Several [load-calculations][load-calculation] were performed on your home to determine the proper -equipment sizing for this application. Below is a comparison of the -[load-calculations][load-calculation] with the current air leakage and several improved air leakage -targets. - -## Your Loads - - - -| [CFM50] | | Heating Total | Cooling Total | [SHR] | [LAIR] | -| ------------------- | ----------- | ------------- | ------------- | -------- | ---------------- | -| **${HOME_LEAKAGE}** | **Current** | **55,102** | **20,726** | **0.79** | **${HOME_LAIR}** | -| 2,000 | | 40,320 | 17,279 | 0.85 | 1.5:1 | -| 1,350 | | 35,885 | 16,245 | 0.88 | 1:1 | - -> **Note:** -> -> 1. _The lower the heating and cooling total's the better._ -> 1. _An undersized air conditioner is better than an oversized one._ -> 1. _Supplemental dehumidification may be required for [SHR]'s below 0.83._ - -The above table shows the relationship between air leakage and the amount of heating and cooling -that is required for the home. A tight home is easier to control the comfort levels, offers superior -IAQ levels, and lower utility costs. - - - -The projected cooling size required for your home is around 2-Tons for the current leakage rate, or -1.5-Tons if [shell] improvements were made. - -[Here is a link to your load calculation reports][loads-folder] - -# Airflow Assessment - -While on site, we also measured the total system airflow and static pressure of the system. Static -pressure is equivalent to the blood pressure of your system and gives us a better understanding of -the overall ability for the system to provide the proper amount of airflow, as well as how much it -may struggle to do so. - -Static pressure is the amount of resistance that the blower has to work against in order to move air -through the system. Things that have an effect on the static pressure of the system include, air -filters (size and type), duct sizes, amount of ducts, length of ducts, duct fittings and -transitions, as well as internal system components. Each component of the system has a resistance -associated with it that the blower has to overcome, by taking some key measurements we are able to -determine the [TESP] of the system. While there are several static pressures in the system, when we -talk about static pressure we are generally referring to [TESP]. - -Static pressure ([TESP]) has a range of _low_, _acceptable_, or _high_. While these numbers are -specific to the actual equipment, most manufacturers follow similar standards. For the sake of -simplicity, 0.5" [wc] or under is an _acceptable_ target, 0.8" [wc] is generally the max acceptable -static pressure (although we like to stay well below this if possible), and above 0.8" [wc] is -considered _high_ and should be addressed. _Low_ is generally not common and is rarely problematic, -so it is not focused on much. - - - -\newpage - -## Your Static Measurements - -![True Flow Report][trueflow-image]{ height=50% } - - - -The above image is a snapshot of the static pressures recorded for your system. This shows that the -static pressure of your system is very high (1.114" [wc]). The primary culprits for the high static -pressure are that the filter is undersized for the airflow required and the return duct sizing is -small. - -These measurements were taken in the heating mode because your system does not currently have air -conditioning. Currently the heating airflow is on the low side for what is required for your system -(1200 CFM would be ideal). This should be adjusted if possible during the install to get better -performance and efficiency out of the system, given that some static pressures can be improved -during the project. - -\ -\ - -[Here is a link to the full airflow report.][trueflow-file] - - - -\newpage - -## Static Measurements Forecast - -![True Flow Forecast][trueflow-forecast-image]{ height=50% } - - - -The above image is a snapshot is of a forecast of the static pressures after adding air -conditioning. It should be noted that these measurements are based solely on the airflow required -for cooling mode, not for heating mode (in other words, heating mode is going to be higher because -the airflow requirement is higher). - -This shows that with an upgraded filter we can get the static pressure below the 0.8" [wc] max -target while in cooling mode. - -\ -\ - -[Here is a link to the full forecast report.][trueflow-forecast-file] - -# Summary - -The purpose of the home performance assessment is to help find the overlap between the house needs, -the goals, and the budget to see if there's a viable project. - - - -The house is pretty leaky overall. This is due to the age and construction style of the house. This -may lead to comfort problems or trouble maintaining comfort in all areas of the house. - -Based on the [load calculations][load-calculation], the previously quoted systems are too large for -the current load, so we need to update the proposals to be for 2-Ton systems. This will help with -the fact that the static pressure of the system is already really high. The static pressure for -heating will likely still be above the 0.8" [wc] max threshold. - -An upgraded air filter is going to be required to help alleviate the blower motor. Another return -may be required in the living space to further drop the static pressure, however this could likely -be done in the future if desired. I would estimate that adding another return would be in the -**$800-1,200** range. - -While on site it was mentioned that you would like some of the ducts to be sealed that go to the -second floor. This is something that is not included in our general proposals. I would estimate this -to be an additional **$150-300** and will add options in the updated proposals. - -Since the goal is to add air conditioning, then I would recommend going with a 2-Ton system. If the -system does not maintain then you could look into [shell] improvements and air sealing the home. - -Regards, - -\ -\ -\ - -[Here is a link to all the documents][document-folder] - - - -[CFM50]: #cfm50-definition "CFM50" -[IAQ]: #iaq-definition "IAQ" -[LAIR]: #lair-definition "LAIR" -[load-calculation]: #load-calculation-definition "load calculation" -[shell]: #shell-definition "shell" -[SHR]: #shr-definition "SHR" -[wc]: #wc-definition "wc" -[TESP]: #tesp-definition "TESP" - - - - - - -[trueflow-image]: ${TRUEFLOW_IMAGE} - - -[trueflow-forecast-image]: ${TRUEFLOW_FORECAST_IMAGE} - - - - -[loads-folder]: ${LOADS_FOLDER} -[trueflow-file]: ${TRUEFLOW_FILE} -[trueflow-forecast-file]: ${TRUEFLOW_FORECAST_FILE} -[document-folder]: ${DOCUMENT_FOLDER} diff --git a/Report.md b/Report.md new file mode 120000 index 0000000..fdccdd5 --- /dev/null +++ b/Report.md @@ -0,0 +1 @@ +./ansible/roles/report/templates/Report.md \ No newline at end of file diff --git a/ansible/group_vars/all/vars.yaml b/ansible/group_vars/all/vars.yaml index 3bbbcd1..34a3368 100644 --- a/ansible/group_vars/all/vars.yaml +++ b/ansible/group_vars/all/vars.yaml @@ -30,4 +30,4 @@ home: cfm50: "3,000" lair: "1:1" -output_path: "outfiles" +build_dir: "build" diff --git a/ansible/group_vars/vault_example/vars.yaml b/ansible/group_vars/vault_example/vars.yaml index fdd0fe4..02ef51a 100644 --- a/ansible/group_vars/vault_example/vars.yaml +++ b/ansible/group_vars/vault_example/vars.yaml @@ -16,4 +16,4 @@ home: cfm50: "3,000" lair: "1:1" -output_path: "/Users/michael/projects/hpa-consult-report/outfiles" +build_dir: "build" diff --git a/ansible/roles/report/defaults/main.yaml b/ansible/roles/report/defaults/main.yaml index 3bbbcd1..34a3368 100644 --- a/ansible/roles/report/defaults/main.yaml +++ b/ansible/roles/report/defaults/main.yaml @@ -30,4 +30,4 @@ home: cfm50: "3,000" lair: "1:1" -output_path: "outfiles" +build_dir: "build" diff --git a/ansible/roles/report/tasks/main.yaml b/ansible/roles/report/tasks/main.yaml index 69f2f51..7f48fad 100644 --- a/ansible/roles/report/tasks/main.yaml +++ b/ansible/roles/report/tasks/main.yaml @@ -2,14 +2,14 @@ - name: Ensure output directory exists. ansible.builtin.file: - path: "{{ output_path }}" + path: "{{ build_dir }}" state: "directory" mode: '0755' - name: Copy Files. ansible.builtin.copy: src: "files/{{ item }}" - dest: "{{ output_path }}/{{ item }}" + dest: "{{ build_dir }}/{{ item }}" mode: '0600' with_items: - "Definitions.md" @@ -18,7 +18,7 @@ - name: Generate Footer File ansible.builtin.template: src: "templates/{{ item }}" - dest: "{{ output_path }}/footer.tex" + dest: "{{ build_dir }}/footer.tex" mode: '0600' with_items: - "footer.tex" @@ -28,7 +28,7 @@ - name: Generate Templated Report File ansible.builtin.template: src: "templates/{{ item }}" - dest: "{{ output_path }}/Report.md" + dest: "{{ build_dir }}/Report.md" mode: '0600' with_items: - "Report.md" diff --git a/scripts/gen.sh b/scripts/gen.sh index 297e8e4..7a74f5b 100755 --- a/scripts/gen.sh +++ b/scripts/gen.sh @@ -1,23 +1,15 @@ #!/bin/zsh -# This script is used to generate the output files and replacing -# variables used with ones setup in the vars.sh file. +local build_dir=${1:-"${PWD}/build"} +local output_file=${2:-"${PWD}/Report.md"} +echo "Starting with build dir: ${build_dir}" -OUT_DIR=${OUT_DIR:-"outfiles"} -OUT_FILE=${OUT_FILE:-"Report.out.md"} -IN_FILE=${IN_FILE:-"Report.md"} -local footer="resources/footer.template.tex" -local footer_out="${OUT_DIR}/footer.tex" +pandoc --pdf-engine=xelatex \ + -H "${build_dir}/head.tex" \ + -H "${build_dir}/footer.tex" \ + -o "${output_file}" \ + "${build_dir}/Report.md" \ + "${build_dir}/Definitions.md" -if [ ! -d "$OUT_DIR" ]; then - mkdir "$OUT_DIR" -fi - -echo "Writing footer to: ${footer_out}" - -(source vars.sh; envsubst < "$footer" > "$footer_out") - -echo "Writing to: ${OUT_FILE}" - -(source vars.sh; envsubst < "$IN_FILE" > "$OUT_FILE") +echo "Wrote report to: ${output_file}"