diff --git a/.ansible/ansible.cfg b/.ansible/ansible.cfg index 12f6c74..e734e5b 100644 --- a/.ansible/ansible.cfg +++ b/.ansible/ansible.cfg @@ -1,5 +1,4 @@ [defaults] inventory=./inventory.ini -roles_path=./roles stdout_callback=yaml interpreter_python=auto_silent diff --git a/.ansible/playbook.yaml b/.ansible/playbook.yaml index 19259da..6e3f5df 100644 --- a/.ansible/playbook.yaml +++ b/.ansible/playbook.yaml @@ -3,5 +3,4 @@ hosts: all roles: - - role: report - tag: report + - role: hpa_role diff --git a/.ansible/requirements.yaml b/.ansible/requirements.yaml new file mode 100644 index 0000000..96814fb --- /dev/null +++ b/.ansible/requirements.yaml @@ -0,0 +1,3 @@ +- name: hpa_role + src: git+https://git.housh.dev/michael/ansible-role-hpa + version: v0.1.0 diff --git a/.ansible/roles/report/defaults/main.yaml b/.ansible/roles/report/defaults/main.yaml deleted file mode 100644 index 34a3368..0000000 --- a/.ansible/roles/report/defaults/main.yaml +++ /dev/null @@ -1,33 +0,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" - -build_dir: "build" diff --git a/.ansible/roles/report/files/Definitions.md b/.ansible/roles/report/files/Definitions.md deleted file mode 100644 index 32c2160..0000000 --- a/.ansible/roles/report/files/Definitions.md +++ /dev/null @@ -1,47 +0,0 @@ -# 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/.ansible/roles/report/files/head.tex b/.ansible/roles/report/files/head.tex deleted file mode 100644 index a2f14f6..0000000 --- a/.ansible/roles/report/files/head.tex +++ /dev/null @@ -1,74 +0,0 @@ -% 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/.ansible/roles/report/tasks/main.yaml b/.ansible/roles/report/tasks/main.yaml deleted file mode 100644 index 7f48fad..0000000 --- a/.ansible/roles/report/tasks/main.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- - -- name: Ensure output directory exists. - ansible.builtin.file: - path: "{{ build_dir }}" - state: "directory" - mode: '0755' - -- name: Copy Files. - ansible.builtin.copy: - src: "files/{{ item }}" - dest: "{{ build_dir }}/{{ item }}" - mode: '0600' - with_items: - - "Definitions.md" - - "head.tex" - -- name: Generate Footer File - ansible.builtin.template: - src: "templates/{{ item }}" - dest: "{{ build_dir }}/footer.tex" - mode: '0600' - with_items: - - "footer.tex" - tags: - - footer - -- name: Generate Templated Report File - ansible.builtin.template: - src: "templates/{{ item }}" - dest: "{{ build_dir }}/Report.md" - mode: '0600' - with_items: - - "Report.md" - tags: - - report diff --git a/.ansible/roles/report/templates/Report.md b/.ansible/roles/report/templates/Report.md deleted file mode 100644 index e96009d..0000000 --- a/.ansible/roles/report/templates/Report.md +++ /dev/null @@ -1,307 +0,0 @@ ---- -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/.ansible/roles/report/templates/footer.tex b/.ansible/roles/report/templates/footer.tex deleted file mode 100644 index 1937ab9..0000000 --- a/.ansible/roles/report/templates/footer.tex +++ /dev/null @@ -1,26 +0,0 @@ -% 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/Report.md b/Report.md deleted file mode 120000 index e50d07a..0000000 --- a/Report.md +++ /dev/null @@ -1 +0,0 @@ -.ansible/roles/report/templates/Report.md \ No newline at end of file diff --git a/justfile b/justfile index 70dd363..de40cc6 100644 --- a/justfile +++ b/justfile @@ -1,21 +1,25 @@ -build_dir := ".build" +build_dir_name := ".build" ansible_dir := ".ansible" +[private] +default: + just --list + [private] run_pandoc dir output_file: build @pandoc --pdf-engine=xelatex \ - -H {{build_dir}}/"head.tex" \ - -H {{build_dir}}/"footer.tex" \ + -H {{build_dir_name}}/"head.tex" \ + -H {{build_dir_name}}/"footer.tex" \ -o {{dir}}/{{output_file}} \ - {{build_dir}}/"Report.md" \ - {{build_dir}}/"Definitions.md" + {{build_dir_name}}/"Report.md" \ + {{build_dir_name}}/"Definitions.md" [private] run_ansible build *ARGS: @echo "Running ansible with build directory: {{build}}" @cd {{ansible_dir}} && \ ansible-playbook playbook.yaml \ - --extra-vars "build_dir={{build}}" \ + --extra-vars '{"config": { "work_dir": {{justfile_directory()}}, "build_dir": {{build}} }}' \ {{ARGS}} alias ansible := build @@ -23,14 +27,15 @@ alias ansible := build # Run the playbook, using the vault example files. [group("build")] ansible-vault-example: ( - run_ansible build_dir "--extra-vars @group_vars/vault_example/vars.yaml" + run_ansible build_dir_name + "--extra-vars @group_vars/vault_example/vars.yaml" "--extra-vars @group_vars/vault_example/vault.yaml" "--ask-vault-password" ) # Run the playbook, which generates files required to build a report. [group("build")] -build: (run_ansible justfile_directory()/build_dir) +build: (run_ansible justfile_directory()/build_dir_name) # Build & generate an HTML report. [group("generate")] @@ -51,9 +56,32 @@ pdf title="Report.pdf" output_dir="${PWD}": (run_pandoc output_dir file_stem(tit tex title="Report.tex" output_dir=".build": (run_pandoc output_dir file_stem(title) + ".tex") @echo "Wrote to: " + {{output_dir}}/{{file_stem(title)}} + ".tex" +# Setup the working directory +[group("setup")] +setup tag='setup': ( + run_ansible justfile_directory()/build_dir_name "--tags " + tag +) + +# Setup the working directory with ansible-vault. +[group("setup")] +setup-vault: (setup "setup-with-vault") + # Removes build directory, useful when debugging. [group("utilities")] -clean: - @rm -rf {{build_dir}} - # just encase it gets built in wrong directory. - @rm -rf {{ansible_dir}}/{{build_dir}} +clean-build-dir: + @rm -rf {{build_dir_name}} + @rm -rf {{ansible_dir}}/{{build_dir_name}} + +# Removes build directory, template, variable, and pdf files. Use with caution or work may lost. +[group("utilities")] +[confirm('This will remove build directories, template files, variables, and pdf files. Are you sure you want to do that?')] +clean-all: clean-build-dir + @rm -f ./Report.{md,pdf} + @rm -f vars.{yml,yaml} + @rm -f vault.{yml,yaml} + + +# Install the required ansible roles. +[group("utilities")] +install-requirements: + @ansible-galaxy install -r ./.ansible/requirements.yaml diff --git a/vars b/vars deleted file mode 120000 index b6ab58a..0000000 --- a/vars +++ /dev/null @@ -1 +0,0 @@ -/Users/michael/projects/hpa-consult-report/.ansible/group_vars/all \ No newline at end of file