feat: Initial commit

This commit is contained in:
2024-11-26 16:57:43 -05:00
commit 6e6c887085
10 changed files with 640 additions and 0 deletions

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.

307
Report.md Normal file
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 -->

26
footer.tex Normal file
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 }}
}
}
}}

74
head.tex Normal file
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}
}

9
justfile Normal file
View File

@@ -0,0 +1,9 @@
edit-repo-vault:
@ansible-vault edit ./repo_vars/vault.yml
create-repo-vault:
@ansible-vault create ./repo_vars/vault.yml
edit-project-vault:
@ansible-vault edit ./vault.yml

47
project.justfile Normal file
View File

@@ -0,0 +1,47 @@
playbook_dir := "${ANSIBLE_LOCAL}/ansible-hpa-playbook"
build_dir_name := ".build"
[private]
default:
just --list
[private]
run_pandoc dir output_file: build
@pandoc --pdf-engine=xelatex \
-H {{build_dir_name}}/"head.tex" \
-H {{build_dir_name}}/"footer.tex" \
-o {{dir}}/{{output_file}} \
{{build_dir_name}}/"Report.md" \
{{build_dir_name}}/"Definitions.md"
# Builds and fills the templates into the .build directory.
[group('build')]
build:
@just --justfile {{playbook_dir}}/justfile build {{justfile_directory()}}
# Build & generate an HTML report.
[group("generate")]
html title="Report.html" output_dir=".build": (
run_pandoc output_dir file_stem(title) + ".html"
)
open {{output_dir}}/{{ prepend(file_stem(title), ".html") }}
# Build & generate a PDF report.
[group("generate")]
pdf title="Report.pdf" output_dir="${PWD}": (run_pandoc output_dir file_stem(title) + ".pdf")
open {{output_dir}}/{{ prepend(file_stem(title), ".pdf") }} && \
@osascript ./scripts/notify.scpt
# Build & generate a Latex file.
[group("generate")]
[group("debug")]
tex title="Report.tex" output_dir=".build": (run_pandoc output_dir file_stem(title) + ".tex")
@echo "Wrote to: " + {{output_dir}}/{{file_stem(title)}} + ".tex"
[group('utilities')]
edit-vault:
@ansible-vault edit ./vault.yml
[group('utilities')]
clean:
@rm -rf {{build_dir_name}}

42
repo_vars/vars.yml Normal file
View File

@@ -0,0 +1,42 @@
---
document_title: "Home Performance Report"
# Files to copy to the project directory when setting up a new consult project.
#
# These can be specified as a single item which is a path to the file
# to copy. Or a dict that includes the following:
#
# src: "/path/to/the/file"
# dest: "FileName"
# mode: '0600' # optional mode, defaults to 0600
copy_on_setup:
- "Report.md"
- "vars.yml"
- "vault.yml"
- src: project.justfile
dest: justfile
# Files to copy to the build directory when building a consult document.
#
# These can be specified as a single item which is a path to the file
# to copy. Or a dict that includes the following:
#
# src: "/path/to/the/file"
# dest: "Name"
# mode: '0600' # optional mode, defaults to 0600
copy_on_build:
- "{{ template.path }}/Definitions.md"
- "{{ template.path }}/head.tex"
# Files to fill with their template values and copy to the build directory.
#
# These can be specified as a single item which is a path to the file
# to copy. Or a dict that includes the following:
#
# src: "/path/to/the/file"
# dest: "Name"
# mode: '0600' # optional mode, defaults to 0600
template_on_build:
- "{{ template.path }}/footer.tex"
- "{{ project_dir }}/Report.md"

14
repo_vars/vault.yml Normal file
View File

@@ -0,0 +1,14 @@
$ANSIBLE_VAULT;1.1;AES256
30346161643637316365613566633434316464333935313632346438616137363038663361633833
6366336433373863333439313362663362303633333934360a616366613136623938356138363737
37656136643965316465333735616564303963333830613234616230616638393963376134613931
3265613362396339300a626432343731333532313663393336616233396231393765346464643632
30666532346362363939313066303264663564336334666435376539623130383231383862636633
33373839356637646464373733356262646538363065353639323265643638306331383663653432
63626361633965623765393735383230643430613237653637373734663730386638656632366530
30366664616465623361313339633930323536646165356563343234623934343664346132316235
34343063353465646565333736323865386433373434363937616634643361306537353832613066
32623838336535323936333763616531356235623764663734373730343439333035643264316464
36363531616261626364663666663661656633306664643337373738363264366239313532633936
33346638343231666636366431333832366337616536353030343365356233343633343365323834
3439

40
vars.yml Normal file
View File

@@ -0,0 +1,40 @@
---
# Stores variables related to the template directory, which is used
# to setup projects and store commonly used files.
#
# WARNING: Update the path to where you store your template.
#
# template:
# path: "/path/to/template/dir
# vars: "repo_vars"
# repo: (optional if using a repo as a template)
template:
path: "/path/to/template/on/local/disk"
vars: "repo_vars"
# When using a git repository as a template dir. In general, it's
# probably best to pin to a particular version of the repo template
# instead of a branch.
#
# repo:
# url: "https://example.com/repo.git"
# version: "main"
repo: {}
author_name: "{{ vault_author_name }}"
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"

34
vault.yml Normal file
View File

@@ -0,0 +1,34 @@
$ANSIBLE_VAULT;1.1;AES256
64663764623565346536303437303736666430393336663438636535383832616362323464323036
3835313138323563346665353538303432313435613330630a623535623133323735333730653836
31303262613937316662346237653937386431656166383538393836306362366635393839643436
6163313838313334380a376130653263623930396338313466323265356661306633346434386362
62303036646238326537346233633635616531333839623332616634626263366532313264646164
64653364366561636438643439653739303066623831383735353333326635376561386133626261
30626433623234396166616237376132393565616266316662363533653865313838356563613036
39666163633531346334333335633962623330313030666636623334663165663438383531643731
37306132663035613539303837323631333033633939306132346662303636306665396262663561
36666238623133306434643761353533356535613535646663353535653634376539636231376236
37626263393936363036306433643734373363383562356236633035343838393437663739353661
35313936396136313864363364363339333838643861336364313862313665316232346631376536
38313332323638303937386637363638373332643266613536383364373832643036653763356436
65646662313839626231336139303666363765396138633061396161386666346135393162393336
37623332663935623233616366336634363437653862633832656237643633346237313234396538
37303061653430656562366635353939633234383733373832643635623065653766393465653561
61643334626261323664636564666432646463666463353538663432656330303466666533326230
36373931646261323866313839636565663133663265636133616630313032353661643033373061
32663065336338303966343461623535623666656138663365616632663366386262356539383965
61303266616164376462386139663462626362383139396563326631376437343236346366613232
38653365393439316637383933356665666163343937306366303838646465353361313437386465
30646536396432316462303738346161643438636439306239643163353362326436353230633837
66306333356335366332633533613230343138643539626263393434373038316661643832343338
66626233373838346137326162666364366566653536666234346633633531303436653137383561
35336530633831313330383934343537616433323337393334363466613765653239353430313166
31363831353936346266623832366463663739383438396663356330323163623163366536346333
31313036386133356530623934613830323435343338326630393933613464656438653530336131
65323066373761626664663866323937373637396133656438323233626230363132313031363231
64346135613461363137343038643662353362623162366262613438653737656664393264396134
33626431343463636139663836363533646335626336383863616634643134393737633962636162
62636533643961303036303039663233313362353463656532313336303031653566623539653939
61626337653735353734343035633036636339373034376139363264326463613339393635343462
63313162303635383239313664333563303433333136616136633532313730363962