commit 65acc3c45df1accefcd41a9ee26aa29d0eaa1378 Author: Michael Housh Date: Sun Nov 24 13:24:33 2024 -0500 feat: Initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1d85460 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2024 Michael Housh II + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8193e69 --- /dev/null +++ b/README.md @@ -0,0 +1,132 @@ +# ansible-role-hpa + +An ansible role for managing and building Home Performance Assessment reports. + +In general this role is used to generate files from templates. The role provides the templates and +uses the variables to inject information into the final documents that can be used by `pandoc` to +generate an output file (generally a PDF). + +## Requirements + +The role itself does not have any requirements, however generating reports uses: + +- [Pandoc](https://pandoc.org/) +- [MacTex](https://www.tug.org/mactex/) +- [ImageMagick](https://imagemagick.org/index.php) +- [gettext](https://www.gnu.org/software/gettext/) + +## Role Variables + +### Author Name (author_name): + +Defines the author name for the Home Performance Assessment report. + +### Document Title (document_title): + +Defines the document title for the Home Performance Assessment report. + +### Company (company): + +Defines company attributes for the company who is generating the Home Performance Assessment report. +It has the following variables: + +- **website**: The company's website. +- **phone**: The company's phone number. +- **url_display_title**: The display title used for links to the company's website. + +### Links (links): + +Defines links used in the Home Performance Assessment report. + +#### Image Links (links.images): + +- **logo**: An image file that is the companies logo. +- **trueflow**: An image file that is of the TrueFlow Report. +- **trueflow_forecast**: An image file that is of the TrueFlow Forecast Report. + +#### Document Links (links.documents): + +- **loads_folder**: A link to the customers load calculations. +- **trueflow_file**: A link to the customers TrueFlow report. +- **trueflow_forecast_file**: A link to the customers TrueFlow Forecast report. +- **document_folder**: A link to all the customers documents. + +### Customer (customer): + +Defines the customer information that the Home Performance Assessment report is being generated for. + +- **name**: The customers name. +- **address**: + - **street**: The customers street address. + - **city**: The customers city. + - **state**: The customers state. + - **zip**: The customers zip code. + +### Home (home): + +Defines variables about the customers home that are used in the Home Performance Assessment report. + +- **square_feet**: The home's square footage. +- **cfm50**: The home's leakage rate in CFM-50. +- **lair**: The home's Leakage Air Infiltration Rate. + +### Config (config): + +This stores lesser used variables. They are generally for internal use of the role. In general you +should not have to declare or change these variables and should use the defaults. + +- **build_dir_name**: The directory name for build files (default is ".build") +- **work_dir**: The current working directory (default is `pwd`) +- **build_dir**: The build directory (defaults to `pwd/`) +- **paths**: + - **report_path**: Path to the customize report template file (defaults is `pwd/Report.md`). + - **footer_path**: Path to the `footer.tex` file (default is the internal template) + - **head_path**: Path to the `head.tex` file (default is the internal template). + - **definitions_path**: Path to the `Definitions.md` file (default is the internal definitions + file) + +## Tags + +The following tags are used to control which tasks the role runs. + +### Setup Tags + +The setup tags are used to copy template files to your working directory. These are used prior to +calling the `build` tag. + +#### Primary setup tags to use: + +- **setup**: Setup the templates and variables in your working directory. This will make a copy of + the default Report file and the default variables for you to adjust to your needs. +- **setup-with-vault**: Setup the templates and variables using variable templates for use with + ansible-vault. + +#### Lesser used setup tags: + +- **setup-definitions**: Copy the default definitions in your working directory to be customized. +- **setup-head**: Copy the default head file in your working directory to be customized. +- **setup-footer**: Copy the default footer file in your working directory so that it can be + customized. +- **setup-all**: Copies all files, templates, and variables in your working directory, not using + ansible-vault variables. +- **setup-all-with-vault**: Copies all files, templates, and variables in your working directory, + using the ansible-vault variables. + +> Note: When using any of the above commands, except `setup` and `setup-with-vault`, you will want +> to change the appropriate `config.paths` variables to point to the files you customize before +> using the `build` tag. + +### Build Tag + +The `build` tag is used after you've customized the documents and templates for your client. It will +then replace any template variable values defined in your variables to be able to be processed by +`pandoc` to generate your final PDF output. + +## License + +MIT + +## Author Information + +An optional section for the role authors to include contact information, or a website (HTML is not +allowed). diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..a3326cb --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,46 @@ +#SPDX-License-Identifier: MIT-0 +--- +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" + +# NOTE: These generally do not need changed, unless debugging. +config: + build_dir_name: ".build" + work_dir: "{{ lookup('env', 'PWD') }}" + build_dir: "{{ config.work_dir }}/{{ config.build_dir_name }}" + + # NOTE: These generally do not need changed, unless debugging or customizing files. + # Such as you want to add new definitions or customize the footer. + paths: + report_path: "{{ config.work_dir }}/Report.md" + footer_path: "templates/footer.tex" + head_path: "files/head.tex" + definitions_path: "files/Definitions.md" diff --git a/files/Definitions.md b/files/Definitions.md new file mode 100644 index 0000000..32c2160 --- /dev/null +++ b/files/Definitions.md @@ -0,0 +1,47 @@ +# Definitions + + + +### CFM50 {#cfm50-definition} + +Is a unit of measurement that is taken when a blower door test is performed on the home. Stands for +$C$ubic $F$eet per $M$inute at 50 pascals. + +### IAQ {#iaq-definition} + +Stands for $I$ndoor $A$ir $Q$uality. We spend most of our time indoors, so having good indoor air +quality can help reduce illness and potentially improve the quality and longevity of life. + +### LAIR {#lair-definition} + +Stands for $L$eakage $A$ir $I$nfiltration $R$ate, which is a metric that compares the square footage +of the home and it's blower door number. This aids in determining if a home is controllable by +properly sized HVAC equipment or if [shell] improvements (air sealing and insulation) should be +considered. + +### Load Caclulation {#load-calculation-definition} + +A load calculation, also called a Manual-J, calculates the heating and cooling requirements for a +home. Each home has a unique heating and cooling load based on the direction it faces, the air +leakage, the location, the insulation values, the types and sizes of windows, among other factors. + +### Shell {#shell-definition} + +Shell is a term used to describe the enclosure of the house. It is often used when talking about air +leakage and insulation levels. + +### SHR {#shr-definition} + +Stands for $S$ensible $H$eat $R$atio. Sensible heat ratio is the ratio of work required by the air +conditioner to remove moisture, as well as maintain the sensible temperature. The higher the number +the better. + +### TESP {#tesp-definition} + +Stands for $T$otal $E$xternal $S$tatic $P$ressure, which is a metric used to determine how much +resistance the blower motor has to overcome for the airflow requirement of the system. + +### WC {#wc-definition} + +Stands for $W$ater $C$olumn, which is a unit of measurement for pressure. diff --git a/files/head.tex b/files/head.tex new file mode 100644 index 0000000..a2f14f6 --- /dev/null +++ b/files/head.tex @@ -0,0 +1,74 @@ +% https://jdhao.github.io/2019/05/30/markdown2pdf_pandoc/#the-top +% These were adapted from the above, which was very helpful in getting this +% functional. + +% change style of quote, see also https://tex.stackexchange.com/a/436253/114857 +\usepackage[most]{tcolorbox} + +% change page margins +\usepackage[top=2cm, bottom=1.5cm, left=2cm, right=2cm]{geometry} + +% change the line spacing +\usepackage{setspace} +\setstretch{1.25} + +\usepackage[utf8]{inputenc} + +% NOTE: This needs to stay above hyperref otherwise internal links break. + +% start each section on new page and make section titles orange. +\usepackage{titlesec} +\titleformat{\section} +{\color{orange}\normalfont\Huge\bfseries} +\newcommand{\sectionbreak}{\clearpage} + +% custom colors +\definecolor{applegreen}{rgb}{0.55,0.71,0.0} + +% Remove figure from images +\usepackage[labelformat=empty]{caption} + +\usepackage{fancyvrb,newverbs} + +% see for different color codes https://rgbcolorcode.com/color/E6FFEA +\definecolor{linequote}{RGB}{224,215,188} +\definecolor{backquote}{RGB}{230,255,234} % background color of quotes +\definecolor{bordercolor}{RGB}{221,221,221} + +% change left border: https://tex.stackexchange.com/a/475716/114857 +% change left margin: https://tex.stackexchange.com/a/457936/114857 +\newtcolorbox{myquote}[1][]{% + enhanced, + breakable, + size=minimal, + left=10pt, + top=5pt, + bottom=5pt, + frame hidden, + boxrule=0pt, + sharp corners=all, + colback=backquote, + borderline west={4pt}{0pt}{bordercolor}, + #1 +} + +% redefine quote environment to use the myquote environment, see https://tex.stackexchange.com/a/337587/114857 +\renewenvironment{quote}{\begin{myquote}}{\end{myquote}} + +% remove the abstract title. +\usepackage{abstract} +\renewcommand{\abstractname}{} +\renewcommand{\absnamepos}{empty} + +\def\squarefoot{$ft^{\text{2}}$ } +\def\goalsimage{ +\begin{center} + +\hfill\break +\hfill\break + +\includegraphics[width=0.6\linewidth,height=\textheight,keepaspectratio]{img/goals.png} + +\end{center} + +} diff --git a/files/vars.default.yml b/files/vars.default.yml new file mode 100644 index 0000000..8a09dc7 --- /dev/null +++ b/files/vars.default.yml @@ -0,0 +1,31 @@ +--- +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" diff --git a/files/vars.vault.yml b/files/vars.vault.yml new file mode 100644 index 0000000..7cabc46 --- /dev/null +++ b/files/vars.vault.yml @@ -0,0 +1,18 @@ +--- +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" diff --git a/files/vault.default.yml b/files/vault.default.yml new file mode 100644 index 0000000..1e94dcb --- /dev/null +++ b/files/vault.default.yml @@ -0,0 +1,20 @@ +--- +vault_author_name: "Testy McTestface Vault" +vault_company: + website: "https://vault.example.com" + phone: "555-555-5555" + url_display_title: "www.VaultExample.com" + +vault_customer: + name: "Testy McTestface Sr Vault" + address: + street: "1234 Seasme Street" + city: "Vault" + state: "Foo" + zip: "55555" + +vault_document_links: + loads_folder: "https://vault.example.com/path/to/loads/folder" + trueflow_file: "https://vault.example.com/path/to/trueflow/file" + trueflow_forecast_file: "https://vault.example.com/path/to/trueflow/forecast/file" + document_folder: "https://vault.example.com/path/to/document/folder" diff --git a/justfile b/justfile new file mode 100644 index 0000000..e7be1a8 --- /dev/null +++ b/justfile @@ -0,0 +1,12 @@ + +work_dir := "/tmp/hpa-role" + +test *ARGS: clean + @mkdir {{work_dir}} + @ansible-playbook ./tests/test.yml \ + --inventory ./tests/inventory \ + --extra-vars "work_dir={{work_dir}}" \ + {{ARGS}} + +clean: + @rm -rf {{work_dir}} diff --git a/meta/main.yml b/meta/main.yml new file mode 100644 index 0000000..7466f24 --- /dev/null +++ b/meta/main.yml @@ -0,0 +1,10 @@ +#SPDX-License-Identifier: MIT-0 +galaxy_info: + author: m-housh + description: Role for managing and building Home Performance Assesment reports. + license: license MIT + min_ansible_version: "2.1" + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/tasks/build.yml b/tasks/build.yml new file mode 100644 index 0000000..68d04f6 --- /dev/null +++ b/tasks/build.yml @@ -0,0 +1,40 @@ +--- +- name: Debug. + ansible.builtin.debug: + msg: "Using {{ config.build_dir }}" + tags: + - debug + +- name: Ensure build directory exists. + ansible.builtin.file: + path: "{{ config.build_dir }}" + state: "directory" + mode: '0755' + tags: + - build + +- name: Copy Build Files. + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ config.build_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "{{ config.paths.definitions_path }}" + dest: "Definitions.md" + - src: "{{ config.paths.head_path }}" + dest: "head.tex" + tags: + - build + +- name: Build Templated Files + ansible.builtin.template: + src: "{{ item.src }}" + dest: "{{ config.build_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "{{ config.paths.report_path }}" + dest: "Report.md" + - src: "{{ config.paths.footer_path }}" + dest: "footer.tex" + tags: + - build diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..e0b1347 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,8 @@ +#SPDX-License-Identifier: MIT-0 +--- +# NOTE: Keep setup first, so that it runs before build. Useful for testing / debugging. +- ansible.builtin.import_tasks: + file: setup.yml + +- ansible.builtin.import_tasks: + file: build.yml diff --git a/tasks/setup.yml b/tasks/setup.yml new file mode 100644 index 0000000..a0dfed4 --- /dev/null +++ b/tasks/setup.yml @@ -0,0 +1,91 @@ +--- +- name: Copy Report Template File + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ config.work_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "templates/Report.md" + dest: "Report.md" + tags: + - setup + - setup-all + - setup-all-with-vault + - setup-with-vault + +- name: Copy Footer Template File + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ config.work_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "templates/footer.tex" + dest: "footer.tex" + tags: + - setup-footer + - setup-all + - setup-all-with-vault + +- name: Copy Head File + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ config.work_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "files/head.tex" + dest: "head.tex" + tags: + - setup-head + - setup-all + - setup-all-with-vault + +- name: Copy Definitions File + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ config.work_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "files/Definitions.md" + dest: "Definitions.md" + tags: + - setup-definitions + - setup-all + - setup-all-with-vault + +- name: Copy Vars File + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ config.work_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "files/vars.default.yml" + dest: "vars.yml" + tags: + - setup + - setup-all + +- name: Copy Vars File + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ config.work_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "files/vars.vault.yml" + dest: "vars.yml" + tags: + - setup-vault + - setup-with-vault + - setup-all-with-vault + +- name: Copy Vault Vars File + ansible.builtin.copy: + src: "{{ item.src }}" + dest: "{{ config.work_dir }}/{{ item.dest }}" + mode: '0600' + with_items: + - src: "files/vault.default.yml" + dest: "vault.yml" + tags: + - setup-vault + - setup-with-vault + - setup-all-with-vault diff --git a/templates/Report.md b/templates/Report.md new file mode 100644 index 0000000..e96009d --- /dev/null +++ b/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/templates/footer.tex b/templates/footer.tex new file mode 100644 index 0000000..1937ab9 --- /dev/null +++ b/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 }} + } + } +}} diff --git a/tests/.build/Definitions.md b/tests/.build/Definitions.md new file mode 100644 index 0000000..32c2160 --- /dev/null +++ b/tests/.build/Definitions.md @@ -0,0 +1,47 @@ +# Definitions + + + +### CFM50 {#cfm50-definition} + +Is a unit of measurement that is taken when a blower door test is performed on the home. Stands for +$C$ubic $F$eet per $M$inute at 50 pascals. + +### IAQ {#iaq-definition} + +Stands for $I$ndoor $A$ir $Q$uality. We spend most of our time indoors, so having good indoor air +quality can help reduce illness and potentially improve the quality and longevity of life. + +### LAIR {#lair-definition} + +Stands for $L$eakage $A$ir $I$nfiltration $R$ate, which is a metric that compares the square footage +of the home and it's blower door number. This aids in determining if a home is controllable by +properly sized HVAC equipment or if [shell] improvements (air sealing and insulation) should be +considered. + +### Load Caclulation {#load-calculation-definition} + +A load calculation, also called a Manual-J, calculates the heating and cooling requirements for a +home. Each home has a unique heating and cooling load based on the direction it faces, the air +leakage, the location, the insulation values, the types and sizes of windows, among other factors. + +### Shell {#shell-definition} + +Shell is a term used to describe the enclosure of the house. It is often used when talking about air +leakage and insulation levels. + +### SHR {#shr-definition} + +Stands for $S$ensible $H$eat $R$atio. Sensible heat ratio is the ratio of work required by the air +conditioner to remove moisture, as well as maintain the sensible temperature. The higher the number +the better. + +### TESP {#tesp-definition} + +Stands for $T$otal $E$xternal $S$tatic $P$ressure, which is a metric used to determine how much +resistance the blower motor has to overcome for the airflow requirement of the system. + +### WC {#wc-definition} + +Stands for $W$ater $C$olumn, which is a unit of measurement for pressure. diff --git a/tests/.build/Report.md b/tests/.build/Report.md new file mode 100644 index 0000000..61ded7e --- /dev/null +++ b/tests/.build/Report.md @@ -0,0 +1,307 @@ +--- +title: "Home Performance Report" +author: "Testy McTestface Jr" +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:** + + Testy McTestface Sr + + 1234 Seasme Street + No Mans Land, Foo 55555 + + ```{=latex} + \begin{center} + ``` + + \ + \ + \ + + [![logo](img/logo.png){ width=30% }](https://example.com) + + ```{=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 3,000 [CFM50] for the approximately +3,000 \squarefoot (1:1 [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 3,000:3,000 \squarefoot for a ratio of +> 1:1_ +> - _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] | +| -------------------- | ----------- | ------------- | ------------- | -------- | ------------------- | +| **3,000** | **Current** | **55,102** | **20,726** | **0.79** | **1:1** | +| 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]: "img/trueflow.png" + + +[trueflow-forecast-image]: "img/forecast.png" + + + +[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" + diff --git a/tests/.build/footer.tex b/tests/.build/footer.tex new file mode 100644 index 0000000..abac351 --- /dev/null +++ b/tests/.build/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{ https://example.com } + {\changefont\textbf{ + www.Example.com + }} +} +\fancyfoot[RE,RO]{\textbf{ + \changefont{ + Phone: \href{tel:555-555-5555 }{ + \color{orange}555-555-5555 + } + } +}} diff --git a/tests/.build/head.tex b/tests/.build/head.tex new file mode 100644 index 0000000..a2f14f6 --- /dev/null +++ b/tests/.build/head.tex @@ -0,0 +1,74 @@ +% https://jdhao.github.io/2019/05/30/markdown2pdf_pandoc/#the-top +% These were adapted from the above, which was very helpful in getting this +% functional. + +% change style of quote, see also https://tex.stackexchange.com/a/436253/114857 +\usepackage[most]{tcolorbox} + +% change page margins +\usepackage[top=2cm, bottom=1.5cm, left=2cm, right=2cm]{geometry} + +% change the line spacing +\usepackage{setspace} +\setstretch{1.25} + +\usepackage[utf8]{inputenc} + +% NOTE: This needs to stay above hyperref otherwise internal links break. + +% start each section on new page and make section titles orange. +\usepackage{titlesec} +\titleformat{\section} +{\color{orange}\normalfont\Huge\bfseries} +\newcommand{\sectionbreak}{\clearpage} + +% custom colors +\definecolor{applegreen}{rgb}{0.55,0.71,0.0} + +% Remove figure from images +\usepackage[labelformat=empty]{caption} + +\usepackage{fancyvrb,newverbs} + +% see for different color codes https://rgbcolorcode.com/color/E6FFEA +\definecolor{linequote}{RGB}{224,215,188} +\definecolor{backquote}{RGB}{230,255,234} % background color of quotes +\definecolor{bordercolor}{RGB}{221,221,221} + +% change left border: https://tex.stackexchange.com/a/475716/114857 +% change left margin: https://tex.stackexchange.com/a/457936/114857 +\newtcolorbox{myquote}[1][]{% + enhanced, + breakable, + size=minimal, + left=10pt, + top=5pt, + bottom=5pt, + frame hidden, + boxrule=0pt, + sharp corners=all, + colback=backquote, + borderline west={4pt}{0pt}{bordercolor}, + #1 +} + +% redefine quote environment to use the myquote environment, see https://tex.stackexchange.com/a/337587/114857 +\renewenvironment{quote}{\begin{myquote}}{\end{myquote}} + +% remove the abstract title. +\usepackage{abstract} +\renewcommand{\abstractname}{} +\renewcommand{\absnamepos}{empty} + +\def\squarefoot{$ft^{\text{2}}$ } +\def\goalsimage{ +\begin{center} + +\hfill\break +\hfill\break + +\includegraphics[width=0.6\linewidth,height=\textheight,keepaspectratio]{img/goals.png} + +\end{center} + +} diff --git a/tests/ansible.cfg b/tests/ansible.cfg new file mode 100644 index 0000000..f241590 --- /dev/null +++ b/tests/ansible.cfg @@ -0,0 +1,3 @@ +[defaults] +stdout_callback = yaml +roles_path = ~/.local/ansible/roles diff --git a/tests/inventory b/tests/inventory new file mode 100644 index 0000000..b1e03e0 --- /dev/null +++ b/tests/inventory @@ -0,0 +1,3 @@ +#SPDX-License-Identifier: MIT-0 +[all] +127.0.0.1 ansible_connection=local diff --git a/tests/test.yml b/tests/test.yml new file mode 100644 index 0000000..9c29965 --- /dev/null +++ b/tests/test.yml @@ -0,0 +1,14 @@ +#SPDX-License-Identifier: MIT-0 +--- +- hosts: all + remote_user: michael + + roles: + - role: '../../ansible-role-hpa' + + tasks: + - name: Start. + ansible.builtin.debug: + msg: "Starting task..." + + #- include_tasks: ../tasks/main.yml diff --git a/vars/main.yml b/vars/main.yml new file mode 100644 index 0000000..1cd72ea --- /dev/null +++ b/vars/main.yml @@ -0,0 +1,42 @@ +#SPDX-License-Identifier: MIT-0 +--- +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" + +config: + build_dir: "/tmp/hpa-role/.build" + work_dir: "/tmp/hpa-role" + + paths: + report_path: "templates/Report.md" + footer_path: "templates/footer.tex" + head_path: "files/head.tex" + definitions_path: "files/Definitions.md"