feat: Initial commit

This commit is contained in:
2024-11-25 17:06:32 -05:00
commit e2d1360ab3
19 changed files with 686 additions and 0 deletions

13
.editorconfig Normal file
View File

@@ -0,0 +1,13 @@
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false

47
Definitions.md Normal file
View File

@@ -0,0 +1,47 @@
# Definitions
<!-- NOTE: Keep these at the very bottom, if any new definitions are added then
they should also be added as links to the content section near the top. -->
### 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.

20
LICENSE Normal file
View File

@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2024 Michael Housh
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 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.

1
README.md Normal file
View File

@@ -0,0 +1 @@
# ansible-hpa-playbook

3
ansible.cfg Normal file
View File

@@ -0,0 +1,3 @@
[defaults]
inventory = ./inventory.ini
roles_path = ./roles

3
inventory.ini Normal file
View File

@@ -0,0 +1,3 @@
[local]
127.0.0.1 ansible_connection=local

3
justfile Normal file
View File

@@ -0,0 +1,3 @@
run-playbook *ARGS:
ansible-playbook ./main.yml "$@"

5
main.yml Normal file
View File

@@ -0,0 +1,5 @@
---
- name: HPA Playbook
hosts: all
roles:
- "repo_template"

View File

@@ -0,0 +1,6 @@
---
# Variables for use with the copy_if_not_exists role.
source: ""
destination: ""
mode: '0600'

View File

@@ -0,0 +1,17 @@
---
# Check if a file exists at the destination already, copy it if not.
- name: "Check if {{ destination | basename }} exists."
ansible.builtin.stat:
path: "{{ destination }}"
register: filestat
tags:
- always
- name: "Copy {{ source }} file to {{ destination }}."
ansible.builtin.copy:
src: "{{ source }}"
dest: "{{ destination }}"
mode: "{{ mode | default('0600') }}"
when: not filestat.stat.exists
tags:
- always

View File

@@ -0,0 +1,4 @@
---
output_dir: "{{ lookup('env', 'PWD') }}"
use_vault: true

View File

@@ -0,0 +1,47 @@
# Definitions
<!-- NOTE: Keep these at the very bottom, if any new definitions are added then
they should also be added as links to the content section near the top. -->
### 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.

View File

@@ -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}
```
<!-- below are just forced line breaks -->
\
\
\
[![logo]({{ links.images.logo }}){ width=30% }]({{ company.website }})
```{=latex}
\end{center}
```
---
<!-- NOTE: Table of contents section only needs changed if new sections are
added.
-->
# 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, lets 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 youll 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:
<!-- NOTE: This should probably be a table in most cases, with a rank.-->
<!--
| Goal | Rank |
| ------ | ---- |
| A goal | 8 |
| B goal | 5 |
-->
<!-- WARNING: Add goals here -->
1. Add air conditioning.
# How Leaky Is Your House
<!-- NOTE: Several of the variables used in this section are defined in vars.sh
Do not change them here, instead update them in the vars.sh file.
-->
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
<!-- WARNING: Add HVAC observations here. -->
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
<!-- WARNING: Add house observations here. -->
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
<!-- WARNING: Add the project loads here. -->
| [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.
<!-- WARNING: Update this summary for the given project -->
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.
<!-- NOTE: Force a new page here, for images and sub-section heading to be on same page -->
\newpage
## Your Static Measurements
![True Flow Report][trueflow-image]{ height=50% }
<!-- WARNING: Summarize the static measurements here -->
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]
<!-- NOTE: Force a new page here, for images and sub-section heading to be on same page -->
\newpage
## Static Measurements Forecast
![True Flow Forecast][trueflow-forecast-image]{ height=50% }
<!-- WARNING: Summarize the forecast results below. -->
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.
<!-- WARNING: Add summary here -->
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]
<!-- prettier-ignore-start -->
<!-- NOTE: These are reference links for short form linking in the document.
This allows all the links to be changed / updated in one place.
However most do not need updated unless sections are added, besides the
document links, which are defined / setup in vars.sh.
-->
[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"
<!-- IMPORTANT: Take screen shots of the TrueFlow reports and add to the img
folder with names / path setup in vars.sh -->
<!-- default is img/trueflow.png -->
[trueflow-image]: "{{ links.images.trueflow }}"
<!-- default is img/forecast.png -->
[trueflow-forecast-image]: "{{ links.images.trueflow_forecast }}"
<!-- NOTE: These links are defined in vars.sh -->
[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 }}"
<!-- prettier-ignore-end -->

View File

@@ -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 }}
}
}
}}

View File

@@ -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}
}

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -0,0 +1,41 @@
---
- name: Starting repo template role.
ansible.builtin.debug:
msg: "Output directory: {{ output_dir }}"
tags:
- "repo-template"
- "never"
- name: Copy general files.
ansible.builtin.copy:
src: "files/{{ item }}"
dest: "{{ output_dir }}/{{ item }}"
with_items:
- "Definitions.md"
- "Report.md"
- "head.tex"
- "footer.tex"
tags:
- "repo-template"
- "never"
- name: Copy vars files.
ansible.builtin.copy:
src: "files/vars.default.yml"
dest: "{{ output_dir }}/vars.yml"
tags:
- "with-default-vars"
- "never"
- name: Copy vars files.
ansible.builtin.copy:
src: "files/{{ item.src }}"
dest: "{{ output_dir }}/{{ item.dest }}"
with_items:
- src: "vars.vault.yml"
dest: "vars.yml"
- src: "vault.default.yml"
dest: "vault.yml"
tags:
- "with-vault-vars"
- "never"