diff --git a/Makefile b/Makefile index 36c6516..cca61bc 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ TEX_TITLE ?= "Report.tex" HTML_TITLE ?= "report.html" OUT_FILE ?= "Report.md" OUT_DIR ?= "outfiles" -PDF_TEST_TILE ?= "Report.test.pdf" +PDF_TEST_TITLE ?= "Report.test.pdf" .PHONY: gen gen: @@ -20,16 +20,14 @@ pdf: gen && open ${PDF_TITLE} \ && osascript ./scripts/notify.scpt -.PHONY: test-pdf -test-pdf: gen +.PHONY: pdf-test +pdf-test: @pandoc --pdf-engine=xelatex \ -H resources/head.tex \ -H "${OUT_DIR}/footer.tex" \ - -o ${PDF_TEST_TITLE} \ + -o "${OUT_DIR}/${PDF_TEST_TITLE}" \ "${OUT_DIR}/${OUT_FILE}" \ - resources/Definitions.md \ - && open ${PDF_TEST_TITLE} \ - && osascript ./scripts/notify.scpt + resources/Definitions.md .PHONY: tex tex: gen @@ -52,3 +50,8 @@ install: mactex-no-gui \ imagemagick \ gettext + +@.PHONY: clean +clean: + @rm -rf outfiles + @mkdir outfiles diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..12f6c74 --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,5 @@ +[defaults] +inventory=./inventory.ini +roles_path=./roles +stdout_callback=yaml +interpreter_python=auto_silent diff --git a/group_vars/all/vars.yml b/group_vars/all/vars.yml new file mode 100644 index 0000000..fdd0fe4 --- /dev/null +++ b/group_vars/all/vars.yml @@ -0,0 +1,19 @@ +--- +author_name: "{{ vault_author_name }}" +document_title: "Home Performance Report" +company: "{{ vault_company }}" +links: + images: + logo: "img/logo.png" + trueflow: "img/trueflow.png" + trueflow_forecast: "img/forecast.png" + documents: "{{ vault_document_links }}" + +customer: "{{ vault_customer }}" + +home: + square_feet: "3,000" + cfm50: "3,000" + lair: "1:1" + +output_path: "/Users/michael/projects/hpa-consult-report/outfiles" diff --git a/group_vars/all/vault.yaml b/group_vars/all/vault.yaml new file mode 100644 index 0000000..0cacb95 --- /dev/null +++ b/group_vars/all/vault.yaml @@ -0,0 +1,35 @@ +$ANSIBLE_VAULT;1.1;AES256 +34356166663933373435353334376433633137323838373832616335396232366536353766613131 +3465313832383733326433613862363639353665306164660a643534646438353233393239373866 +38336631623166643065653738393330616535656237376438323438363934323935363565393632 +3462366164323233640a343966303361656261383138306664333930636433383261653066626639 +63626465323266346164313030343963623661666233633236363439303164396431306165646533 +33353562386337343538363333313362333362643230353536656535383931333665653335383130 +34353130653836633531336563323831333337353936313737303239653539623263356261303635 +31373832396438643466326361396162316134313833303732633062326531346637313665663037 +63393261666436363062306436313334356465316361383938646162333130356130323736633761 +34396530356231623437633163363762333461303337363539366638376462663561313437313938 +30306335303638633037383732646236663437333362626433366330326566633532396535346165 +64376663346132666538343566343437323763633532303336646330626439353334643837383165 +66323261656466363237346661653232363766646265643037343366373133663739383532643161 +63353338663537313430653066373764376437393364363438363834616363653139396237656534 +34343332393030383863306664613434653665303336346163613161363431633236316138396537 +37373332326233326264613337303134626661663930316434303865633365353437313363343834 +61656266343466656239623366366538343937363932613966333832646534653462366637623163 +31383733303736353565306637653532346431666666303931616232656138616532653161666463 +37623734303436653664353261363664666138666436626330316437396237313131663361373634 +61383061366263313239643665356638666361666561313532636563643932613462616131396363 +36636362613463336136633962386139353965636538666562383831313661376261396531306631 +32346264633631303164643832613835376432636331396234323034656438363638633633353363 +36303831653534333031623437663832323961323763323863643562343137323164373161343130 +31306132343235333735616437376662336464643431643563623731333463353631626238656262 +38613637626433303866336330636234363534626664306337613832623433663866646430373666 +66626131383839356337653461343866313431666566633230653831303062636433623830383236 +39626137653461353535333366393633356538633437356563323663616466623737323438666438 +33623364303961363666653930393466613938333537336530616461333036646265343032653362 +66303237363631353631346137643539333435323535356133313530393238623239333233656265 +62303633376233646334663633613838303462613662643433663465323864396265383165313932 +61346434633965656133646264373034616538653330663661306562613730376432363564646461 +34636462666337303465666564393465363865343763623832383735616237373331623231333931 +33323965353864313932623339383431636536633734393065373437666461636666373364356535 +3666336333306431306630663537383235653735363662343636 diff --git a/inventory.ini b/inventory.ini new file mode 100644 index 0000000..8a9c63a --- /dev/null +++ b/inventory.ini @@ -0,0 +1,2 @@ +[local] +127.0.0.1 ansible_connection=local diff --git a/playbook/report.yml b/playbook/report.yml new file mode 100644 index 0000000..19259da --- /dev/null +++ b/playbook/report.yml @@ -0,0 +1,7 @@ +--- +- name: Generate Report. + hosts: all + + roles: + - role: report + tag: report diff --git a/resources/vault.example.yaml b/resources/vault.example.yaml new file mode 100644 index 0000000..4c5468b --- /dev/null +++ b/resources/vault.example.yaml @@ -0,0 +1,21 @@ +--- +vault_author_name: "Testy McTestface Jr" + +vault_company: + website: "https://example.com" + phone: "555-555-5555" + url_display_title: "www.Example.com" + +vault_document_links: + loads_folder: "https://example.com/path/to/loads/folder" + trueflow_file: "https://example.com/path/to/trueflow/file" + trueflow_forecast_file: "https://example.com/path/to/trueflow/forecast/file" + document_folder: "https://example.com/path/to/document/folder" + +vault_customer: + name: "Testy McTestface Sr" + address: + street: "1234 Seasme Street" + city: "No Mans Land" + state: "Foo" + zip: "55555" diff --git a/roles/report/defaults/main.yml b/roles/report/defaults/main.yml new file mode 100644 index 0000000..3bbbcd1 --- /dev/null +++ b/roles/report/defaults/main.yml @@ -0,0 +1,33 @@ +--- +author_name: "Testy McTestface Jr" +document_title: "Home Performance Report" +company: + website: "https://example.com" + phone: "555-555-5555" + url_display_title: "www.Example.com" + +links: + images: + logo: "img/logo.png" + trueflow: "img/trueflow.png" + trueflow_forecast: "img/forecast.png" + documents: + loads_folder: "https://example.com/path/to/loads/folder" + trueflow_file: "https://example.com/path/to/trueflow/file" + trueflow_forecast_file: "https://example.com/path/to/trueflow/forecast/file" + document_folder: "https://example.com/path/to/document/folder" + +customer: + name: "Testy McTestface Sr" + address: + street: "1234 Seasme Street" + city: "No Mans Land" + state: "Foo" + zip: "55555" + +home: + square_feet: "3,000" + cfm50: "3,000" + lair: "1:1" + +output_path: "outfiles" diff --git a/roles/report/tasks/main.yml b/roles/report/tasks/main.yml new file mode 100644 index 0000000..aaf0ac6 --- /dev/null +++ b/roles/report/tasks/main.yml @@ -0,0 +1,22 @@ +--- +- name: Generate Footer File + ansible.builtin.template: + src: "templates/{{ item }}" + dest: "{{ output_path }}/footer.tex" + mode: "0600" +# variable_end_string: '[%' +# variable_start_string: '%]' + with_items: + - "footer.tex" + tags: + - footer + +- name: Generate Templated Files + ansible.builtin.template: + src: "templates/{{ item }}" + dest: "{{ output_path }}/Report.md" + mode: "0600" + with_items: + - "Report.md" + tags: + - report diff --git a/roles/report/templates/Report.md b/roles/report/templates/Report.md new file mode 100644 index 0000000..e96009d --- /dev/null +++ b/roles/report/templates/Report.md @@ -0,0 +1,307 @@ +--- +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.address.street }} + {{ customer.address.city }}, {{ customer.address.state }} {{ customer.address.zip }} + + ```{=latex} + \begin{center} + ``` + + \ + \ + \ + + [![logo]({{ links.images.logo }}){ 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.cfm50 }} [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.cfm50 }}:{{ 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.cfm50 }}** | **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]: "{{ links.images.trueflow }}" + + +[trueflow-forecast-image]: "{{ links.images.trueflow_forecast }}" + + + +[loads-folder]: "{{ links.documents.loads_folder }}" +[trueflow-file]: "{{ links.documents.trueflow_file }}" +[trueflow-forecast-file]: "{{ links.documents.trueflow_forecast_file }}" +[document-folder]: "{{ links.documents.document_folder }}" + diff --git a/roles/report/templates/footer.tex b/roles/report/templates/footer.tex new file mode 100644 index 0000000..1937ab9 --- /dev/null +++ b/roles/report/templates/footer.tex @@ -0,0 +1,26 @@ +% customize the footer +\usepackage{fancyhdr} +\pagestyle{fancy} +% clear all footers +\fancyfoot{} +% clear all headers +\fancyhead{} + +% change font size on footer. +\newcommand{\changefont}{ + \fontsize{8}{10}\selectfont +} +% NOTE: What is displayed in the footer of each page. +\fancyfoot[LE,LO]{ + \href{ {{ company.website }} } + {\changefont\textbf{ + {{ company.url_display_title }} + }} +} +\fancyfoot[RE,RO]{\textbf{ + \changefont{ + Phone: \href{tel:{{ company.phone }} }{ + \color{orange}{{ company.phone }} + } + } +}}