commit 6e6c8870855843250fd581d6241ee5b1868c606b Author: Michael Housh Date: Tue Nov 26 16:57:43 2024 -0500 feat: Initial commit diff --git a/Definitions.md b/Definitions.md new file mode 100644 index 0000000..32c2160 --- /dev/null +++ b/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/Report.md b/Report.md new file mode 100644 index 0000000..e96009d --- /dev/null +++ b/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/footer.tex b/footer.tex new file mode 100644 index 0000000..1937ab9 --- /dev/null +++ b/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/head.tex b/head.tex new file mode 100644 index 0000000..a2f14f6 --- /dev/null +++ b/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/justfile b/justfile new file mode 100644 index 0000000..59e8e19 --- /dev/null +++ b/justfile @@ -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 diff --git a/project.justfile b/project.justfile new file mode 100644 index 0000000..ad01bbe --- /dev/null +++ b/project.justfile @@ -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}} diff --git a/repo_vars/vars.yml b/repo_vars/vars.yml new file mode 100644 index 0000000..c64dc1f --- /dev/null +++ b/repo_vars/vars.yml @@ -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" diff --git a/repo_vars/vault.yml b/repo_vars/vault.yml new file mode 100644 index 0000000..1ef9c0f --- /dev/null +++ b/repo_vars/vault.yml @@ -0,0 +1,14 @@ +$ANSIBLE_VAULT;1.1;AES256 +30346161643637316365613566633434316464333935313632346438616137363038663361633833 +6366336433373863333439313362663362303633333934360a616366613136623938356138363737 +37656136643965316465333735616564303963333830613234616230616638393963376134613931 +3265613362396339300a626432343731333532313663393336616233396231393765346464643632 +30666532346362363939313066303264663564336334666435376539623130383231383862636633 +33373839356637646464373733356262646538363065353639323265643638306331383663653432 +63626361633965623765393735383230643430613237653637373734663730386638656632366530 +30366664616465623361313339633930323536646165356563343234623934343664346132316235 +34343063353465646565333736323865386433373434363937616634643361306537353832613066 +32623838336535323936333763616531356235623764663734373730343439333035643264316464 +36363531616261626364663666663661656633306664643337373738363264366239313532633936 +33346638343231666636366431333832366337616536353030343365356233343633343365323834 +3439 diff --git a/vars.yml b/vars.yml new file mode 100644 index 0000000..80e6a33 --- /dev/null +++ b/vars.yml @@ -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" diff --git a/vault.yml b/vault.yml new file mode 100644 index 0000000..8ca65ff --- /dev/null +++ b/vault.yml @@ -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