From 67dc3540d64ba1573843f36b68da706d6740eb3b Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Thu, 20 Feb 2025 12:14:09 -0500 Subject: [PATCH] feat: Ports all existing articles and images. --- Sources/Mhoush/String+Extensions.swift | 7 + Sources/Mhoush/run.swift | 27 +- Sources/Mhoush/templates/BaseLayout.swift | 3 + Sources/Mhoush/templates/RenderArticles.swift | 25 +- content/404.md | 11 + .../2023-08-10-coil-bypass-overview.md | 101 ++ content/articles/2023-08-10-rss-feed.md | 38 + .../2023-09-08-pounds-of-water-removed.md | 68 + .../2023-09-14-why-mini-splits-stink.md | 66 + ...9-15-sizing-dehumidifier-by-latent-load.md | 48 + ...23-09-18-introducing-psychrometrics-cli.md | 102 ++ ...-introduction-to-programming-for-hvac-1.md | 241 +++ ...-introduction-to-programming-for-hvac-2.md | 109 ++ ...-introduction-to-programming-for-hvac-3.md | 125 ++ ...-introduction-to-programming-for-hvac-4.md | 205 +++ ...04-free-quotes-are-bad-for-the-industry.md | 103 ++ .../2025-01-05-vapor-htmx-todo-app.md | 103 +- .../2023-08-10-coil-bypass-overview.png | 3 + .../images/2023-08-10-register-throw.png | 3 + .../articles/images/2023-08-10-rss-feed.gif | 3 + .../images/2023-08-10-volume-equation.png | 3 + .../articles/images/2023-09-08-formula.png | 3 + .../2023-09-08-pounds-of-water-removed.png | 3 + .../articles/images/2023-09-08-solution.png | 3 + .../2023-09-14-why-mini-splits-stink.png | 3 + .../2023-09-15-pints-per-day-example.png | 3 + .../2023-09-15-pints-per-day-example2.png | 3 + .../images/2023-09-15-pints-per-day.png | 3 + ...-15-sizing-dehumidifier-by-latent-load.png | 3 + .../articles/images/2023-09-18-dh-size.png | 3 + content/articles/images/2023-09-18-help.png | 3 + ...3-09-18-introducing-psychrometrics-cli.png | 3 + .../images/2023-09-18-pounds-removed.png | 3 + .../articles/images/2023-09-18-properties.png | 3 + ...introduction-to-programming-for-hvac-1.png | 3 + .../articles/images/2023-09-21-spotlight.png | 3 + .../images/2023-09-21-terminal-line.png | 3 + .../articles/images/2023-09-21-terminal.png | 3 + .../images/2023-09-22-brew-output.png | 3 + ...introduction-to-programming-for-hvac-2.png | 3 + .../images/2023-09-24-hello-output.png | 3 + ...introduction-to-programming-for-hvac-3.png | 3 + .../images/2023-09-24-text-settings.png | 3 + .../images/2023-09-26-greet-output.png | 3 + ...introduction-to-programming-for-hvac-4.png | 3 + .../2023-09-26-part4-banner-transparent.png | 3 + ...4-free-quotes-are-bad-for-the-industry.png | 3 + .../images/2023-10-04-sinking-boat.png | 3 + content/static/prism.css | 112 +- deploy/404.html | 109 ++ deploy/{about/index.html => about.html} | 6 + .../index.html | 54 +- deploy/articles/2023/cancel-this/index.html | 76 +- .../2023/coil-bypass-overview/index.html | 266 +++ .../index.html | 264 +++ .../2023/heat-recovery-chiller/index.html | 80 +- deploy/articles/2023/hope/index.html | 58 +- deploy/articles/2023/index.html | 157 ++ .../introducing-psychrometrics-cli/index.html | 206 +++ .../index.html | 321 ++++ .../index.html | 214 +++ .../index.html | 228 +++ .../index.html | 294 ++++ .../2023/most-important-job/index.html | 34 +- .../2023/pounds-of-water-removed/index.html | 221 +++ deploy/articles/2023/rss-feed/index.html | 175 ++ .../index.html | 209 +++ deploy/articles/2023/the-struggle/index.html | 128 +- .../2023/why-mini-splits-stink/index.html | 196 +++ .../2023/you-should-learn-markdown/index.html | 36 +- .../articles/2024/elevating-hvac/index.html | 68 +- .../2024/free-as-in-freedom/index.html | 102 +- deploy/articles/2024/index.html | 6 + .../pgp-encryption-introduction/index.html | 80 +- deploy/articles/2024/unvr-as-nas/index.html | 44 +- deploy/articles/2025/index.html | 6 + .../2025/vapor-htmx-todo-app/index.html | 113 +- deploy/articles/feed.xml | 1543 +++++++++++++---- .../2023-08-10-coil-bypass-overview.png | 3 + .../images/2023-08-10-register-throw.png | 3 + .../articles/images/2023-08-10-rss-feed.gif | 3 + .../images/2023-08-10-volume-equation.png | 3 + deploy/articles/images/2023-09-08-formula.png | 3 + .../2023-09-08-pounds-of-water-removed.png | 3 + .../articles/images/2023-09-08-solution.png | 3 + .../2023-09-14-why-mini-splits-stink.png | 3 + .../2023-09-15-pints-per-day-example.png | 3 + .../2023-09-15-pints-per-day-example2.png | 3 + .../images/2023-09-15-pints-per-day.png | 3 + ...-15-sizing-dehumidifier-by-latent-load.png | 3 + deploy/articles/images/2023-09-18-dh-size.png | 3 + deploy/articles/images/2023-09-18-help.png | 3 + ...3-09-18-introducing-psychrometrics-cli.png | 3 + .../images/2023-09-18-pounds-removed.png | 3 + .../articles/images/2023-09-18-properties.png | 3 + ...9-19-calculate-seer-degradation-by-age.png | 4 +- ...introduction-to-programming-for-hvac-1.png | 3 + .../articles/images/2023-09-21-spotlight.png | 3 + .../images/2023-09-21-terminal-line.png | 3 + .../articles/images/2023-09-21-terminal.png | 3 + .../images/2023-09-22-brew-output.png | 3 + ...introduction-to-programming-for-hvac-2.png | 3 + .../images/2023-09-24-hello-output.png | 3 + ...introduction-to-programming-for-hvac-3.png | 3 + .../images/2023-09-24-text-settings.png | 3 + .../images/2023-09-26-greet-output.png | 3 + ...introduction-to-programming-for-hvac-4.png | 3 + .../2023-09-26-part4-banner-transparent.png | 3 + ...4-free-quotes-are-bad-for-the-industry.png | 3 + .../images/2023-10-04-sinking-boat.png | 3 + deploy/articles/index.html | 191 +- deploy/articles/tag/article/feed.xml | 122 +- deploy/articles/tag/article/index.html | 6 + deploy/articles/tag/chiller/feed.xml | 74 +- deploy/articles/tag/chiller/index.html | 6 + deploy/articles/tag/design/feed.xml | 191 ++ deploy/articles/tag/design/index.html | 96 + deploy/articles/tag/formulas/feed.xml | 182 +- deploy/articles/tag/formulas/index.html | 33 + deploy/articles/tag/general/feed.xml | 202 +-- deploy/articles/tag/general/index.html | 6 + deploy/articles/tag/gnupgp/feed.xml | 74 +- deploy/articles/tag/gnupgp/index.html | 6 + deploy/articles/tag/how-to/feed.xml | 64 +- deploy/articles/tag/how-to/index.html | 20 + deploy/articles/tag/hvac/feed.xml | 1237 +++++++++++-- deploy/articles/tag/hvac/index.html | 143 ++ deploy/articles/tag/hydronics/feed.xml | 74 +- deploy/articles/tag/hydronics/index.html | 6 + deploy/articles/tag/nas/feed.xml | 38 +- deploy/articles/tag/nas/index.html | 6 + deploy/articles/tag/networking/feed.xml | 38 +- deploy/articles/tag/networking/index.html | 6 + deploy/articles/tag/open-source/feed.xml | 2 +- deploy/articles/tag/open-source/index.html | 6 + deploy/articles/tag/pgp/feed.xml | 74 +- deploy/articles/tag/pgp/index.html | 6 + deploy/articles/tag/programming/feed.xml | 603 ++++++- deploy/articles/tag/programming/index.html | 63 + .../articles/tag/psychrometric-chart/feed.xml | 84 + .../tag/psychrometric-chart/index.html | 83 + deploy/articles/tag/psychrometrics/feed.xml | 143 ++ deploy/articles/tag/psychrometrics/index.html | 96 + deploy/articles/tag/security/feed.xml | 76 +- deploy/articles/tag/security/index.html | 6 + deploy/articles/tag/software/feed.xml | 554 +++++- deploy/articles/tag/software/index.html | 90 + deploy/articles/tag/tech-tip/feed.xml | 208 ++- deploy/articles/tag/tech-tip/index.html | 33 + deploy/index.html | 6 + deploy/static/prism.css | 112 +- 151 files changed, 10413 insertions(+), 1631 deletions(-) create mode 100644 content/404.md create mode 100644 content/articles/2023-08-10-coil-bypass-overview.md create mode 100644 content/articles/2023-08-10-rss-feed.md create mode 100644 content/articles/2023-09-08-pounds-of-water-removed.md create mode 100644 content/articles/2023-09-14-why-mini-splits-stink.md create mode 100644 content/articles/2023-09-15-sizing-dehumidifier-by-latent-load.md create mode 100644 content/articles/2023-09-18-introducing-psychrometrics-cli.md create mode 100644 content/articles/2023-09-21-introduction-to-programming-for-hvac-1.md create mode 100644 content/articles/2023-09-22-introduction-to-programming-for-hvac-2.md create mode 100644 content/articles/2023-09-24-introduction-to-programming-for-hvac-3.md create mode 100644 content/articles/2023-09-26-introduction-to-programming-for-hvac-4.md create mode 100644 content/articles/2023-10-04-free-quotes-are-bad-for-the-industry.md create mode 100644 content/articles/images/2023-08-10-coil-bypass-overview.png create mode 100644 content/articles/images/2023-08-10-register-throw.png create mode 100644 content/articles/images/2023-08-10-rss-feed.gif create mode 100644 content/articles/images/2023-08-10-volume-equation.png create mode 100644 content/articles/images/2023-09-08-formula.png create mode 100644 content/articles/images/2023-09-08-pounds-of-water-removed.png create mode 100644 content/articles/images/2023-09-08-solution.png create mode 100644 content/articles/images/2023-09-14-why-mini-splits-stink.png create mode 100644 content/articles/images/2023-09-15-pints-per-day-example.png create mode 100644 content/articles/images/2023-09-15-pints-per-day-example2.png create mode 100644 content/articles/images/2023-09-15-pints-per-day.png create mode 100644 content/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png create mode 100644 content/articles/images/2023-09-18-dh-size.png create mode 100644 content/articles/images/2023-09-18-help.png create mode 100644 content/articles/images/2023-09-18-introducing-psychrometrics-cli.png create mode 100644 content/articles/images/2023-09-18-pounds-removed.png create mode 100644 content/articles/images/2023-09-18-properties.png create mode 100644 content/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png create mode 100644 content/articles/images/2023-09-21-spotlight.png create mode 100644 content/articles/images/2023-09-21-terminal-line.png create mode 100644 content/articles/images/2023-09-21-terminal.png create mode 100644 content/articles/images/2023-09-22-brew-output.png create mode 100644 content/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png create mode 100644 content/articles/images/2023-09-24-hello-output.png create mode 100644 content/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png create mode 100644 content/articles/images/2023-09-24-text-settings.png create mode 100644 content/articles/images/2023-09-26-greet-output.png create mode 100644 content/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png create mode 100644 content/articles/images/2023-09-26-part4-banner-transparent.png create mode 100644 content/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png create mode 100644 content/articles/images/2023-10-04-sinking-boat.png create mode 100644 deploy/404.html rename deploy/{about/index.html => about.html} (91%) create mode 100644 deploy/articles/2023/coil-bypass-overview/index.html create mode 100644 deploy/articles/2023/free-quotes-are-bad-for-the-industry/index.html create mode 100644 deploy/articles/2023/introducing-psychrometrics-cli/index.html create mode 100644 deploy/articles/2023/introduction-to-programming-for-hvac-1/index.html create mode 100644 deploy/articles/2023/introduction-to-programming-for-hvac-2/index.html create mode 100644 deploy/articles/2023/introduction-to-programming-for-hvac-3/index.html create mode 100644 deploy/articles/2023/introduction-to-programming-for-hvac-4/index.html create mode 100644 deploy/articles/2023/pounds-of-water-removed/index.html create mode 100644 deploy/articles/2023/rss-feed/index.html create mode 100644 deploy/articles/2023/sizing-dehumidifier-by-latent-load/index.html create mode 100644 deploy/articles/2023/why-mini-splits-stink/index.html create mode 100644 deploy/articles/images/2023-08-10-coil-bypass-overview.png create mode 100644 deploy/articles/images/2023-08-10-register-throw.png create mode 100644 deploy/articles/images/2023-08-10-rss-feed.gif create mode 100644 deploy/articles/images/2023-08-10-volume-equation.png create mode 100644 deploy/articles/images/2023-09-08-formula.png create mode 100644 deploy/articles/images/2023-09-08-pounds-of-water-removed.png create mode 100644 deploy/articles/images/2023-09-08-solution.png create mode 100644 deploy/articles/images/2023-09-14-why-mini-splits-stink.png create mode 100644 deploy/articles/images/2023-09-15-pints-per-day-example.png create mode 100644 deploy/articles/images/2023-09-15-pints-per-day-example2.png create mode 100644 deploy/articles/images/2023-09-15-pints-per-day.png create mode 100644 deploy/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png create mode 100644 deploy/articles/images/2023-09-18-dh-size.png create mode 100644 deploy/articles/images/2023-09-18-help.png create mode 100644 deploy/articles/images/2023-09-18-introducing-psychrometrics-cli.png create mode 100644 deploy/articles/images/2023-09-18-pounds-removed.png create mode 100644 deploy/articles/images/2023-09-18-properties.png create mode 100644 deploy/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png create mode 100644 deploy/articles/images/2023-09-21-spotlight.png create mode 100644 deploy/articles/images/2023-09-21-terminal-line.png create mode 100644 deploy/articles/images/2023-09-21-terminal.png create mode 100644 deploy/articles/images/2023-09-22-brew-output.png create mode 100644 deploy/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png create mode 100644 deploy/articles/images/2023-09-24-hello-output.png create mode 100644 deploy/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png create mode 100644 deploy/articles/images/2023-09-24-text-settings.png create mode 100644 deploy/articles/images/2023-09-26-greet-output.png create mode 100644 deploy/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png create mode 100644 deploy/articles/images/2023-09-26-part4-banner-transparent.png create mode 100644 deploy/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png create mode 100644 deploy/articles/images/2023-10-04-sinking-boat.png create mode 100644 deploy/articles/tag/design/feed.xml create mode 100644 deploy/articles/tag/design/index.html create mode 100644 deploy/articles/tag/psychrometric-chart/feed.xml create mode 100644 deploy/articles/tag/psychrometric-chart/index.html create mode 100644 deploy/articles/tag/psychrometrics/feed.xml create mode 100644 deploy/articles/tag/psychrometrics/index.html diff --git a/Sources/Mhoush/String+Extensions.swift b/Sources/Mhoush/String+Extensions.swift index d15aa6b..4fd63c8 100644 --- a/Sources/Mhoush/String+Extensions.swift +++ b/Sources/Mhoush/String+Extensions.swift @@ -27,4 +27,11 @@ extension String { return prefix(length - end.count).split(separator: " ").dropLast().joined(separator: " ") + end } + + var removeBreaks: String { + replacingOccurrences(of: "
", with: "") + .replacingOccurrences(of: "
", with: "") + .trimmingCharacters(in: .whitespacesAndNewlines) + } + } diff --git a/Sources/Mhoush/run.swift b/Sources/Mhoush/run.swift index 2d26afe..54950fb 100644 --- a/Sources/Mhoush/run.swift +++ b/Sources/Mhoush/run.swift @@ -1,4 +1,5 @@ import Foundation +import HTML import PathKit @preconcurrency import Saga import SagaParsleyMarkdownReader @@ -45,6 +46,12 @@ func permalink(item: Item) { item.relativeDestination = Path(components: components) } +func removingBreaks(item: Item) { + // remove explicit
from items that show up likely due to how prettier formats + // markdown files inside of neovim. + item.body = item.body.removeBreaks +} + @main struct Run { static func main() async throws { @@ -56,14 +63,13 @@ struct Run { folder: "articles", metadata: ArticleMetadata.self, readers: [.parsleyMarkdownReader], - itemProcessor: sequence(publicationDateInFilename, permalink), + itemProcessor: sequence(removingBreaks, publicationDateInFilename, permalink), filter: \.public, writers: [ .itemWriter(swim(renderArticle)), .listWriter(swim(renderArticles)), .tagWriter(swim(renderTag), tags: \.metadata.tags), .yearWriter(swim(renderYear)), - // Atom feed for all articles, and a feed per tag .listWriter( atomFeed( @@ -84,27 +90,12 @@ struct Run { ) ] ) - - // All markdown files within the "apps" subfolder will be parsed to html, - // using AppMetadata as the Item's metadata type. - // .register( - // folder: "apps", - // metadata: AppMetadata.self, - // readers: [.parsleyMarkdownReader], - // writers: [.listWriter(swim(renderApps))] - // ) - // - // .register( - // folder: "photos", - // readers: [.parsleyMarkdownReader], - // writers: [.itemWriter(swim(renderPhotos))] - // ) - // All the remaining markdown files will be parsed to html, // using the default EmptyMetadata as the Item's metadata type. .register( metadata: PageMetadata.self, readers: [.parsleyMarkdownReader], + itemWriteMode: .keepAsFile, // need to keep 404.md as 404.html, not 404/index.html writers: [.itemWriter(swim(renderPage))] ) diff --git a/Sources/Mhoush/templates/BaseLayout.swift b/Sources/Mhoush/templates/BaseLayout.swift index 46104ef..74cf438 100644 --- a/Sources/Mhoush/templates/BaseLayout.swift +++ b/Sources/Mhoush/templates/BaseLayout.swift @@ -78,6 +78,9 @@ private func footer(_ rssLink: String) -> Node { " | " a(href: "mailto:michael@mhoush.com", rel: "nofollow") { "Email" } } + script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js") + script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js") + script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js") } } diff --git a/Sources/Mhoush/templates/RenderArticles.swift b/Sources/Mhoush/templates/RenderArticles.swift index c1682fe..d685383 100644 --- a/Sources/Mhoush/templates/RenderArticles.swift +++ b/Sources/Mhoush/templates/RenderArticles.swift @@ -28,7 +28,7 @@ func renderArticleForGrid(article: Item) -> Node { p { a(href: article.url) { div { - img(alt: "banner", src: article.imagePath) + // img(alt: "banner", src: article.imagePath) article.summary } } @@ -56,7 +56,13 @@ func renderArticles(context: ItemsRenderingContext) -> Node { } } -func _renderArticles(_ articles: [Item], canocicalURL: String, title pageTitle: String, rssLink: String = "", extraHeader: NodeConvertible = Node.fragment([])) -> Node { +func _renderArticles( + _ articles: [Item], + canocicalURL: String, + title pageTitle: String, + rssLink: String = "", + extraHeader: NodeConvertible = Node.fragment([]) +) -> Node { return baseLayout(canocicalURL: canocicalURL, section: .articles, title: pageTitle, rssLink: rssLink, extraHeader: extraHeader) { articles.map { article in section(class: "mb-10") { @@ -73,9 +79,20 @@ func _renderArticles(_ articles: [Item], canocicalURL: String, } func renderTag(context: PartitionedRenderingContext) -> Node { - let extraHeader = link(href: "/articles/tag/\(context.key.slugified)/feed.xml", rel: "alternate", title: "\(SiteMetadata.name): articles with tag \(context.key)", type: "application/rss+xml") + let extraHeader = link( + href: "/articles/tag/\(context.key.slugified)/feed.xml", + rel: "alternate", + title: "\(SiteMetadata.name): articles with tag \(context.key)", + type: "application/rss+xml" + ) - return _renderArticles(context.items, canocicalURL: "/articles/tag/\(context.key.slugified)/", title: "Articles in \(context.key)", rssLink: "tag/\(context.key.slugified)/", extraHeader: extraHeader) + return _renderArticles( + context.items, + canocicalURL: "/articles/tag/\(context.key.slugified)/", + title: "Articles in \(context.key)", + rssLink: "tag/\(context.key.slugified)/", + extraHeader: extraHeader + ) } func renderYear(context: PartitionedRenderingContext) -> Node { diff --git a/content/404.md b/content/404.md new file mode 100644 index 0000000..f68d4e6 --- /dev/null +++ b/content/404.md @@ -0,0 +1,11 @@ +--- +section: notFound +--- + +# 404 + +## Oops! + +Your page was not found. + +Looking for one of the articles? diff --git a/content/articles/2023-08-10-coil-bypass-overview.md b/content/articles/2023-08-10-coil-bypass-overview.md new file mode 100644 index 0000000..b48d984 --- /dev/null +++ b/content/articles/2023-08-10-coil-bypass-overview.md @@ -0,0 +1,101 @@ +--- +tags: HVAC, design +--- + +# Coil Bypass Overview + +This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a +coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the challenges of this style of +system. + +## What is a Coil Bypass + +A coil bypass is not to be mistaken for a zoning system bypass, where airflow is "relieved" from the supply side of the system back into the +return. Instead, a coil bypass diverts a portion of the airflow around the coil using a bypass damper(s). The bypass can serve several +functions depending on the application, but in general it allows for a constant volume of air to be delivered to the space while the output +of the coil can be shifted towards more or less dehumidification. In other words, it decouples the total system airflow from the coil +airflow. + +The bypassed air mixes with the supply air stream to act as a reheat source, however unlike a typical reheat source it does not add more +sensible load to the structure, instead it just brings the supply air temperature closer to the existing home's temperature while still +covering the latent and sensible loads of the home. A warmer duct system reduces the losses of the duct to unconditioned spaces as well as +reduces the risk for duct condensation. + +The coil bypass strategy, as far as I know, was pioneered by [Harry Boody](https://www.linkedin.com/in/harry-boody-9b8a4366/) of Energy +Innovations and Scientific Environmental Design, Inc. However their websites are no longer active, so I'm not sure if they are still active +in the HVAC design space or not. + +## The Problem + +| Why | | +| -------- | ---------------------------------------------------------------- | +| Question | Why would we want to utilize a strategy such as the coil bypass? | +| Answer | Improved indoor air quality (IAQ) | + +ASHRAE's recommandation for the amount of air changes per hour (ACH) in a residential structure to be in the range of 3-5 ACH, and in +general the higher the better, along with a MERV 13+ filter. In some / most cases the system airflow does not meet that criteria, especially +low load homes or high volume homes. + +For example, let's imagine a single story ranch home that is 2,500 square feet with 9 foot ceilings. This home is relatively tight +construction and after doing the heating and cooling loads we've selected a 2.5 Ton system for this home. It is located in a green grass +climate that needs some priority on dehumidification and requires an airflow of 350 CFM/Ton (875 CFM). + +We determine the volume of the conditioned space. + +2,500 x 9 = 22,500 ft^3 + +![volume-equation](/articles/images/2023-08-10-volume-equation.png) + +| **Where:** | | +| ---------- | ------------------------------------- | +| **V** | _is the volume of the home_ | +| **ACH** | _is the desired air changes per hour_ | +| **60** | _conversion from hours to minutes_ | + +Below is a table of the required CFM to meet the different air changes per hour. + +| | CFM | +| --------------- | :-----------------: | +| (22,500 x 3)/60 | **_1,125 @ 3 ACH_** | +| (22,500 x 4)/60 | **_1,500 @ 4 ACH_** | +| (22,500 x 5)/60 | **_1,875 @ 5 ACH_** | + +As you can see we have a discrepency of meeting even the low end of 3 ACH. The high end of 5 ACH is over 2x the airflow for our 2.5 Ton +system. The coil bypass strategy is one viable way, by decoupling the total system airflow from the coil airflow without, which eliminates +the need of an auxilary fan / system that circulates air through some sort of filtration system. + +### Multi-Stage Systems + +A challenge with multi-stage systems, even when sized properly, is that we often run at part-load conditions, and spend the majority of the +time in lower stages. The lower stages often do worse at dehumidification than when running at full load. + +When the equipment runs in lower stages on a traditional system the total system airflow is reduced even further from the recommended air +changes per hour. This reduced airflow also causes the throw of the air from the registers to be reduced which can lead to increased odds of +stratification, poor air mixing, and increased potential for poor mean radiant temperatures (MRT) of the surfaces. The decreased airflow in +low stages, lowers the velocity in the duct system, while low velocity is not a concern, it does increase the duct gains and increase the +possibility of condensation on the ducts when they're located outside of the thermal envelope of the building. + +Let's imagine we have a duct system that has high wall registers located in a soffit at the interior wall that moves 100 CFM and we are +trying to throw the air to the exterior wall which includes a window. The wall is @ 12 feet from the register. We've selected a register +that meets the criteria, at high stage airflow it has a throw of 11.5 feet (shown as the green rectangle). When the system runs in low +stage, the airflow is reduced to 70% of high stage (70 CFM), which would give us a throw from the register of @ 7 feet (shown as the red +rectangle). + +![register-throw](/articles/images/2023-08-10-register-throw.png) + +The reduced flow through the register causes the air to only make it about 60% across the room before reaching it's terminal velocity, which +can cause the room to feel uncomfortable since the air never reaches the exterior wall and window. + +By decoupling the fan from the coil airflow it is possible to run in low stages, still have adequate dehumidification performance out of the +system, and achieve the proper throw from the registers. + +## Conclusion + +In this article we've begun to scratch the surface of what a coil bypass strategy is in an HVAC system, as well as some of the challenges +that it can help solve. We've learned about why we may desire to decouple the total system airflow from the coil airflow. + +In future articles we will continue to explore some of the features, benefits, and challenges presented by such a strategy. + +## Related Resources + +[HVAC School - Bypass Dehumidification / Airflow HVAC Design](https://hvacrschool.com/bypass-dehumidification-airflow-hvac-design/) diff --git a/content/articles/2023-08-10-rss-feed.md b/content/articles/2023-08-10-rss-feed.md new file mode 100644 index 0000000..e744914 --- /dev/null +++ b/content/articles/2023-08-10-rss-feed.md @@ -0,0 +1,38 @@ +--- +tags: software, how-to +image: 2023-08-10-rss-feed.gif +--- + +# Rss Feed + +In this article I will show how to add this site's rss feed. In particular, we will be using [NetNewsWire](https://netnewswire.com) as the +rss reader. + +## What is an RSS Feed + +An RSS feed will show you new posts, generally from a blog, without having to remember to check the website at regular intervals or signup +for an email list for notifications. + +NetNewsWire puts an RSS feed as: + +**It's like podcasts** - but for _reading._ + +You consume an RSS feed, using an RSS reader application or extension in your browser. + +## Step One + +First find and download an RSS reader, you can download [NetNewsWire](https://netnewswire.com) for macOS from the link, or for iOS from the +[AppStore](https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210). + +## Step Two + +Add the rss feed to stay up to date when I publish new articles. + +1. Click the plus in the right side of the sidebar and select `New Feed...` +1. In the URL field add: `https://mhoush.com/articles/feed.xml` +1. Optionally give it a name +1. Click the `Add` button. + +![rss gif](/articles/images/2023-08-10-rss-feed.gif) + +That's it. diff --git a/content/articles/2023-09-08-pounds-of-water-removed.md b/content/articles/2023-09-08-pounds-of-water-removed.md new file mode 100644 index 0000000..bea2f00 --- /dev/null +++ b/content/articles/2023-09-08-pounds-of-water-removed.md @@ -0,0 +1,68 @@ +--- +tags: tech-tip, HVAC, formulas, psychrometrics, psychrometric-chart +--- + +# Pounds of Water Removed + +This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream). + +This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This +article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here +are a couple articles to familiarize yourself. + +## Articles + +- [Understand Dew-Point](https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/) +- [Impact of Adding or Removing Water from Air](https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/) + +## Scenario + +Let's imagine that we have an air-conditioner that has the following measurements taken: + +- Return Air: 75° / 50% RH +- Supply Air: 55° / 81% RH + +We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air +conditions). + +![chart](/articles/images/2023-09-08-pounds-of-water-removed.png) + +We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the +relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per +pound of air. + +This gives us the following values: + +- Return Air: 66 gr/lb +- Supply Air: 52 gr/lb + +We can then use the following formula to calculate the pounds of water removed. + +![formula](/articles/images/2023-09-08-formula.png) + +| **Where** | | +| ------------ | -------------------------------------------------------- | +| **W** | _Weight of water in pounds per hour_ | +| **4.5** | _Constant based on density / specific heat of moist air_ | +| **CFM** | _Airflow in cubic feet per minute_ | +| **∆G** | _Difference in grains of moisture_ | +| **7000** | _Constant based on grains of moisture in saturated air_ | + +## Solution + +First, we solve for the difference in grains between the two air streams. + +∆G = 66 - 52 = 14 + +Next, we've measured our airflow and have determined to have **797 CFM** of airflow across the evaporator coil, so we can substitute our +values into the formula. + +![solution](/articles/images/2023-09-08-solution.png) + +So, we are removing about 7 pounds of water per hour at these conditions. + +Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that +can often be rated in pints per day. + +I hope you've found this article helpful, thanks for reading! diff --git a/content/articles/2023-09-14-why-mini-splits-stink.md b/content/articles/2023-09-14-why-mini-splits-stink.md new file mode 100644 index 0000000..384e5d7 --- /dev/null +++ b/content/articles/2023-09-14-why-mini-splits-stink.md @@ -0,0 +1,66 @@ +--- +tags: HVAC +--- + +# Why Mini Splits Stink + +In this general article, I explain why I don't generally like to use mini-splits. + +## The Positive Sides + +When people say mini-splits, in general we mean "ductless" style units. These can either be high wall, floor mounted, or ceiling mounted +consoles. These units do offer really high efficiency and becuase they're "ductless" you don't have duct gains/losses. + +These units are common in many other countries and have been around for a long time. They do are generally quick and fairly easy to install, +but are mostly a pain in the tail to work on. + +So, the plus side to these units are that they are really efficient, they generally have models that have a high-heat output for colder +climates, although this option is becoming more prevelant in traditional unitary style heat pumps as well. You do not have heat gains or +losses due to ductwork being in unconditioned spaces. + +## The Down Sides + +Most mini-split systems do not do the greatest at humidity removal. This is partially because they use proprietary algorithms to control the +blower and compressor. They do achieve long run-times, which is often good for comfort stand points, however there is generally not a good +way to control / hack them to work towards achieving good IAQ. + +These units offer next to no filtration, so in order to have filtration you need to utilize a stand-alone / portable filtration means. Which +a lot of the portable filtration systems have problems of their own (come bundled with UV / PCO technology or other "space" technology that +can lead to their own IAQ problems). It also introduces another fan, which may / may not be that efficient. In other words, when considering +other items to make them more comparable to what a traditional system offers, are they really that much more efficient? + +These systems also do not have a good method of offering basic fresh air control / management, so other systems, such as an ERV need to be +installed to handle the fresh air requirements of the building. + +The controls for these systems are often hard to understand / use. They do allow you to change fan speeds, but they control the compressor. +The fans often run all the time, which is not necessarily a bad thing, but they don't really offer many ramping profiles or adjustments to +change the blower speed when the compressor is off vs. on. + +These systems get dirty quickly, are generally a pain to clean properly, and are not easily repairable. Manufacturer support is often poor, +the documents aren't always translated very well, and most technicians hate to work on them. + +# What about ducted models? + +But what about the ducted models? Well, the ducted models are a step in the right direction. You can use filters on them, although some of +the manufacturer's do not recommend installing better / improved filter cabinets (like a 4-5" media filter), however we have done that +successfully many times and always include media filters as an option on our installations, but you do need to make sure that they have a +very low pressure drop, as they a lot are not designed for very much static pressure. + +The ducted models still generally have the same control problems, previously mentioned. If you read my introduction to the +[coil-bypass-system](https://mhoush.com/posts/coil-bypass-overview/), you have a basic understanding that even most traditional systems / +designers do not focus on the proper air-changes in a structure to maintain proper IAQ levels. + +You can't easily pair mini-splits with larger fan-coils because they are "communicating" style systems. + +## Conclusion + +Don't get me wrong, there are applications that are well suited for mini-splits. These are often applications like sun-rooms, garages, small +server-rooms / network storage rooms, and many others. But in my opinion these are not at all my favorite and are generally really far down +my list of options that I want to recommend to my clients. + +As an industry, I feel we need to step back and refocus on the pillars of IAQ. Filtration, fresh-air, and humidity control. The +manufacturers / government should put less emphasis on chasing efficiency just to shoot ourselves in the foot and loose the qualities that +make traditional / unitary style systems cover more if not all of the 3 pillars of proper IAQ. + +There's plenty that I did not cover and I'm sure I missed some things, but just needed to rant for a few minutes... Thank you for making it +to the end! diff --git a/content/articles/2023-09-15-sizing-dehumidifier-by-latent-load.md b/content/articles/2023-09-15-sizing-dehumidifier-by-latent-load.md new file mode 100644 index 0000000..a935e66 --- /dev/null +++ b/content/articles/2023-09-15-sizing-dehumidifier-by-latent-load.md @@ -0,0 +1,48 @@ +--- +tags: tech-tip, HVAC, formulas, design +--- + +# Dehumidifier Sizing by Latent Load + +This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you've done a load calculation and know the latent load of the structure. + +## Formulas + +The formula above is used to solve for the pints per hour required to size a dehumidifier. + +| Where | | +| ----- | ------------ | +| Ql | Latent load | +| Ph | Pints / hour | + +We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula. + +![pints-per-day-formula](/articles/images/2023-09-15-pints-per-day.png) + +| Where | | +| ----- | ----------- | +| Ql | Latent load | +| Pd | Pints / day | + +In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized +properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during +peak cooling demand. + +## Example + +Let's imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula. + +![pints-per-day-formula-example](/articles/images/2023-09-15-pints-per-day-example.png) + +Or if we just want to cover the latent capacity at 85% of the full latent load. + +![pints-per-day-formula-example](/articles/images/2023-09-15-pints-per-day-example2.png) + +This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition +we wanted to use. + +I don't feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an +oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application. + +Thanks for reading! diff --git a/content/articles/2023-09-18-introducing-psychrometrics-cli.md b/content/articles/2023-09-18-introducing-psychrometrics-cli.md new file mode 100644 index 0000000..7dba2a5 --- /dev/null +++ b/content/articles/2023-09-18-introducing-psychrometrics-cli.md @@ -0,0 +1,102 @@ +--- +tags: HVAC, psychrometrics, software +title: "Introducing Psychrometrics Cli" +--- + +# Introducing Psychrometrics CLI + +Today, I'm releasing a command line application that is built on top of my +[swift-psychrometrics](https://github.com/swift-psychrometrics/swift-psychrometrics) package, that I open sourced over 2 years ago. + +The application consists of many calculations / conversions for psychrometric properties of an air stream. The tool works for both imperial +and metric units. The application will work natively on macOS, but can also be ran through a `docker` container on other platforms. + +## Why + +I spend a lot of time in my terminal, because I can work so much more efficiently. I discovered many years ago that the more I can do using +simple applications and keyboard over a mouse and a web browser or native application the more I can accomplish. I understand this is +intimidating for many who think they are _"not good with computers"._ I can assure that was me several years ago, I would only encourage you +to not be afraid and give it a shot. We are at a time in society where it is easier than ever to get informed and learned new skills. + +## Installation + +For complete installation instructions, you can view the [github](https://github.com/swift-psychrometrics/psychrometrics-cli) repository. + +The following instructions are based on using macOS. + +### Open your terminal application. + +Personally, I use [iTerm2](https://iterm2.com/), however you can use the default `Terminal` app. Found at +`/Applications/Utilities/Terminal.app`. + +## Install Homebrew + +We use [Homebrew](https://brew.sh) for package distribution of the pre-built application binaries. You can follow their instructions to +install. + +### Tap our custom formula tap. + +```bash +brew tap swift-psychrometrics/formula +``` + +### Install the psychrometrics application + +```bash +brew install psychrometrics +``` + +That's it! + +## Usage + +I will run through a couple of the commands that are supplied with the application and show what you can expect the outputs to be. + +### Properties + +The following command will output a bunch of the psychrometric properties of an air stream. There are several ways to call it, but generally +you will supply the dry bulb temperature and the relative humidity. + +Below, we calculate the psychrometric properties based on 75°F and 50% humidity. + +```bash +psychrometrics --dry-bulb 75 --relative-humidity 50 +``` + +![properties-output](/articles/images/2023-09-18-properties.png) + +### Dehumidifier Sizing + +If you've read some of my recent articles on calculating the +[dehumidifier size required based on the latent load](https://mhoush.com/posts/sizing-dehumidifier-by-latent-load/), the application also +ships with a calculation that will do this for you and has the ability to calculate it at different `coverages` that you can supply. + +For example if we've done a load calculation and determined that we have a latent load of `4,334 BTU/h` then we could run the following +command to see what size dehumidifier is needed for `100%, 85%, and 70%` of the latent load. + +```bash +psychrometrics dh size --coverage 100 85 70 --verbose 4334 +``` + +![dh-size](/articles/images/2023-09-18-dh-size.png) + +### Pounds of Water Removed + +I also recently wrote an article about [calculating the pounds of water removed](https://mhoush.com/posts/pounds-of-water-removed/) from an +air stream given the grains of moisture removed. + +Below is an example of calculating the pounds of water removed per hour based on the example in the article (14 delta-grains) + +```bash +psychrometrics dh pounds-removed --delta 14 --cfm 797 --verbose +``` + +![pounds-removed](/articles/images/2023-09-18-pounds-removed.png) + +### Help + +You can use `--help` option to show help and the list of commands provided. + +![help](/articles/images/2023-09-18-help.png) + +If you have any questions then feel free to email or message me. I hope some of you may find this application useful. diff --git a/content/articles/2023-09-21-introduction-to-programming-for-hvac-1.md b/content/articles/2023-09-21-introduction-to-programming-for-hvac-1.md new file mode 100644 index 0000000..ec6367f --- /dev/null +++ b/content/articles/2023-09-21-introduction-to-programming-for-hvac-1.md @@ -0,0 +1,241 @@ +--- +tags: HVAC, programming, software +--- + +# Introduction to Programming for HVAC Part-1 + +This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers. + +## Why + +I think if nothing else, this series can help gain knowledge, tips, and tricks to make you more comfortable with your computer. I hope that +you will at least learn how to use your `terminal` application and more specifically `vim` motions and keybindings (more on that in another +article). + +The goal of this article is to just get a machine setup with tools and to start exploring. I am a shill for `macOS`, so all of these will be +specifically geared towards that and my workflows, most everything that is showcased should also work on `linux` machines (not sure about +`windows`), although you may have to search for specific instructions on installing software for other platforms. + +What I have learned on my journey in programming is that the more you can lean on small software packages that focus on a single task, but +do them well, the better. The less you use your mouse, the more productive you can be. The more you can work with `text` files and formats +the more portable and transformable your workflows can be. + +## Getting Started + +The first thing that we will focus on is becoming familiar with the terminal application. On macOS the terminal application is located at +`/Applications/Utilities/Terminal.app`. However, rather than click around to find it, you can use the `⌘` to pull up your spotlight +search, then type `Terminal` to select the terminal application. + +![spotlight](/articles/images/2023-09-21-spotlight.png) + +### Terminal Overview + +Your terminal is a program that allows you to run programs by typing commands into it's window. There are a lot of built-in commands and a +bunch that you can install. The terminal is very customizable (and once familiar, you will constantly be tweaking / adjusting to suit your +needs). Right now customization is not what we will focus on, however in future articles I will provide tips and tricks on customizing it. +Right now, we only need to know how to open it up and type in commands. + +![terminal](/articles/images/2023-09-21-terminal.png) + +Below is an image / explanation of what the default status line includes. + +![terminal-line](/articles/images/2023-09-21-terminal-line.png) + +### Learn Basic Commands (Built-in) + +Here are a few basic commands that you should familiarize yourself with, as you will use them often when working inside of a terminal. + +### Change Directory + +`cd` (change directory) is the command that allows you to move around your file system when inside the terminal. + +> **Note:** `~` is a representation of your `Home` directory. + +```bash +cd ~/Documents +``` + +The above command will move you into your Documents directory. + +> **Note:** If there are spaces in the name of the directory you try to move to then the easiest way is to wrap the name in quotes. + +```bash +cd "~/Documents/Product Concepts" +``` + +Some other things to understand when moving around / supplying arguments to the `cd` command. + +You can use `..` to go backwards / move up to the parent directory. For example, say we are in the `~/Documents` directory, to go back up to +the home directory we could use the following: + +```bash +cd .. +``` + +These can be chained together as well. For example say we are located in the `~/Documents/Product Concepts` directory, we could use the +following to go up two directory levels back to the home directory. + +```bash +cd ../.. +``` + +> **Pro-Tip:** You can use the `` key when navigating to auto-complete, generally typing a few characters followed with the `` key +> will auto-complete for you. + +### List files + +Use `ls` to output a list of files and directories where you are located. + +```bash +ls +``` + +_Example Output when in my ~/Documents directory_ + +```bash +Estimates.app +InkscapeDrawings +KwikModel +MyAparment +NCISummit +Personal +Product Concepts +Receipts.receipts +RingCentral +SketchUP +Tech-Tips +desktop.ini +espanso-migrate-backup +espanso-migrate-backup-2 +``` + +Using options with `ls` to show more statistics and hidden files. There are often hidden files on your computer that are used for +application support or other purposes, these files are not shown using the default command. Hidden files start with a `.`, below is an +example of showing hidden files in your home directory. + +```bash +ls -la ~/ +``` + +> **Note:** Above I added the `~/` which will allow you to list the files in your home directory even if you currently are not there in your +> terminal, if you were already there (for example by using `cd ~/` then you would not need to use that at the end of the command. + +_Example Output_ + +``` +total 168 +drwxr-xr-x+ 46 michael staff 1472 Sep 22 10:45 . +drwxr-xr-x 6 root admin 192 Sep 22 09:08 .. +-r-------- 1 michael staff 7 Apr 8 2021 .CFUserTextEncoding +-rw-r--r--@ 1 michael staff 14340 Sep 18 10:15 .DS_Store +drwx------+ 5 michael staff 160 Sep 20 17:03 .Trash +-rw-r--r-- 1 michael staff 186 Sep 12 15:20 .actrc +drwxr-xr-x 4 michael staff 128 Dec 13 2021 .bin +drwxr-xr-x 3 michael staff 96 Mar 6 2023 .bundle +drwxr-xr-x 7 michael staff 224 Sep 12 11:40 .cabal +drwxr-xr-x 7 michael staff 224 Sep 12 15:20 .cache +drwxr-xr-x 13 michael staff 416 Aug 10 08:47 .config +drwx------ 3 michael staff 96 Jun 21 2021 .cups +drwxr-xr-x 12 michael staff 384 Sep 15 15:22 .docker +drwxr-xr-x 20 michael staff 640 Sep 19 08:11 .dotfiles +drwxr-xr-x 4 michael staff 128 Jul 26 2021 .gem +drwxr-xr-x 3 michael staff 96 Oct 11 2021 .jssc +-rw------- 1 michael staff 20 Sep 22 10:45 .lesshst +drwxr-x--- 3 michael staff 96 Mar 29 08:47 .lldb +drwxr-xr-x 8 michael staff 256 Mar 1 2023 .local +drwxr-xr-x 4 root staff 128 Apr 12 2021 .newtek +drwxr-xr-x 5 michael staff 160 Dec 13 2021 .npm +-rw------- 1 michael staff 27436 Apr 10 10:21 .psql_history +drwxr-xr-x 7 michael staff 224 Apr 18 2022 .ssh +drwxr-xr-x 6 michael staff 192 Sep 21 09:06 .swiftpm +lrwxr-xr-x 1 michael staff 25 Dec 27 2021 .tmux.conf -> .dotfiles/tmux/.tmux.conf +drwxr-xr-x 8 michael staff 256 Mar 27 16:14 .twilio-cli +drwxr-xr-x 6 michael staff 192 Sep 18 11:08 .vim +-rw------- 1 michael staff 23086 Sep 21 09:45 .viminfo +-rw-r--r-- 1 michael staff 254 Sep 21 09:32 .wget-hsts +lrwxr-xr-x 1 michael staff 43 Jan 3 2022 .zshenv -> /Users/michael/.dotfiles/zsh/config/.zshenv +drwxr-xr-x 8 michael staff 256 Dec 14 2021 AmazonWorkDocsCompanion +drwx------@ 4 michael staff 128 Dec 13 2021 Applications +lrwxr-xr-x 1 michael staff 40 Jun 6 12:00 Applications (Parallels) -> /Volumes/Bucket/Applications (Parallels) +drwx------@ 30 michael staff 960 Sep 21 08:54 Desktop +drwx------@ 19 michael staff 608 Sep 14 10:15 Documents +drwx------@ 21 michael staff 672 Sep 21 09:43 Downloads +drwx------+ 115 michael staff 3680 Sep 14 10:04 Library +drwxr-xr-x 3 michael staff 96 Sep 8 13:06 LocalProjects +lrwxr-xr-x 1 michael staff 29 Dec 30 2021 Movies -> /Volumes/Bucket/Videos/Movies +lrwxr-xr-x 1 michael staff 21 Dec 30 2021 Music -> /Volumes/Bucket/Music +drwx------@ 2 michael staff 64 Mar 6 2023 Parallels +drwx------@ 7 michael staff 224 Sep 14 09:52 Pictures +drwxr-x---+ 4 michael staff 128 Apr 8 2021 Public +drwxr-xr-x+ 3 michael staff 96 Sep 14 09:52 Sites +drwxr-xr-x 3 michael staff 96 Jun 7 2021 WorkDocs Drive +drwxr-xr-x 3 michael staff 96 Sep 18 11:36 go +``` + +As you can see, I have a lot of hidden files and folders, your output will probably look much different than mine. + +### Clearing the Terminal + +Often times you may want to clear the terminal screen. You can use the `clear` command to clear the screen of the terminal. + +```bash +clear +``` + +Or use a keyboard shortcut `⌃l` (`l`) + +### Creating Directories + +Use `mkdir` (make directory) to create a directory. + +First, let's move into the `tmp` directory, the `tmp` directory is a directory on your file system that is typically used for applications +to write temporary logs / files to, it get's erased everytime your computer is restarted. We can use the `cd` command that we learned +earlier. + +```bash +cd /tmp +``` + +Next, let's create a new directory called "MyDirectory". + +```bash +mkdir MyDirectory +``` + +#### Gotcha's with 'mkdir' + +By default you can't create directories that are multiple levels deep, unless the directories already existed or we provide the `-p` option. +For example, if we want to create a directory at `/tmp/MyOtherDirectory/Nested/Deeply` then we could use the following command when inside +the `tmp` directory. + +```bash +mkdir -p MyOtherDirectory/Nested/Deeply +``` + +Now, try out using the `` key with the `cd` command to navigate to the `Deeply` folder. + +```bash +cd MyOther +``` + +### Open Command + +You can use the open command to open files or folders in the default application for the file type. + +For example, if we want to open a `Finder` window while in the `/tmp` directory, we can use the following command: + +```bash +open . +``` + +### Manual Pages + +Lastly, to learn more about commands you can use the `man `. To bring up the manual pages for the command in the terminal. You can +use the arrow keys to navigate around the manual pages and type the letter `q` to quit / close the manual pages. + +```bash +man ls +``` + +That is it for the first installment in this series. I hope you learned something and have better understanding of using your terminal. diff --git a/content/articles/2023-09-22-introduction-to-programming-for-hvac-2.md b/content/articles/2023-09-22-introduction-to-programming-for-hvac-2.md new file mode 100644 index 0000000..383c211 --- /dev/null +++ b/content/articles/2023-09-22-introduction-to-programming-for-hvac-2.md @@ -0,0 +1,109 @@ +--- +tags: HVAC, programming, software +title: "Introduction to Programming for HVAC Part-2" +--- + +# Introduction to Programming for HVAC Part-2 + +In this article, learn about installing a package manager. If you missed it, check out the +[first](https://mhoush.com/posts/introduction-to-programming-for-hvac-1/) article in the series where we learned about using your terminal. +This article builds upon that foundation. + +## What is a Package Manager + +A package manager is a piece of software that helps to install software and manage updates for your system. For me, the first thing that I +do with a new machine is install `Homebrew`. [Homebrew](https://brew.sh) is my preferred package manager for `macOS`. + +## Why + +A package manager is nice because often software relies / requires other dependencies in order to work properly. By using a package manager +it will make sure that the correct dependencies are installed for the software that you need to run. It allows you to be able to update and +manage software through a centralized interface. + +## Installation + +Installation is simple. Open up your terminal and enter the following command (easiest to just copy / paste from the homepage linked above). + +```bash +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +``` + +This will prompt you for your password in order to create some directories and install the required software for `brew` to work. The +installation may take some time, while it downloads the command line tools for `Xcode`. + +When completed, follow the `Next Steps` and copy / paste the command listed, that should look like below. + +```bash +(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users//.zprofile +eval "$(/opt/homebrew/bin/brew shellenv)" +``` + +![brew-output](/articles/images/2023-09-22-brew-output.png) + +The first line of this command sets up some things in your shell profile (which we have not discussed yet) that will make `Homebrew` +available to you anytime you start a new session in your terminal. The second line of the command makes it available in your current +terminal session. + +Next run the following command and make sure that everything is setup correctly. + +```bash +brew doctor +``` + +Which should output the following: + +``` +Your system is ready to brew. +``` + +### Terminology + +Homebrew calls command line applications `formula` and normal graphical applications `casks`. It has the ability to install both styles of +applications. + +## Search Command + +The following command is used to search for software packages: + +```bash +brew search chrome +``` + +## Open a Homepage + +The following command can be used to view the homepage of a formula or cask in your browser: + +```bash +brew home google-chrome +``` + +## Update Homebrew + +The following command is used to update homebrew: + +```bash +brew update +``` + +## Update packages installed on your system + +The following command is used to update software that is installed / managed by homebrew. + +```bash +brew upgrade +``` + +You can combine the update and upgrade commands, which will update homebrew and upgrade all the software it manages on you machine with the +following command. + +```bash +brew update && brew upgrade +``` + +## Conclusion + +That is it for this article. I will say that for me, when I find a piece of software that I want to use, I generally try to search for it in +`brew` first, before installing it via other means. + +I hope you've found this article helpful. In the next article we will start to use the skills that we've learned in these first two articles +and write our first program / script. diff --git a/content/articles/2023-09-24-introduction-to-programming-for-hvac-3.md b/content/articles/2023-09-24-introduction-to-programming-for-hvac-3.md new file mode 100644 index 0000000..9887ab5 --- /dev/null +++ b/content/articles/2023-09-24-introduction-to-programming-for-hvac-3.md @@ -0,0 +1,125 @@ +--- +tags: HVAC, programming, software +--- + +# Introduction to Programming for HVAC Part-3 + +In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up [here](https://mhoush.com/series/programming-for-hvac/) before continuing with this article. + +## Getting Started + +We are going to make our first script / program. This first program is really just setting up some building blocks for our next program we +will write, that will remove the background from an image. + +### Creating a scripts directory + +We learned in the [first article](https://mhoush.com/posts/introduction-to-programming-for-hvac-1/) how to use our terminal. Today we are +going to use some of the commands we learned to create a directory where we can store our script and future scripts that we write. + +**Create a directory** + +```bash +mkdir -p ~/.local/bin +``` + +The above command will create a "hidden" directory in your home folder. We can go ahead and move into the directory we just created. + +> **Note:** The `-p` option allows us to create nested directories if the parent directory doesn't exist. + +```bash +cd ~/.local/bin +``` + +### Hello World + +It is common in programming to start out with a "Hello World" program when learning a new scripting paradigm. So let's jump in and get +started. + +**Creating our script file:** + +```bash +touch hello-world.sh +``` + +**Now open the file:** + +```bash +open hello-world.sh +``` + +The above command should open the file in the `TextEdit` application. In order to make the text edit application to not auto-capitalize +words and play more nicely, we need to adjust some settings. Open the settings by pressing `⌘,`. + +In the **Format** section, select _Plain text_ and in the **Options** section de-select _Check spelling as you type_. + +![text-settings](/articles/images/2023-09-24-text-settings.png) + +At this point for changes to take place, you will need to close the file and re-open. + +> **Tip:** In your terminal you can run the last command in your history by using the `↑` (Up) arrow key. + +Now that the file is open again, we will write our hello-world program. The contents of your file should look like the following: + +```bash +#!/bin/sh + +echo 'Hello World!' +``` + +The first line is referred to as the `shebang`, this tells your computer which shell interperter to run your file. I have not explained the +shell yet, but it currently would just muddy the waters a bit, but there are several shell interperters on your computer with the `sh` posix +shell being one of the most universal / lowest level ones, which is why I'm choosing this one (in other words this script would work on just +about any machine you were on). + +The second line we are using the built-in `echo` command and passing it the 'Hello World!' argument. + +Now save and close the file `⌘s` (to save) `⌘q` (to quit the text edit application). + +**Run the program from your terminal:** + +```bash +/bin/sh hello-world.sh +``` + +You should see that `Hello World!` was printed to your console. + +![hello-output](/articles/images/2023-09-24-hello-output.png) + +### Make Executable + +Now that we have our basic script working, let's make it an executable. + +**In your terminal, type the following:** + +```bash +chmod u+x hello-world.sh +``` + +This will change the mode of the file type to be an executable. + +Now move / rename the file so we don't have to call it using `.sh` extension: + +```bash +mv hello-world.sh hello-world +``` + +Now that the file is executable, we can execute it by just calling the name of the file. + +```bash +./hello-world +``` + +> **Note:** We have to prefix the file name with `./` in the above command so that it knows where to find our file. The `./` is saying run +> this file in our current directory. In the future we will setup our shell so that it knows to look in our `~/.local/bin` directory for +> scripts, so that we can call them without this prefix. + +## Conclusion + +Congratulations, in this article we wrote our first program. We learned how to edit the file, set it's permissions, and execute the program +from our terminal. I should mention that the `TextEdit` application is generally not how you would program, people typically use what is +known as an `IDE (integrated development environment)`, however I chose to use the `TextEdit` application because it is built-in to `macOS` +and allowed us to accomplish our goal without downloading other software. + +In our upcoming articles, we will write a program that I hope is useful to you / something that you can build upon and use for a long time. +Thank you for reading to this point. diff --git a/content/articles/2023-09-26-introduction-to-programming-for-hvac-4.md b/content/articles/2023-09-26-introduction-to-programming-for-hvac-4.md new file mode 100644 index 0000000..a933112 --- /dev/null +++ b/content/articles/2023-09-26-introduction-to-programming-for-hvac-4.md @@ -0,0 +1,205 @@ +--- +tags: HVAC, programming, software +--- + +# Introduction to Programming for HVAC Part-4 + +This article builds upon our [last](https://mhoush.com/posts/introduction-to-programming-for-hvac-3/) article, so make sure to catch up +before continuing with this article. + +## Arguments + +Before we start creating our program that will remove the background from images let's go over arguments in shell scripts. Arguments are +supplied to shell scripts are separated by a space `" "`, as opposed to options which start with a `-` or `--`. + +To illustrate this, let's change our `hello-world` script we wrote in the last article. + +**Move into our scripts directory:** + +```bash +cd ~/.local/bin +``` + +**Make a copy of the hello-world script:** + +```bash +cp hello-world greet +``` + +Above we make a copy of the hello-world file and name the copy `greet`. + +**Open the greet file:** + +```bash +open -a TextEdit greet +``` + +> **Note:** Because the greet file is an executable, in order to open it in the `TextEdit` application we must supply the `-a` option. +> Otherwise it will just run our `greet` program in another terminal. Use `man open` to read more about the open command. + +**Edit the greet file:** + +```bash +#!/bin/sh + +echo "Hello, ${1}!" +``` + +Make sure to save `⌘s` the file. + +Take note that the quotes need to be changed to `"` (double quotes) from our original `hello-world` program. + +The `${1}` is indicating that we will insert / interpret the first argument passed to our program and insert it at that location. Arguments +are interpreted in order they are passed in with `${0}` always representing the filename of the program that is called (generally not needed +/ used in your scripts). + +**Test it out:** + +```bash +./greet Michael +``` + +![greet-output](/articles/images/2023-09-26-greet-output.png) + +If you'd like to supply multiple words (or arguments that contain spaces) as a single argument then you can wrap them in quotes. + +```bash +./greet "Michael Housh" +``` + +> **Tip:** Wrapping in quotes is especially useful for commands that take file paths, if any of the folders or file names contain spaces. + +## More Useful Program + +At this point, it's time to build a more useful program that we can use. First, we must download some dependencies for our program. + +**Install imagemagick:** + +```bash +brew install imagemagick +``` + +> **Note:** If you'd like to check out the documentation / website for imagemagick you can run `brew home imagemagick`. + +This will take a bit for brew to install imagemagick and it's dependencies. When it's completed, we can check to make sure that imagemagick +is installed by running the following command. + +```bash +magick --version +``` + +It should output something along the lines of this below. + +```bash +Version: ImageMagick 7.1.1-17 Q16-HDRI aarch64 21569 https://imagemagick.org +Copyright: (C) 1999 ImageMagick Studio LLC +License: https://imagemagick.org/script/license.php +Features: Cipher DPC HDRI Modules OpenMP(5.0) +Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib +Compiler: gcc (4.2) +``` + +> **Tip:** Don't forget, you can use the `clear` command to clear the terminal. + +**Create our script:** + +```bash +touch mktrans +``` + +We are going to name our script `mktrans` as a short for make transparent. + +**Open the file:** + +```bash +open mktrans +``` + +**The program:** + +```bash +#!/bin/bash + +# The input file path, passed in as the first argument. +inputfile="${1}" + +# The color to make transparent, optionally passed in as the second argument. +# by default we handle / make white backgrounds transparent. +color="${2:-white}" + +# Use the built-in basename command to normalize the input file name +# this will convert a file path, such as ~/Pictures/my-image.png to my-image.png. +fullfilename=$(basename -- "$inputfile") + +# Use the text of the `fullfilename` up to the first '.' as the file name. +filename="${fullfilename%%.*}" + +# Use the text after the last '.' as the file extension. +extension="${fullfilename##*.}" + +# Create the output file name to use. +# +# For an input file of `input.png`, our output name would be +# `input-transparent.png`. +# +# This will output the file in the directory that we are +# in when we use our script (which may different than where +# the image is located) +outputfile="${filename}-transparent.${extension}" + +# Make the magick happen :) +convert "${inputfile}" -fuzz 10% -transparent "${color}" "${outputfile}" + +``` + +I've included comments in the program above, which is good practice, as there is high odds that you will forget what is going on when / if +you open the file up in the future to look at it. We are using a lot of what is called parameter expansion magic in this file. You can read +up more on what we are doing in the [bash documentation](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html). + +This script is far from perfect, there are a lot of things to be improved upon. For example, if you download / save the banner image of this +post and run this script, it will also remove some color in the wizards beard, eyes, and eye brows. However, it does work very well for my +general use case, which is to remove the background from screenshots of pdf documents. It should be noted that it will not work on all types +of images, some image types do not allow transparency, so it is safest to call this with input image being a `.png` image type, however you +can use the `imagemagick` program that we downloaded to convert other image types to `.png`, but that will be left up to you to figure out. + +## Using Our Program + +This is going to assume that you have download the banner image at the top of this article. You can do this by right-clicking and choosing +`Save As`. This should save the image in your downloads folder, and you can keep the name of `part4-banner.png`. + +**Make the program executable:** + +```bash +chmod u+x mktrans +``` + +**Make the image background transparent:** + +```bash +./mktrans ~/Downloads/part4-banner.png +``` + +**Open the image:** + +```bash +open part4-banner-transparent.png +``` + +It should look like below. + +![banner-transparent](/articles/images/2023-09-26-part4-banner-transparent.png) + +> **Note:** If you are viewing this site in _light_ mode, the image does not look that bad. Hit the moon button in the top above my profile +> image to see some of the flaws of our program. + +--- + +> **Tip:** Remove the image from the `~/.local/bin` by using `rm part4-banner-transparent.png`. Be aware that the `rm` command can not be +> undone, so use with caution / knowledge. It is safer, until you are more comfortable to use the `Finder` application and move the file to +> the trash. In `Finder`, you can show hidden directories by typing `⌘.` or go directly to the folder by typing `⇧⌘G` (shift + command + G) +> and in the pop-up typing `~/.local/bin`. + +--- + +That is it for this article. In the upcoming articles we will setup our `shell` environment so that we can use the commands we've built +without having to navigate to the `~/.local/bin` directory. Thank you for reading to the end, I hope you're finding this series helpful. diff --git a/content/articles/2023-10-04-free-quotes-are-bad-for-the-industry.md b/content/articles/2023-10-04-free-quotes-are-bad-for-the-industry.md new file mode 100644 index 0000000..61c6c96 --- /dev/null +++ b/content/articles/2023-10-04-free-quotes-are-bad-for-the-industry.md @@ -0,0 +1,103 @@ +--- +tags: HVAC +--- + +# Free quotes != good + +I found myself re-reading the +[ACCA Quality Installation Standard](https://www.acca.org/communities/community-home/librarydocuments/viewdocument?DocumentKey=b1d2a39d-fda8-4af9-b8de-0ae579bfe24a) +recently and it got me thinking about the industries tendency of offering free quotes. In this article, I'd like to just focus in on the +items that are required as what I'm calling "prior to installation" items. + +## Prior to installation + +1. Ensure ventilation calculations are performed. +1. Building heat gain / loss calculation (Manual-J / Manual-N) + 1. Room x room for new construction or duct modifications. + 1. Block load for existing (can use original if available). +1. Proper equipment capacity selection (Manual-S / Manual-CS) +1. Properly matched systems (AHRI or CEE-AHRI) + +Let's break the above items down to a rough estimated time to complete each of the items. + +| Item | Time (minutes) | +| ----------------------------------- | -------------- | +| Ventilation calculations | 15 | +| Manual-J (data gathering) | 30 | +| Manual-J (data entry / calculation) | 30 | +| Manual-S | 15 | +| AHRI | 15 | +| **Total** | 105 | + +> _The above items are obviously just estimations and the person's experience in the different areas / tools they use. Some of the items are +> probably on the low side while others are probably on the high side._ + +This is 1.75 hours just to do the calculations required to meet the QI Standard. This does not include any of the time spent with the +customer building value in you or your product recommendations. + +When you want to not guess at some of the calculations then a blower door test is generally required in order to understand the leakage of +the home, which adds even more time to the estimation process. Depending on the understanding you are looking for, the blower door test can +add 30-180 minutes. This takes the total time to 2.25-4.75 hours. + +## Pushing boxes + +The majority of residential HVAC companies make the bulk of their income off of equipment sales, so they have to "feed the beast" by +skipping steps in both the installation of equipment and the sales process in order to close jobs and keep the ship afloat. + +![sinking-boat](/articles/images/2023-10-04-sinking-boat.png) + +This has helped contribute to these industry statistics:[^1] + +- **Incorrect refrigerant charge in greater than 50-80% of systems.** +- **Improper airflow:** + - **70% above the rated 0.5" w.c.** + - **47% above 0.7" w.c.** + - **85% undersized / inappropriate filter.** +- **70-80% of systems have at least one fault.** +- **90-100% if duct leakage is considered.** + +## Consumer responsibility + +Let me be clear, I don't think that all the blame is on the industry here. The culture today is that everyone wants things for free and +fast. They have been conditioned by online services and box stores. Should we not cater to those that aren't willing to do their leg work? +Is it really our fault, if they don't care? + +## Liability + +While it's generally easy to shrug our shoulders and think that it's ok to just continue on because all the competitors are doing the same +thing. There is at least the possibility that skipping steps can come back to bite you. If things ever went to litigation and the steps +outlined in the QI Standard are ignored, then there is high odds you would loose. + +No matter what you do to try and protect yourself (having customers sign-off, etc) does not adequately protect your company from litigation. +There are stories out there where contractors were still held liable for not performing load calculations even though the consumer signed +off on it, because it is not inline with "industry best practices." + +# Summary + +This has led me to the conclusion that free quotes are just bad for the industry in general. The path forward is a challenge (changing +perception is hard). I don't know that I have answers on what the best path forward is, to be frank, but I do know that our current _status +quo_ is subpar to say the least. + +Unfortunately, I don't think the change is going to come from the industry, but that it's going to require the consumer base to be more +educated and demand more from the industry. There have been many organizations that have dedicated years to changing the skill levels of +technicians in the industry, they are very well needed / don't mistake my words here, however unless a company has faced litigation or +facing requests on a regular basis that demand better results, then why would a company change!?! + +I've been trying (unsuccessfully) to get rid of free quotes for 5+ years in my company. We try to educate customers during maintenance +visits and when scheduling equipment estimates, however only about 10-20% choose to go down our paid Home Performance Assessment path. Our +installation process does follow the QI Standard for the items that pertain to the setup / commissioning of the installed equipment, however +there is just no sustainable way for us to completely follow the items outlined in this article without charging for our time, because at +the end of the day we still have to be competitive in our market. + +There are days that I can justify our actions to myself and also days that I just want to throw in the towel / not sacrifice our integrity. +Integrity is something that I take very seriously, after all our companies tag line is _"Since 1954, Integrity is in the Housh!"_ + +As mentioned, I'm not sure what the best path forward is! I hate to not have answers, but some problems are just complex and somewhat beyond +our control. + +Let me know what you think some good solutions are. + +- Does your company follow the QI Standard? +- What are resources that you've found helpful in educating your customers? + +[^1]: DOE (2018) diff --git a/content/articles/2025-01-05-vapor-htmx-todo-app.md b/content/articles/2025-01-05-vapor-htmx-todo-app.md index d8c9693..9fc6acd 100644 --- a/content/articles/2025-01-05-vapor-htmx-todo-app.md +++ b/content/articles/2025-01-05-vapor-htmx-todo-app.md @@ -7,8 +7,8 @@ summary: Build an example application using Vapor and HTMX. ## Introduction -This post is a quick example of creating a very basic todo web application using `Vapor` a swift web -framework and `Htmx`, with no custom javascript required. +This post is a quick example of creating a very basic todo web application using `Vapor` a swift web framework and `Htmx`, with no custom +javascript required. [Vapor](https://docs.vapor.codes) @@ -30,9 +30,8 @@ Next, generate the project using the vapor command-line tool. vapor new todo-htmx --fluent.db sqlite --leaf ``` -The above command will generate a new project that uses an `SQLite` database along with vapor's -`Leaf` templating engine. You can move into the project directory and browse around the files that -are generated. +The above command will generate a new project that uses an `SQLite` database along with vapor's `Leaf` templating engine. You can move into +the project directory and browse around the files that are generated. ```bash cd todo-htmx @@ -40,8 +39,8 @@ cd todo-htmx ## Update the Controller -Open the `Sources/App/Controllers/TodoController.swift` file. This file handles the api routes for -our `Todo` database model. Personally I like to prefix these routes with `api`. +Open the `Sources/App/Controllers/TodoController.swift` file. This file handles the api routes for our `Todo` database model. Personally I +like to prefix these routes with `api`. Update the first line in the `boot(routes: RoutesBuilder)` function to look like this. @@ -49,14 +48,13 @@ Update the first line in the `boot(routes: RoutesBuilder)` function to look like let todos = routes.grouped("api", "todos") ``` -Everything else can stay the same. This changes these routes to be exposed at -`http://localhost:8080/api/todos`, which will allow our routes that return html views to be able to -be exposed at `http://localhost:8080/todos`. +Everything else can stay the same. This changes these routes to be exposed at `http://localhost:8080/api/todos`, which will allow our routes +that return html views to be able to be exposed at `http://localhost:8080/todos`. ## Update the Todo Model -A todo is not very valuable without a way to tell if it needs to be completed or not. So, let's add -a field to our database model (`Sources/App/Models/Todo.swift`). +A todo is not very valuable without a way to tell if it needs to be completed or not. So, let's add a field to our database model +(`Sources/App/Models/Todo.swift`). Update the file to include the following: @@ -97,8 +95,7 @@ final class Todo: Model, @unchecked Sendable { } ``` -Since we added a field to our database model, we also need to update the migration file -(`Sources/App/Migrations/CreateTodo.swift`). +Since we added a field to our database model, we also need to update the migration file (`Sources/App/Migrations/CreateTodo.swift`). ```swift import Fluent @@ -118,13 +115,12 @@ struct CreateTodo: AsyncMigration { } ``` -This just adds our new field to the database schema when we run the migrations, which we will do -later on in the tutorial. +This just adds our new field to the database schema when we run the migrations, which we will do later on in the tutorial. ### Update the Data Transfer Object -We also need to add the `complete` field to our data transfer object (`DTO`). This model is used as -an intermediate between our database and the user. +We also need to add the `complete` field to our data transfer object (`DTO`). This model is used as an intermediate between our database and +the user. ```swift import Fluent @@ -150,11 +146,9 @@ struct TodoDTO: Content { ## Generate the View Templates -Our index template was already generated at `Resources/Views/index.leaf`, open the file and edit the -contents to match the following. +Our index template was already generated at `Resources/Views/index.leaf`, open the file and edit the contents to match the following. -> Note: You can learn more about the -> [leaf templating engine here.](https://docs.vapor.codes/leaf/getting-started/) +> Note: You can learn more about the [leaf templating engine here.](https://docs.vapor.codes/leaf/getting-started/) ```html @@ -182,18 +176,15 @@ contents to match the following. ``` -The important parts here are the ` + + + + + \ No newline at end of file diff --git a/deploy/about/index.html b/deploy/about.html similarity index 91% rename from deploy/about/index.html rename to deploy/about.html index 55f5ae8..de0435b 100644 --- a/deploy/about/index.html +++ b/deploy/about.html @@ -83,6 +83,12 @@ HVAC Overtime | Email

+ + + \ No newline at end of file diff --git a/deploy/articles/2023/calculate-seer-degradation-by-age/index.html b/deploy/articles/2023/calculate-seer-degradation-by-age/index.html index d01395a..d70cf7a 100644 --- a/deploy/articles/2023/calculate-seer-degradation-by-age/index.html +++ b/deploy/articles/2023/calculate-seer-degradation-by-age/index.html @@ -66,36 +66,36 @@ refrigerant charge losses. It should be noted that this is not true for..." name banner -

This is a quick tech-tip to learn how to calculate the degradation of SEER based
+

This is a quick tech-tip to learn how to calculate the degradation of SEER based on age.

-

The degradation of SEER is due to fouling of the evaporator coil with dirt and
-refrigerant charge losses. It should be noted that this is not true for all
-applications, but is used as an estimation based on research done by the DOE
+

The degradation of SEER is due to fouling of the evaporator coil with dirt and +refrigerant charge losses. It should be noted that this is not true for all +applications, but is used as an estimation based on research done by the DOE of the average degradation based on systems tested.

Formula

-

This is the formula used to calculate the SEER based on age of the evaporator
+

This is the formula used to calculate the SEER based on age of the evaporator coil / air handler.

$$ SEER_d = SEER_n \times (1 - M)^{age} $$

-

| Where | |
-| –––– | —————————————— | — |
-| $SEER_d$ | Degradated SEER rating |
-| $SEER_n$ | Nominal SEER rating when equipment was new |  |
-| M | Maintenance factor, 0.01-0.03 |
+

| Where | | +| –––– | —————————————— | — | +| $SEER_d$ | Degradated SEER rating | +| $SEER_n$ | Nominal SEER rating when equipment was new |  | +| M | Maintenance factor, 0.01-0.03 | | age | The age of the equipment, in years |

-

The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is
-for unmaintained. The maintenance factor in essence is based on 1%-3%
-degradation per year, however there are some
-studies
-that show that this can actually be as high as 5% or above depending on climate.
-We could use up to 0.05 as the maintenance factor, just to see what the “range”
+

The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is +for unmaintained. The maintenance factor in essence is based on 1%-3% +degradation per year, however there are some +studies +that show that this can actually be as high as 5% or above depending on climate. +We could use up to 0.05 as the maintenance factor, just to see what the “range” of degradation would be.

-

Interestingly, the study linked also shows that the degradation is higher the
-higher the tonnage of the equipment. It also shows that the degradation is lower
-per year the higher the nominal SEER rating of the system (which is corelated to
-using TXV’s and lower airflow rates because of the equipment having multiple
+

Interestingly, the study linked also shows that the degradation is higher the +higher the tonnage of the equipment. It also shows that the degradation is lower +per year the higher the nominal SEER rating of the system (which is corelated to +using TXV’s and lower airflow rates because of the equipment having multiple stages).

Example

-

Let’s consider that we have a 13 SEER piece of equipment that was matched when
+

Let’s consider that we have a 13 SEER piece of equipment that was matched when installed and the system is 15 years old.

Plugging those numbers into our formula.


@@ -105,8 +105,8 @@ installed and the system is 15 years old.

Highest Rage (5% degradation / year)

$$ SEER_d = 13 \times (1 - 0.05)^{15} = 6 $$


-

An expertly maintained system may not have degraded that much, with an 11.2 SEER
-vs. a poorly maintained / dirty system that also suffers from refrigerant charge
+

An expertly maintained system may not have degraded that much, with an 11.2 SEER +vs. a poorly maintained / dirty system that also suffers from refrigerant charge losses can be as low as 6 SEER.

Thanks for learning how to estimate SEER degradation based on equipment age!

@@ -143,7 +143,6 @@ Programming, Home-Performance, and Building Science

@@ -157,7 +156,6 @@ Programming, Home-Performance, and Building Science

@@ -188,6 +186,12 @@ Programming, Home-Performance, and Building Science | Email

+ + + \ No newline at end of file diff --git a/deploy/articles/2023/cancel-this/index.html b/deploy/articles/2023/cancel-this/index.html index 78289db..efb3bba 100644 --- a/deploy/articles/2023/cancel-this/index.html +++ b/deploy/articles/2023/cancel-this/index.html @@ -64,52 +64,52 @@ online interactions is tone and other subtleties..." name="og:description"/> banner -

This post is going to be hard to put into words, it’s going to seem egotistical at points, but know
-that my actions / feelings online are the same as they are if you met me in person. The problem with
-online interactions is tone and other subtleties do not come across, so it’s hard to tell when
+

This post is going to be hard to put into words, it’s going to seem egotistical at points, but know +that my actions / feelings online are the same as they are if you met me in person. The problem with +online interactions is tone and other subtleties do not come across, so it’s hard to tell when someone is joking or being serious.

The Meat

-

It has been brought to my attention that someone out there thinks that I’m sexist and should not
-speak at the HVAC School symposium because of it. They are holding a curse word against me that I
-said two years ago, in the moment A) it was fitting and B) it was one of those times that my mouth
+

It has been brought to my attention that someone out there thinks that I’m sexist and should not +speak at the HVAC School symposium because of it. They are holding a curse word against me that I +said two years ago, in the moment A) it was fitting and B) it was one of those times that my mouth was working faster than my brain (raise your hand if that’s ever happened to you).

-

I am an open book, I am not afraid of showing failures and strengths. I’ve never claimed to be
-perfect (well, actually I have but it’s always a joke). I’m not at all condoning what I’ve said in
-the past, nor will I repeat it out of context now, but I communicate with people like adults and I
-look at people as piers. We do not always have to agree with one another, conflict helps us learn
-where to grow, but we also can not expect people to change to fit our wants / needs, that’s just not
+

I am an open book, I am not afraid of showing failures and strengths. I’ve never claimed to be +perfect (well, actually I have but it’s always a joke). I’m not at all condoning what I’ve said in +the past, nor will I repeat it out of context now, but I communicate with people like adults and I +look at people as piers. We do not always have to agree with one another, conflict helps us learn +where to grow, but we also can not expect people to change to fit our wants / needs, that’s just not how it works.

-

I do not at all agree with the tactics used by whomever is behind this. I would happily discuss this
-in private or out in the open. You can find all my contact / social information in the sidebar of
-this website and I’ve offered up my cell phone number in private groups that we are all probably a
+

I do not at all agree with the tactics used by whomever is behind this. I would happily discuss this +in private or out in the open. You can find all my contact / social information in the sidebar of +this website and I’ve offered up my cell phone number in private groups that we are all probably a part of.

The Potatoes

-

I am a father of 3 girls, I have a sister, talk crap about my mom and you’ll find out who I am! I
-love women, I have no problem with women in the trades, I encourage women who are in the trades. I
-try to help every person that I can, if I can. I have failed more times than you can imagine! I am
-self taught in about everything I do, so I give of it freely. I have all kinds of work to do to grow
-into the man that I should be, but at the same time, I am not afraid to be the man that I am today.
+

I am a father of 3 girls, I have a sister, talk crap about my mom and you’ll find out who I am! I +love women, I have no problem with women in the trades, I encourage women who are in the trades. I +try to help every person that I can, if I can. I have failed more times than you can imagine! I am +self taught in about everything I do, so I give of it freely. I have all kinds of work to do to grow +into the man that I should be, but at the same time, I am not afraid to be the man that I am today. I will greet you by whatever pronoun you want to be referred as.

-

I would love to say that I don’t judge people, but I do, just as I’m being judged! I am fine with
-someone judging me and having opinions about me, I mean that is our right. I will not say that
-person is wrong, because in their mind they’re right. What I will not do is stop being myself. I
-know for a fact that I’ve helped more people than this person has gotten “cancelled”. I will
-continue to help people in the trades, homeowners, or people in need. I also will not remain quiet!
-I will give my opinion like it or not. There are people in my corner that really know me and my
+

I would love to say that I don’t judge people, but I do, just as I’m being judged! I am fine with +someone judging me and having opinions about me, I mean that is our right. I will not say that +person is wrong, because in their mind they’re right. What I will not do is stop being myself. I +know for a fact that I’ve helped more people than this person has gotten “cancelled”. I will +continue to help people in the trades, homeowners, or people in need. I also will not remain quiet! +I will give my opinion like it or not. There are people in my corner that really know me and my intentions.

Final Words

-

The trades are rough around the edges, just as am I. The trades are a slow turning ship (just look
-at how many still do not follow proper practices, etc. even with the capabilities and resources
+

The trades are rough around the edges, just as am I. The trades are a slow turning ship (just look +at how many still do not follow proper practices, etc. even with the capabilities and resources available today).

-

If you are new / coming into the trades then I hope you are not overly sensitive to foul language
-and other inappropriate comments. Thick skin is valuable in the trades, but at the same time don’t
-be afraid to speak up if something offends you. Remember we are adults, we can handle disagreements
-like adults (well, some of us can). Adults can learn from those of any age, they can reflect on
+

If you are new / coming into the trades then I hope you are not overly sensitive to foul language +and other inappropriate comments. Thick skin is valuable in the trades, but at the same time don’t +be afraid to speak up if something offends you. Remember we are adults, we can handle disagreements +like adults (well, some of us can). Adults can learn from those of any age, they can reflect on their own behavior and make their own decisions.

-

I personally think that being offended is not a bad thing, it causes us to reflect / repair our
-foundational beliefs. I hope that we can stop with this “cancel culture” of today, stop hiding
+

I personally think that being offended is not a bad thing, it causes us to reflect / repair our +foundational beliefs. I hope that we can stop with this “cancel culture” of today, stop hiding behind a keyboard, and be a diverse community.

-

To wrap things up, I just want to reiterate that I am not at all mad at whomever is behind this. To
+

To wrap things up, I just want to reiterate that I am not at all mad at whomever is behind this. To everyone out there who has shown me love and support, I greatly appreciate it.

@@ -145,7 +145,6 @@ Programming, Home-Performance, and Building Science

@@ -159,7 +158,6 @@ Programming, Home-Performance, and Building Science

@@ -190,6 +188,12 @@ Programming, Home-Performance, and Building Science | Email

+ + + \ No newline at end of file diff --git a/deploy/articles/2023/coil-bypass-overview/index.html b/deploy/articles/2023/coil-bypass-overview/index.html new file mode 100644 index 0000000..17af055 --- /dev/null +++ b/deploy/articles/2023/coil-bypass-overview/index.html @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + mhoush: Coil Bypass Overview + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

+ Coil Bypass Overview +

+
+ +
+ banner +

This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a +coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the challenges of this style of +system.

+

What is a Coil Bypass

+

A coil bypass is not to be mistaken for a zoning system bypass, where airflow is “relieved” from the supply side of the system back into the +return. Instead, a coil bypass diverts a portion of the airflow around the coil using a bypass damper(s). The bypass can serve several +functions depending on the application, but in general it allows for a constant volume of air to be delivered to the space while the output +of the coil can be shifted towards more or less dehumidification. In other words, it decouples the total system airflow from the coil +airflow.

+

The bypassed air mixes with the supply air stream to act as a reheat source, however unlike a typical reheat source it does not add more +sensible load to the structure, instead it just brings the supply air temperature closer to the existing home’s temperature while still +covering the latent and sensible loads of the home. A warmer duct system reduces the losses of the duct to unconditioned spaces as well as +reduces the risk for duct condensation.

+

The coil bypass strategy, as far as I know, was pioneered by Harry Boody of Energy +Innovations and Scientific Environmental Design, Inc. However their websites are no longer active, so I’m not sure if they are still active +in the HVAC design space or not.

+

The Problem

+ + + + + + + + + + + + + + + + + +
Why
QuestionWhy would we want to utilize a strategy such as the coil bypass?
AnswerImproved indoor air quality (IAQ)
+

ASHRAE’s recommandation for the amount of air changes per hour (ACH) in a residential structure to be in the range of 3-5 ACH, and in +general the higher the better, along with a MERV 13+ filter. In some / most cases the system airflow does not meet that criteria, especially +low load homes or high volume homes.

+

For example, let’s imagine a single story ranch home that is 2,500 square feet with 9 foot ceilings. This home is relatively tight +construction and after doing the heating and cooling loads we’ve selected a 2.5 Ton system for this home. It is located in a green grass +climate that needs some priority on dehumidification and requires an airflow of 350 CFM/Ton (875 CFM).

+

We determine the volume of the conditioned space.

+

2,500 x 9 = 22,500 ft^3

+

volume-equation

+ + + + + + + + + + + + + + + + + + + + + +
Where:
Vis the volume of the home
ACHis the desired air changes per hour
60conversion from hours to minutes
+

Below is a table of the required CFM to meet the different air changes per hour.

+ + + + + + + + + + + + + + + + + + + + + +
CFM
(22,500 x 3)/601,125 @ 3 ACH
(22,500 x 4)/601,500 @ 4 ACH
(22,500 x 5)/601,875 @ 5 ACH
+

As you can see we have a discrepency of meeting even the low end of 3 ACH. The high end of 5 ACH is over 2x the airflow for our 2.5 Ton +system. The coil bypass strategy is one viable way, by decoupling the total system airflow from the coil airflow without, which eliminates +the need of an auxilary fan / system that circulates air through some sort of filtration system.

+

Multi-Stage Systems

+

A challenge with multi-stage systems, even when sized properly, is that we often run at part-load conditions, and spend the majority of the +time in lower stages. The lower stages often do worse at dehumidification than when running at full load.

+

When the equipment runs in lower stages on a traditional system the total system airflow is reduced even further from the recommended air +changes per hour. This reduced airflow also causes the throw of the air from the registers to be reduced which can lead to increased odds of +stratification, poor air mixing, and increased potential for poor mean radiant temperatures (MRT) of the surfaces. The decreased airflow in +low stages, lowers the velocity in the duct system, while low velocity is not a concern, it does increase the duct gains and increase the +possibility of condensation on the ducts when they’re located outside of the thermal envelope of the building.

+

Let’s imagine we have a duct system that has high wall registers located in a soffit at the interior wall that moves 100 CFM and we are +trying to throw the air to the exterior wall which includes a window. The wall is @ 12 feet from the register. We’ve selected a register +that meets the criteria, at high stage airflow it has a throw of 11.5 feet (shown as the green rectangle). When the system runs in low +stage, the airflow is reduced to 70% of high stage (70 CFM), which would give us a throw from the register of @ 7 feet (shown as the red +rectangle).

+

register-throw

+

The reduced flow through the register causes the air to only make it about 60% across the room before reaching it’s terminal velocity, which +can cause the room to feel uncomfortable since the air never reaches the exterior wall and window.

+

By decoupling the fan from the coil airflow it is possible to run in low stages, still have adequate dehumidification performance out of the +system, and achieve the proper throw from the registers.

+

Conclusion

+

In this article we’ve begun to scratch the surface of what a coil bypass strategy is in an HVAC system, as well as some of the challenges +that it can help solve. We’ve learned about why we may desire to decouple the total system airflow from the coil airflow.

+

In future articles we will continue to explore some of the features, benefits, and challenges presented by such a strategy.

+

Related Resources

+

HVAC School - Bypass Dehumidification / Airflow HVAC Design

+
+
+

+ Written by +

+
+
+ +
+
+

+ Michael Housh +

+

+ HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

+
+
+
+ +
+ + + \ No newline at end of file diff --git a/deploy/articles/2023/free-quotes-are-bad-for-the-industry/index.html b/deploy/articles/2023/free-quotes-are-bad-for-the-industry/index.html new file mode 100644 index 0000000..5993f90 --- /dev/null +++ b/deploy/articles/2023/free-quotes-are-bad-for-the-industry/index.html @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + mhoush: Free quotes != good + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

+ Free quotes != good +

+
+ +
+ banner +

I found myself re-reading the +ACCA Quality Installation Standard +recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the +items that are required as what I’m calling “prior to installation” items.

+

Prior to installation

+
    +
  1. Ensure ventilation calculations are performed.
  2. +
  3. Building heat gain / loss calculation (Manual-J / Manual-N) +
      +
    1. Room x room for new construction or duct modifications.
    2. +
    3. Block load for existing (can use original if available).
    4. +
    +
  4. +
  5. Proper equipment capacity selection (Manual-S / Manual-CS)
  6. +
  7. Properly matched systems (AHRI or CEE-AHRI)
  8. +
+

Let’s break the above items down to a rough estimated time to complete each of the items.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ItemTime (minutes)
Ventilation calculations15
Manual-J (data gathering)30
Manual-J (data entry / calculation)30
Manual-S15
AHRI15
Total105
+
+

The above items are obviously just estimations and the person’s experience in the different areas / tools they use. Some of the items are +probably on the low side while others are probably on the high side.

+
+

This is 1.75 hours just to do the calculations required to meet the QI Standard. This does not include any of the time spent with the +customer building value in you or your product recommendations.

+

When you want to not guess at some of the calculations then a blower door test is generally required in order to understand the leakage of +the home, which adds even more time to the estimation process. Depending on the understanding you are looking for, the blower door test can +add 30-180 minutes. This takes the total time to 2.25-4.75 hours.

+

Pushing boxes

+

The majority of residential HVAC companies make the bulk of their income off of equipment sales, so they have to “feed the beast” by +skipping steps in both the installation of equipment and the sales process in order to close jobs and keep the ship afloat.

+

sinking-boat

+

This has helped contribute to these industry statistics:^1

+
    +
  • Incorrect refrigerant charge in greater than 50-80% of systems.
  • +
  • Improper airflow: +
      +
    • 70% above the rated 0.5” w.c.
    • +
    • 47% above 0.7” w.c.
    • +
    • 85% undersized / inappropriate filter.
    • +
    +
  • +
  • 70-80% of systems have at least one fault.
  • +
  • 90-100% if duct leakage is considered.
  • +
+

Consumer responsibility

+

Let me be clear, I don’t think that all the blame is on the industry here. The culture today is that everyone wants things for free and +fast. They have been conditioned by online services and box stores. Should we not cater to those that aren’t willing to do their leg work? +Is it really our fault, if they don’t care?

+

Liability

+

While it’s generally easy to shrug our shoulders and think that it’s ok to just continue on because all the competitors are doing the same +thing. There is at least the possibility that skipping steps can come back to bite you. If things ever went to litigation and the steps +outlined in the QI Standard are ignored, then there is high odds you would loose.

+

No matter what you do to try and protect yourself (having customers sign-off, etc) does not adequately protect your company from litigation. +There are stories out there where contractors were still held liable for not performing load calculations even though the consumer signed +off on it, because it is not inline with “industry best practices.”

+

Summary

+

This has led me to the conclusion that free quotes are just bad for the industry in general. The path forward is a challenge (changing +perception is hard). I don’t know that I have answers on what the best path forward is, to be frank, but I do know that our current status +quo is subpar to say the least.

+

Unfortunately, I don’t think the change is going to come from the industry, but that it’s going to require the consumer base to be more +educated and demand more from the industry. There have been many organizations that have dedicated years to changing the skill levels of +technicians in the industry, they are very well needed / don’t mistake my words here, however unless a company has faced litigation or +facing requests on a regular basis that demand better results, then why would a company change!?!

+

I’ve been trying (unsuccessfully) to get rid of free quotes for 5+ years in my company. We try to educate customers during maintenance +visits and when scheduling equipment estimates, however only about 10-20% choose to go down our paid Home Performance Assessment path. Our +installation process does follow the QI Standard for the items that pertain to the setup / commissioning of the installed equipment, however +there is just no sustainable way for us to completely follow the items outlined in this article without charging for our time, because at +the end of the day we still have to be competitive in our market.

+

There are days that I can justify our actions to myself and also days that I just want to throw in the towel / not sacrifice our integrity. +Integrity is something that I take very seriously, after all our companies tag line is “Since 1954, Integrity is in the Housh!”

+

As mentioned, I’m not sure what the best path forward is! I hate to not have answers, but some problems are just complex and somewhat beyond +our control.

+

Let me know what you think some good solutions are.

+
    +
  • Does your company follow the QI Standard?
  • +
  • What are resources that you’ve found helpful in educating your customers?
  • +
+
+
+

+ Written by +

+
+
+ +
+
+

+ Michael Housh +

+

+ HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

+
+
+
+ +
+ + + \ No newline at end of file diff --git a/deploy/articles/2023/heat-recovery-chiller/index.html b/deploy/articles/2023/heat-recovery-chiller/index.html index d7d389e..b0aea17 100644 --- a/deploy/articles/2023/heat-recovery-chiller/index.html +++ b/deploy/articles/2023/heat-recovery-chiller/index.html @@ -68,48 +68,48 @@ I have always had a love and passion for..." name="og:description"/> banner -

This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so
-I’m doing it now. I did discuss this on
+

This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so +I’m doing it now. I did discuss this on this episode of the HVAC School Podcast.

Heat Recovery Chillers

-

I have always had a love and passion for hydronic systems, perhaps it’s because they are not that
-common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most
-equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds
+

I have always had a love and passion for hydronic systems, perhaps it’s because they are not that +common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most +equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds in this article, but offer an overview of what I feel would be my dream system.

The Source

-

A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional
-heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would
-have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to
-bank / store heat, or are running in heat only mode. There are several benefits to this style
-system, the main being that while operating simultaneous heating / cooling mode the COP of the
-system doubles. For example, the Multi-Aqua MHRC2 shows a COP of
-about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level
+

A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional +heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would +have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to +bank / store heat, or are running in heat only mode. There are several benefits to this style +system, the main being that while operating simultaneous heating / cooling mode the COP of the +system doubles. For example, the Multi-Aqua MHRC2 shows a COP of +about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level performance without the need of a field.

Indoor Portion

-

The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller.
-The buffer tanks give us several benefits, including longer run times for the chiller, load
-matching, and the ability to size for larger load (heating or cooling) without some of the problems
-that occur when over-sizing a traditional system. The buffer tanks also allow sizing more
+

The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller. +The buffer tanks give us several benefits, including longer run times for the chiller, load +matching, and the ability to size for larger load (heating or cooling) without some of the problems +that occur when over-sizing a traditional system. The buffer tanks also allow sizing more aggressively by having storage during peak load conditions.

buffer

-

This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what
-circulate water through the chiller, while the vertical pumps are what distribute the water to the
-load / emitters. This configuration allows for water to be used for the loads first and extra
-capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps
-(meaning that they won’t interfere with each other if / when there are different flow rates).
-Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in
-parallel to the system. This is shown by the extra tees in the hot buffer tank where we could
-connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler.
-You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat
+

This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what +circulate water through the chiller, while the vertical pumps are what distribute the water to the +load / emitters. This configuration allows for water to be used for the loads first and extra +capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps +(meaning that they won’t interfere with each other if / when there are different flow rates). +Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in +parallel to the system. This is shown by the extra tees in the hot buffer tank where we could +connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler. +You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat exchanger that would be used to supply domestic hot water.

Distribution System

-

This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators,
+

This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators, however I’m going to model it as a 4-pipe hydronic air handler.

ah

-

The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in
-one package. With a hydronic system, it would be very easy to load match by controlling the fan
-speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from
-several manufacturers and come in different styles from traditional (as shown), small duct high
+

The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in +one package. With a hydronic system, it would be very easy to load match by controlling the fan +speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from +several manufacturers and come in different styles from traditional (as shown), small duct high velocity systems, and even ductless styles.

Disadvantages

    @@ -118,7 +118,7 @@ velocity systems, and even ductless styles.

  1. Lack of understanding / technicians afraid to work on this style system.
  2. Potentially higher upfront costs.
  3. Lack of design or planning could cause unhappy clients (same with traditional)
  4. -
  5. Distribution systems need to be designed around low water temperatures (not a drop in replacement
    +
  6. Distribution systems need to be designed around low water temperatures (not a drop in replacement for traditional boiler systems)

Advantages

@@ -132,11 +132,11 @@ for traditional boiler systems)
  • Easier transition to natural / flammable refrigerants
  • Conclusion

    -

    In conclusion, there are many advantages to this style system, as well as disadvantages. One of the
    -main points is to think of the system in 3 distinct components, the source(s), thermal storage, and
    -distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish
    -this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to
    -dump excess heat into a pool, create ice storage during off peak hours, cascade into another water
    +

    In conclusion, there are many advantages to this style system, as well as disadvantages. One of the +main points is to think of the system in 3 distinct components, the source(s), thermal storage, and +distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish +this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to +dump excess heat into a pool, create ice storage during off peak hours, cascade into another water -> water heat pump for higher temperature distribution, incorporate solar collectors, and so on.

    Thank you for reading all the way to the end!

    @@ -173,7 +173,6 @@ Programming, Home-Performance, and Building Science

    @@ -187,7 +186,6 @@ Programming, Home-Performance, and Building Science

    @@ -218,6 +216,12 @@ Programming, Home-Performance, and Building Science | Email

    + + + \ No newline at end of file diff --git a/deploy/articles/2023/hope/index.html b/deploy/articles/2023/hope/index.html index 8d111b1..47c17f3 100644 --- a/deploy/articles/2023/hope/index.html +++ b/deploy/articles/2023/hope/index.html @@ -66,50 +66,50 @@ article I’d like to take a minute to layout some of the things that give..." n banner -

    This is a piggy-back article off of
    +

    This is a piggy-back article off of The Struggle article that I had recently.

    -

    I was a bit of a “Debbie Downer” in that article, which is okay, I get that way sometimes. In this
    -article I’d like to take a minute to layout some of the things that give me hope, things that I
    +

    I was a bit of a “Debbie Downer” in that article, which is okay, I get that way sometimes. In this +article I’d like to take a minute to layout some of the things that give me hope, things that I focus on to try and kick myself out of the rut I can get into sometimes.

    -

    I believe it’s important to have hope, to realize that feeling down is normal / part of being
    -human. It’s just as important to have hope. For some it is a harder thing to focus on, it may be
    -easy for us to try and dwell in negative feelings, to some that may feel more comfortable. When
    +

    I believe it’s important to have hope, to realize that feeling down is normal / part of being +human. It’s just as important to have hope. For some it is a harder thing to focus on, it may be +easy for us to try and dwell in negative feelings, to some that may feel more comfortable. When we’re feeling cynical, it’s easy to feed the negativity, although it’s rarely helpful.

    Hope

    -

    One of the things that I try to focus on is that I’m human, it brings me hope to realize that I’m
    -not the only one who feels the way that I do. This was evident by the feedback on my previous
    +

    One of the things that I try to focus on is that I’m human, it brings me hope to realize that I’m +not the only one who feels the way that I do. This was evident by the feedback on my previous article.

    My problems are very much “first world problems”.

    -

    Make no mistake, I’m selfish, but it’s the selfishness that makes me feel distant or disconnected.
    -The times that I feel connected are without a doubt the times that I let go of my ego and focus on
    +

    Make no mistake, I’m selfish, but it’s the selfishness that makes me feel distant or disconnected. +The times that I feel connected are without a doubt the times that I let go of my ego and focus on things outside of myself.

    -

    It’s the feeling I get from going to customers home and feeling truly appreciated. There’s no push
    -back on price, no one telling me how I should run my business, no “the part only costs $x on
    +

    It’s the feeling I get from going to customers home and feeling truly appreciated. There’s no push +back on price, no one telling me how I should run my business, no “the part only costs $x on amazon”, etc.

    -

    The feeling of seeing your child smile. The safety you feel when getting a hug from your mother or
    +

    The feeling of seeing your child smile. The safety you feel when getting a hug from your mother or father. When you’re looking up at the stars and realize how small you actually are.

    -

    When you’re out with friends and trick the DJ into playing a Mr. Bungle song and no one else
    +

    When you’re out with friends and trick the DJ into playing a Mr. Bungle song and no one else appreciates it, but you. The times when your guard is completely down and you laugh with abandon.

    -

    The smell of your lover’s hair when you’re holding them close. The joy you receive from sitting with
    +

    The smell of your lover’s hair when you’re holding them close. The joy you receive from sitting with your pets. The songs of nature, insects, birds, etc. The sounds of waves / water in the distance.

    -

    The feeling when you’ve helped someone learn a new skill, when something finally clicks and makes
    -sense. When a complex topic is understood at a fundamental level. The breakthrough of a problem
    +

    The feeling when you’ve helped someone learn a new skill, when something finally clicks and makes +sense. When a complex topic is understood at a fundamental level. The breakthrough of a problem you’ve pondered for days / months / years.

    Conclusion

    -

    There are so many things to be grateful for. This does not mean that there will not be hard times,
    -there surely will be. This does not mean that you are wrong for having negative feelings, for
    -feeling depressed or anxious. There are many around you that likely feel similar (they may just not
    -be able to express it in the same way). You never truly know what the person next to you is dealing
    +

    There are so many things to be grateful for. This does not mean that there will not be hard times, +there surely will be. This does not mean that you are wrong for having negative feelings, for +feeling depressed or anxious. There are many around you that likely feel similar (they may just not +be able to express it in the same way). You never truly know what the person next to you is dealing with. Be compassionate (including showing yourself compassion).

    -

    When you are feeling down, try to do something for someone else. Make your own list of things to be
    -thankful for. Maybe my non-exhaustive list above will give you some ideas. Write those items down
    +

    When you are feeling down, try to do something for someone else. Make your own list of things to be +thankful for. Maybe my non-exhaustive list above will give you some ideas. Write those items down regularly so that you can look back on them when you feel out of balance.

    -

    There is plenty of negative energy in this world, be true and genuine and you will receive rewards.
    +

    There is plenty of negative energy in this world, be true and genuine and you will receive rewards. When you focus on blessings then the negativity will fade.

    What impact are you going to leave with what little time we have?

    -

    I hope that you enjoyed this short article. Know that you are NOT alone, you are important, and
    +

    I hope that you enjoyed this short article. Know that you are NOT alone, you are important, and that I appreciate you!

    @@ -145,7 +145,6 @@ Programming, Home-Performance, and Building Science

    @@ -159,7 +158,6 @@ Programming, Home-Performance, and Building Science

    @@ -190,6 +188,12 @@ Programming, Home-Performance, and Building Science | Email

    + + + \ No newline at end of file diff --git a/deploy/articles/2023/index.html b/deploy/articles/2023/index.html index e07534f..d33d6fd 100644 --- a/deploy/articles/2023/index.html +++ b/deploy/articles/2023/index.html @@ -123,6 +123,77 @@ The struggle It has been one of those “when it rains, it pours” type of weeks. As...

    +
    +

    + Free quotes != good +

    + +

    + I found myself re-reading the +ACCA Quality Installation Standard +recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the +items that are required as what I’m calling... +

    +
    +
    +

    + Introduction to Programming for HVAC Part-4 +

    + +

    + This article builds upon our last article, so make sure to catch up +before continuing with this article. +Arguments +Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments... +

    +
    +
    +

    + Introduction to Programming for HVAC Part-3 +

    + +

    + In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up here before continuing with this article. +Getting Started +We are going to make... +

    +
    +
    +

    + Introduction to Programming for HVAC Part-2 +

    + +

    + In this article, learn about installing a package manager. If you missed it, check out the +first article in the series where we learned about using your terminal. +This article builds upon that foundation. +What is a Package Manager +A package manager... +

    +
    +
    +

    + Introduction to Programming for HVAC Part-1 +

    + +

    + This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers. +Why +I... +

    +

    Calculate SEER Degradation by Age @@ -137,6 +208,86 @@ The degradation of SEER is due to fouling of the evaporator coil with dirt and refrigerant charge losses. It should be noted that this is not true for...

    +
    +

    + Introducing Psychrometrics CLI +

    + +

    + Today, I’m releasing a command line application that is built on top of my +swift-psychrometrics package, that I open sourced over 2 years ago. +The application consists of many calculations / conversions for psychrometric properties of an air stream.... +

    +
    +
    +

    + Dehumidifier Sizing by Latent Load +

    + +

    + This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure. +Formulas +The formula above is used to... +

    +
    +
    +

    + Why Mini Splits Stink +

    + +

    + In this general article, I explain why I don’t generally like to use mini-splits. +The Positive Sides +When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted +consoles.... +

    +
    +
    +

    + Pounds of Water Removed +

    + +

    + This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream). +This is useful in the field when you want to calculate the... +

    +
    +
    +

    + Rss Feed +

    + +

    + In this article I will show how to add this site’s rss feed. In particular, we will be using NetNewsWire as the +rss reader. +What is an RSS Feed +An RSS feed will show you new posts, generally from a blog, without having to remember to check the... +

    +
    +
    +

    + Coil Bypass Overview +

    + +

    + This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a +coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the... +

    +
    \ No newline at end of file diff --git a/deploy/articles/2023/introducing-psychrometrics-cli/index.html b/deploy/articles/2023/introducing-psychrometrics-cli/index.html new file mode 100644 index 0000000..9eb6645 --- /dev/null +++ b/deploy/articles/2023/introducing-psychrometrics-cli/index.html @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + mhoush: Introducing Psychrometrics CLI + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Introducing Psychrometrics CLI +

    +
    + +
    + banner +

    Today, I’m releasing a command line application that is built on top of my +swift-psychrometrics package, that I open sourced over 2 years ago.

    +

    The application consists of many calculations / conversions for psychrometric properties of an air stream. The tool works for both imperial +and metric units. The application will work natively on macOS, but can also be ran through a docker container on other platforms.

    +

    Why

    +

    I spend a lot of time in my terminal, because I can work so much more efficiently. I discovered many years ago that the more I can do using +simple applications and keyboard over a mouse and a web browser or native application the more I can accomplish. I understand this is +intimidating for many who think they are “not good with computers”. I can assure that was me several years ago, I would only encourage you +to not be afraid and give it a shot. We are at a time in society where it is easier than ever to get informed and learned new skills.

    +

    Installation

    +

    For complete installation instructions, you can view the github repository.

    +

    The following instructions are based on using macOS.

    +

    Open your terminal application.

    +

    Personally, I use iTerm2, however you can use the default Terminal app. Found at +/Applications/Utilities/Terminal.app.

    +

    Install Homebrew

    +

    We use Homebrew for package distribution of the pre-built application binaries. You can follow their instructions to +install.

    +

    Tap our custom formula tap.

    +
    brew tap swift-psychrometrics/formula
    +
    +

    Install the psychrometrics application

    +
    brew install psychrometrics
    +
    +

    That’s it!

    +

    Usage

    +

    I will run through a couple of the commands that are supplied with the application and show what you can expect the outputs to be.

    +

    Properties

    +

    The following command will output a bunch of the psychrometric properties of an air stream. There are several ways to call it, but generally +you will supply the dry bulb temperature and the relative humidity.

    +

    Below, we calculate the psychrometric properties based on 75°F and 50% humidity.

    +
    psychrometrics --dry-bulb 75 --relative-humidity 50
    +
    +

    properties-output

    +

    Dehumidifier Sizing

    +

    If you’ve read some of my recent articles on calculating the +dehumidifier size required based on the latent load, the application also +ships with a calculation that will do this for you and has the ability to calculate it at different coverages that you can supply.

    +

    For example if we’ve done a load calculation and determined that we have a latent load of 4,334 BTU/h then we could run the following +command to see what size dehumidifier is needed for 100%, 85%, and 70% of the latent load.

    +
    psychrometrics dh size --coverage 100 85 70 --verbose 4334
    +
    +

    dh-size

    +

    Pounds of Water Removed

    +

    I also recently wrote an article about calculating the pounds of water removed from an +air stream given the grains of moisture removed.

    +

    Below is an example of calculating the pounds of water removed per hour based on the example in the article (14 delta-grains)

    +
    psychrometrics dh pounds-removed --delta 14 --cfm 797 --verbose
    +
    +

    pounds-removed

    +

    Help

    +

    You can use --help option to show help and the list of commands provided.

    +

    help

    +

    If you have any questions then feel free to email or message me. I hope some of you may find this application useful.

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/introduction-to-programming-for-hvac-1/index.html b/deploy/articles/2023/introduction-to-programming-for-hvac-1/index.html new file mode 100644 index 0000000..ba0d7cb --- /dev/null +++ b/deploy/articles/2023/introduction-to-programming-for-hvac-1/index.html @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + mhoush: Introduction to Programming for HVAC Part-1 + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Introduction to Programming for HVAC Part-1 +

    +
    + +
    + banner +

    This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.

    +

    Why

    +

    I think if nothing else, this series can help gain knowledge, tips, and tricks to make you more comfortable with your computer. I hope that +you will at least learn how to use your terminal application and more specifically vim motions and keybindings (more on that in another +article).

    +

    The goal of this article is to just get a machine setup with tools and to start exploring. I am a shill for macOS, so all of these will be +specifically geared towards that and my workflows, most everything that is showcased should also work on linux machines (not sure about +windows), although you may have to search for specific instructions on installing software for other platforms.

    +

    What I have learned on my journey in programming is that the more you can lean on small software packages that focus on a single task, but +do them well, the better. The less you use your mouse, the more productive you can be. The more you can work with text files and formats +the more portable and transformable your workflows can be.

    +

    Getting Started

    +

    The first thing that we will focus on is becoming familiar with the terminal application. On macOS the terminal application is located at +/Applications/Utilities/Terminal.app. However, rather than click around to find it, you can use the ⌘<space> to pull up your spotlight +search, then type Terminal to select the terminal application.

    +

    spotlight

    +

    Terminal Overview

    +

    Your terminal is a program that allows you to run programs by typing commands into it’s window. There are a lot of built-in commands and a +bunch that you can install. The terminal is very customizable (and once familiar, you will constantly be tweaking / adjusting to suit your +needs). Right now customization is not what we will focus on, however in future articles I will provide tips and tricks on customizing it. +Right now, we only need to know how to open it up and type in commands.

    +

    terminal

    +

    Below is an image / explanation of what the default status line includes.

    +

    terminal-line

    +

    Learn Basic Commands (Built-in)

    +

    Here are a few basic commands that you should familiarize yourself with, as you will use them often when working inside of a terminal.

    +

    Change Directory

    +

    cd (change directory) is the command that allows you to move around your file system when inside the terminal.

    +
    +

    Note: ~ is a representation of your Home directory.

    +
    +
    cd ~/Documents
    +
    +

    The above command will move you into your Documents directory.

    +
    +

    Note: If there are spaces in the name of the directory you try to move to then the easiest way is to wrap the name in quotes.

    +
    +
    cd "~/Documents/Product Concepts"
    +
    +

    Some other things to understand when moving around / supplying arguments to the cd command.

    +

    You can use .. to go backwards / move up to the parent directory. For example, say we are in the ~/Documents directory, to go back up to +the home directory we could use the following:

    +
    cd ..
    +
    +

    These can be chained together as well. For example say we are located in the ~/Documents/Product Concepts directory, we could use the +following to go up two directory levels back to the home directory.

    +
    cd ../..
    +
    +
    +

    Pro-Tip: You can use the <tab> key when navigating to auto-complete, generally typing a few characters followed with the <tab> key +will auto-complete for you.

    +
    +

    List files

    +

    Use ls to output a list of files and directories where you are located.

    +
    ls
    +
    +

    Example Output when in my ~/Documents directory

    +
    Estimates.app
    +InkscapeDrawings
    +KwikModel
    +MyAparment
    +NCISummit
    +Personal
    +Product Concepts
    +Receipts.receipts
    +RingCentral
    +SketchUP
    +Tech-Tips
    +desktop.ini
    +espanso-migrate-backup
    +espanso-migrate-backup-2
    +
    +

    Using options with ls to show more statistics and hidden files. There are often hidden files on your computer that are used for +application support or other purposes, these files are not shown using the default command. Hidden files start with a ., below is an +example of showing hidden files in your home directory.

    +
    ls -la ~/
    +
    +
    +

    Note: Above I added the ~/ which will allow you to list the files in your home directory even if you currently are not there in your +terminal, if you were already there (for example by using cd ~/ then you would not need to use that at the end of the command.

    +
    +

    Example Output

    +
    total 168
    +drwxr-xr-x+  46 michael  staff   1472 Sep 22 10:45 .
    +drwxr-xr-x    6 root     admin    192 Sep 22 09:08 ..
    +-r--------    1 michael  staff      7 Apr  8  2021 .CFUserTextEncoding
    +-rw-r--r--@   1 michael  staff  14340 Sep 18 10:15 .DS_Store
    +drwx------+   5 michael  staff    160 Sep 20 17:03 .Trash
    +-rw-r--r--    1 michael  staff    186 Sep 12 15:20 .actrc
    +drwxr-xr-x    4 michael  staff    128 Dec 13  2021 .bin
    +drwxr-xr-x    3 michael  staff     96 Mar  6  2023 .bundle
    +drwxr-xr-x    7 michael  staff    224 Sep 12 11:40 .cabal
    +drwxr-xr-x    7 michael  staff    224 Sep 12 15:20 .cache
    +drwxr-xr-x   13 michael  staff    416 Aug 10 08:47 .config
    +drwx------    3 michael  staff     96 Jun 21  2021 .cups
    +drwxr-xr-x   12 michael  staff    384 Sep 15 15:22 .docker
    +drwxr-xr-x   20 michael  staff    640 Sep 19 08:11 .dotfiles
    +drwxr-xr-x    4 michael  staff    128 Jul 26  2021 .gem
    +drwxr-xr-x    3 michael  staff     96 Oct 11  2021 .jssc
    +-rw-------    1 michael  staff     20 Sep 22 10:45 .lesshst
    +drwxr-x---    3 michael  staff     96 Mar 29 08:47 .lldb
    +drwxr-xr-x    8 michael  staff    256 Mar  1  2023 .local
    +drwxr-xr-x    4 root     staff    128 Apr 12  2021 .newtek
    +drwxr-xr-x    5 michael  staff    160 Dec 13  2021 .npm
    +-rw-------    1 michael  staff  27436 Apr 10 10:21 .psql_history
    +drwxr-xr-x    7 michael  staff    224 Apr 18  2022 .ssh
    +drwxr-xr-x    6 michael  staff    192 Sep 21 09:06 .swiftpm
    +lrwxr-xr-x    1 michael  staff     25 Dec 27  2021 .tmux.conf -> .dotfiles/tmux/.tmux.conf
    +drwxr-xr-x    8 michael  staff    256 Mar 27 16:14 .twilio-cli
    +drwxr-xr-x    6 michael  staff    192 Sep 18 11:08 .vim
    +-rw-------    1 michael  staff  23086 Sep 21 09:45 .viminfo
    +-rw-r--r--    1 michael  staff    254 Sep 21 09:32 .wget-hsts
    +lrwxr-xr-x    1 michael  staff     43 Jan  3  2022 .zshenv -> /Users/michael/.dotfiles/zsh/config/.zshenv
    +drwxr-xr-x    8 michael  staff    256 Dec 14  2021 AmazonWorkDocsCompanion
    +drwx------@   4 michael  staff    128 Dec 13  2021 Applications
    +lrwxr-xr-x    1 michael  staff     40 Jun  6 12:00 Applications (Parallels) -> /Volumes/Bucket/Applications (Parallels)
    +drwx------@  30 michael  staff    960 Sep 21 08:54 Desktop
    +drwx------@  19 michael  staff    608 Sep 14 10:15 Documents
    +drwx------@  21 michael  staff    672 Sep 21 09:43 Downloads
    +drwx------+ 115 michael  staff   3680 Sep 14 10:04 Library
    +drwxr-xr-x    3 michael  staff     96 Sep  8 13:06 LocalProjects
    +lrwxr-xr-x    1 michael  staff     29 Dec 30  2021 Movies -> /Volumes/Bucket/Videos/Movies
    +lrwxr-xr-x    1 michael  staff     21 Dec 30  2021 Music -> /Volumes/Bucket/Music
    +drwx------@   2 michael  staff     64 Mar  6  2023 Parallels
    +drwx------@   7 michael  staff    224 Sep 14 09:52 Pictures
    +drwxr-x---+   4 michael  staff    128 Apr  8  2021 Public
    +drwxr-xr-x+   3 michael  staff     96 Sep 14 09:52 Sites
    +drwxr-xr-x    3 michael  staff     96 Jun  7  2021 WorkDocs Drive
    +drwxr-xr-x    3 michael  staff     96 Sep 18 11:36 go
    +
    +

    As you can see, I have a lot of hidden files and folders, your output will probably look much different than mine.

    +

    Clearing the Terminal

    +

    Often times you may want to clear the terminal screen. You can use the clear command to clear the screen of the terminal.

    +
    clear
    +
    +

    Or use a keyboard shortcut ⌃l (<control>l)

    +

    Creating Directories

    +

    Use mkdir (make directory) to create a directory.

    +

    First, let’s move into the tmp directory, the tmp directory is a directory on your file system that is typically used for applications +to write temporary logs / files to, it get’s erased everytime your computer is restarted. We can use the cd command that we learned +earlier.

    +
    cd /tmp
    +
    +

    Next, let’s create a new directory called “MyDirectory”.

    +
    mkdir MyDirectory
    +
    +

    Gotcha’s with ‘mkdir’

    +

    By default you can’t create directories that are multiple levels deep, unless the directories already existed or we provide the -p option. +For example, if we want to create a directory at /tmp/MyOtherDirectory/Nested/Deeply then we could use the following command when inside +the tmp directory.

    +
    mkdir -p MyOtherDirectory/Nested/Deeply
    +
    +

    Now, try out using the <tab> key with the cd command to navigate to the Deeply folder.

    +
    cd MyOther <tab> <tab> <tab>
    +
    +

    Open Command

    +

    You can use the open command to open files or folders in the default application for the file type.

    +

    For example, if we want to open a Finder window while in the /tmp directory, we can use the following command:

    +
    open .
    +
    +

    Manual Pages

    +

    Lastly, to learn more about commands you can use the man <command>. To bring up the manual pages for the command in the terminal. You can +use the arrow keys to navigate around the manual pages and type the letter q to quit / close the manual pages.

    +
    man ls
    +
    +

    That is it for the first installment in this series. I hope you learned something and have better understanding of using your terminal.

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/introduction-to-programming-for-hvac-2/index.html b/deploy/articles/2023/introduction-to-programming-for-hvac-2/index.html new file mode 100644 index 0000000..a2f988e --- /dev/null +++ b/deploy/articles/2023/introduction-to-programming-for-hvac-2/index.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + mhoush: Introduction to Programming for HVAC Part-2 + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Introduction to Programming for HVAC Part-2 +

    +
    + +
    + banner +

    In this article, learn about installing a package manager. If you missed it, check out the +first article in the series where we learned about using your terminal. +This article builds upon that foundation.

    +

    What is a Package Manager

    +

    A package manager is a piece of software that helps to install software and manage updates for your system. For me, the first thing that I +do with a new machine is install Homebrew. Homebrew is my preferred package manager for macOS.

    +

    Why

    +

    A package manager is nice because often software relies / requires other dependencies in order to work properly. By using a package manager +it will make sure that the correct dependencies are installed for the software that you need to run. It allows you to be able to update and +manage software through a centralized interface.

    +

    Installation

    +

    Installation is simple. Open up your terminal and enter the following command (easiest to just copy / paste from the homepage linked above).

    +
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    +
    +

    This will prompt you for your password in order to create some directories and install the required software for brew to work. The +installation may take some time, while it downloads the command line tools for Xcode.

    +

    When completed, follow the Next Steps and copy / paste the command listed, that should look like below.

    +
    (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/<you>/.zprofile
    +eval "$(/opt/homebrew/bin/brew shellenv)"
    +
    +

    brew-output

    +

    The first line of this command sets up some things in your shell profile (which we have not discussed yet) that will make Homebrew +available to you anytime you start a new session in your terminal. The second line of the command makes it available in your current +terminal session.

    +

    Next run the following command and make sure that everything is setup correctly.

    +
    brew doctor
    +
    +

    Which should output the following:

    +
    Your system is ready to brew.
    +
    +

    Terminology

    +

    Homebrew calls command line applications formula and normal graphical applications casks. It has the ability to install both styles of +applications.

    +

    Search Command

    +

    The following command is used to search for software packages:

    +
    brew search chrome
    +
    +

    Open a Homepage

    +

    The following command can be used to view the homepage of a formula or cask in your browser:

    +
    brew home google-chrome
    +
    +

    Update Homebrew

    +

    The following command is used to update homebrew:

    +
    brew update
    +
    +

    Update packages installed on your system

    +

    The following command is used to update software that is installed / managed by homebrew.

    +
    brew upgrade
    +
    +

    You can combine the update and upgrade commands, which will update homebrew and upgrade all the software it manages on you machine with the +following command.

    +
    brew update && brew upgrade
    +
    +

    Conclusion

    +

    That is it for this article. I will say that for me, when I find a piece of software that I want to use, I generally try to search for it in +brew first, before installing it via other means.

    +

    I hope you’ve found this article helpful. In the next article we will start to use the skills that we’ve learned in these first two articles +and write our first program / script.

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/introduction-to-programming-for-hvac-3/index.html b/deploy/articles/2023/introduction-to-programming-for-hvac-3/index.html new file mode 100644 index 0000000..58a3599 --- /dev/null +++ b/deploy/articles/2023/introduction-to-programming-for-hvac-3/index.html @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + mhoush: Introduction to Programming for HVAC Part-3 + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Introduction to Programming for HVAC Part-3 +

    +
    + +
    + banner +

    In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up here before continuing with this article.

    +

    Getting Started

    +

    We are going to make our first script / program. This first program is really just setting up some building blocks for our next program we +will write, that will remove the background from an image.

    +

    Creating a scripts directory

    +

    We learned in the first article how to use our terminal. Today we are +going to use some of the commands we learned to create a directory where we can store our script and future scripts that we write.

    +

    Create a directory

    +
    mkdir -p ~/.local/bin
    +
    +

    The above command will create a “hidden” directory in your home folder. We can go ahead and move into the directory we just created.

    +
    +

    Note: The -p option allows us to create nested directories if the parent directory doesn’t exist.

    +
    +
    cd ~/.local/bin
    +
    +

    Hello World

    +

    It is common in programming to start out with a “Hello World” program when learning a new scripting paradigm. So let’s jump in and get +started.

    +

    Creating our script file:

    +
    touch hello-world.sh
    +
    +

    Now open the file:

    +
    open hello-world.sh
    +
    +

    The above command should open the file in the TextEdit application. In order to make the text edit application to not auto-capitalize +words and play more nicely, we need to adjust some settings. Open the settings by pressing ⌘,.

    +

    In the Format section, select Plain text and in the Options section de-select Check spelling as you type.

    +

    text-settings

    +

    At this point for changes to take place, you will need to close the file and re-open.

    +
    +

    Tip: In your terminal you can run the last command in your history by using the (Up) arrow key.

    +
    +

    Now that the file is open again, we will write our hello-world program. The contents of your file should look like the following:

    +
    #!/bin/sh
    +
    +echo 'Hello World!'
    +
    +

    The first line is referred to as the shebang, this tells your computer which shell interperter to run your file. I have not explained the +shell yet, but it currently would just muddy the waters a bit, but there are several shell interperters on your computer with the sh posix +shell being one of the most universal / lowest level ones, which is why I’m choosing this one (in other words this script would work on just +about any machine you were on).

    +

    The second line we are using the built-in echo command and passing it the ‘Hello World!’ argument.

    +

    Now save and close the file ⌘s (to save) ⌘q (to quit the text edit application).

    +

    Run the program from your terminal:

    +
    /bin/sh hello-world.sh
    +
    +

    You should see that Hello World! was printed to your console.

    +

    hello-output

    +

    Make Executable

    +

    Now that we have our basic script working, let’s make it an executable.

    +

    In your terminal, type the following:

    +
    chmod u+x hello-world.sh
    +
    +

    This will change the mode of the file type to be an executable.

    +

    Now move / rename the file so we don’t have to call it using .sh extension:

    +
    mv hello-world.sh hello-world
    +
    +

    Now that the file is executable, we can execute it by just calling the name of the file.

    +
    ./hello-world
    +
    +
    +

    Note: We have to prefix the file name with ./ in the above command so that it knows where to find our file. The ./ is saying run +this file in our current directory. In the future we will setup our shell so that it knows to look in our ~/.local/bin directory for +scripts, so that we can call them without this prefix.

    +
    +

    Conclusion

    +

    Congratulations, in this article we wrote our first program. We learned how to edit the file, set it’s permissions, and execute the program +from our terminal. I should mention that the TextEdit application is generally not how you would program, people typically use what is +known as an IDE (integrated development environment), however I chose to use the TextEdit application because it is built-in to macOS +and allowed us to accomplish our goal without downloading other software.

    +

    In our upcoming articles, we will write a program that I hope is useful to you / something that you can build upon and use for a long time. +Thank you for reading to this point.

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/introduction-to-programming-for-hvac-4/index.html b/deploy/articles/2023/introduction-to-programming-for-hvac-4/index.html new file mode 100644 index 0000000..0c5aa32 --- /dev/null +++ b/deploy/articles/2023/introduction-to-programming-for-hvac-4/index.html @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + mhoush: Introduction to Programming for HVAC Part-4 + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Introduction to Programming for HVAC Part-4 +

    +
    + +
    + banner +

    This article builds upon our last article, so make sure to catch up +before continuing with this article.

    +

    Arguments

    +

    Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments are +supplied to shell scripts are separated by a space " ", as opposed to options which start with a -<character> or --<word>.

    +

    To illustrate this, let’s change our hello-world script we wrote in the last article.

    +

    Move into our scripts directory:

    +
    cd ~/.local/bin
    +
    +

    Make a copy of the hello-world script:

    +
    cp hello-world greet
    +
    +

    Above we make a copy of the hello-world file and name the copy greet.

    +

    Open the greet file:

    +
    open -a TextEdit greet
    +
    +
    +

    Note: Because the greet file is an executable, in order to open it in the TextEdit application we must supply the -a option. +Otherwise it will just run our greet program in another terminal. Use man open to read more about the open command.

    +
    +

    Edit the greet file:

    +
    #!/bin/sh
    +
    +echo "Hello, ${1}!"
    +
    +

    Make sure to save ⌘s the file.

    +

    Take note that the quotes need to be changed to " (double quotes) from our original hello-world program.

    +

    The ${1} is indicating that we will insert / interpret the first argument passed to our program and insert it at that location. Arguments +are interpreted in order they are passed in with ${0} always representing the filename of the program that is called (generally not needed +/ used in your scripts).

    +

    Test it out:

    +
    ./greet Michael
    +
    +

    greet-output

    +

    If you’d like to supply multiple words (or arguments that contain spaces) as a single argument then you can wrap them in quotes.

    +
    ./greet "Michael Housh"
    +
    +
    +

    Tip: Wrapping in quotes is especially useful for commands that take file paths, if any of the folders or file names contain spaces.

    +
    +

    More Useful Program

    +

    At this point, it’s time to build a more useful program that we can use. First, we must download some dependencies for our program.

    +

    Install imagemagick:

    +
    brew install imagemagick
    +
    +
    +

    Note: If you’d like to check out the documentation / website for imagemagick you can run brew home imagemagick.

    +
    +

    This will take a bit for brew to install imagemagick and it’s dependencies. When it’s completed, we can check to make sure that imagemagick +is installed by running the following command.

    +
    magick --version
    +
    +

    It should output something along the lines of this below.

    +
    Version: ImageMagick 7.1.1-17 Q16-HDRI aarch64 21569 https://imagemagick.org
    +Copyright: (C) 1999 ImageMagick Studio LLC
    +License: https://imagemagick.org/script/license.php
    +Features: Cipher DPC HDRI Modules OpenMP(5.0)
    +Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib
    +Compiler: gcc (4.2)
    +
    +
    +

    Tip: Don’t forget, you can use the clear command to clear the terminal.

    +
    +

    Create our script:

    +
    touch mktrans
    +
    +

    We are going to name our script mktrans as a short for make transparent.

    +

    Open the file:

    +
    open mktrans
    +
    +

    The program:

    +
    #!/bin/bash
    +
    +# The input file path, passed in as the first argument.
    +inputfile="${1}"
    +
    +# The color to make transparent, optionally passed in as the second argument.
    +# by default we handle / make white backgrounds transparent.
    +color="${2:-white}"
    +
    +# Use the built-in basename command to normalize the input file name
    +# this will convert a file path, such as ~/Pictures/my-image.png to my-image.png.
    +fullfilename=$(basename -- "$inputfile")
    +
    +# Use the text of the `fullfilename` up to the first '.' as the file name.
    +filename="${fullfilename%%.*}"
    +
    +# Use the text after the last '.' as the file extension.
    +extension="${fullfilename##*.}"
    +
    +# Create the output file name to use.
    +#
    +# For an input file of `input.png`, our output name would be
    +# `input-transparent.png`.
    +#
    +# This will output the file in the directory that we are
    +# in when we use our script (which may different than where
    +# the image is located)
    +outputfile="${filename}-transparent.${extension}"
    +
    +# Make the magick happen :)
    +convert "${inputfile}" -fuzz 10% -transparent "${color}" "${outputfile}"
    +
    +
    +

    I’ve included comments in the program above, which is good practice, as there is high odds that you will forget what is going on when / if +you open the file up in the future to look at it. We are using a lot of what is called parameter expansion magic in this file. You can read +up more on what we are doing in the bash documentation.

    +

    This script is far from perfect, there are a lot of things to be improved upon. For example, if you download / save the banner image of this +post and run this script, it will also remove some color in the wizards beard, eyes, and eye brows. However, it does work very well for my +general use case, which is to remove the background from screenshots of pdf documents. It should be noted that it will not work on all types +of images, some image types do not allow transparency, so it is safest to call this with input image being a .png image type, however you +can use the imagemagick program that we downloaded to convert other image types to .png, but that will be left up to you to figure out.

    +

    Using Our Program

    +

    This is going to assume that you have download the banner image at the top of this article. You can do this by right-clicking and choosing +Save As. This should save the image in your downloads folder, and you can keep the name of part4-banner.png.

    +

    Make the program executable:

    +
    chmod u+x mktrans
    +
    +

    Make the image background transparent:

    +
    ./mktrans ~/Downloads/part4-banner.png
    +
    +

    Open the image:

    +
    open part4-banner-transparent.png
    +
    +

    It should look like below.

    +

    banner-transparent

    +
    +

    Note: If you are viewing this site in light mode, the image does not look that bad. Hit the moon button in the top above my profile +image to see some of the flaws of our program.

    +
    +
    +
    +

    Tip: Remove the image from the ~/.local/bin by using rm part4-banner-transparent.png. Be aware that the rm command can not be +undone, so use with caution / knowledge. It is safer, until you are more comfortable to use the Finder application and move the file to +the trash. In Finder, you can show hidden directories by typing ⌘. or go directly to the folder by typing ⇧⌘G (shift + command + G) +and in the pop-up typing ~/.local/bin.

    +
    +
    +

    That is it for this article. In the upcoming articles we will setup our shell environment so that we can use the commands we’ve built +without having to navigate to the ~/.local/bin directory. Thank you for reading to the end, I hope you’re finding this series helpful.

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/most-important-job/index.html b/deploy/articles/2023/most-important-job/index.html index aca183a..1daa7c2 100644 --- a/deploy/articles/2023/most-important-job/index.html +++ b/deploy/articles/2023/most-important-job/index.html @@ -70,26 +70,26 @@ This..." name="og:description"/> banner -

    This short tech tip is about something one of my good friends in the trade told me a long time ago,
    +

    This short tech tip is about something one of my good friends in the trade told me a long time ago, that has stuck with me through the years. It is a simple phrase / mindset.

    “The current job you’re on, is the most important job of your day”.

    -

    This mindset should be carried from the dispatcher, manager, and technician to make this successful.
    -I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use
    -this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging
    +

    This mindset should be carried from the dispatcher, manager, and technician to make this successful. +I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use +this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging out there.

    -

    I do think it’s also important to acknowledge that there are times that a technician has exhausted
    -all their options, maybe they just don’t have the mental capacity anymore to continue with a problem
    -job, or need a break to come back another day with a fresh set of eyes, etc… This is also an
    -important thing for a technician to realize, and hopefully those type of instances are much more few
    +

    I do think it’s also important to acknowledge that there are times that a technician has exhausted +all their options, maybe they just don’t have the mental capacity anymore to continue with a problem +job, or need a break to come back another day with a fresh set of eyes, etc… This is also an +important thing for a technician to realize, and hopefully those type of instances are much more few and far between, but I do want to acknowledge that scenario does also exist.

    -

    If you are a business owner, then this is something to consider instilling in your operations.
    -Empower your technicians and dispatchers to understand when things need to be shuffled around in
    -order to accommodate taking care of the customer at hand. It costs a lot of money to get a
    -technician to job, so minimizing truck rolls to the same job is important from a business
    +

    If you are a business owner, then this is something to consider instilling in your operations. +Empower your technicians and dispatchers to understand when things need to be shuffled around in +order to accommodate taking care of the customer at hand. It costs a lot of money to get a +technician to job, so minimizing truck rolls to the same job is important from a business standpoint.

    -

    This was just a quick tech tip of something that has been rolling around in my mind lately. I hope
    +

    This was just a quick tech tip of something that has been rolling around in my mind lately. I hope you find it helpful and it sticks with you through your career as it has mine.

    @@ -125,7 +125,6 @@ Programming, Home-Performance, and Building Science

    @@ -139,7 +138,6 @@ Programming, Home-Performance, and Building Science

    @@ -170,6 +168,12 @@ Programming, Home-Performance, and Building Science | Email

    + + + \ No newline at end of file diff --git a/deploy/articles/2023/pounds-of-water-removed/index.html b/deploy/articles/2023/pounds-of-water-removed/index.html new file mode 100644 index 0000000..bc2e99f --- /dev/null +++ b/deploy/articles/2023/pounds-of-water-removed/index.html @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + mhoush: Pounds of Water Removed + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Pounds of Water Removed +

    +
    + +
    + banner +

    This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream).

    +

    This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This +article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here +are a couple articles to familiarize yourself.

    +

    Articles

    + +

    Scenario

    +

    Let’s imagine that we have an air-conditioner that has the following measurements taken:

    +
      +
    • Return Air: 75° / 50% RH
    • +
    • Supply Air: 55° / 81% RH
    • +
    +

    We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air +conditions).

    +

    chart

    +

    We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the +relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per +pound of air.

    +

    This gives us the following values:

    +
      +
    • Return Air: 66 gr/lb
    • +
    • Supply Air: 52 gr/lb
    • +
    +

    We can then use the following formula to calculate the pounds of water removed.

    +

    formula

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Where
    WWeight of water in pounds per hour
    4.5Constant based on density / specific heat of moist air
    CFMAirflow in cubic feet per minute
    ∆GDifference in grains of moisture
    7000Constant based on grains of moisture in saturated air
    +

    Solution

    +

    First, we solve for the difference in grains between the two air streams.

    +

    ∆G = 66 - 52 = 14

    +

    Next, we’ve measured our airflow and have determined to have 797 CFM of airflow across the evaporator coil, so we can substitute our +values into the formula.

    +

    solution

    +

    So, we are removing about 7 pounds of water per hour at these conditions.

    +

    Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that +can often be rated in pints per day.

    +

    I hope you’ve found this article helpful, thanks for reading!

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/rss-feed/index.html b/deploy/articles/2023/rss-feed/index.html new file mode 100644 index 0000000..d1c13a4 --- /dev/null +++ b/deploy/articles/2023/rss-feed/index.html @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + mhoush: Rss Feed + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Rss Feed +

    +
    + +
    + banner +

    In this article I will show how to add this site’s rss feed. In particular, we will be using NetNewsWire as the +rss reader.

    +

    What is an RSS Feed

    +

    An RSS feed will show you new posts, generally from a blog, without having to remember to check the website at regular intervals or signup +for an email list for notifications.

    +

    NetNewsWire puts an RSS feed as:

    +

    It’s like podcasts - but for reading.

    +

    You consume an RSS feed, using an RSS reader application or extension in your browser.

    +

    Step One

    +

    First find and download an RSS reader, you can download NetNewsWire for macOS from the link, or for iOS from the +AppStore.

    +

    Step Two

    +

    Add the rss feed to stay up to date when I publish new articles.

    +
      +
    1. Click the plus in the right side of the sidebar and select New Feed...
    2. +
    3. In the URL field add: https://mhoush.com/articles/feed.xml
    4. +
    5. Optionally give it a name
    6. +
    7. Click the Add button.
    8. +
    +

    rss gif

    +

    That’s it.

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/sizing-dehumidifier-by-latent-load/index.html b/deploy/articles/2023/sizing-dehumidifier-by-latent-load/index.html new file mode 100644 index 0000000..42418d0 --- /dev/null +++ b/deploy/articles/2023/sizing-dehumidifier-by-latent-load/index.html @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + mhoush: Dehumidifier Sizing by Latent Load + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Dehumidifier Sizing by Latent Load +

    +
    + +
    + banner +

    This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure.

    +

    Formulas

    +

    The formula above is used to solve for the pints per hour required to size a dehumidifier.

    + + + + + + + + + + + + + + + + + +
    Where
    QlLatent load
    PhPints / hour
    +

    We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula.

    +

    pints-per-day-formula

    + + + + + + + + + + + + + + + + + +
    Where
    QlLatent load
    PdPints / day
    +

    In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized +properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during +peak cooling demand.

    +

    Example

    +

    Let’s imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula.

    +

    pints-per-day-formula-example

    +

    Or if we just want to cover the latent capacity at 85% of the full latent load.

    +

    pints-per-day-formula-example

    +

    This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition +we wanted to use.

    +

    I don’t feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an +oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application.

    +

    Thanks for reading!

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/the-struggle/index.html b/deploy/articles/2023/the-struggle/index.html index 7b4ee05..65e78d6 100644 --- a/deploy/articles/2023/the-struggle/index.html +++ b/deploy/articles/2023/the-struggle/index.html @@ -66,71 +66,71 @@ It has been one of those “when it rains, it pours” type of weeks. As..." nam banner -

    This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If
    +

    This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If that is not your cup of tea then feel free to skip this article.

    The struggle

    -

    It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby
    +

    It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby / complainer, which is not my intention, but here it goes.

    -

    My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived
    -in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9
    -years apart), so she helped raise my mother growing up. They’ve always had a close relationship and
    -are like two peas in a pod. They would always visit us, especially while my grand-parents were still
    -alive. She is currently not really awake or expected to make it. She does not eat / drink and
    +

    My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived +in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9 +years apart), so she helped raise my mother growing up. They’ve always had a close relationship and +are like two peas in a pod. They would always visit us, especially while my grand-parents were still +alive. She is currently not really awake or expected to make it. She does not eat / drink and they’ve basically just been making her comfortable.

    -

    One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject,
    -but he had surgery to fuse some discs back together and should eventually be ok, however it will be
    +

    One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject, +but he had surgery to fuse some discs back together and should eventually be ok, however it will be a long recovery time.

    -

    A few weeks ago, I commited one of the deadly sins of running a blower door test without checking /
    -asking about the fireplaces, which caused lord knows how much damage from the soot that was spread
    +

    A few weeks ago, I commited one of the deadly sins of running a blower door test without checking / +asking about the fireplaces, which caused lord knows how much damage from the soot that was spread throughout the living room(s).

    An online friend lost her mother.

    All of these things have just got me emotional.

    My secrets

    -

    I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I
    -spent many years masking things through alcohol abuse and many other idiotic tendencies. I still
    +

    I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I +spent many years masking things through alcohol abuse and many other idiotic tendencies. I still drink on occasion, but not as I once did.

    -

    I often put my faith in folks, even if I haven’t met them in person, this can often lead to being
    -let down. I guess I struggle sometimes with the reality of online relationships. I think that people
    -are genuine, because I’m that way (how I act online is the same as I act in person for the most
    -part). I will happily show / share the good and the bad, in hopes that someone may learn. This is
    -not at all something to be ashamed of, or anything that I’d like to change, however it does on
    +

    I often put my faith in folks, even if I haven’t met them in person, this can often lead to being +let down. I guess I struggle sometimes with the reality of online relationships. I think that people +are genuine, because I’m that way (how I act online is the same as I act in person for the most +part). I will happily show / share the good and the bad, in hopes that someone may learn. This is +not at all something to be ashamed of, or anything that I’d like to change, however it does on occasion lead me into turmoil when I find out some true identity / personality of someone.

    -

    I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want
    -to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to
    -forgive people, but it is just not the way it works for me often times. It takes a lot to get me
    -beyond my breaking point, but once someone has gotten me there, there is likely no turning back for
    -that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my
    -life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but
    +

    I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want +to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to +forgive people, but it is just not the way it works for me often times. It takes a lot to get me +beyond my breaking point, but once someone has gotten me there, there is likely no turning back for +that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my +life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but truthfully I do not.

    -

    My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot
    -of regret around these things, because I generally mean what I say, and also feel we are entitled to
    -opinions as well as entitled to change those opinions as often as we see fit. Although I don’t
    -regret them per-se, it does make me wonder what type of impression it leaves (something for future
    +

    My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot +of regret around these things, because I generally mean what I say, and also feel we are entitled to +opinions as well as entitled to change those opinions as often as we see fit. Although I don’t +regret them per-se, it does make me wonder what type of impression it leaves (something for future pondering, perhaps).

    -

    I’m one of those that says “I don’t care what they think about me”, when I really do care what
    -people think about me. This often leads to fear and anxiety, especially in social settings. I’m not
    -the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time
    -to think before responding. Therefore, I’m quick to make a joke or something rather than having
    +

    I’m one of those that says “I don’t care what they think about me”, when I really do care what +people think about me. This often leads to fear and anxiety, especially in social settings. I’m not +the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time +to think before responding. Therefore, I’m quick to make a joke or something rather than having thoughtful / genuine responses.

    Community

    -

    All of these things have just got me thinking about community. Community is an aspect that seems
    -distant nowadays, even though we have more opportunity than ever. We call ourselves part of
    -communities, especially online, but I’m not convinced that it is really community (or at least not
    +

    All of these things have just got me thinking about community. Community is an aspect that seems +distant nowadays, even though we have more opportunity than ever. We call ourselves part of +communities, especially online, but I’m not convinced that it is really community (or at least not most of the time, not saying it can’t be / in absolute terms).

    -

    I have met a lot of folks online that I consider true friends. Friends that I would do anything for
    -and feel they would do anything for me, just like my real life friends who have stuck with me for
    -many years. These are people that challenge me and how I think on a regular basis. They do their
    +

    I have met a lot of folks online that I consider true friends. Friends that I would do anything for +and feel they would do anything for me, just like my real life friends who have stuck with me for +many years. These are people that challenge me and how I think on a regular basis. They do their best to lift me up when I’m down.

    -

    It’s easy to hide when so much of our interactions are not really in person, to feel like the
    -relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the
    -benefit / trust they deserve until, at least until they don’t then see my part about holding grudges
    +

    It’s easy to hide when so much of our interactions are not really in person, to feel like the +relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the +benefit / trust they deserve until, at least until they don’t then see my part about holding grudges ;)

    -

    Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m
    -trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks
    -Jennifer in real life, I read today about her mom and decided to take an hour or so to put together
    -a website for the HVAChicks Community, hoping it would bring a moment of
    -happiness to her day. While I’ve deployed several websites in the past, this one for some reason was
    -a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and
    +

    Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m +trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks +Jennifer in real life, I read today about her mom and decided to take an hour or so to put together +a website for the HVAChicks Community, hoping it would bring a moment of +happiness to her day. While I’ve deployed several websites in the past, this one for some reason was +a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and it’s basic AF), but that truly made me feel useful / great after being down in the dumps for a bit.

    Conclusion

    I’ve probably rambled enough and am losing direction here, so I will end with a few things.

    @@ -140,43 +140,43 @@ it’s basic AF), but that truly made me feel useful / great after being down in
  • Spend time with your loved ones, while you can.
  • Tell someone you love them.
  • -

    Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I
    +

    Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I left you off, I’m sorry and please do not take it personally.

    1. Bryan Orr
        -
      • Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and
        -commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan,
        +
      • Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and +commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan, mostly all the following names would not even be in my vocabulary.
    2. Ty Branaman (forget exactly how to spell his last name).
        -
      • Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be
        +
      • Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be positive all the time, however it brings me hope and joy everytime!
    3. Dustin (mother f’n) Cole
        -
      • Dustin is like a brother that I never had, he’s a true master of his craft and I know that I
        +
      • Dustin is like a brother that I never had, he’s a true master of his craft and I know that I can rely on him anytime I need it!
    4. Genry Garcia
        -
      • The cuban crusader who has taught me so much about home performance, and especially ZPD (baby,
        +
      • The cuban crusader who has taught me so much about home performance, and especially ZPD (baby, baby)!
    5. Chris Hughes
        -
      • It’s hard to put into words here, but I know that Chris is there to talk when I need it and
        +
      • It’s hard to put into words here, but I know that Chris is there to talk when I need it and he’s a great motivator because of his action items :)
    6. Eric Kaiser
        -
      • I think genuine when I think of Eric, I hear his voice in my head when I write reports because
        +
      • I think genuine when I think of Eric, I hear his voice in my head when I write reports because of guidance he has given in the past. He truly wants to help teach people.
    7. @@ -187,26 +187,26 @@ of guidance he has given in the past. He truly wants to help teach people.
    8. HVAChicks Jennifer (I’ll butcher her last name from memory)
        -
      • Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I
        +
      • Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I can’t wait to meet her in person one day soon!
    9. HVAC Overtime Crew
        -
      • I’m lumping these guys together because I truly enjoy when I’m able to make their live stream
        +
      • I’m lumping these guys together because I truly enjoy when I’m able to make their live stream on Friday’s. And I interact with A-Team a lot and really appreciate him / them!
    10. Alicia Hollon
        -
      • Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner,
        +
      • Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner, love you babe!
    -

    Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt
    +

    Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt currently. My mother is the kindest gentlest soul that I’ve ever met. I look up to all 5’ of her!

    -

    At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today
    +

    At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today and tomorrow!

    @@ -242,7 +242,6 @@ Programming, Home-Performance, and Building Science

    @@ -256,7 +255,6 @@ Programming, Home-Performance, and Building Science

    @@ -287,6 +285,12 @@ Programming, Home-Performance, and Building Science | Email

    + + + \ No newline at end of file diff --git a/deploy/articles/2023/why-mini-splits-stink/index.html b/deploy/articles/2023/why-mini-splits-stink/index.html new file mode 100644 index 0000000..801c38a --- /dev/null +++ b/deploy/articles/2023/why-mini-splits-stink/index.html @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + mhoush: Why Mini Splits Stink + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    + Why Mini Splits Stink +

    +
    + +
    + banner +

    In this general article, I explain why I don’t generally like to use mini-splits.

    +

    The Positive Sides

    +

    When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted +consoles. These units do offer really high efficiency and becuase they’re “ductless” you don’t have duct gains/losses.

    +

    These units are common in many other countries and have been around for a long time. They do are generally quick and fairly easy to install, +but are mostly a pain in the tail to work on.

    +

    So, the plus side to these units are that they are really efficient, they generally have models that have a high-heat output for colder +climates, although this option is becoming more prevelant in traditional unitary style heat pumps as well. You do not have heat gains or +losses due to ductwork being in unconditioned spaces.

    +

    The Down Sides

    +

    Most mini-split systems do not do the greatest at humidity removal. This is partially because they use proprietary algorithms to control the +blower and compressor. They do achieve long run-times, which is often good for comfort stand points, however there is generally not a good +way to control / hack them to work towards achieving good IAQ.

    +

    These units offer next to no filtration, so in order to have filtration you need to utilize a stand-alone / portable filtration means. Which +a lot of the portable filtration systems have problems of their own (come bundled with UV / PCO technology or other “space” technology that +can lead to their own IAQ problems). It also introduces another fan, which may / may not be that efficient. In other words, when considering +other items to make them more comparable to what a traditional system offers, are they really that much more efficient?

    +

    These systems also do not have a good method of offering basic fresh air control / management, so other systems, such as an ERV need to be +installed to handle the fresh air requirements of the building.

    +

    The controls for these systems are often hard to understand / use. They do allow you to change fan speeds, but they control the compressor. +The fans often run all the time, which is not necessarily a bad thing, but they don’t really offer many ramping profiles or adjustments to +change the blower speed when the compressor is off vs. on.

    +

    These systems get dirty quickly, are generally a pain to clean properly, and are not easily repairable. Manufacturer support is often poor, +the documents aren’t always translated very well, and most technicians hate to work on them.

    +

    What about ducted models?

    +

    But what about the ducted models? Well, the ducted models are a step in the right direction. You can use filters on them, although some of +the manufacturer’s do not recommend installing better / improved filter cabinets (like a 4-5” media filter), however we have done that +successfully many times and always include media filters as an option on our installations, but you do need to make sure that they have a +very low pressure drop, as they a lot are not designed for very much static pressure.

    +

    The ducted models still generally have the same control problems, previously mentioned. If you read my introduction to the +coil-bypass-system, you have a basic understanding that even most traditional systems / +designers do not focus on the proper air-changes in a structure to maintain proper IAQ levels.

    +

    You can’t easily pair mini-splits with larger fan-coils because they are “communicating” style systems.

    +

    Conclusion

    +

    Don’t get me wrong, there are applications that are well suited for mini-splits. These are often applications like sun-rooms, garages, small +server-rooms / network storage rooms, and many others. But in my opinion these are not at all my favorite and are generally really far down +my list of options that I want to recommend to my clients.

    +

    As an industry, I feel we need to step back and refocus on the pillars of IAQ. Filtration, fresh-air, and humidity control. The +manufacturers / government should put less emphasis on chasing efficiency just to shoot ourselves in the foot and loose the qualities that +make traditional / unitary style systems cover more if not all of the 3 pillars of proper IAQ.

    +

    There’s plenty that I did not cover and I’m sure I missed some things, but just needed to rant for a few minutes… Thank you for making it +to the end!

    +
    +
    +

    + Written by +

    +
    +
    + +
    +
    +

    + Michael Housh +

    +

    + HVAC business owner with over 27 years of experience. Writes articles about HVAC, +Programming, Home-Performance, and Building Science +

    +
    +
    +
    + +
    + + + \ No newline at end of file diff --git a/deploy/articles/2023/you-should-learn-markdown/index.html b/deploy/articles/2023/you-should-learn-markdown/index.html index 14bc995..a10ea72 100644 --- a/deploy/articles/2023/you-should-learn-markdown/index.html +++ b/deploy/articles/2023/you-should-learn-markdown/index.html @@ -68,25 +68,25 @@ converted to other formats, such as html, pdf, docx, and many more. All..." name banner

    This is a quick article about why you should learn markdown.

    What is markdown

    -

    Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily
    -converted to other formats, such as html, pdf, docx, and many more. All the articles written on
    +

    Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily +converted to other formats, such as html, pdf, docx, and many more. All the articles written on this website are written in markdown, here’s an image of this article written in markdown.

    markdown

    -

    The reason you should learn markdown is that it allows you to focus on the content / text of your
    -content with simple concepts for formatting. Markdown is used heavily in documenting software
    -projects, which is how I got introduced to it, however it can scale all the way up to writing
    +

    The reason you should learn markdown is that it allows you to focus on the content / text of your +content with simple concepts for formatting. Markdown is used heavily in documenting software +projects, which is how I got introduced to it, however it can scale all the way up to writing research papers or even books.

    -

    I use markdown for probably 80% of all the text documents I need to write, from company documents,
    -web / software documentation, and so on. It allows me to get content out quickly without having to
    -click around with formatting options in a program like Word or Pages. To be clear, a lot of
    -the reports and things I generate for my Home Performance Assessments are written using
    -Pages (for now at least) because I have templates that make the documents look more
    +

    I use markdown for probably 80% of all the text documents I need to write, from company documents, +web / software documentation, and so on. It allows me to get content out quickly without having to +click around with formatting options in a program like Word or Pages. To be clear, a lot of +the reports and things I generate for my Home Performance Assessments are written using +Pages (for now at least) because I have templates that make the documents look more professional, however I am working on solutions to migrate those to be markdown based.

    -

    Markdown is supported in mostly all the Google tools, as well as the Outlook email client
    -(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many
    +

    Markdown is supported in mostly all the Google tools, as well as the Outlook email client +(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many common document related tasks.

    Resources

    -

    You can learn more about the syntax used for markdown at
    +

    You can learn more about the syntax used for markdown at markdownguide.org.

    A non-exhaustive list of where you can use Markdown and editors.

    @@ -118,7 +118,7 @@ common document related tasks.

    You can use tools such as pandoc to convert Markdown files to other formats.

    pandoc

    Conclusion

    -

    I hope that you take the time to research and see if Markdown is good fit for your document /
    +

    I hope that you take the time to research and see if Markdown is good fit for your document / content creation.

    Thanks for reading until the end!

    @@ -155,7 +155,6 @@ Programming, Home-Performance, and Building Science

    @@ -169,7 +168,6 @@ Programming, Home-Performance, and Building Science

    @@ -200,6 +198,12 @@ Programming, Home-Performance, and Building Science | Email

    + + + \ No newline at end of file diff --git a/deploy/articles/2024/elevating-hvac/index.html b/deploy/articles/2024/elevating-hvac/index.html index 05c58ac..c176fad 100644 --- a/deploy/articles/2024/elevating-hvac/index.html +++ b/deploy/articles/2024/elevating-hvac/index.html @@ -68,50 +68,50 @@ job, overshadowing the intricate skill set and technical expertise required in.. banner

    This is a guest post from my good friend, Ty Branaman.

    Introduction:

    -

    Heating, Ventilation, and Air Conditioning (HVAC) is often mistakenly categorized as a simple labor
    -job, overshadowing the intricate skill set and technical expertise required in this field. Labor
    -jobs are also very important positions needed to keep society running. HVAC, like other skilled
    -trades, demands a high level of knowledge, precision, and adaptability. This article aims to shed
    -light on the misconception surrounding HVAC, emphasizing its status as a skilled trade that plays a
    +

    Heating, Ventilation, and Air Conditioning (HVAC) is often mistakenly categorized as a simple labor +job, overshadowing the intricate skill set and technical expertise required in this field. Labor +jobs are also very important positions needed to keep society running. HVAC, like other skilled +trades, demands a high level of knowledge, precision, and adaptability. This article aims to shed +light on the misconception surrounding HVAC, emphasizing its status as a skilled trade that plays a pivotal role in creating comfortable and efficient living and working environments.

    Technical Proficiency:

    -

    One of the defining features that distinguish HVAC as a skilled trade is the level of technical
    -proficiency required. HVAC professionals must have a deep understanding of thermodynamics, fluid
    -mechanics, electrical circuits, Psychrometrics and air properties. This knowledge is essential for
    +

    One of the defining features that distinguish HVAC as a skilled trade is the level of technical +proficiency required. HVAC professionals must have a deep understanding of thermodynamics, fluid +mechanics, electrical circuits, Psychrometrics and air properties. This knowledge is essential for designing, installing, and maintaining HVAC systems that operate seamlessly and efficiently.

    System Design and Installation:

    -

    HVAC professionals are involved in the intricate process of designing and installing heating,
    -ventilation, and air conditioning systems. This task requires not only a thorough understanding of
    -the physical principles governing HVAC but also the ability to tailor solutions to meet the unique
    -needs of each space. Proper system design and installation are crucial for achieving optimal energy
    +

    HVAC professionals are involved in the intricate process of designing and installing heating, +ventilation, and air conditioning systems. This task requires not only a thorough understanding of +the physical principles governing HVAC but also the ability to tailor solutions to meet the unique +needs of each space. Proper system design and installation are crucial for achieving optimal energy efficiency and performance.

    Diagnostic Skills:

    -

    Troubleshooting and diagnosing issues in HVAC systems require a keen analytical mind and
    -problem-solving skills. Skilled HVAC technicians possess the ability to identify and rectify
    -problems efficiently, ensuring minimal downtime and disruption to the comfort of occupants. This
    +

    Troubleshooting and diagnosing issues in HVAC systems require a keen analytical mind and +problem-solving skills. Skilled HVAC technicians possess the ability to identify and rectify +problems efficiently, ensuring minimal downtime and disruption to the comfort of occupants. This diagnostic acumen is a hallmark of a trade that goes beyond routine labor.

    Adaptability to Advanced Technologies:

    -

    The HVAC industry is in a constant state of evolution, with new technologies and innovations
    -continuously being introduced. Skilled HVAC professionals are adaptable and stay abreast of these
    -advancements. From smart thermostats to energy-efficient systems, they integrate cutting-edge
    +

    The HVAC industry is in a constant state of evolution, with new technologies and innovations +continuously being introduced. Skilled HVAC professionals are adaptable and stay abreast of these +advancements. From smart thermostats to energy-efficient systems, they integrate cutting-edge technologies to provide state-of-the-art solutions for their clients.

    Safety and Compliance:

    -

    Safety is paramount in the HVAC trade. Professionals must adhere to strict safety protocols to
    -protect both themselves and the occupants of the spaces they work in. Additionally, compliance with
    -industry regulations and codes is a testament to the skilled nature of the trade, ensuring that HVAC
    +

    Safety is paramount in the HVAC trade. Professionals must adhere to strict safety protocols to +protect both themselves and the occupants of the spaces they work in. Additionally, compliance with +industry regulations and codes is a testament to the skilled nature of the trade, ensuring that HVAC systems meet the highest standards of safety and efficiency.

    Continual Learning and Certification:

    -

    Unlike a labor job, HVAC professionals engage in continual learning to stay current with industry
    -trends and technological advancements. Many pursue certifications and attend training programs to
    -enhance their skills and expand their knowledge base. This commitment to ongoing education is a
    +

    Unlike a labor job, HVAC professionals engage in continual learning to stay current with industry +trends and technological advancements. Many pursue certifications and attend training programs to +enhance their skills and expand their knowledge base. This commitment to ongoing education is a hallmark of skilled trades.

    Conclusion:

    -

    Heating, Ventilation, and Air Conditioning is undeniably a skilled trade that goes beyond the
    -perception of a labor job. Labor jobs are also very important to the function of society and I have
    -proudly done these jobs myself. The technical proficiency, problem-solving abilities, adaptability,
    -and commitment to safety make HVAC professionals essential contributors to the creation of
    -comfortable and efficient indoor environments. It is crucial to recognize and appreciate the skill
    -set inherent in the HVAC trade, as it plays a vital role in shaping the quality of life for
    +

    Heating, Ventilation, and Air Conditioning is undeniably a skilled trade that goes beyond the +perception of a labor job. Labor jobs are also very important to the function of society and I have +proudly done these jobs myself. The technical proficiency, problem-solving abilities, adaptability, +and commitment to safety make HVAC professionals essential contributors to the creation of +comfortable and efficient indoor environments. It is crucial to recognize and appreciate the skill +set inherent in the HVAC trade, as it plays a vital role in shaping the quality of life for individuals and the functionality of diverse spaces.

    • Ty Branaman
    • @@ -150,7 +150,6 @@ Programming, Home-Performance, and Building Science

      @@ -164,7 +163,6 @@ Programming, Home-Performance, and Building Science

      @@ -195,6 +193,12 @@ Programming, Home-Performance, and Building Science | Email

      + + + \ No newline at end of file diff --git a/deploy/articles/2024/free-as-in-freedom/index.html b/deploy/articles/2024/free-as-in-freedom/index.html index 240d619..1cf16dc 100644 --- a/deploy/articles/2024/free-as-in-freedom/index.html +++ b/deploy/articles/2024/free-as-in-freedom/index.html @@ -62,67 +62,67 @@ banner

      This is a hot take kind of article, but here it goes the rant.

      This applies to me and you.

      -

      I’m writing this to remind myself somethings that I too often take for granted. I am going to
      -preface this whole article by saying that everything I’m going to lay out / mention is something
      -that I am personally guilty of. This is an open reminder and call out of things that I feel should
      +

      I’m writing this to remind myself somethings that I too often take for granted. I am going to +preface this whole article by saying that everything I’m going to lay out / mention is something +that I am personally guilty of. This is an open reminder and call out of things that I feel should change.

      Our perspective is flawed

      -

      Nobody can dispute that the advances in technology have greatly improved our lives. Like anything,
      +

      Nobody can dispute that the advances in technology have greatly improved our lives. Like anything, though, there is a trade off.

      What is FOSS

      -

      FOSS is an acronym for “Free and Open Source Software”. It is generally about how software is
      -licensed, meaning that the source code is available in the public for review, allowing a broader
      -spectrum of people than the originators of the code to have input, look for bugs, redistribute the
      -software, contribute, etc. It does not however mean that the software should be no cost to the end
      +

      FOSS is an acronym for “Free and Open Source Software”. It is generally about how software is +licensed, meaning that the source code is available in the public for review, allowing a broader +spectrum of people than the originators of the code to have input, look for bugs, redistribute the +software, contribute, etc. It does not however mean that the software should be no cost to the end user.

      -

      This is where the word “freedom” comes into it. Overtime, as a society, we generally now think of
      -FOSS as “free” software. This takes what was originally a noble / courageous idea and devalues it to
      -the point that we now expect things to be free. It encourages corporate greed to take advantage of
      -people who created something to solve a particular need, or as a hobby, expecting the creator to
      -handle the burden of maintaining / patching bugs while they profit from it. Don’t get me wrong,
      -these corporations will also contribute back, sometimes even donate money to the creators. I am not
      -at all opposed to capitalism, nor saying that these corporations are in the wrong. At the end of the
      +

      This is where the word “freedom” comes into it. Overtime, as a society, we generally now think of +FOSS as “free” software. This takes what was originally a noble / courageous idea and devalues it to +the point that we now expect things to be free. It encourages corporate greed to take advantage of +people who created something to solve a particular need, or as a hobby, expecting the creator to +handle the burden of maintaining / patching bugs while they profit from it. Don’t get me wrong, +these corporations will also contribute back, sometimes even donate money to the creators. I am not +at all opposed to capitalism, nor saying that these corporations are in the wrong. At the end of the day, we created this problem.

      Current state and how we got here

      -

      Software services / giants create applications that we come to rely on. They tempt / bait us with
      -them being “free” or cheap, but that is because we are their target. They bloat the software
      -with tracking and telemetry to capture data about us and sell us more products and services. Once
      -again, if you’re pro-capitalism, it’s somewhat hard to blame them for this. We’re the gullible sheep
      +

      Software services / giants create applications that we come to rely on. They tempt / bait us with +them being “free” or cheap, but that is because we are their target. They bloat the software +with tracking and telemetry to capture data about us and sell us more products and services. Once +again, if you’re pro-capitalism, it’s somewhat hard to blame them for this. We’re the gullible sheep who will blindly eat out their grain bins.

      -

      I can remember back in the day when there were music pirating services on the internet (napster is
      -the one that comes to mind). As a giant music buff, I quickly jumped on board with services like
      -these. Back in those days, I was young, didn’t make very much money, so it was hard to afford the
      -latest and greatest tunes. I also remember back in this time frame a lawsuit from the metal giants
      -Metallica (other’s words not mine ;)). At the time I remember thinking, like many others, that
      -Metallica didn’t need the money, but then a comment from Lars Ulrich the band’s drummer struck a
      -cord with me (pun intended). I’ll will paraphrase here, but it was something along the lines of
      -“We’re not pursuing this for us, but for all of those (musicians) that come after us”. After this
      +

      I can remember back in the day when there were music pirating services on the internet (napster is +the one that comes to mind). As a giant music buff, I quickly jumped on board with services like +these. Back in those days, I was young, didn’t make very much money, so it was hard to afford the +latest and greatest tunes. I also remember back in this time frame a lawsuit from the metal giants +Metallica (other’s words not mine ;)). At the time I remember thinking, like many others, that +Metallica didn’t need the money, but then a comment from Lars Ulrich the band’s drummer struck a +cord with me (pun intended). I’ll will paraphrase here, but it was something along the lines of +“We’re not pursuing this for us, but for all of those (musicians) that come after us”. After this and reflection, I decided that I would not pirate music anymore.

      -

      Fast forward, now the majority do not purchases music / albums, we typically utilize streaming
      -services (myself included), sure it may be more fair to the artists than pirating was, it can be
      -argued that it’s easier today for independent artists to become known / discovered, I’m also in no
      -way saying the old school music industry wasn’t a giant pile of dog poo, but I am saying that who is
      +

      Fast forward, now the majority do not purchases music / albums, we typically utilize streaming +services (myself included), sure it may be more fair to the artists than pirating was, it can be +argued that it’s easier today for independent artists to become known / discovered, I’m also in no +way saying the old school music industry wasn’t a giant pile of dog poo, but I am saying that who is really winning(?), it’s the Spotify’s and Apple Music’s of the world, that’s who.

      -

      I’m also reminded of the great “MeasureQuick is now charging for services” that happened in the HVAC
      -industry. I have personally never complained and have always supported this decision, because it is
      -not sustainable to run a software company and not charge for services, generally. Sure, you may not
      -like their pricing model, etc. Where I think they went wrong was not charging from the beginning, as
      -it sets the wrong expectation that is presumably hard to recover from. There are those who took some
      -of Jim’s words / opinions in a way different from how I do / did, which is fine, we’re all entitled
      -to our opinions. What is often forgotten is that we’re all also entitled to change those opinions.
      +

      I’m also reminded of the great “MeasureQuick is now charging for services” that happened in the HVAC +industry. I have personally never complained and have always supported this decision, because it is +not sustainable to run a software company and not charge for services, generally. Sure, you may not +like their pricing model, etc. Where I think they went wrong was not charging from the beginning, as +it sets the wrong expectation that is presumably hard to recover from. There are those who took some +of Jim’s words / opinions in a way different from how I do / did, which is fine, we’re all entitled +to our opinions. What is often forgotten is that we’re all also entitled to change those opinions. Heck, I will probably be shouting a different story tomorrow, so be it!

      Conclusion

      -

      What I would like to encourage people to do is to support software development. If an application is
      -free, but has a donate button consider giving a donation. If an application is free and they don’t
      -want to charge that’s fine too, however I would say to be suspicous, meaning is it free because
      +

      What I would like to encourage people to do is to support software development. If an application is +free, but has a donate button consider giving a donation. If an application is free and they don’t +want to charge that’s fine too, however I would say to be suspicous, meaning is it free because you are the product?!?

      -

      I would also encourage you to be active in communities and organizations that foster community (HVAC
      -School is a great example). Show appreciation and encouragement, but at the same time don’t be
      +

      I would also encourage you to be active in communities and organizations that foster community (HVAC +School is a great example). Show appreciation and encouragement, but at the same time don’t be afraid to be critical or speak up.

      -

      At the end of the day, I hope to lift up my brothers and sisters, help to fight against the
      +

      At the end of the day, I hope to lift up my brothers and sisters, help to fight against the corporations who abuse the little guy’s and hopefully feel good about my decisions.

      -

      Over the last few weeks, I have been going through my software and services and looking for those
      -donation buttons and giving back a little bit for the software that makes my life better. Help
      +

      Over the last few weeks, I have been going through my software and services and looking for those +donation buttons and giving back a little bit for the software that makes my life better. Help change the narrative and remember that it’s about Freedom not Free.

      Links

        @@ -137,7 +137,7 @@ change the narrative and remember that it’s about Freedom not Free
      • Hugo Theme
      -

      Note: I do not use any trackers or analytics on this site to respect your privacy. So feel
      +

      Note: I do not use any trackers or analytics on this site to respect your privacy. So feel free to contact me directly to share feedback or let me know how I’m doing.

      @@ -174,7 +174,6 @@ Programming, Home-Performance, and Building Science

      @@ -188,7 +187,6 @@ Programming, Home-Performance, and Building Science

      \ No newline at end of file diff --git a/deploy/articles/2024/index.html b/deploy/articles/2024/index.html index af33e59..f4d1c9b 100644 --- a/deploy/articles/2024/index.html +++ b/deploy/articles/2024/index.html @@ -110,6 +110,12 @@ job, overshadowing the intricate skill set and technical expertise required in.. | Email

      + + + \ No newline at end of file diff --git a/deploy/articles/2024/pgp-encryption-introduction/index.html b/deploy/articles/2024/pgp-encryption-introduction/index.html index 9eff428..79ffc28 100644 --- a/deploy/articles/2024/pgp-encryption-introduction/index.html +++ b/deploy/articles/2024/pgp-encryption-introduction/index.html @@ -68,67 +68,67 @@ cryptographic privacy and authentication and is..." name="og:description"/> banner

      In this article I introduce PGP and show a use case for me, which perhaps you can use as well.

      What is PGP

      -

      PGP stands for Pretty Good Privacy, it was first developed in 1991 by Phil Zimmermann. PGP uses
      +

      PGP stands for Pretty Good Privacy, it was first developed in 1991 by Phil Zimmermann. PGP uses cryptographic privacy and authentication and is generally used in data communication.

      -

      According to Wikipedia it’s name was inspired
      -by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s
      +

      According to Wikipedia it’s name was inspired +by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s fictional town of Lake Wobegon.

      -

      PGP is commonly used in software development to “sign” software commits or files to help ensure both
      +

      PGP is commonly used in software development to “sign” software commits or files to help ensure both who the commits were from as well as make sure they were not modified from the original versions.

      -

      It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which
      +

      It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which are implementations of the PGP standard protocol.

      What it does

      -

      Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms
      +

      Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms that I understand / make sense to me. Do what I do at your own risk!

      -

      PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption
      -(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource
      +

      PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption +(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource intensive (which is generally not a problem with computers of today).

      -

      Generally speaking PGP uses what are known as public and private key pairs. The public portion of
      -the key par is meant to be shared with others freely, while the private portion needs to be secured
      -/ not shared with anyone EVER. It is best practice to generate your keys on a computer that is
      -“air gapped”, meaning it is not connected to any network / internet, and does not save a history of
      +

      Generally speaking PGP uses what are known as public and private key pairs. The public portion of +the key par is meant to be shared with others freely, while the private portion needs to be secured +/ not shared with anyone EVER. It is best practice to generate your keys on a computer that is +“air gapped”, meaning it is not connected to any network / internet, and does not save a history of commands performed on it.

      -

      PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public
      +

      PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public key. The recipients private key is required to decrypt the data once it’s been encrypted.

      -

      Your key pair is tied to your identity / person, generally by your name and email(s). The key can
      -also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it
      -can be tied to your same private key. This is useful for example for work vs. activism vs. software
      +

      Your key pair is tied to your identity / person, generally by your name and email(s). The key can +also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it +can be tied to your same private key. This is useful for example for work vs. activism vs. software development.

      -

      Once your key is generated and your private key secured, you can share your public portion of the
      +

      Once your key is generated and your private key secured, you can share your public portion of the key to a “keyserver” where other people can download it and verify messages were sent by you.

      Web of Trust

      -

      PGP also uses what is called the “Web of Trust”, which is used to validate that messages are
      -encrypted by a trusted source. There are different levels of trust depending on where a key is
      -retrieved from. For example, if somebody gave you their public key in person and you were able to
      -inspect that the identity matches their government id, then you can give it a higher trust level
      +

      PGP also uses what is called the “Web of Trust”, which is used to validate that messages are +encrypted by a trusted source. There are different levels of trust depending on where a key is +retrieved from. For example, if somebody gave you their public key in person and you were able to +inspect that the identity matches their government id, then you can give it a higher trust level than one that is sent / retrieved from a keyserver.

      -

      My understanding of this portion is that over time your key is signed by other’s with their level of
      +

      My understanding of this portion is that over time your key is signed by other’s with their level of certainty about you / your key, which over time increases the overall trust in your key.

      Out of the weeds

      -

      Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use
      +

      Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use cases of PGP encryption.

      -

      PGP encryption is used by some email clients / applications, such as
      -Canary,
      -Thunderbird, or
      +

      PGP encryption is used by some email clients / applications, such as +Canary, +Thunderbird, or GPGSuite.

      -

      In my understanding, it is also what is used in devices such as a
      +

      In my understanding, it is also what is used in devices such as a YubiKey.

      -

      Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons
      +

      Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons it is not very popular is that it can be hard to use PGP for the average person.

      -

      Aside from using my PGP key for signing software commits, my major use case is for encrypting files
      -that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a
      -computer (in reality a gang of computers in a data center). You are solely reliant that these cloud
      +

      Aside from using my PGP key for signing software commits, my major use case is for encrypting files +that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a +computer (in reality a gang of computers in a data center). You are solely reliant that these cloud providers are not snooping on, inspecting, or even selling your data.

      -

      Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit
      -of effort on your part you can at least make it very hard for anyone to know what is inside your
      -documents. You can be in control of the way your items are encrypted and have confidence that nobody
      +

      Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit +of effort on your part you can at least make it very hard for anyone to know what is inside your +documents. You can be in control of the way your items are encrypted and have confidence that nobody but you can access what is inside your documents.

      -

      Heck, I even encrypt documents that are stored on my own network / computer so that if something
      +

      Heck, I even encrypt documents that are stored on my own network / computer so that if something get’s stolen or someone breach’s my network they will not be able to easily get to sensitive data.

      Conclusion

      -

      This article is just meant as an overview of PGP encryption. In future articles I will show you how
      +

      This article is just meant as an overview of PGP encryption. In future articles I will show you how to use it to encrypt your data and be in control of your privacy.

      Resources

        @@ -171,7 +171,6 @@ Programming, Home-Performance, and Building Science

        @@ -185,7 +184,6 @@ Programming, Home-Performance, and Building Science

        @@ -216,6 +214,12 @@ Programming, Home-Performance, and Building Science | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/2024/unvr-as-nas/index.html b/deploy/articles/2024/unvr-as-nas/index.html index afd99b7..7a51606 100644 --- a/deploy/articles/2024/unvr-as-nas/index.html +++ b/deploy/articles/2024/unvr-as-nas/index.html @@ -64,19 +64,19 @@ any warranty on your UNVR as we are using it for..." name="og:description"/> banner -

        In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be
        -used as NAS (network attached storage). Be aware that this should be done with caution and may void
        -any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also
        -possible that this setup will break when / if updating the UNVR software. With that said, let’s jump
        +

        In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be +used as NAS (network attached storage). Be aware that this should be done with caution and may void +any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also +possible that this setup will break when / if updating the UNVR software. With that said, let’s jump in.

        -

        This post follows along with
        -this reddit post,
        +

        This post follows along with +this reddit post, with some adaptations to get it to work on the latest Unifi-OS release of 3.2.12.

        Step One - Setup SSH & Login

        -

        In your unifi network console you need to enable the SSH login option and set a secure password
        +

        In your unifi network console you need to enable the SSH login option and set a secure password for the root user to login to the UNVR.

        ssh.png

        -

        Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR
        +

        Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR on your network.

        ssh root@192.168.1.10

        Step Two - Install Samba

        @@ -85,14 +85,14 @@ on your network.

        Next, install samba.

        apt-get install samba

        Step Three - Setup Samba

        -

        In order to edit the configuration we are going to need to install your terminal based text editor
        +

        In order to edit the configuration we are going to need to install your terminal based text editor of choice (generally nano or vim), for me I will install vim.

        apt-get install vim

        Create a backup of the default configuration.

        cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

        Open the configuration file to be edited.

        vim /etc/samba/smb.conf

        -

        Just above the Share Definitions section of the configuration, I added some global settings to
        +

        Just above the Share Definitions section of the configuration, I added some global settings to make the samba server act better for time machine backups.

        #======================= MacOS Client Optimizations  =======================
         vfs objects = fruit streams_xattr
        @@ -105,11 +105,11 @@ fruit:wipe_intentionally_left_blank_rfork = yes
         fruit:delete_empty_adfiles = yes
         
         
        -

        Also because we want users we create to be able to read and write to their home directories created
        -on the samba server, we need to change the option under the [homes] share definition to be
        +

        Also because we want users we create to be able to read and write to their home directories created +on the samba server, we need to change the option under the [homes] share definition to be read only = no.

        -

        That is our primary configuration. You can add more share definitions at the bottom of the file to
        -suit your use case, there are decent examples of this in the original reddit post, linked in the
        +

        That is our primary configuration. You can add more share definitions at the bottom of the file to +suit your use case, there are decent examples of this in the original reddit post, linked in the beginning.

        Save and exit the file.

        :wq

        @@ -130,13 +130,13 @@ beginning.

        In the Finder app on macOS you can type ⌘k to connect to a server.

        In the text field enter smb://<USER>@<UNVR_IP> to connect to the samba server.

        connect

        -

        You can also automatically connect to the server when you login to your client device, for this to
        -work you need the credentials to be stored in your keychain (ticking the box in the step above when
        +

        You can also automatically connect to the server when you login to your client device, for this to +work you need the credentials to be stored in your keychain (ticking the box in the step above when you first connect to the server).

        -

        This is found in System Settings -> General -> Login Items -> Open at Login. Click the plus button
        +

        This is found in System Settings -> General -> Login Items -> Open at Login. Click the plus button and select the volume you would like to mount at login.

        login

        -

        Once you have it setup so that the server is connected on login, you can also set it up as location
        +

        Once you have it setup so that the server is connected on login, you can also set it up as location for Time Machine Backups. System Settings -> General -> Time Machine

        time-machine

        @@ -173,7 +173,6 @@ Programming, Home-Performance, and Building Science

        @@ -187,7 +186,6 @@ Programming, Home-Performance, and Building Science

        @@ -218,6 +216,12 @@ Programming, Home-Performance, and Building Science | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/2025/index.html b/deploy/articles/2025/index.html index 7fb32a5..f7d9618 100644 --- a/deploy/articles/2025/index.html +++ b/deploy/articles/2025/index.html @@ -69,6 +69,12 @@ | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/2025/vapor-htmx-todo-app/index.html b/deploy/articles/2025/vapor-htmx-todo-app/index.html index 57363fb..6a60a7e 100644 --- a/deploy/articles/2025/vapor-htmx-todo-app/index.html +++ b/deploy/articles/2025/vapor-htmx-todo-app/index.html @@ -61,8 +61,8 @@ banner

        Introduction

        -

        This post is a quick example of creating a very basic todo web application using Vapor a swift web
        -framework and Htmx, with no custom javascript required.

        +

        This post is a quick example of creating a very basic todo web application using Vapor a swift web framework and Htmx, with no custom +javascript required.

        Vapor

        Htmx

        Getting Started

        @@ -73,23 +73,21 @@ framework and Htmx, with no custom javascript required.

        vapor new todo-htmx --fluent.db sqlite --leaf
         
        -

        The above command will generate a new project that uses an SQLite database along with vapor’s
        -Leaf templating engine. You can move into the project directory and browse around the files that
        -are generated.

        +

        The above command will generate a new project that uses an SQLite database along with vapor’s Leaf templating engine. You can move into +the project directory and browse around the files that are generated.

        cd todo-htmx
         

        Update the Controller

        -

        Open the Sources/App/Controllers/TodoController.swift file. This file handles the api routes for
        -our Todo database model. Personally I like to prefix these routes with api.

        +

        Open the Sources/App/Controllers/TodoController.swift file. This file handles the api routes for our Todo database model. Personally I +like to prefix these routes with api.

        Update the first line in the boot(routes: RoutesBuilder) function to look like this.

        let todos = routes.grouped("api", "todos")
         
        -

        Everything else can stay the same. This changes these routes to be exposed at
        -http://localhost:8080/api/todos, which will allow our routes that return html views to be able to
        -be exposed at http://localhost:8080/todos.

        +

        Everything else can stay the same. This changes these routes to be exposed at http://localhost:8080/api/todos, which will allow our routes +that return html views to be able to be exposed at http://localhost:8080/todos.

        Update the Todo Model

        -

        A todo is not very valuable without a way to tell if it needs to be completed or not. So, let’s add
        -a field to our database model (Sources/App/Models/Todo.swift).

        +

        A todo is not very valuable without a way to tell if it needs to be completed or not. So, let’s add a field to our database model +(Sources/App/Models/Todo.swift).

        Update the file to include the following:

        import Fluent
         import struct Foundation.UUID
        @@ -126,8 +124,7 @@ final class Todo: Model, @unchecked Sendable {
           }
         }
         
        -

        Since we added a field to our database model, we also need to update the migration file
        -(Sources/App/Migrations/CreateTodo.swift).

        +

        Since we added a field to our database model, we also need to update the migration file (Sources/App/Migrations/CreateTodo.swift).

        import Fluent
         
         struct CreateTodo: AsyncMigration {
        @@ -144,11 +141,10 @@ struct CreateTodo: AsyncMigration {
           }
         }
         
        -

        This just adds our new field to the database schema when we run the migrations, which we will do
        -later on in the tutorial.

        +

        This just adds our new field to the database schema when we run the migrations, which we will do later on in the tutorial.

        Update the Data Transfer Object

        -

        We also need to add the complete field to our data transfer object (DTO). This model is used as
        -an intermediate between our database and the user.

        +

        We also need to add the complete field to our data transfer object (DTO). This model is used as an intermediate between our database and +the user.

        import Fluent
         import Vapor
         
        @@ -170,11 +166,9 @@ struct TodoDTO: Content {
         }
         

        Generate the View Templates

        -

        Our index template was already generated at Resources/Views/index.leaf, open the file and edit the
        -contents to match the following.

        +

        Our index template was already generated at Resources/Views/index.leaf, open the file and edit the contents to match the following.

        -

        Note: You can learn more about the
        -leaf templating engine here.

        +

        Note: You can learn more about the leaf templating engine here.

        <!doctype html>
         <html lang="en">
        @@ -200,15 +194,12 @@ contents to match the following.

        </body> </html>
        -

        The important parts here are the <script> tag in the head element which will include Htmx in our
        -project.

        +

        The important parts here are the <script> tag in the head element which will include Htmx in our project.

        The head element also contains a link to a custom css stylesheet that we will create shortly.

        -

        We add a form element that will be used to generate a new todo item in the database. This is a
        -basic / standard html form, but we are using Htmx to post the form contents to the route
        -POST http://localhost:8080/todos, which we will create shortly.

        -

        Then there’s the table element that will contain the contents of our todos. When the page is
        -loaded it will use Htmx to fetch the todos from GET http://localhost:8080/todos route, which we
        -will create shortly.

        +

        We add a form element that will be used to generate a new todo item in the database. This is a basic / standard html form, but we are +using Htmx to post the form contents to the route POST http://localhost:8080/todos, which we will create shortly.

        +

        Then there’s the table element that will contain the contents of our todos. When the page is loaded it will use Htmx to fetch the todos +from GET http://localhost:8080/todos route, which we will create shortly.

        Todos Table Template

        Create a new view template that will return our populated table of todos.

        touch Resources/Views/todos.leaf
        @@ -249,14 +240,12 @@ will create shortly.

        #endfor </table>
        -

        Here, we just create a table that is 3 columns wide from a list of todos that we will pass in to the
        -template. We use Htmx to handle updating a todo if a user clicks a checkbox to mark the todo as
        -complete, we also add a button in the last column of the table that we use Htmx to handle
        -deleting a todo from the database.

        +

        Here, we just create a table that is 3 columns wide from a list of todos that we will pass in to the template. We use Htmx to handle +updating a todo if a user clicks a checkbox to mark the todo as complete, we also add a button in the last column of the table that we use +Htmx to handle deleting a todo from the database.

        Controllers

        -

        The controllers handle the routes that our website exposes. The project template creates a
        -controller for us that handles JSON / API requests, but we do need to make a couple of changes
        -to the file (Sources/App/Controllers/TodoController.swift).

        +

        The controllers handle the routes that our website exposes. The project template creates a controller for us that handles JSON / API +requests, but we do need to make a couple of changes to the file (Sources/App/Controllers/TodoController.swift).

        import Fluent
         import Vapor
         
        @@ -308,16 +297,13 @@ struct TodoController: RouteCollection {
         
         }
         
        -

        The primary changes here are to add the update(req: Request) function at the bottom, which handles
        -updating a todo that has already been created. This will be used when a user clicks on the checkbox
        -to mark a todo as complete or incomplete.

        -

        We also change the route in the boot(routes: RoutesBuilder) method to make all these routes
        -accessible at /api/todos instead of the original /todos as we will use the /todos routes for
        -returning our views from our view controller.

        +

        The primary changes here are to add the update(req: Request) function at the bottom, which handles updating a todo that has already been +created. This will be used when a user clicks on the checkbox to mark a todo as complete or incomplete.

        +

        We also change the route in the boot(routes: RoutesBuilder) method to make all these routes accessible at /api/todos instead of the +original /todos as we will use the /todos routes for returning our views from our view controller.

        Todo View Controller

        -

        Next we need to create our view controller, it is what will be used to handle routes that should
        -return html content for our website. This controller will actually use the api controller to do
        -the majority of it’s work.

        +

        Next we need to create our view controller, it is what will be used to handle routes that should return html content for our website. This +controller will actually use the api controller to do the majority of it’s work.

        The easiest thing is to make a copy of the current api controller:

        cp Sources/App/Controllers/TodoController.swift Sources/App/Controllers/TodoViewController.swift
         
        @@ -365,9 +351,8 @@ struct TodoViewController: RouteCollection { } } -

        Here we use the api controller to do the heavy lifting of communicating with the database, then we
        -just always return / render the todos.leaf template that we created earlier, which will update our
        -web page with the list of todos retreived from the database.

        +

        Here we use the api controller to do the heavy lifting of communicating with the database, then we just always return / render the +todos.leaf template that we created earlier, which will update our web page with the list of todos retreived from the database.

        Note: There are better ways to handle this, however this is just a simple example.

        @@ -389,29 +374,29 @@ func routes(_ app: Application) throws { try app.register(collection: TodoViewController()) } -

        Here, we just add the TodoViewController at the bottom so vapor will be able to handle those
        -routes and also update the title to be Todos (in the first app.get near the top).

        +

        Here, we just add the TodoViewController at the bottom so vapor will be able to handle those routes and also update the title to be +Todos (in the first app.get near the top).

        Build and Run

        At this point we should be able to build and run the application.

        First, let’s make sure the project builds.

        swift build
         
        -

        This may take a minute if it’s the first time building the project as it has to fetch the
        -dependencies. If you experience problems here then make sure you don’t have typos in your files.

        +

        This may take a minute if it’s the first time building the project as it has to fetch the dependencies. If you experience problems here then +make sure you don’t have typos in your files.

        Next, we need to run the database migrations.

        swift run App migrate
         

        Finally, we can run the application.

        swift run App
         
        -

        You should be able to open your browser and type in the url: http://localhost:8080 to view the
        -application. You can experiment with adding a new todo using the form.

        +

        You should be able to open your browser and type in the url: http://localhost:8080 to view the application. You can experiment with adding +a new todo using the form.

        Note: To stop the application use Ctrl-c

        Bonus Styles

        -

        Hopefully you weren’t blinded the first time you opened the application. You can add custom styles
        -by creating a css file (Public/css/main.css).

        +

        Hopefully you weren’t blinded the first time you opened the application. You can add custom styles by creating a css file +(Public/css/main.css).

        mkdir Public/css
         touch Public/css/main.css
         
        @@ -444,8 +429,8 @@ td { margin-left: 20px; } -

        Currently vapor does not know to serve files from the Public directory, so we need to update the
        -Sources/App/configure.swift file, by uncommenting the line near the top.

        +

        Currently vapor does not know to serve files from the Public directory, so we need to update the Sources/App/configure.swift file, by +uncommenting the line near the top.

        import Fluent
         import FluentSQLiteDriver
         import Leaf
        @@ -471,7 +456,7 @@ public func configure(_ app: Application) async throws {
         
        swift run App
         

        Conclusion

        -

        I hope you enjoyed this quick example of using Htmx with Vapor. You can view the source files at
        +

        I hope you enjoyed this quick example of using Htmx with Vapor. You can view the source files at here.

        @@ -507,7 +492,6 @@ Programming, Home-Performance, and Building Science

        @@ -521,7 +505,6 @@ Programming, Home-Performance, and Building Science

        \ No newline at end of file diff --git a/deploy/articles/feed.xml b/deploy/articles/feed.xml index fcc02de..c6a2374 100644 --- a/deploy/articles/feed.xml +++ b/deploy/articles/feed.xml @@ -6,11 +6,11 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2025/vapor-htmx-todo-app/ Vapor + HTMX - 2025-02-19T21:47:31Z + 2025-02-20T14:15:37Z Build an example application using Vapor and HTMX. @@ -27,67 +27,67 @@ 2025-02-19T21:36:11Z <p>In this article I introduce PGP and show a use case for me, which perhaps you can use as well.</p> <h2>What is PGP</h2> -<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses<br /> +<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses cryptographic privacy and authentication and is generally used in data communication.</p> -<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired<br /> -by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s<br /> +<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired +by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s fictional town of Lake Wobegon.</p> -<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both<br /> +<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both who the commits were from as well as make sure they were not modified from the original versions.</p> -<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which<br /> +<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which are implementations of the PGP standard protocol.</p> <h2>What it does</h2> <blockquote> -<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms<br /> +<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms that I understand / make sense to me. Do what I do at your own risk!</p> </blockquote> -<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption<br /> -(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource<br /> +<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption +(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource intensive (which is generally not a problem with computers of today).</p> -<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of<br /> -the key par is meant to be shared with others freely, while the private portion needs to be secured<br /> -/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is<br /> -“air gapped”, meaning it is not connected to any network / internet, and does not save a history of<br /> +<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of +the key par is meant to be shared with others freely, while the private portion needs to be secured +/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is +“air gapped”, meaning it is not connected to any network / internet, and does not save a history of commands performed on it.</p> -<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public<br /> +<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public key. The recipients private key is required to decrypt the data once it’s been encrypted.</p> -<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can<br /> -also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it<br /> -can be tied to your same private key. This is useful for example for work vs. activism vs. software<br /> +<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can +also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it +can be tied to your same private key. This is useful for example for work vs. activism vs. software development.</p> -<p>Once your key is generated and your private key secured, you can share your public portion of the<br /> +<p>Once your key is generated and your private key secured, you can share your public portion of the key to a “keyserver” where other people can download it and verify messages were sent by you.</p> <h2>Web of Trust</h2> -<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are<br /> -encrypted by a trusted source. There are different levels of trust depending on where a key is<br /> -retrieved from. For example, if somebody gave you their public key in person and you were able to<br /> -inspect that the identity matches their government id, then you can give it a higher trust level<br /> +<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are +encrypted by a trusted source. There are different levels of trust depending on where a key is +retrieved from. For example, if somebody gave you their public key in person and you were able to +inspect that the identity matches their government id, then you can give it a higher trust level than one that is sent / retrieved from a keyserver.</p> -<p>My understanding of this portion is that over time your key is signed by other’s with their level of<br /> +<p>My understanding of this portion is that over time your key is signed by other’s with their level of certainty about you / your key, which over time increases the overall trust in your key.</p> <h2>Out of the weeds</h2> -<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use<br /> +<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use cases of PGP encryption.</p> -<p>PGP encryption is used by some email clients / applications, such as<br /> -<a href="https://canarymail.io/">Canary</a>,<br /> -<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or<br /> +<p>PGP encryption is used by some email clients / applications, such as +<a href="https://canarymail.io/">Canary</a>, +<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or <a href="https://gpgtools.tenderapp.com/">GPGSuite</a>.</p> -<p>In my understanding, it is also what is used in devices such as a<br /> +<p>In my understanding, it is also what is used in devices such as a <a href="https://www.yubico.com/">YubiKey</a>.</p> -<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons<br /> +<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons it is not very popular is that it can be hard to use PGP for the average person.</p> -<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files<br /> -that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a<br /> -computer (in reality a gang of computers in a data center). You are solely reliant that these cloud<br /> +<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files +that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a +computer (in reality a gang of computers in a data center). You are solely reliant that these cloud providers are not snooping on, inspecting, or even selling your data.</p> -<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit<br /> -of effort on your part you can at least make it very hard for anyone to know what is inside your<br /> -documents. You can be in control of the way your items are encrypted and have confidence that nobody<br /> +<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit +of effort on your part you can at least make it very hard for anyone to know what is inside your +documents. You can be in control of the way your items are encrypted and have confidence that nobody but you can access what is inside your documents.</p> -<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something<br /> +<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something get’s stolen or someone breach’s my network they will not be able to easily get to sensitive data.</p> <h2>Conclusion</h2> -<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how<br /> +<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how to use it to encrypt your data and be in control of your privacy.</p> <h3>Resources</h3> <ul> @@ -101,19 +101,19 @@ to use it to encrypt your data and be in control of your privacy.</p> http://localhost:3000/articles/2024/unvr-as-nas/ UNVR as NAS 2025-02-19T21:32:01Z - <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be<br /> -used as NAS (network attached storage). Be aware that this should be done with caution and may void<br /> -any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also<br /> -possible that this setup will break when / if updating the UNVR software. With that said, let’s jump<br /> + <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be +used as NAS (network attached storage). Be aware that this should be done with caution and may void +any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also +possible that this setup will break when / if updating the UNVR software. With that said, let’s jump in.</p> -<p>This post follows along with<br /> -<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>,<br /> +<p>This post follows along with +<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>, with some adaptations to get it to work on the latest Unifi-OS release of <code>3.2.12</code>.</p> <h2>Step One - Setup SSH &amp; Login</h2> -<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password<br /> +<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password for the root user to login to the UNVR.</p> <p><img src="/articles/images/2024-03-15-ssh.png" alt="ssh.png" /></p> -<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR<br /> +<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR on your network.</p> <p><code>ssh root@192.168.1.10</code></p> <h2>Step Two - Install Samba</h2> @@ -122,14 +122,14 @@ on your network.</p> <p>Next, install samba.</p> <p><code>apt-get install samba</code></p> <h2>Step Three - Setup Samba</h2> -<p>In order to edit the configuration we are going to need to install your terminal based text editor<br /> +<p>In order to edit the configuration we are going to need to install your terminal based text editor of choice (generally nano or vim), for me I will install vim.</p> <p><code>apt-get install vim</code></p> <p>Create a backup of the default configuration.</p> <p><code>cp /etc/samba/smb.conf /etc/samba/smb.conf.bak</code></p> <p>Open the configuration file to be edited.</p> <p><code>vim /etc/samba/smb.conf</code></p> -<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to<br /> +<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to make the samba server act better for time machine backups.</p> <pre><code>#======================= MacOS Client Optimizations ======================= vfs objects = fruit streams_xattr @@ -142,11 +142,11 @@ fruit:wipe_intentionally_left_blank_rfork = yes fruit:delete_empty_adfiles = yes </code></pre> -<p>Also because we want users we create to be able to read and write to their home directories created<br /> -on the samba server, we need to change the option under the <code>[homes]</code> share definition to be<br /> +<p>Also because we want users we create to be able to read and write to their home directories created +on the samba server, we need to change the option under the <code>[homes]</code> share definition to be <code>read only = no</code>.</p> -<p>That is our primary configuration. You can add more share definitions at the bottom of the file to<br /> -suit your use case, there are decent examples of this in the original reddit post, linked in the<br /> +<p>That is our primary configuration. You can add more share definitions at the bottom of the file to +suit your use case, there are decent examples of this in the original reddit post, linked in the beginning.</p> <p>Save and exit the file.</p> <p><code>:wq</code></p> @@ -167,13 +167,13 @@ beginning.</p> <p>In the <code>Finder</code> app on macOS you can type <code>⌘k</code> to connect to a server.</p> <p>In the text field enter <code>smb://&lt;USER&gt;@&lt;UNVR_IP&gt;</code> to connect to the samba server.</p> <p><img src="/articles/images/2024-03-15-connect.png" alt="connect" /></p> -<p>You can also automatically connect to the server when you login to your client device, for this to<br /> -work you need the credentials to be stored in your keychain (ticking the box in the step above when<br /> +<p>You can also automatically connect to the server when you login to your client device, for this to +work you need the credentials to be stored in your keychain (ticking the box in the step above when you first connect to the server).</p> -<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button<br /> +<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button and select the volume you would like to mount at login.</p> <p><img src="/articles/images/2024-03-15-login.png" alt="login" /></p> -<p>Once you have it setup so that the server is connected on login, you can also set it up as location<br /> +<p>Once you have it setup so that the server is connected on login, you can also set it up as location for Time Machine Backups. <code>System Settings -&gt; General -&gt; Time Machine</code></p> <p><img src="/articles/images/2024-03-15-time-machine.png" alt="time-machine" /></p> @@ -183,50 +183,50 @@ for Time Machine Backups. <code>System Settings -&gt; General -&gt 2025-02-19T21:25:29Z <p>This is a guest post from my good friend, <strong>Ty Branaman</strong>.</p> <h2>Introduction:</h2> -<p>Heating, Ventilation, and Air Conditioning (HVAC) is often mistakenly categorized as a simple labor<br /> -job, overshadowing the intricate skill set and technical expertise required in this field. Labor<br /> -jobs are also very important positions needed to keep society running. HVAC, like other skilled<br /> -trades, demands a high level of knowledge, precision, and adaptability. This article aims to shed<br /> -light on the misconception surrounding HVAC, emphasizing its status as a skilled trade that plays a<br /> +<p>Heating, Ventilation, and Air Conditioning (HVAC) is often mistakenly categorized as a simple labor +job, overshadowing the intricate skill set and technical expertise required in this field. Labor +jobs are also very important positions needed to keep society running. HVAC, like other skilled +trades, demands a high level of knowledge, precision, and adaptability. This article aims to shed +light on the misconception surrounding HVAC, emphasizing its status as a skilled trade that plays a pivotal role in creating comfortable and efficient living and working environments.</p> <h2>Technical Proficiency:</h2> -<p>One of the defining features that distinguish HVAC as a skilled trade is the level of technical<br /> -proficiency required. HVAC professionals must have a deep understanding of thermodynamics, fluid<br /> -mechanics, electrical circuits, Psychrometrics and air properties. This knowledge is essential for<br /> +<p>One of the defining features that distinguish HVAC as a skilled trade is the level of technical +proficiency required. HVAC professionals must have a deep understanding of thermodynamics, fluid +mechanics, electrical circuits, Psychrometrics and air properties. This knowledge is essential for designing, installing, and maintaining HVAC systems that operate seamlessly and efficiently.</p> <h2>System Design and Installation:</h2> -<p>HVAC professionals are involved in the intricate process of designing and installing heating,<br /> -ventilation, and air conditioning systems. This task requires not only a thorough understanding of<br /> -the physical principles governing HVAC but also the ability to tailor solutions to meet the unique<br /> -needs of each space. Proper system design and installation are crucial for achieving optimal energy<br /> +<p>HVAC professionals are involved in the intricate process of designing and installing heating, +ventilation, and air conditioning systems. This task requires not only a thorough understanding of +the physical principles governing HVAC but also the ability to tailor solutions to meet the unique +needs of each space. Proper system design and installation are crucial for achieving optimal energy efficiency and performance.</p> <h2>Diagnostic Skills:</h2> -<p>Troubleshooting and diagnosing issues in HVAC systems require a keen analytical mind and<br /> -problem-solving skills. Skilled HVAC technicians possess the ability to identify and rectify<br /> -problems efficiently, ensuring minimal downtime and disruption to the comfort of occupants. This<br /> +<p>Troubleshooting and diagnosing issues in HVAC systems require a keen analytical mind and +problem-solving skills. Skilled HVAC technicians possess the ability to identify and rectify +problems efficiently, ensuring minimal downtime and disruption to the comfort of occupants. This diagnostic acumen is a hallmark of a trade that goes beyond routine labor.</p> <h2>Adaptability to Advanced Technologies:</h2> -<p>The HVAC industry is in a constant state of evolution, with new technologies and innovations<br /> -continuously being introduced. Skilled HVAC professionals are adaptable and stay abreast of these<br /> -advancements. From smart thermostats to energy-efficient systems, they integrate cutting-edge<br /> +<p>The HVAC industry is in a constant state of evolution, with new technologies and innovations +continuously being introduced. Skilled HVAC professionals are adaptable and stay abreast of these +advancements. From smart thermostats to energy-efficient systems, they integrate cutting-edge technologies to provide state-of-the-art solutions for their clients.</p> <h2>Safety and Compliance:</h2> -<p>Safety is paramount in the HVAC trade. Professionals must adhere to strict safety protocols to<br /> -protect both themselves and the occupants of the spaces they work in. Additionally, compliance with<br /> -industry regulations and codes is a testament to the skilled nature of the trade, ensuring that HVAC<br /> +<p>Safety is paramount in the HVAC trade. Professionals must adhere to strict safety protocols to +protect both themselves and the occupants of the spaces they work in. Additionally, compliance with +industry regulations and codes is a testament to the skilled nature of the trade, ensuring that HVAC systems meet the highest standards of safety and efficiency.</p> <h2>Continual Learning and Certification:</h2> -<p>Unlike a labor job, HVAC professionals engage in continual learning to stay current with industry<br /> -trends and technological advancements. Many pursue certifications and attend training programs to<br /> -enhance their skills and expand their knowledge base. This commitment to ongoing education is a<br /> +<p>Unlike a labor job, HVAC professionals engage in continual learning to stay current with industry +trends and technological advancements. Many pursue certifications and attend training programs to +enhance their skills and expand their knowledge base. This commitment to ongoing education is a hallmark of skilled trades.</p> <h2>Conclusion:</h2> -<p>Heating, Ventilation, and Air Conditioning is undeniably a skilled trade that goes beyond the<br /> -perception of a labor job. Labor jobs are also very important to the function of society and I have<br /> -proudly done these jobs myself. The technical proficiency, problem-solving abilities, adaptability,<br /> -and commitment to safety make HVAC professionals essential contributors to the creation of<br /> -comfortable and efficient indoor environments. It is crucial to recognize and appreciate the skill<br /> -set inherent in the HVAC trade, as it plays a vital role in shaping the quality of life for<br /> +<p>Heating, Ventilation, and Air Conditioning is undeniably a skilled trade that goes beyond the +perception of a labor job. Labor jobs are also very important to the function of society and I have +proudly done these jobs myself. The technical proficiency, problem-solving abilities, adaptability, +and commitment to safety make HVAC professionals essential contributors to the creation of +comfortable and efficient indoor environments. It is crucial to recognize and appreciate the skill +set inherent in the HVAC trade, as it plays a vital role in shaping the quality of life for individuals and the functionality of diverse spaces.</p> <ul> <li>Ty Branaman</li> @@ -236,176 +236,176 @@ individuals and the functionality of diverse spaces.</p> http://localhost:3000/articles/2023/most-important-job/ Most Important Job 2025-02-19T21:21:54Z - <p>This short tech tip is about something one of my good friends in the trade told me a long time ago,<br /> + <p>This short tech tip is about something one of my good friends in the trade told me a long time ago, that has stuck with me through the years. It is a simple phrase / mindset.</p> <blockquote> <p>“The current job you’re on, is the most important job of your day”.</p> </blockquote> -<p>This mindset should be carried from the dispatcher, manager, and technician to make this successful.<br /> -I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use<br /> -this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging<br /> +<p>This mindset should be carried from the dispatcher, manager, and technician to make this successful. +I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use +this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging out there.</p> -<p>I do think it’s also important to acknowledge that there are times that a technician has exhausted<br /> -all their options, maybe they just don’t have the mental capacity anymore to continue with a problem<br /> -job, or need a break to come back another day with a fresh set of eyes, etc… This is also an<br /> -important thing for a technician to realize, and hopefully those type of instances are much more few<br /> +<p>I do think it’s also important to acknowledge that there are times that a technician has exhausted +all their options, maybe they just don’t have the mental capacity anymore to continue with a problem +job, or need a break to come back another day with a fresh set of eyes, etc… This is also an +important thing for a technician to realize, and hopefully those type of instances are much more few and far between, but I do want to acknowledge that scenario does also exist.</p> -<p>If you are a business owner, then this is something to consider instilling in your operations.<br /> -Empower your technicians and dispatchers to understand when things need to be shuffled around in<br /> -order to accommodate taking care of the customer at hand. It costs a lot of money to get a<br /> -technician to job, so minimizing truck rolls to the same job is important from a business<br /> +<p>If you are a business owner, then this is something to consider instilling in your operations. +Empower your technicians and dispatchers to understand when things need to be shuffled around in +order to accommodate taking care of the customer at hand. It costs a lot of money to get a +technician to job, so minimizing truck rolls to the same job is important from a business standpoint.</p> -<p>This was just a quick tech tip of something that has been rolling around in my mind lately. I hope<br /> +<p>This was just a quick tech tip of something that has been rolling around in my mind lately. I hope you find it helpful and it sticks with you through your career as it has mine.</p> http://localhost:3000/articles/2023/cancel-this/ Cancel This 2025-02-19T21:17:16Z - <p>This post is going to be hard to put into words, it’s going to seem egotistical at points, but know<br /> -that my actions / feelings online are the same as they are if you met me in person. The problem with<br /> -online interactions is tone and other subtleties do not come across, so it’s hard to tell when<br /> + <p>This post is going to be hard to put into words, it’s going to seem egotistical at points, but know +that my actions / feelings online are the same as they are if you met me in person. The problem with +online interactions is tone and other subtleties do not come across, so it’s hard to tell when someone is joking or being serious.</p> <h2>The Meat</h2> -<p>It has been brought to my attention that someone out there thinks that I’m sexist and should not<br /> -speak at the HVAC School symposium because of it. They are holding a curse word against me that I<br /> -said two years ago, in the moment A) it was fitting and B) it was one of those times that my mouth<br /> +<p>It has been brought to my attention that someone out there thinks that I’m sexist and should not +speak at the HVAC School symposium because of it. They are holding a curse word against me that I +said two years ago, in the moment A) it was fitting and B) it was one of those times that my mouth was working faster than my brain (raise your hand if that’s ever happened to you).</p> -<p>I am an open book, I am not afraid of showing failures and strengths. I’ve never claimed to be<br /> -perfect (well, actually I have but it’s always a joke). I’m not at all condoning what I’ve said in<br /> -the past, nor will I repeat it out of context now, but I communicate with people like adults and I<br /> -look at people as piers. We do not always have to agree with one another, conflict helps us learn<br /> -where to grow, but we also can not expect people to change to fit our wants / needs, that’s just not<br /> +<p>I am an open book, I am not afraid of showing failures and strengths. I’ve never claimed to be +perfect (well, actually I have but it’s always a joke). I’m not at all condoning what I’ve said in +the past, nor will I repeat it out of context now, but I communicate with people like adults and I +look at people as piers. We do not always have to agree with one another, conflict helps us learn +where to grow, but we also can not expect people to change to fit our wants / needs, that’s just not how it works.</p> -<p>I do not at all agree with the tactics used by whomever is behind this. I would happily discuss this<br /> -in private or out in the open. You can find all my contact / social information in the sidebar of<br /> -this website and I’ve offered up my cell phone number in private groups that we are all probably a<br /> +<p>I do not at all agree with the tactics used by whomever is behind this. I would happily discuss this +in private or out in the open. You can find all my contact / social information in the sidebar of +this website and I’ve offered up my cell phone number in private groups that we are all probably a part of.</p> <h2>The Potatoes</h2> -<p>I am a father of 3 girls, I have a sister, talk crap about my mom and you’ll find out who I am! I<br /> -love women, I have no problem with women in the trades, I encourage women who are in the trades. I<br /> -try to help every person that I can, if I can. I have failed more times than you can imagine! I am<br /> -self taught in about everything I do, so I give of it freely. I have all kinds of work to do to grow<br /> -into the man that I should be, but at the same time, I am not afraid to be the man that I am today.<br /> +<p>I am a father of 3 girls, I have a sister, talk crap about my mom and you’ll find out who I am! I +love women, I have no problem with women in the trades, I encourage women who are in the trades. I +try to help every person that I can, if I can. I have failed more times than you can imagine! I am +self taught in about everything I do, so I give of it freely. I have all kinds of work to do to grow +into the man that I should be, but at the same time, I am not afraid to be the man that I am today. I will greet you by whatever pronoun you want to be referred as.</p> -<p>I would love to say that I don’t judge people, but I do, just as I’m being judged! I am fine with<br /> -someone judging me and having opinions about me, I mean that is our right. I will not say that<br /> -person is wrong, because in their mind they’re right. What I will not do is stop being myself. I<br /> -know for a fact that I’ve helped more people than this person has gotten “cancelled”. I will<br /> -continue to help people in the trades, homeowners, or people in need. I also will not remain quiet!<br /> -I will give my opinion like it or not. There are people in my corner that really know me and my<br /> +<p>I would love to say that I don’t judge people, but I do, just as I’m being judged! I am fine with +someone judging me and having opinions about me, I mean that is our right. I will not say that +person is wrong, because in their mind they’re right. What I will not do is stop being myself. I +know for a fact that I’ve helped more people than this person has gotten “cancelled”. I will +continue to help people in the trades, homeowners, or people in need. I also will not remain quiet! +I will give my opinion like it or not. There are people in my corner that really know me and my intentions.</p> <h2>Final Words</h2> -<p>The trades are rough around the edges, just as am I. The trades are a slow turning ship (just look<br /> -at how many still do not follow proper practices, etc. even with the capabilities and resources<br /> +<p>The trades are rough around the edges, just as am I. The trades are a slow turning ship (just look +at how many still do not follow proper practices, etc. even with the capabilities and resources available today).</p> -<p>If you are new / coming into the trades then I hope you are not overly sensitive to foul language<br /> -and other inappropriate comments. Thick skin is valuable in the trades, but at the same time don’t<br /> -be afraid to speak up if something offends you. Remember we are adults, we can handle disagreements<br /> -like adults (well, some of us can). Adults can learn from those of any age, they can reflect on<br /> +<p>If you are new / coming into the trades then I hope you are not overly sensitive to foul language +and other inappropriate comments. Thick skin is valuable in the trades, but at the same time don’t +be afraid to speak up if something offends you. Remember we are adults, we can handle disagreements +like adults (well, some of us can). Adults can learn from those of any age, they can reflect on their own behavior and make their own decisions.</p> -<p>I personally think that being offended is not a bad thing, it causes us to reflect / repair our<br /> -foundational beliefs. I hope that we can stop with this “cancel culture” of today, stop hiding<br /> +<p>I personally think that being offended is not a bad thing, it causes us to reflect / repair our +foundational beliefs. I hope that we can stop with this “cancel culture” of today, stop hiding behind a keyboard, and be a diverse community.</p> -<p>To wrap things up, I just want to reiterate that I am not at all mad at whomever is behind this. To<br /> +<p>To wrap things up, I just want to reiterate that I am not at all mad at whomever is behind this. To everyone out there who has shown me love and support, I greatly appreciate it.</p> http://localhost:3000/articles/2023/hope/ Hope 2025-02-19T21:13:20Z - <p>This is a piggy-back article off of<br /> + <p>This is a piggy-back article off of <a href="https://mhoush.com/posts/20231018224631-the-struggle/">The Struggle</a> article that I had recently.</p> -<p>I was a bit of a “Debbie Downer” in that article, which is okay, I get that way sometimes. In this<br /> -article I’d like to take a minute to layout some of the things that give me hope, things that I<br /> +<p>I was a bit of a “Debbie Downer” in that article, which is okay, I get that way sometimes. In this +article I’d like to take a minute to layout some of the things that give me hope, things that I focus on to try and kick myself out of the rut I can get into sometimes.</p> -<p>I believe it’s important to have <strong>hope</strong>, to realize that feeling down is normal / part of being<br /> -human. It’s just as important to have hope. For some it is a harder thing to focus on, it may be<br /> -easy for us to try and dwell in negative feelings, to some that may feel more comfortable. When<br /> +<p>I believe it’s important to have <strong>hope</strong>, to realize that feeling down is normal / part of being +human. It’s just as important to have hope. For some it is a harder thing to focus on, it may be +easy for us to try and dwell in negative feelings, to some that may feel more comfortable. When we’re feeling cynical, it’s easy to feed the negativity, although it’s rarely helpful.</p> <h2>Hope</h2> -<p>One of the things that I try to focus on is that I’m human, it brings me hope to realize that I’m<br /> -not the only one who feels the way that I do. This was evident by the feedback on my previous<br /> +<p>One of the things that I try to focus on is that I’m human, it brings me hope to realize that I’m +not the only one who feels the way that I do. This was evident by the feedback on my previous article.</p> <blockquote> <p>My problems are very much “first world problems”.</p> </blockquote> -<p>Make no mistake, I’m selfish, but it’s the selfishness that makes me feel distant or disconnected.<br /> -The times that I feel connected are without a doubt the times that I let go of my ego and focus on<br /> +<p>Make no mistake, I’m selfish, but it’s the selfishness that makes me feel distant or disconnected. +The times that I feel connected are without a doubt the times that I let go of my ego and focus on things outside of myself.</p> -<p>It’s the feeling I get from going to customers home and feeling truly appreciated. There’s no push<br /> -back on price, no one telling me how I should run my business, no “the part only costs $x on<br /> +<p>It’s the feeling I get from going to customers home and feeling truly appreciated. There’s no push +back on price, no one telling me how I should run my business, no “the part only costs $x on amazon”, etc.</p> -<p>The feeling of seeing your child smile. The safety you feel when getting a hug from your mother or<br /> +<p>The feeling of seeing your child smile. The safety you feel when getting a hug from your mother or father. When you’re looking up at the stars and realize how small you actually are.</p> -<p>When you’re out with friends and trick the DJ into playing a Mr. Bungle song and no one else<br /> +<p>When you’re out with friends and trick the DJ into playing a Mr. Bungle song and no one else appreciates it, but you. The times when your guard is completely down and you laugh with abandon.</p> -<p>The smell of your lover’s hair when you’re holding them close. The joy you receive from sitting with<br /> +<p>The smell of your lover’s hair when you’re holding them close. The joy you receive from sitting with your pets. The songs of nature, insects, birds, etc. The sounds of waves / water in the distance.</p> -<p>The feeling when you’ve helped someone learn a new skill, when something finally clicks and makes<br /> -sense. When a complex topic is understood at a fundamental level. The breakthrough of a problem<br /> +<p>The feeling when you’ve helped someone learn a new skill, when something finally clicks and makes +sense. When a complex topic is understood at a fundamental level. The breakthrough of a problem you’ve pondered for days / months / years.</p> <h2>Conclusion</h2> -<p>There are so many things to be grateful for. This does not mean that there will not be hard times,<br /> -there surely will be. This does not mean that you are wrong for having negative feelings, for<br /> -feeling depressed or anxious. There are many around you that likely feel similar (they may just not<br /> -be able to express it in the same way). You never truly know what the person next to you is dealing<br /> +<p>There are so many things to be grateful for. This does not mean that there will not be hard times, +there surely will be. This does not mean that you are wrong for having negative feelings, for +feeling depressed or anxious. There are many around you that likely feel similar (they may just not +be able to express it in the same way). You never truly know what the person next to you is dealing with. Be compassionate (including showing yourself compassion).</p> -<p>When you are feeling down, try to do something for someone else. Make your own list of things to be<br /> -thankful for. Maybe my non-exhaustive list above will give you some ideas. Write those items down<br /> +<p>When you are feeling down, try to do something for someone else. Make your own list of things to be +thankful for. Maybe my non-exhaustive list above will give you some ideas. Write those items down regularly so that you can look back on them when you feel out of balance.</p> -<p>There is plenty of negative energy in this world, be true and genuine and you will receive rewards.<br /> +<p>There is plenty of negative energy in this world, be true and genuine and you will receive rewards. When you focus on blessings then the negativity will fade.</p> <p>What impact are you going to leave with what little time we have?</p> -<p>I hope that you enjoyed this short article. Know that you are <em>NOT</em> alone, you are important, and<br /> +<p>I hope that you enjoyed this short article. Know that you are <em>NOT</em> alone, you are important, and that I appreciate <em>you!</em></p> http://localhost:3000/articles/2023/heat-recovery-chiller/ Heat Recovery Chiller 2025-02-19T21:08:37Z - <p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so<br /> -I’m doing it now. I did discuss this on<br /> + <p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so +I’m doing it now. I did discuss this on <a href="https://hvacrschool.com/podcasts/is-the-future-of-air-conditioning-self-contained-propane-chillers/">this episode of the HVAC School Podcast.</a></p> <h2>Heat Recovery Chillers</h2> -<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that<br /> -common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most<br /> -equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds<br /> +<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that +common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most +equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds in this article, but offer an overview of what I feel would be my dream system.</p> <h2>The Source</h2> -<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional<br /> -heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would<br /> -have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to<br /> -bank / store heat, or are running in heat only mode. There are several benefits to this style<br /> -system, the main being that while operating simultaneous heating / cooling mode the COP of the<br /> -system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of<br /> -about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level<br /> +<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional +heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would +have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to +bank / store heat, or are running in heat only mode. There are several benefits to this style +system, the main being that while operating simultaneous heating / cooling mode the COP of the +system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of +about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level performance without the need of a field.</p> <h2>Indoor Portion</h2> -<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller.<br /> -The buffer tanks give us several benefits, including longer run times for the chiller, load<br /> -matching, and the ability to size for larger load (heating or cooling) without some of the problems<br /> -that occur when over-sizing a traditional system. The buffer tanks also allow sizing more<br /> +<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller. +The buffer tanks give us several benefits, including longer run times for the chiller, load +matching, and the ability to size for larger load (heating or cooling) without some of the problems +that occur when over-sizing a traditional system. The buffer tanks also allow sizing more aggressively by having storage during peak load conditions.</p> <p><img src="/articles/images/2023-10-27-buffers2.png" alt="buffer" /></p> -<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what<br /> -circulate water through the chiller, while the vertical pumps are what distribute the water to the<br /> -load / emitters. This configuration allows for water to be used for the loads first and extra<br /> -capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps<br /> -(meaning that they won’t interfere with each other if / when there are different flow rates).<br /> -Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in<br /> -parallel to the system. This is shown by the extra tees in the hot buffer tank where we could<br /> -connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler.<br /> -You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat<br /> +<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what +circulate water through the chiller, while the vertical pumps are what distribute the water to the +load / emitters. This configuration allows for water to be used for the loads first and extra +capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps +(meaning that they won’t interfere with each other if / when there are different flow rates). +Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in +parallel to the system. This is shown by the extra tees in the hot buffer tank where we could +connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler. +You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat exchanger that would be used to supply domestic hot water.</p> <h2>Distribution System</h2> -<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators,<br /> +<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators, however I’m going to model it as a 4-pipe hydronic air handler.</p> <p><img src="/articles/images/2023-10-27-ah.png" alt="ah" /></p> -<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in<br /> -one package. With a hydronic system, it would be very easy to load match by controlling the fan<br /> -speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from<br /> -several manufacturers and come in different styles from traditional (as shown), small duct high<br /> +<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in +one package. With a hydronic system, it would be very easy to load match by controlling the fan +speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from +several manufacturers and come in different styles from traditional (as shown), small duct high velocity systems, and even ductless styles.</p> <h2>Disadvantages</h2> <ol> @@ -414,7 +414,7 @@ velocity systems, and even ductless styles.</p> <li>Lack of understanding / technicians afraid to work on this style system.</li> <li>Potentially higher upfront costs.</li> <li>Lack of design or planning could cause unhappy clients (same with traditional)</li> -<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement<br /> +<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement for traditional boiler systems)</li> </ol> <h2>Advantages</h2> @@ -428,11 +428,11 @@ for traditional boiler systems)</li> <li>Easier transition to natural / flammable refrigerants</li> </ol> <h2>Conclusion</h2> -<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the<br /> -main points is to think of the system in 3 distinct components, the source(s), thermal storage, and<br /> -distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish<br /> -this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to<br /> -dump excess heat into a pool, create ice storage during off peak hours, cascade into another water<br /> +<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the +main points is to think of the system in 3 distinct components, the source(s), thermal storage, and +distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish +this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to +dump excess heat into a pool, create ice storage during off peak hours, cascade into another water -&gt; water heat pump for higher temperature distribution, incorporate solar collectors, and so on.</p> <p>Thank you for reading all the way to the end!</p> @@ -442,25 +442,25 @@ dump excess heat into a pool, create ice storage during off peak hours, cascade 2025-02-19T20:51:49Z <p>This is a quick article about why you should learn markdown.</p> <h2>What is markdown</h2> -<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily<br /> -converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on<br /> +<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily +converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on this website are written in markdown, here’s an image of this article written in markdown.</p> <p><img src="/articles/images/2023-10-21-markdown.png" alt="markdown" /></p> -<p>The reason you should learn markdown is that it allows you to focus on the content / text of your<br /> -content with simple concepts for formatting. Markdown is used heavily in documenting software<br /> -projects, which is how I got introduced to it, however it can scale all the way up to writing<br /> +<p>The reason you should learn markdown is that it allows you to focus on the content / text of your +content with simple concepts for formatting. Markdown is used heavily in documenting software +projects, which is how I got introduced to it, however it can scale all the way up to writing research papers or even books.</p> -<p>I use markdown for probably 80% of all the text documents I need to write, from company documents,<br /> -web / software documentation, and so on. It allows me to get content out quickly without having to<br /> -click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of<br /> -the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using<br /> -<strong>Pages</strong> (for now at least) because I have templates that make the documents look more<br /> +<p>I use markdown for probably 80% of all the text documents I need to write, from company documents, +web / software documentation, and so on. It allows me to get content out quickly without having to +click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of +the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using +<strong>Pages</strong> (for now at least) because I have templates that make the documents look more professional, however I am working on solutions to migrate those to be markdown based.</p> -<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client<br /> -(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many<br /> +<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client +(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many common document related tasks.</p> <h2>Resources</h2> -<p>You can learn more about the syntax used for markdown at<br /> +<p>You can learn more about the syntax used for markdown at <a href="https://www.markdownguide.org/basic-syntax/">markdownguide.org</a>.</p> <h3>A non-exhaustive list of where you can use Markdown and editors.</h3> <table> @@ -492,7 +492,7 @@ common document related tasks.</p> <p>You can use tools such as <a href="https://pandoc.org/#">pandoc</a> to convert Markdown files to other formats.</p> <p><img src="/articles/images/2023-10-21-pandoc.gif" alt="pandoc" /></p> <h2>Conclusion</h2> -<p>I hope that you take the time to research and see if Markdown is good fit for your document /<br /> +<p>I hope that you take the time to research and see if Markdown is good fit for your document / content creation.</p> <p>Thanks for reading until the end!</p> @@ -500,71 +500,71 @@ content creation.</p> http://localhost:3000/articles/2023/the-struggle/ The Struggle 2025-02-19T20:53:34Z - <p>This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If<br /> + <p>This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If that is not your cup of tea then feel free to skip this article.</p> <h2>The struggle</h2> -<p>It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby<br /> +<p>It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby / complainer, which is not my intention, but here it goes.</p> -<p>My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived<br /> -in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9<br /> -years apart), so she helped raise my mother growing up. They’ve always had a close relationship and<br /> -are like two peas in a pod. They would always visit us, especially while my grand-parents were still<br /> -alive. She is currently not really awake or expected to make it. She does not eat / drink and<br /> +<p>My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived +in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9 +years apart), so she helped raise my mother growing up. They’ve always had a close relationship and +are like two peas in a pod. They would always visit us, especially while my grand-parents were still +alive. She is currently not really awake or expected to make it. She does not eat / drink and they’ve basically just been making her comfortable.</p> -<p>One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject,<br /> -but he had surgery to fuse some discs back together and should eventually be ok, however it will be<br /> +<p>One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject, +but he had surgery to fuse some discs back together and should eventually be ok, however it will be a long recovery time.</p> -<p>A few weeks ago, I commited one of the deadly sins of running a blower door test without checking /<br /> -asking about the fireplaces, which caused lord knows how much damage from the soot that was spread<br /> +<p>A few weeks ago, I commited one of the deadly sins of running a blower door test without checking / +asking about the fireplaces, which caused lord knows how much damage from the soot that was spread throughout the living room(s).</p> <p>An online friend lost her mother.</p> <p>All of these things have just got me emotional.</p> <h2>My secrets</h2> -<p>I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I<br /> -spent many years masking things through alcohol abuse and many other idiotic tendencies. I still<br /> +<p>I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I +spent many years masking things through alcohol abuse and many other idiotic tendencies. I still drink on occasion, but not as I once did.</p> -<p>I often put my faith in folks, even if I haven’t met them in person, this can often lead to being<br /> -let down. I guess I struggle sometimes with the reality of online relationships. I think that people<br /> -are genuine, because I’m that way (how I act online is the same as I act in person for the most<br /> -part). I will happily show / share the good and the bad, in hopes that someone may learn. This is<br /> -not at all something to be ashamed of, or anything that I’d like to change, however it does on<br /> +<p>I often put my faith in folks, even if I haven’t met them in person, this can often lead to being +let down. I guess I struggle sometimes with the reality of online relationships. I think that people +are genuine, because I’m that way (how I act online is the same as I act in person for the most +part). I will happily show / share the good and the bad, in hopes that someone may learn. This is +not at all something to be ashamed of, or anything that I’d like to change, however it does on occasion lead me into turmoil when I find out some true identity / personality of someone.</p> -<p>I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want<br /> -to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to<br /> -forgive people, but it is just not the way it works for me often times. It takes a lot to get me<br /> -beyond my breaking point, but once someone has gotten me there, there is likely no turning back for<br /> -that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my<br /> -life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but<br /> +<p>I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want +to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to +forgive people, but it is just not the way it works for me often times. It takes a lot to get me +beyond my breaking point, but once someone has gotten me there, there is likely no turning back for +that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my +life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but truthfully I do not.</p> -<p>My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot<br /> -of regret around these things, because I generally mean what I say, and also feel we are entitled to<br /> -opinions as well as entitled to change those opinions as often as we see fit. Although I don’t<br /> -regret them per-se, it does make me wonder what type of impression it leaves (something for future<br /> +<p>My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot +of regret around these things, because I generally mean what I say, and also feel we are entitled to +opinions as well as entitled to change those opinions as often as we see fit. Although I don’t +regret them per-se, it does make me wonder what type of impression it leaves (something for future pondering, perhaps).</p> -<p>I’m one of those that says “I don’t care what they think about me”, when I really do care what<br /> -people think about me. This often leads to fear and anxiety, especially in social settings. I’m not<br /> -the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time<br /> -to think before responding. Therefore, I’m quick to make a joke or something rather than having<br /> +<p>I’m one of those that says “I don’t care what they think about me”, when I really do care what +people think about me. This often leads to fear and anxiety, especially in social settings. I’m not +the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time +to think before responding. Therefore, I’m quick to make a joke or something rather than having thoughtful / genuine responses.</p> <h2>Community</h2> -<p>All of these things have just got me thinking about community. Community is an aspect that seems<br /> -distant nowadays, even though we have more opportunity than ever. We call ourselves part of<br /> -communities, especially online, but I’m not convinced that it is really community (or at least not<br /> +<p>All of these things have just got me thinking about community. Community is an aspect that seems +distant nowadays, even though we have more opportunity than ever. We call ourselves part of +communities, especially online, but I’m not convinced that it is really community (or at least not most of the time, not saying it can’t be / in absolute terms).</p> -<p>I have met a lot of folks online that I consider true friends. Friends that I would do anything for<br /> -and feel they would do anything for me, just like my real life friends who have stuck with me for<br /> -many years. These are people that challenge me and how I think on a regular basis. They do their<br /> +<p>I have met a lot of folks online that I consider true friends. Friends that I would do anything for +and feel they would do anything for me, just like my real life friends who have stuck with me for +many years. These are people that challenge me and how I think on a regular basis. They do their best to lift me up when I’m down.</p> -<p>It’s easy to hide when so much of our interactions are not really in person, to feel like the<br /> -relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the<br /> -benefit / trust they deserve until, at least until they don’t then see my part about holding grudges<br /> +<p>It’s easy to hide when so much of our interactions are not really in person, to feel like the +relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the +benefit / trust they deserve until, at least until they don’t then see my part about holding grudges ;)</p> -<p>Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m<br /> -trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks<br /> -Jennifer in real life, I read today about her mom and decided to take an hour or so to put together<br /> -a website for the <a href="https://hvachicks.com">HVAChicks Community</a>, hoping it would bring a moment of<br /> -happiness to her day. While I’ve deployed several websites in the past, this one for some reason was<br /> -a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and<br /> +<p>Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m +trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks +Jennifer in real life, I read today about her mom and decided to take an hour or so to put together +a website for the <a href="https://hvachicks.com">HVAChicks Community</a>, hoping it would bring a moment of +happiness to her day. While I’ve deployed several websites in the past, this one for some reason was +a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and it’s basic AF), but that truly made me feel useful / great after being down in the dumps for a bit.</p> <h2>Conclusion</h2> <p>I’ve probably rambled enough and am losing direction here, so I will end with a few things.</p> @@ -574,43 +574,43 @@ it’s basic AF), but that truly made me feel useful / great after being down in <li>Spend time with your loved ones, while you can.</li> <li>Tell someone you love them.</li> </ol> -<p>Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I<br /> +<p>Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I left you off, I’m sorry and please do not take it personally.</p> <ol> <li>Bryan Orr <ul> -<li>Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and<br /> -commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan,<br /> +<li>Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and +commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan, mostly all the following names would not even be in my vocabulary.</li> </ul> </li> <li>Ty Branaman (forget exactly how to spell his last name). <ul> -<li>Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be<br /> +<li>Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be positive all the time, however it brings me hope and joy everytime!</li> </ul> </li> <li>Dustin (mother f’n) Cole <ul> -<li>Dustin is like a brother that I never had, he’s a true master of his craft and I know that I<br /> +<li>Dustin is like a brother that I never had, he’s a true master of his craft and I know that I can rely on him anytime I need it!</li> </ul> </li> <li>Genry Garcia <ul> -<li>The cuban crusader who has taught me so much about home performance, and especially ZPD (baby,<br /> +<li>The cuban crusader who has taught me so much about home performance, and especially ZPD (baby, baby)!</li> </ul> </li> <li>Chris Hughes <ul> -<li>It’s hard to put into words here, but I know that Chris is there to talk when I need it and<br /> +<li>It’s hard to put into words here, but I know that Chris is there to talk when I need it and he’s a great motivator because of his action items :)</li> </ul> </li> <li>Eric Kaiser <ul> -<li>I think genuine when I think of Eric, I hear his voice in my head when I write reports because<br /> +<li>I think genuine when I think of Eric, I hear his voice in my head when I write reports because of guidance he has given in the past. He truly wants to help teach people.</li> </ul> </li> @@ -621,62 +621,636 @@ of guidance he has given in the past. He truly wants to help teach people.</l </li> <li>HVAChicks Jennifer (I’ll butcher her last name from memory) <ul> -<li>Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I<br /> +<li>Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I can’t wait to meet her in person one day soon!</li> </ul> </li> <li>HVAC Overtime Crew <ul> -<li>I’m lumping these guys together because I truly enjoy when I’m able to make their live stream<br /> +<li>I’m lumping these guys together because I truly enjoy when I’m able to make their live stream on Friday’s. And I interact with A-Team a lot and really appreciate him / them!</li> </ul> </li> <li>Alicia Hollon <ul> -<li>Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner,<br /> +<li>Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner, love you babe!</li> </ul> </li> </ol> -<p>Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt<br /> +<p>Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt currently. My mother is the kindest gentlest soul that I’ve ever met. I look up to all 5’ of her!</p> -<p>At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today<br /> +<p>At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today and tomorrow!</p> + + + http://localhost:3000/articles/2023/free-quotes-are-bad-for-the-industry/ + Free quotes != good + 2025-02-20T15:56:18Z + <p>I found myself re-reading the +<a href="https://www.acca.org/communities/community-home/librarydocuments/viewdocument?DocumentKey=b1d2a39d-fda8-4af9-b8de-0ae579bfe24a">ACCA Quality Installation Standard</a> +recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the +items that are required as what I’m calling “prior to installation” items.</p> +<h2>Prior to installation</h2> +<ol> +<li>Ensure ventilation calculations are performed.</li> +<li>Building heat gain / loss calculation (Manual-J / Manual-N) +<ol> +<li>Room x room for new construction or duct modifications.</li> +<li>Block load for existing (can use original if available).</li> +</ol> +</li> +<li>Proper equipment capacity selection (Manual-S / Manual-CS)</li> +<li>Properly matched systems (AHRI or CEE-AHRI)</li> +</ol> +<p>Let’s break the above items down to a rough estimated time to complete each of the items.</p> +<table> +<thead> +<tr> +<th>Item</th> +<th>Time (minutes)</th> +</tr> +</thead> +<tbody> +<tr> +<td>Ventilation calculations</td> +<td>15</td> +</tr> +<tr> +<td>Manual-J (data gathering)</td> +<td>30</td> +</tr> +<tr> +<td>Manual-J (data entry / calculation)</td> +<td>30</td> +</tr> +<tr> +<td>Manual-S</td> +<td>15</td> +</tr> +<tr> +<td>AHRI</td> +<td>15</td> +</tr> +<tr> +<td><strong>Total</strong></td> +<td>105</td> +</tr> +</tbody> +</table> +<blockquote> +<p><em>The above items are obviously just estimations and the person’s experience in the different areas / tools they use. Some of the items are +probably on the low side while others are probably on the high side.</em></p> +</blockquote> +<p>This is 1.75 hours just to do the calculations required to meet the QI Standard. This does not include any of the time spent with the +customer building value in you or your product recommendations.</p> +<p>When you want to not guess at some of the calculations then a blower door test is generally required in order to understand the leakage of +the home, which adds even more time to the estimation process. Depending on the understanding you are looking for, the blower door test can +add 30-180 minutes. This takes the total time to 2.25-4.75 hours.</p> +<h2>Pushing boxes</h2> +<p>The majority of residential HVAC companies make the bulk of their income off of equipment sales, so they have to “feed the beast” by +skipping steps in both the installation of equipment and the sales process in order to close jobs and keep the ship afloat.</p> +<p><img src="/articles/images/2023-10-04-sinking-boat.png" alt="sinking-boat" /></p> +<p>This has helped contribute to these industry statistics:<a href="DOE" title="2018">^1</a></p> +<ul> +<li><strong>Incorrect refrigerant charge in greater than 50-80% of systems.</strong></li> +<li><strong>Improper airflow:</strong> +<ul> +<li><strong>70% above the rated 0.5” w.c.</strong></li> +<li><strong>47% above 0.7” w.c.</strong></li> +<li><strong>85% undersized / inappropriate filter.</strong></li> +</ul> +</li> +<li><strong>70-80% of systems have at least one fault.</strong></li> +<li><strong>90-100% if duct leakage is considered.</strong></li> +</ul> +<h2>Consumer responsibility</h2> +<p>Let me be clear, I don’t think that all the blame is on the industry here. The culture today is that everyone wants things for free and +fast. They have been conditioned by online services and box stores. Should we not cater to those that aren’t willing to do their leg work? +Is it really our fault, if they don’t care?</p> +<h2>Liability</h2> +<p>While it’s generally easy to shrug our shoulders and think that it’s ok to just continue on because all the competitors are doing the same +thing. There is at least the possibility that skipping steps can come back to bite you. If things ever went to litigation and the steps +outlined in the QI Standard are ignored, then there is high odds you would loose.</p> +<p>No matter what you do to try and protect yourself (having customers sign-off, etc) does not adequately protect your company from litigation. +There are stories out there where contractors were still held liable for not performing load calculations even though the consumer signed +off on it, because it is not inline with “industry best practices.”</p> +<h1>Summary</h1> +<p>This has led me to the conclusion that free quotes are just bad for the industry in general. The path forward is a challenge (changing +perception is hard). I don’t know that I have answers on what the best path forward is, to be frank, but I do know that our current <em>status +quo</em> is subpar to say the least.</p> +<p>Unfortunately, I don’t think the change is going to come from the industry, but that it’s going to require the consumer base to be more +educated and demand more from the industry. There have been many organizations that have dedicated years to changing the skill levels of +technicians in the industry, they are very well needed / don’t mistake my words here, however unless a company has faced litigation or +facing requests on a regular basis that demand better results, then why would a company change!?!</p> +<p>I’ve been trying (unsuccessfully) to get rid of free quotes for 5+ years in my company. We try to educate customers during maintenance +visits and when scheduling equipment estimates, however only about 10-20% choose to go down our paid Home Performance Assessment path. Our +installation process does follow the QI Standard for the items that pertain to the setup / commissioning of the installed equipment, however +there is just no sustainable way for us to completely follow the items outlined in this article without charging for our time, because at +the end of the day we still have to be competitive in our market.</p> +<p>There are days that I can justify our actions to myself and also days that I just want to throw in the towel / not sacrifice our integrity. +Integrity is something that I take very seriously, after all our companies tag line is <em>“Since 1954, Integrity is in the Housh!”</em></p> +<p>As mentioned, I’m not sure what the best path forward is! I hate to not have answers, but some problems are just complex and somewhat beyond +our control.</p> +<p>Let me know what you think some good solutions are.</p> +<ul> +<li>Does your company follow the QI Standard?</li> +<li>What are resources that you’ve found helpful in educating your customers?</li> +</ul> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-4/ + Introduction to Programming for HVAC Part-4 + 2025-02-20T16:31:35Z + <p>This article builds upon our <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-3/">last</a> article, so make sure to catch up +before continuing with this article.</p> +<h2>Arguments</h2> +<p>Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments are +supplied to shell scripts are separated by a space <code>&quot; &quot;</code>, as opposed to options which start with a <code>-&lt;character&gt;</code> or <code>--&lt;word&gt;</code>.</p> +<p>To illustrate this, let’s change our <code>hello-world</code> script we wrote in the last article.</p> +<p><strong>Move into our scripts directory:</strong></p> +<pre><code class="language-bash">cd ~/.local/bin +</code></pre> +<p><strong>Make a copy of the hello-world script:</strong></p> +<pre><code class="language-bash">cp hello-world greet +</code></pre> +<p>Above we make a copy of the hello-world file and name the copy <code>greet</code>.</p> +<p><strong>Open the greet file:</strong></p> +<pre><code class="language-bash">open -a TextEdit greet +</code></pre> +<blockquote> +<p><strong>Note:</strong> Because the greet file is an executable, in order to open it in the <code>TextEdit</code> application we must supply the <code>-a</code> option. +Otherwise it will just run our <code>greet</code> program in another terminal. Use <code>man open</code> to read more about the open command.</p> +</blockquote> +<p><strong>Edit the greet file:</strong></p> +<pre><code class="language-bash">#!/bin/sh + +echo &quot;Hello, ${1}!&quot; +</code></pre> +<p>Make sure to save <code>⌘s</code> the file.</p> +<p>Take note that the quotes need to be changed to <code>&quot;</code> (double quotes) from our original <code>hello-world</code> program.</p> +<p>The <code>${1}</code> is indicating that we will insert / interpret the first argument passed to our program and insert it at that location. Arguments +are interpreted in order they are passed in with <code>${0}</code> always representing the filename of the program that is called (generally not needed +/ used in your scripts).</p> +<p><strong>Test it out:</strong></p> +<pre><code class="language-bash">./greet Michael +</code></pre> +<p><img src="/articles/images/2023-09-26-greet-output.png" alt="greet-output" /></p> +<p>If you’d like to supply multiple words (or arguments that contain spaces) as a single argument then you can wrap them in quotes.</p> +<pre><code class="language-bash">./greet &quot;Michael Housh&quot; +</code></pre> +<blockquote> +<p><strong>Tip:</strong> Wrapping in quotes is especially useful for commands that take file paths, if any of the folders or file names contain spaces.</p> +</blockquote> +<h2>More Useful Program</h2> +<p>At this point, it’s time to build a more useful program that we can use. First, we must download some dependencies for our program.</p> +<p><strong>Install imagemagick:</strong></p> +<pre><code class="language-bash">brew install imagemagick +</code></pre> +<blockquote> +<p><strong>Note:</strong> If you’d like to check out the documentation / website for imagemagick you can run <code>brew home imagemagick</code>.</p> +</blockquote> +<p>This will take a bit for brew to install imagemagick and it’s dependencies. When it’s completed, we can check to make sure that imagemagick +is installed by running the following command.</p> +<pre><code class="language-bash">magick --version +</code></pre> +<p>It should output something along the lines of this below.</p> +<pre><code class="language-bash">Version: ImageMagick 7.1.1-17 Q16-HDRI aarch64 21569 https://imagemagick.org +Copyright: (C) 1999 ImageMagick Studio LLC +License: https://imagemagick.org/script/license.php +Features: Cipher DPC HDRI Modules OpenMP(5.0) +Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib +Compiler: gcc (4.2) +</code></pre> +<blockquote> +<p><strong>Tip:</strong> Don’t forget, you can use the <code>clear</code> command to clear the terminal.</p> +</blockquote> +<p><strong>Create our script:</strong></p> +<pre><code class="language-bash">touch mktrans +</code></pre> +<p>We are going to name our script <code>mktrans</code> as a short for make transparent.</p> +<p><strong>Open the file:</strong></p> +<pre><code class="language-bash">open mktrans +</code></pre> +<p><strong>The program:</strong></p> +<pre><code class="language-bash">#!/bin/bash + +# The input file path, passed in as the first argument. +inputfile=&quot;${1}&quot; + +# The color to make transparent, optionally passed in as the second argument. +# by default we handle / make white backgrounds transparent. +color=&quot;${2:-white}&quot; + +# Use the built-in basename command to normalize the input file name +# this will convert a file path, such as ~/Pictures/my-image.png to my-image.png. +fullfilename=$(basename -- &quot;$inputfile&quot;) + +# Use the text of the `fullfilename` up to the first '.' as the file name. +filename=&quot;${fullfilename%%.*}&quot; + +# Use the text after the last '.' as the file extension. +extension=&quot;${fullfilename##*.}&quot; + +# Create the output file name to use. +# +# For an input file of `input.png`, our output name would be +# `input-transparent.png`. +# +# This will output the file in the directory that we are +# in when we use our script (which may different than where +# the image is located) +outputfile=&quot;${filename}-transparent.${extension}&quot; + +# Make the magick happen :) +convert &quot;${inputfile}&quot; -fuzz 10% -transparent &quot;${color}&quot; &quot;${outputfile}&quot; + +</code></pre> +<p>I’ve included comments in the program above, which is good practice, as there is high odds that you will forget what is going on when / if +you open the file up in the future to look at it. We are using a lot of what is called parameter expansion magic in this file. You can read +up more on what we are doing in the <a href="https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html">bash documentation</a>.</p> +<p>This script is far from perfect, there are a lot of things to be improved upon. For example, if you download / save the banner image of this +post and run this script, it will also remove some color in the wizards beard, eyes, and eye brows. However, it does work very well for my +general use case, which is to remove the background from screenshots of pdf documents. It should be noted that it will not work on all types +of images, some image types do not allow transparency, so it is safest to call this with input image being a <code>.png</code> image type, however you +can use the <code>imagemagick</code> program that we downloaded to convert other image types to <code>.png</code>, but that will be left up to you to figure out.</p> +<h2>Using Our Program</h2> +<p>This is going to assume that you have download the banner image at the top of this article. You can do this by right-clicking and choosing +<code>Save As</code>. This should save the image in your downloads folder, and you can keep the name of <code>part4-banner.png</code>.</p> +<p><strong>Make the program executable:</strong></p> +<pre><code class="language-bash">chmod u+x mktrans +</code></pre> +<p><strong>Make the image background transparent:</strong></p> +<pre><code class="language-bash">./mktrans ~/Downloads/part4-banner.png +</code></pre> +<p><strong>Open the image:</strong></p> +<pre><code class="language-bash">open part4-banner-transparent.png +</code></pre> +<p>It should look like below.</p> +<p><img src="/articles/images/2023-09-26-part4-banner-transparent.png" alt="banner-transparent" /></p> +<blockquote> +<p><strong>Note:</strong> If you are viewing this site in <em>light</em> mode, the image does not look that bad. Hit the moon button in the top above my profile +image to see some of the flaws of our program.</p> +</blockquote> +<hr /> +<blockquote> +<p><strong>Tip:</strong> Remove the image from the <code>~/.local/bin</code> by using <code>rm part4-banner-transparent.png</code>. Be aware that the <code>rm</code> command can not be +undone, so use with caution / knowledge. It is safer, until you are more comfortable to use the <code>Finder</code> application and move the file to +the trash. In <code>Finder</code>, you can show hidden directories by typing <code>⌘.</code> or go directly to the folder by typing <code>⇧⌘G</code> (shift + command + G) +and in the pop-up typing <code>~/.local/bin</code>.</p> +</blockquote> +<hr /> +<p>That is it for this article. In the upcoming articles we will setup our <code>shell</code> environment so that we can use the commands we’ve built +without having to navigate to the <code>~/.local/bin</code> directory. Thank you for reading to the end, I hope you’re finding this series helpful.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-3/ + Introduction to Programming for HVAC Part-3 + 2025-02-20T16:20:56Z + <p>In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up <a href="https://mhoush.com/series/programming-for-hvac/">here</a> before continuing with this article.</p> +<h2>Getting Started</h2> +<p>We are going to make our first script / program. This first program is really just setting up some building blocks for our next program we +will write, that will remove the background from an image.</p> +<h3>Creating a scripts directory</h3> +<p>We learned in the <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first article</a> how to use our terminal. Today we are +going to use some of the commands we learned to create a directory where we can store our script and future scripts that we write.</p> +<p><strong>Create a directory</strong></p> +<pre><code class="language-bash">mkdir -p ~/.local/bin +</code></pre> +<p>The above command will create a “hidden” directory in your home folder. We can go ahead and move into the directory we just created.</p> +<blockquote> +<p><strong>Note:</strong> The <code>-p</code> option allows us to create nested directories if the parent directory doesn’t exist.</p> +</blockquote> +<pre><code class="language-bash">cd ~/.local/bin +</code></pre> +<h3>Hello World</h3> +<p>It is common in programming to start out with a “Hello World” program when learning a new scripting paradigm. So let’s jump in and get +started.</p> +<p><strong>Creating our script file:</strong></p> +<pre><code class="language-bash">touch hello-world.sh +</code></pre> +<p><strong>Now open the file:</strong></p> +<pre><code class="language-bash">open hello-world.sh +</code></pre> +<p>The above command should open the file in the <code>TextEdit</code> application. In order to make the text edit application to not auto-capitalize +words and play more nicely, we need to adjust some settings. Open the settings by pressing <code>⌘,</code>.</p> +<p>In the <strong>Format</strong> section, select <em>Plain text</em> and in the <strong>Options</strong> section de-select <em>Check spelling as you type</em>.</p> +<p><img src="/articles/images/2023-09-24-text-settings.png" alt="text-settings" /></p> +<p>At this point for changes to take place, you will need to close the file and re-open.</p> +<blockquote> +<p><strong>Tip:</strong> In your terminal you can run the last command in your history by using the <code>↑</code> (Up) arrow key.</p> +</blockquote> +<p>Now that the file is open again, we will write our hello-world program. The contents of your file should look like the following:</p> +<pre><code class="language-bash">#!/bin/sh + +echo 'Hello World!' +</code></pre> +<p>The first line is referred to as the <code>shebang</code>, this tells your computer which shell interperter to run your file. I have not explained the +shell yet, but it currently would just muddy the waters a bit, but there are several shell interperters on your computer with the <code>sh</code> posix +shell being one of the most universal / lowest level ones, which is why I’m choosing this one (in other words this script would work on just +about any machine you were on).</p> +<p>The second line we are using the built-in <code>echo</code> command and passing it the ‘Hello World!’ argument.</p> +<p>Now save and close the file <code>⌘s</code> (to save) <code>⌘q</code> (to quit the text edit application).</p> +<p><strong>Run the program from your terminal:</strong></p> +<pre><code class="language-bash">/bin/sh hello-world.sh +</code></pre> +<p>You should see that <code>Hello World!</code> was printed to your console.</p> +<p><img src="/articles/images/2023-09-24-hello-output.png" alt="hello-output" /></p> +<h3>Make Executable</h3> +<p>Now that we have our basic script working, let’s make it an executable.</p> +<p><strong>In your terminal, type the following:</strong></p> +<pre><code class="language-bash">chmod u+x hello-world.sh +</code></pre> +<p>This will change the mode of the file type to be an executable.</p> +<p>Now move / rename the file so we don’t have to call it using <code>.sh</code> extension:</p> +<pre><code class="language-bash">mv hello-world.sh hello-world +</code></pre> +<p>Now that the file is executable, we can execute it by just calling the name of the file.</p> +<pre><code class="language-bash">./hello-world +</code></pre> +<blockquote> +<p><strong>Note:</strong> We have to prefix the file name with <code>./</code> in the above command so that it knows where to find our file. The <code>./</code> is saying run +this file in our current directory. In the future we will setup our shell so that it knows to look in our <code>~/.local/bin</code> directory for +scripts, so that we can call them without this prefix.</p> +</blockquote> +<h2>Conclusion</h2> +<p>Congratulations, in this article we wrote our first program. We learned how to edit the file, set it’s permissions, and execute the program +from our terminal. I should mention that the <code>TextEdit</code> application is generally not how you would program, people typically use what is +known as an <code>IDE (integrated development environment)</code>, however I chose to use the <code>TextEdit</code> application because it is built-in to <code>macOS</code> +and allowed us to accomplish our goal without downloading other software.</p> +<p>In our upcoming articles, we will write a program that I hope is useful to you / something that you can build upon and use for a long time. +Thank you for reading to this point.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-2/ + Introduction to Programming for HVAC Part-2 + 2025-02-20T16:16:09Z + <p>In this article, learn about installing a package manager. If you missed it, check out the +<a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first</a> article in the series where we learned about using your terminal. +This article builds upon that foundation.</p> +<h2>What is a Package Manager</h2> +<p>A package manager is a piece of software that helps to install software and manage updates for your system. For me, the first thing that I +do with a new machine is install <code>Homebrew</code>. <a href="https://brew.sh">Homebrew</a> is my preferred package manager for <code>macOS</code>.</p> +<h2>Why</h2> +<p>A package manager is nice because often software relies / requires other dependencies in order to work properly. By using a package manager +it will make sure that the correct dependencies are installed for the software that you need to run. It allows you to be able to update and +manage software through a centralized interface.</p> +<h2>Installation</h2> +<p>Installation is simple. Open up your terminal and enter the following command (easiest to just copy / paste from the homepage linked above).</p> +<pre><code class="language-bash">/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot; +</code></pre> +<p>This will prompt you for your password in order to create some directories and install the required software for <code>brew</code> to work. The +installation may take some time, while it downloads the command line tools for <code>Xcode</code>.</p> +<p>When completed, follow the <code>Next Steps</code> and copy / paste the command listed, that should look like below.</p> +<pre><code class="language-bash">(echo; echo 'eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;') &gt;&gt; /Users/&lt;you&gt;/.zprofile +eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot; +</code></pre> +<p><img src="/articles/images/2023-09-22-brew-output.png" alt="brew-output" /></p> +<p>The first line of this command sets up some things in your shell profile (which we have not discussed yet) that will make <code>Homebrew</code> +available to you anytime you start a new session in your terminal. The second line of the command makes it available in your current +terminal session.</p> +<p>Next run the following command and make sure that everything is setup correctly.</p> +<pre><code class="language-bash">brew doctor +</code></pre> +<p>Which should output the following:</p> +<pre><code>Your system is ready to brew. +</code></pre> +<h3>Terminology</h3> +<p>Homebrew calls command line applications <code>formula</code> and normal graphical applications <code>casks</code>. It has the ability to install both styles of +applications.</p> +<h2>Search Command</h2> +<p>The following command is used to search for software packages:</p> +<pre><code class="language-bash">brew search chrome +</code></pre> +<h2>Open a Homepage</h2> +<p>The following command can be used to view the homepage of a formula or cask in your browser:</p> +<pre><code class="language-bash">brew home google-chrome +</code></pre> +<h2>Update Homebrew</h2> +<p>The following command is used to update homebrew:</p> +<pre><code class="language-bash">brew update +</code></pre> +<h2>Update packages installed on your system</h2> +<p>The following command is used to update software that is installed / managed by homebrew.</p> +<pre><code class="language-bash">brew upgrade +</code></pre> +<p>You can combine the update and upgrade commands, which will update homebrew and upgrade all the software it manages on you machine with the +following command.</p> +<pre><code class="language-bash">brew update &amp;&amp; brew upgrade +</code></pre> +<h2>Conclusion</h2> +<p>That is it for this article. I will say that for me, when I find a piece of software that I want to use, I generally try to search for it in +<code>brew</code> first, before installing it via other means.</p> +<p>I hope you’ve found this article helpful. In the next article we will start to use the skills that we’ve learned in these first two articles +and write our first program / script.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-1/ + Introduction to Programming for HVAC Part-1 + 2025-02-20T16:12:06Z + <p>This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.</p> +<h2>Why</h2> +<p>I think if nothing else, this series can help gain knowledge, tips, and tricks to make you more comfortable with your computer. I hope that +you will at least learn how to use your <code>terminal</code> application and more specifically <code>vim</code> motions and keybindings (more on that in another +article).</p> +<p>The goal of this article is to just get a machine setup with tools and to start exploring. I am a shill for <code>macOS</code>, so all of these will be +specifically geared towards that and my workflows, most everything that is showcased should also work on <code>linux</code> machines (not sure about +<code>windows</code>), although you may have to search for specific instructions on installing software for other platforms.</p> +<p>What I have learned on my journey in programming is that the more you can lean on small software packages that focus on a single task, but +do them well, the better. The less you use your mouse, the more productive you can be. The more you can work with <code>text</code> files and formats +the more portable and transformable your workflows can be.</p> +<h2>Getting Started</h2> +<p>The first thing that we will focus on is becoming familiar with the terminal application. On macOS the terminal application is located at +<code>/Applications/Utilities/Terminal.app</code>. However, rather than click around to find it, you can use the <code>⌘&lt;space&gt;</code> to pull up your spotlight +search, then type <code>Terminal</code> to select the terminal application.</p> +<p><img src="/articles/images/2023-09-21-spotlight.png" alt="spotlight" /></p> +<h3>Terminal Overview</h3> +<p>Your terminal is a program that allows you to run programs by typing commands into it’s window. There are a lot of built-in commands and a +bunch that you can install. The terminal is very customizable (and once familiar, you will constantly be tweaking / adjusting to suit your +needs). Right now customization is not what we will focus on, however in future articles I will provide tips and tricks on customizing it. +Right now, we only need to know how to open it up and type in commands.</p> +<p><img src="/articles/images/2023-09-21-terminal.png" alt="terminal" /></p> +<p>Below is an image / explanation of what the default status line includes.</p> +<p><img src="/articles/images/2023-09-21-terminal-line.png" alt="terminal-line" /></p> +<h3>Learn Basic Commands (Built-in)</h3> +<p>Here are a few basic commands that you should familiarize yourself with, as you will use them often when working inside of a terminal.</p> +<h3>Change Directory</h3> +<p><code>cd</code> (change directory) is the command that allows you to move around your file system when inside the terminal.</p> +<blockquote> +<p><strong>Note:</strong> <code>~</code> is a representation of your <code>Home</code> directory.</p> +</blockquote> +<pre><code class="language-bash">cd ~/Documents +</code></pre> +<p>The above command will move you into your Documents directory.</p> +<blockquote> +<p><strong>Note:</strong> If there are spaces in the name of the directory you try to move to then the easiest way is to wrap the name in quotes.</p> +</blockquote> +<pre><code class="language-bash">cd &quot;~/Documents/Product Concepts&quot; +</code></pre> +<p>Some other things to understand when moving around / supplying arguments to the <code>cd</code> command.</p> +<p>You can use <code>..</code> to go backwards / move up to the parent directory. For example, say we are in the <code>~/Documents</code> directory, to go back up to +the home directory we could use the following:</p> +<pre><code class="language-bash">cd .. +</code></pre> +<p>These can be chained together as well. For example say we are located in the <code>~/Documents/Product Concepts</code> directory, we could use the +following to go up two directory levels back to the home directory.</p> +<pre><code class="language-bash">cd ../.. +</code></pre> +<blockquote> +<p><strong>Pro-Tip:</strong> You can use the <code>&lt;tab&gt;</code> key when navigating to auto-complete, generally typing a few characters followed with the <code>&lt;tab&gt;</code> key +will auto-complete for you.</p> +</blockquote> +<h3>List files</h3> +<p>Use <code>ls</code> to output a list of files and directories where you are located.</p> +<pre><code class="language-bash">ls +</code></pre> +<p><em>Example Output when in my ~/Documents directory</em></p> +<pre><code class="language-bash">Estimates.app +InkscapeDrawings +KwikModel +MyAparment +NCISummit +Personal +Product Concepts +Receipts.receipts +RingCentral +SketchUP +Tech-Tips +desktop.ini +espanso-migrate-backup +espanso-migrate-backup-2 +</code></pre> +<p>Using options with <code>ls</code> to show more statistics and hidden files. There are often hidden files on your computer that are used for +application support or other purposes, these files are not shown using the default command. Hidden files start with a <code>.</code>, below is an +example of showing hidden files in your home directory.</p> +<pre><code class="language-bash">ls -la ~/ +</code></pre> +<blockquote> +<p><strong>Note:</strong> Above I added the <code>~/</code> which will allow you to list the files in your home directory even if you currently are not there in your +terminal, if you were already there (for example by using <code>cd ~/</code> then you would not need to use that at the end of the command.</p> +</blockquote> +<p><em>Example Output</em></p> +<pre><code>total 168 +drwxr-xr-x+ 46 michael staff 1472 Sep 22 10:45 . +drwxr-xr-x 6 root admin 192 Sep 22 09:08 .. +-r-------- 1 michael staff 7 Apr 8 2021 .CFUserTextEncoding +-rw-r--r--@ 1 michael staff 14340 Sep 18 10:15 .DS_Store +drwx------+ 5 michael staff 160 Sep 20 17:03 .Trash +-rw-r--r-- 1 michael staff 186 Sep 12 15:20 .actrc +drwxr-xr-x 4 michael staff 128 Dec 13 2021 .bin +drwxr-xr-x 3 michael staff 96 Mar 6 2023 .bundle +drwxr-xr-x 7 michael staff 224 Sep 12 11:40 .cabal +drwxr-xr-x 7 michael staff 224 Sep 12 15:20 .cache +drwxr-xr-x 13 michael staff 416 Aug 10 08:47 .config +drwx------ 3 michael staff 96 Jun 21 2021 .cups +drwxr-xr-x 12 michael staff 384 Sep 15 15:22 .docker +drwxr-xr-x 20 michael staff 640 Sep 19 08:11 .dotfiles +drwxr-xr-x 4 michael staff 128 Jul 26 2021 .gem +drwxr-xr-x 3 michael staff 96 Oct 11 2021 .jssc +-rw------- 1 michael staff 20 Sep 22 10:45 .lesshst +drwxr-x--- 3 michael staff 96 Mar 29 08:47 .lldb +drwxr-xr-x 8 michael staff 256 Mar 1 2023 .local +drwxr-xr-x 4 root staff 128 Apr 12 2021 .newtek +drwxr-xr-x 5 michael staff 160 Dec 13 2021 .npm +-rw------- 1 michael staff 27436 Apr 10 10:21 .psql_history +drwxr-xr-x 7 michael staff 224 Apr 18 2022 .ssh +drwxr-xr-x 6 michael staff 192 Sep 21 09:06 .swiftpm +lrwxr-xr-x 1 michael staff 25 Dec 27 2021 .tmux.conf -&gt; .dotfiles/tmux/.tmux.conf +drwxr-xr-x 8 michael staff 256 Mar 27 16:14 .twilio-cli +drwxr-xr-x 6 michael staff 192 Sep 18 11:08 .vim +-rw------- 1 michael staff 23086 Sep 21 09:45 .viminfo +-rw-r--r-- 1 michael staff 254 Sep 21 09:32 .wget-hsts +lrwxr-xr-x 1 michael staff 43 Jan 3 2022 .zshenv -&gt; /Users/michael/.dotfiles/zsh/config/.zshenv +drwxr-xr-x 8 michael staff 256 Dec 14 2021 AmazonWorkDocsCompanion +drwx------@ 4 michael staff 128 Dec 13 2021 Applications +lrwxr-xr-x 1 michael staff 40 Jun 6 12:00 Applications (Parallels) -&gt; /Volumes/Bucket/Applications (Parallels) +drwx------@ 30 michael staff 960 Sep 21 08:54 Desktop +drwx------@ 19 michael staff 608 Sep 14 10:15 Documents +drwx------@ 21 michael staff 672 Sep 21 09:43 Downloads +drwx------+ 115 michael staff 3680 Sep 14 10:04 Library +drwxr-xr-x 3 michael staff 96 Sep 8 13:06 LocalProjects +lrwxr-xr-x 1 michael staff 29 Dec 30 2021 Movies -&gt; /Volumes/Bucket/Videos/Movies +lrwxr-xr-x 1 michael staff 21 Dec 30 2021 Music -&gt; /Volumes/Bucket/Music +drwx------@ 2 michael staff 64 Mar 6 2023 Parallels +drwx------@ 7 michael staff 224 Sep 14 09:52 Pictures +drwxr-x---+ 4 michael staff 128 Apr 8 2021 Public +drwxr-xr-x+ 3 michael staff 96 Sep 14 09:52 Sites +drwxr-xr-x 3 michael staff 96 Jun 7 2021 WorkDocs Drive +drwxr-xr-x 3 michael staff 96 Sep 18 11:36 go +</code></pre> +<p>As you can see, I have a lot of hidden files and folders, your output will probably look much different than mine.</p> +<h3>Clearing the Terminal</h3> +<p>Often times you may want to clear the terminal screen. You can use the <code>clear</code> command to clear the screen of the terminal.</p> +<pre><code class="language-bash">clear +</code></pre> +<p>Or use a keyboard shortcut <code>⌃l</code> (<code>&lt;control&gt;l</code>)</p> +<h3>Creating Directories</h3> +<p>Use <code>mkdir</code> (make directory) to create a directory.</p> +<p>First, let’s move into the <code>tmp</code> directory, the <code>tmp</code> directory is a directory on your file system that is typically used for applications +to write temporary logs / files to, it get’s erased everytime your computer is restarted. We can use the <code>cd</code> command that we learned +earlier.</p> +<pre><code class="language-bash">cd /tmp +</code></pre> +<p>Next, let’s create a new directory called “MyDirectory”.</p> +<pre><code class="language-bash">mkdir MyDirectory +</code></pre> +<h4>Gotcha’s with ‘mkdir’</h4> +<p>By default you can’t create directories that are multiple levels deep, unless the directories already existed or we provide the <code>-p</code> option. +For example, if we want to create a directory at <code>/tmp/MyOtherDirectory/Nested/Deeply</code> then we could use the following command when inside +the <code>tmp</code> directory.</p> +<pre><code class="language-bash">mkdir -p MyOtherDirectory/Nested/Deeply +</code></pre> +<p>Now, try out using the <code>&lt;tab&gt;</code> key with the <code>cd</code> command to navigate to the <code>Deeply</code> folder.</p> +<pre><code class="language-bash">cd MyOther &lt;tab&gt; &lt;tab&gt; &lt;tab&gt; +</code></pre> +<h3>Open Command</h3> +<p>You can use the open command to open files or folders in the default application for the file type.</p> +<p>For example, if we want to open a <code>Finder</code> window while in the <code>/tmp</code> directory, we can use the following command:</p> +<pre><code class="language-bash">open . +</code></pre> +<h3>Manual Pages</h3> +<p>Lastly, to learn more about commands you can use the <code>man &lt;command&gt;</code>. To bring up the manual pages for the command in the terminal. You can +use the arrow keys to navigate around the manual pages and type the letter <code>q</code> to quit / close the manual pages.</p> +<pre><code class="language-bash">man ls +</code></pre> +<p>That is it for the first installment in this series. I hope you learned something and have better understanding of using your terminal.</p> http://localhost:3000/articles/2023/calculate-seer-degradation-by-age/ Calculate SEER Degradation by Age 2025-02-19T21:55:30Z - <p>This is a quick tech-tip to learn how to calculate the degradation of SEER based<br /> + <p>This is a quick tech-tip to learn how to calculate the degradation of SEER based on age.</p> -<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and<br /> -refrigerant charge losses. It should be noted that this is not true for all<br /> -applications, but is used as an estimation based on research done by the <code>DOE</code><br /> +<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and +refrigerant charge losses. It should be noted that this is not true for all +applications, but is used as an estimation based on research done by the <code>DOE</code> of the average degradation based on systems tested.</p> <h2>Formula</h2> -<p>This is the formula used to calculate the SEER based on age of the evaporator<br /> +<p>This is the formula used to calculate the SEER based on age of the evaporator coil / air handler.</p> <p>$$ SEER_d = SEER_n \times (1 - M)^{age} $$</p> -<p>| Where | |<br /> -| –––– | —————————————— | — |<br /> -| $SEER_d$ | Degradated SEER rating |<br /> -| $SEER_n$ | Nominal SEER rating when equipment was new |  |<br /> -| M | Maintenance factor, 0.01-0.03 |<br /> +<p>| Where | | +| –––– | —————————————— | — | +| $SEER_d$ | Degradated SEER rating | +| $SEER_n$ | Nominal SEER rating when equipment was new |  | +| M | Maintenance factor, 0.01-0.03 | | age | The age of the equipment, in years |</p> -<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is<br /> -for unmaintained. The maintenance factor in essence is based on 1%-3%<br /> -degradation per year, however there are some<br /> -<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a><br /> -that show that this can actually be as high as 5% or above depending on climate.<br /> -We could use up to 0.05 as the maintenance factor, just to see what the “range”<br /> +<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is +for unmaintained. The maintenance factor in essence is based on 1%-3% +degradation per year, however there are some +<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a> +that show that this can actually be as high as 5% or above depending on climate. +We could use up to 0.05 as the maintenance factor, just to see what the “range” of degradation would be.</p> -<p>Interestingly, the study linked also shows that the degradation is higher the<br /> -higher the tonnage of the equipment. It also shows that the degradation is lower<br /> -per year the higher the nominal SEER rating of the system (which is corelated to<br /> -using TXV’s and lower airflow rates because of the equipment having multiple<br /> +<p>Interestingly, the study linked also shows that the degradation is higher the +higher the tonnage of the equipment. It also shows that the degradation is lower +per year the higher the nominal SEER rating of the system (which is corelated to +using TXV’s and lower airflow rates because of the equipment having multiple stages).</p> <h2>Example</h2> -<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when<br /> +<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when installed and the system is 15 years old.</p> <p>Plugging those numbers into our formula.</p> <hr /> @@ -686,9 +1260,396 @@ installed and the system is 15 years old.</p> <h4>Highest Rage (5% degradation / year)</h4> <p>$$ SEER_d = 13 \times (1 - 0.05)^{15} = 6 $$</p> <hr /> -<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER<br /> -vs. a poorly maintained / dirty system that also suffers from refrigerant charge<br /> +<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER +vs. a poorly maintained / dirty system that also suffers from refrigerant charge losses can be as low as 6 SEER.</p> <p>Thanks for learning how to estimate SEER degradation based on equipment age!</p> + + http://localhost:3000/articles/2023/introducing-psychrometrics-cli/ + Introducing Psychrometrics CLI + 2025-02-20T16:03:19Z + <p>Today, I’m releasing a command line application that is built on top of my +<a href="https://github.com/swift-psychrometrics/swift-psychrometrics">swift-psychrometrics</a> package, that I open sourced over 2 years ago.</p> +<p>The application consists of many calculations / conversions for psychrometric properties of an air stream. The tool works for both imperial +and metric units. The application will work natively on macOS, but can also be ran through a <code>docker</code> container on other platforms.</p> +<h2>Why</h2> +<p>I spend a lot of time in my terminal, because I can work so much more efficiently. I discovered many years ago that the more I can do using +simple applications and keyboard over a mouse and a web browser or native application the more I can accomplish. I understand this is +intimidating for many who think they are <em>“not good with computers”.</em> I can assure that was me several years ago, I would only encourage you +to not be afraid and give it a shot. We are at a time in society where it is easier than ever to get informed and learned new skills.</p> +<h2>Installation</h2> +<p>For complete installation instructions, you can view the <a href="https://github.com/swift-psychrometrics/psychrometrics-cli">github</a> repository.</p> +<p>The following instructions are based on using macOS.</p> +<h3>Open your terminal application.</h3> +<p>Personally, I use <a href="https://iterm2.com/">iTerm2</a>, however you can use the default <code>Terminal</code> app. Found at +<code>/Applications/Utilities/Terminal.app</code>.</p> +<h2>Install Homebrew</h2> +<p>We use <a href="https://brew.sh">Homebrew</a> for package distribution of the pre-built application binaries. You can follow their instructions to +install.</p> +<h3>Tap our custom formula tap.</h3> +<pre><code class="language-bash">brew tap swift-psychrometrics/formula +</code></pre> +<h3>Install the psychrometrics application</h3> +<pre><code class="language-bash">brew install psychrometrics +</code></pre> +<p>That’s it!</p> +<h2>Usage</h2> +<p>I will run through a couple of the commands that are supplied with the application and show what you can expect the outputs to be.</p> +<h3>Properties</h3> +<p>The following command will output a bunch of the psychrometric properties of an air stream. There are several ways to call it, but generally +you will supply the dry bulb temperature and the relative humidity.</p> +<p>Below, we calculate the psychrometric properties based on 75°F and 50% humidity.</p> +<pre><code class="language-bash">psychrometrics --dry-bulb 75 --relative-humidity 50 +</code></pre> +<p><img src="/articles/images/2023-09-18-properties.png" alt="properties-output" /></p> +<h3>Dehumidifier Sizing</h3> +<p>If you’ve read some of my recent articles on calculating the +<a href="https://mhoush.com/posts/sizing-dehumidifier-by-latent-load/">dehumidifier size required based on the latent load</a>, the application also +ships with a calculation that will do this for you and has the ability to calculate it at different <code>coverages</code> that you can supply.</p> +<p>For example if we’ve done a load calculation and determined that we have a latent load of <code>4,334 BTU/h</code> then we could run the following +command to see what size dehumidifier is needed for <code>100%, 85%, and 70%</code> of the latent load.</p> +<pre><code class="language-bash">psychrometrics dh size --coverage 100 85 70 --verbose 4334 +</code></pre> +<p><img src="/articles/images/2023-09-18-dh-size.png" alt="dh-size" /></p> +<h3>Pounds of Water Removed</h3> +<p>I also recently wrote an article about <a href="https://mhoush.com/posts/pounds-of-water-removed/">calculating the pounds of water removed</a> from an +air stream given the grains of moisture removed.</p> +<p>Below is an example of calculating the pounds of water removed per hour based on the example in the article (14 delta-grains)</p> +<pre><code class="language-bash">psychrometrics dh pounds-removed --delta 14 --cfm 797 --verbose +</code></pre> +<p><img src="/articles/images/2023-09-18-pounds-removed.png" alt="pounds-removed" /></p> +<h3>Help</h3> +<p>You can use <code>--help</code> option to show help and the list of commands provided.</p> +<p><img src="/articles/images/2023-09-18-help.png" alt="help" /></p> +<p>If you have any questions then feel free to email or message me. I hope some of you may find this application useful.</p> + + + http://localhost:3000/articles/2023/sizing-dehumidifier-by-latent-load/ + Dehumidifier Sizing by Latent Load + 2025-02-20T17:04:37Z + <p>This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure.</p> +<h2>Formulas</h2> +<p>The formula above is used to solve for the pints per hour required to size a dehumidifier.</p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Ph</td> +<td>Pints / hour</td> +</tr> +</tbody> +</table> +<p>We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day.png" alt="pints-per-day-formula" /></p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Pd</td> +<td>Pints / day</td> +</tr> +</tbody> +</table> +<p>In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized +properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during +peak cooling demand.</p> +<h2>Example</h2> +<p>Let’s imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example.png" alt="pints-per-day-formula-example" /></p> +<p>Or if we just want to cover the latent capacity at 85% of the full latent load.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example2.png" alt="pints-per-day-formula-example" /></p> +<p>This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition +we wanted to use.</p> +<p>I don’t feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an +oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application.</p> +<p>Thanks for reading!</p> + + + http://localhost:3000/articles/2023/why-mini-splits-stink/ + Why Mini Splits Stink + 2025-02-20T17:06:24Z + <p>In this general article, I explain why I don’t generally like to use mini-splits.</p> +<h2>The Positive Sides</h2> +<p>When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted +consoles. These units do offer really high efficiency and becuase they’re “ductless” you don’t have duct gains/losses.</p> +<p>These units are common in many other countries and have been around for a long time. They do are generally quick and fairly easy to install, +but are mostly a pain in the tail to work on.</p> +<p>So, the plus side to these units are that they are really efficient, they generally have models that have a high-heat output for colder +climates, although this option is becoming more prevelant in traditional unitary style heat pumps as well. You do not have heat gains or +losses due to ductwork being in unconditioned spaces.</p> +<h2>The Down Sides</h2> +<p>Most mini-split systems do not do the greatest at humidity removal. This is partially because they use proprietary algorithms to control the +blower and compressor. They do achieve long run-times, which is often good for comfort stand points, however there is generally not a good +way to control / hack them to work towards achieving good IAQ.</p> +<p>These units offer next to no filtration, so in order to have filtration you need to utilize a stand-alone / portable filtration means. Which +a lot of the portable filtration systems have problems of their own (come bundled with UV / PCO technology or other “space” technology that +can lead to their own IAQ problems). It also introduces another fan, which may / may not be that efficient. In other words, when considering +other items to make them more comparable to what a traditional system offers, are they really that much more efficient?</p> +<p>These systems also do not have a good method of offering basic fresh air control / management, so other systems, such as an ERV need to be +installed to handle the fresh air requirements of the building.</p> +<p>The controls for these systems are often hard to understand / use. They do allow you to change fan speeds, but they control the compressor. +The fans often run all the time, which is not necessarily a bad thing, but they don’t really offer many ramping profiles or adjustments to +change the blower speed when the compressor is off vs. on.</p> +<p>These systems get dirty quickly, are generally a pain to clean properly, and are not easily repairable. Manufacturer support is often poor, +the documents aren’t always translated very well, and most technicians hate to work on them.</p> +<h1>What about ducted models?</h1> +<p>But what about the ducted models? Well, the ducted models are a step in the right direction. You can use filters on them, although some of +the manufacturer’s do not recommend installing better / improved filter cabinets (like a 4-5” media filter), however we have done that +successfully many times and always include media filters as an option on our installations, but you do need to make sure that they have a +very low pressure drop, as they a lot are not designed for very much static pressure.</p> +<p>The ducted models still generally have the same control problems, previously mentioned. If you read my introduction to the +<a href="https://mhoush.com/posts/coil-bypass-overview/">coil-bypass-system</a>, you have a basic understanding that even most traditional systems / +designers do not focus on the proper air-changes in a structure to maintain proper IAQ levels.</p> +<p>You can’t easily pair mini-splits with larger fan-coils because they are “communicating” style systems.</p> +<h2>Conclusion</h2> +<p>Don’t get me wrong, there are applications that are well suited for mini-splits. These are often applications like sun-rooms, garages, small +server-rooms / network storage rooms, and many others. But in my opinion these are not at all my favorite and are generally really far down +my list of options that I want to recommend to my clients.</p> +<p>As an industry, I feel we need to step back and refocus on the pillars of IAQ. Filtration, fresh-air, and humidity control. The +manufacturers / government should put less emphasis on chasing efficiency just to shoot ourselves in the foot and loose the qualities that +make traditional / unitary style systems cover more if not all of the 3 pillars of proper IAQ.</p> +<p>There’s plenty that I did not cover and I’m sure I missed some things, but just needed to rant for a few minutes… Thank you for making it +to the end!</p> + + + http://localhost:3000/articles/2023/pounds-of-water-removed/ + Pounds of Water Removed + 2025-02-20T16:43:21Z + <p>This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream).</p> +<p>This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This +article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here +are a couple articles to familiarize yourself.</p> +<h2>Articles</h2> +<ul> +<li><a href="https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/">Understand Dew-Point</a></li> +<li><a href="https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/">Impact of Adding or Removing Water from Air</a></li> +</ul> +<h2>Scenario</h2> +<p>Let’s imagine that we have an air-conditioner that has the following measurements taken:</p> +<ul> +<li>Return Air: 75° / 50% RH</li> +<li>Supply Air: 55° / 81% RH</li> +</ul> +<p>We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air +conditions).</p> +<p><img src="/articles/images/2023-09-08-pounds-of-water-removed.png" alt="chart" /></p> +<p>We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the +relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per +pound of air.</p> +<p>This gives us the following values:</p> +<ul> +<li>Return Air: 66 gr/lb</li> +<li>Supply Air: 52 gr/lb</li> +</ul> +<p>We can then use the following formula to calculate the pounds of water removed.</p> +<p><img src="/articles/images/2023-09-08-formula.png" alt="formula" /></p> +<table> +<thead> +<tr> +<th><strong>Where</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>W</strong></td> +<td><em>Weight of water in pounds per hour</em></td> +</tr> +<tr> +<td><strong>4.5</strong></td> +<td><em>Constant based on density / specific heat of moist air</em></td> +</tr> +<tr> +<td><strong>CFM</strong></td> +<td><em>Airflow in cubic feet per minute</em></td> +</tr> +<tr> +<td><strong>∆G</strong></td> +<td><em>Difference in grains of moisture</em></td> +</tr> +<tr> +<td><strong>7000</strong></td> +<td><em>Constant based on grains of moisture in saturated air</em></td> +</tr> +</tbody> +</table> +<h2>Solution</h2> +<p>First, we solve for the difference in grains between the two air streams.</p> +<p>∆G = 66 - 52 = 14</p> +<p>Next, we’ve measured our airflow and have determined to have <strong>797 CFM</strong> of airflow across the evaporator coil, so we can substitute our +values into the formula.</p> +<p><img src="/articles/images/2023-09-08-solution.png" alt="solution" /></p> +<p>So, we are removing about 7 pounds of water per hour at these conditions.</p> +<p>Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that +can often be rated in pints per day.</p> +<p>I hope you’ve found this article helpful, thanks for reading!</p> + + + http://localhost:3000/articles/2023/rss-feed/ + Rss Feed + 2025-02-20T16:50:11Z + <p>In this article I will show how to add this site’s rss feed. In particular, we will be using <a href="https://netnewswire.com">NetNewsWire</a> as the +rss reader.</p> +<h2>What is an RSS Feed</h2> +<p>An RSS feed will show you new posts, generally from a blog, without having to remember to check the website at regular intervals or signup +for an email list for notifications.</p> +<p>NetNewsWire puts an RSS feed as:</p> +<p><strong>It’s like podcasts</strong> - but for <em>reading.</em></p> +<p>You consume an RSS feed, using an RSS reader application or extension in your browser.</p> +<h2>Step One</h2> +<p>First find and download an RSS reader, you can download <a href="https://netnewswire.com">NetNewsWire</a> for macOS from the link, or for iOS from the +<a href="https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210">AppStore</a>.</p> +<h2>Step Two</h2> +<p>Add the rss feed to stay up to date when I publish new articles.</p> +<ol> +<li>Click the plus in the right side of the sidebar and select <code>New Feed...</code></li> +<li>In the URL field add: <code>https://mhoush.com/articles/feed.xml</code></li> +<li>Optionally give it a name</li> +<li>Click the <code>Add</code> button.</li> +</ol> +<p><img src="/articles/images/2023-08-10-rss-feed.gif" alt="rss gif" /></p> +<p>That’s it.</p> + + + http://localhost:3000/articles/2023/coil-bypass-overview/ + Coil Bypass Overview + 2025-02-20T15:14:48Z + <p>This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a +coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the challenges of this style of +system.</p> +<h2>What is a Coil Bypass</h2> +<p>A coil bypass is not to be mistaken for a zoning system bypass, where airflow is “relieved” from the supply side of the system back into the +return. Instead, a coil bypass diverts a portion of the airflow around the coil using a bypass damper(s). The bypass can serve several +functions depending on the application, but in general it allows for a constant volume of air to be delivered to the space while the output +of the coil can be shifted towards more or less dehumidification. In other words, it decouples the total system airflow from the coil +airflow.</p> +<p>The bypassed air mixes with the supply air stream to act as a reheat source, however unlike a typical reheat source it does not add more +sensible load to the structure, instead it just brings the supply air temperature closer to the existing home’s temperature while still +covering the latent and sensible loads of the home. A warmer duct system reduces the losses of the duct to unconditioned spaces as well as +reduces the risk for duct condensation.</p> +<p>The coil bypass strategy, as far as I know, was pioneered by <a href="https://www.linkedin.com/in/harry-boody-9b8a4366/">Harry Boody</a> of Energy +Innovations and Scientific Environmental Design, Inc. However their websites are no longer active, so I’m not sure if they are still active +in the HVAC design space or not.</p> +<h2>The Problem</h2> +<table> +<thead> +<tr> +<th>Why</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Question</td> +<td>Why would we want to utilize a strategy such as the coil bypass?</td> +</tr> +<tr> +<td>Answer</td> +<td>Improved indoor air quality (IAQ)</td> +</tr> +</tbody> +</table> +<p>ASHRAE’s recommandation for the amount of air changes per hour (ACH) in a residential structure to be in the range of 3-5 ACH, and in +general the higher the better, along with a MERV 13+ filter. In some / most cases the system airflow does not meet that criteria, especially +low load homes or high volume homes.</p> +<p>For example, let’s imagine a single story ranch home that is 2,500 square feet with 9 foot ceilings. This home is relatively tight +construction and after doing the heating and cooling loads we’ve selected a 2.5 Ton system for this home. It is located in a green grass +climate that needs some priority on dehumidification and requires an airflow of 350 CFM/Ton (875 CFM).</p> +<p>We determine the volume of the conditioned space.</p> +<p>2,500 x 9 = 22,500 ft^3</p> +<p><img src="/articles/images/2023-08-10-volume-equation.png" alt="volume-equation" /></p> +<table> +<thead> +<tr> +<th><strong>Where:</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>V</strong></td> +<td><em>is the volume of the home</em></td> +</tr> +<tr> +<td><strong>ACH</strong></td> +<td><em>is the desired air changes per hour</em></td> +</tr> +<tr> +<td><strong>60</strong></td> +<td><em>conversion from hours to minutes</em></td> +</tr> +</tbody> +</table> +<p>Below is a table of the required CFM to meet the different air changes per hour.</p> +<table> +<thead> +<tr> +<th></th> +<th align="center">CFM</th> +</tr> +</thead> +<tbody> +<tr> +<td>(22,500 x 3)/60</td> +<td align="center"><strong><em>1,125 @ 3 ACH</em></strong></td> +</tr> +<tr> +<td>(22,500 x 4)/60</td> +<td align="center"><strong><em>1,500 @ 4 ACH</em></strong></td> +</tr> +<tr> +<td>(22,500 x 5)/60</td> +<td align="center"><strong><em>1,875 @ 5 ACH</em></strong></td> +</tr> +</tbody> +</table> +<p>As you can see we have a discrepency of meeting even the low end of 3 ACH. The high end of 5 ACH is over 2x the airflow for our 2.5 Ton +system. The coil bypass strategy is one viable way, by decoupling the total system airflow from the coil airflow without, which eliminates +the need of an auxilary fan / system that circulates air through some sort of filtration system.</p> +<h3>Multi-Stage Systems</h3> +<p>A challenge with multi-stage systems, even when sized properly, is that we often run at part-load conditions, and spend the majority of the +time in lower stages. The lower stages often do worse at dehumidification than when running at full load.</p> +<p>When the equipment runs in lower stages on a traditional system the total system airflow is reduced even further from the recommended air +changes per hour. This reduced airflow also causes the throw of the air from the registers to be reduced which can lead to increased odds of +stratification, poor air mixing, and increased potential for poor mean radiant temperatures (MRT) of the surfaces. The decreased airflow in +low stages, lowers the velocity in the duct system, while low velocity is not a concern, it does increase the duct gains and increase the +possibility of condensation on the ducts when they’re located outside of the thermal envelope of the building.</p> +<p>Let’s imagine we have a duct system that has high wall registers located in a soffit at the interior wall that moves 100 CFM and we are +trying to throw the air to the exterior wall which includes a window. The wall is @ 12 feet from the register. We’ve selected a register +that meets the criteria, at high stage airflow it has a throw of 11.5 feet (shown as the green rectangle). When the system runs in low +stage, the airflow is reduced to 70% of high stage (70 CFM), which would give us a throw from the register of @ 7 feet (shown as the red +rectangle).</p> +<p><img src="/articles/images/2023-08-10-register-throw.png" alt="register-throw" /></p> +<p>The reduced flow through the register causes the air to only make it about 60% across the room before reaching it’s terminal velocity, which +can cause the room to feel uncomfortable since the air never reaches the exterior wall and window.</p> +<p>By decoupling the fan from the coil airflow it is possible to run in low stages, still have adequate dehumidification performance out of the +system, and achieve the proper throw from the registers.</p> +<h2>Conclusion</h2> +<p>In this article we’ve begun to scratch the surface of what a coil bypass strategy is in an HVAC system, as well as some of the challenges +that it can help solve. We’ve learned about why we may desire to decouple the total system airflow from the coil airflow.</p> +<p>In future articles we will continue to explore some of the features, benefits, and challenges presented by such a strategy.</p> +<h2>Related Resources</h2> +<p><a href="https://hvacrschool.com/bypass-dehumidification-airflow-hvac-design/">HVAC School - Bypass Dehumidification / Airflow HVAC Design</a></p> + \ No newline at end of file diff --git a/deploy/articles/images/2023-08-10-coil-bypass-overview.png b/deploy/articles/images/2023-08-10-coil-bypass-overview.png new file mode 100644 index 0000000..bb00dba --- /dev/null +++ b/deploy/articles/images/2023-08-10-coil-bypass-overview.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:038b1f92b37682a80ae0c1421f3b6ee29d3fa8d9cb08b9dcdaa26a177d3fc9d9 +size 287883 diff --git a/deploy/articles/images/2023-08-10-register-throw.png b/deploy/articles/images/2023-08-10-register-throw.png new file mode 100644 index 0000000..c9755e0 --- /dev/null +++ b/deploy/articles/images/2023-08-10-register-throw.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62ec20b603b245e94176ac5ff188b7ce68cdfca00b95e8a4b164cc044ff3b6b3 +size 179990 diff --git a/deploy/articles/images/2023-08-10-rss-feed.gif b/deploy/articles/images/2023-08-10-rss-feed.gif new file mode 100644 index 0000000..a4c20b5 --- /dev/null +++ b/deploy/articles/images/2023-08-10-rss-feed.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e22b1ed1f73ab5e7611df80fd301f6d37c09f1adcdfed2b1b8044f1cd097a14 +size 231779 diff --git a/deploy/articles/images/2023-08-10-volume-equation.png b/deploy/articles/images/2023-08-10-volume-equation.png new file mode 100644 index 0000000..d256838 --- /dev/null +++ b/deploy/articles/images/2023-08-10-volume-equation.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd6e0d4ea2716d7a8dbf2e20341905e5e5fc8168b0f49613689991422077cf2e +size 12991 diff --git a/deploy/articles/images/2023-09-08-formula.png b/deploy/articles/images/2023-09-08-formula.png new file mode 100644 index 0000000..aa09523 --- /dev/null +++ b/deploy/articles/images/2023-09-08-formula.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3442db2c659f0ec11272fed67d50d5cf81751f1d01599a2e0b3b611392e9a775 +size 18654 diff --git a/deploy/articles/images/2023-09-08-pounds-of-water-removed.png b/deploy/articles/images/2023-09-08-pounds-of-water-removed.png new file mode 100644 index 0000000..e307d70 --- /dev/null +++ b/deploy/articles/images/2023-09-08-pounds-of-water-removed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ea0cba06d40e3e093ec37c47fa7806e1cfb316f7e7c3b344f195e3619484330 +size 402560 diff --git a/deploy/articles/images/2023-09-08-solution.png b/deploy/articles/images/2023-09-08-solution.png new file mode 100644 index 0000000..99864fb --- /dev/null +++ b/deploy/articles/images/2023-09-08-solution.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:728327574d6ea91ef6b186d5ec69942167e7b3d02a3fbba954964471bbe1c7a3 +size 18866 diff --git a/deploy/articles/images/2023-09-14-why-mini-splits-stink.png b/deploy/articles/images/2023-09-14-why-mini-splits-stink.png new file mode 100644 index 0000000..d8279e3 --- /dev/null +++ b/deploy/articles/images/2023-09-14-why-mini-splits-stink.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c0a6cfc2e44825d2f22576f48d93972f5d7a9c607448ab2d22c6dfd710b93e2 +size 1617575 diff --git a/deploy/articles/images/2023-09-15-pints-per-day-example.png b/deploy/articles/images/2023-09-15-pints-per-day-example.png new file mode 100644 index 0000000..0ac47a4 --- /dev/null +++ b/deploy/articles/images/2023-09-15-pints-per-day-example.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43fbfcad8eba8a9f3efa0870ef2ab91c4356800a3d65f67d133887915f714f7d +size 19380 diff --git a/deploy/articles/images/2023-09-15-pints-per-day-example2.png b/deploy/articles/images/2023-09-15-pints-per-day-example2.png new file mode 100644 index 0000000..c898b48 --- /dev/null +++ b/deploy/articles/images/2023-09-15-pints-per-day-example2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:439b67dbc151b4c5521aa26251b08df78503f6e612254be57c500477dcfbe14d +size 22582 diff --git a/deploy/articles/images/2023-09-15-pints-per-day.png b/deploy/articles/images/2023-09-15-pints-per-day.png new file mode 100644 index 0000000..611c0c7 --- /dev/null +++ b/deploy/articles/images/2023-09-15-pints-per-day.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a447c0fa57576efd4a8c21f84b1fca9a796b8a33cbbf1160a4bbb2551af665e1 +size 14885 diff --git a/deploy/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png b/deploy/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png new file mode 100644 index 0000000..329ff1c --- /dev/null +++ b/deploy/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93f8717fca8099065e891999cf60b068b745246a01e874db32047f15a4b3f169 +size 11152 diff --git a/deploy/articles/images/2023-09-18-dh-size.png b/deploy/articles/images/2023-09-18-dh-size.png new file mode 100644 index 0000000..37e78dc --- /dev/null +++ b/deploy/articles/images/2023-09-18-dh-size.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ce050c04f54ff1975b3c629249bbfdad4c237c643d2a8eb78b75fc2cb7f0e35 +size 41647 diff --git a/deploy/articles/images/2023-09-18-help.png b/deploy/articles/images/2023-09-18-help.png new file mode 100644 index 0000000..059c9b6 --- /dev/null +++ b/deploy/articles/images/2023-09-18-help.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:152eba1c70df403333ebbee326b7f014bdf8463bdd4f3169c88b918b6047a4c8 +size 71404 diff --git a/deploy/articles/images/2023-09-18-introducing-psychrometrics-cli.png b/deploy/articles/images/2023-09-18-introducing-psychrometrics-cli.png new file mode 100644 index 0000000..2ceed79 --- /dev/null +++ b/deploy/articles/images/2023-09-18-introducing-psychrometrics-cli.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:faf7fad8f4f6bdbdff8ffe2a91dc6ee0316ecd5d02a4553d8bcf1da45cafb35f +size 247475 diff --git a/deploy/articles/images/2023-09-18-pounds-removed.png b/deploy/articles/images/2023-09-18-pounds-removed.png new file mode 100644 index 0000000..91f7b05 --- /dev/null +++ b/deploy/articles/images/2023-09-18-pounds-removed.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86b45e7224e8b0524dd9c15578d171e6ed57a0235f03a4798ff2ceacef9106ef +size 17672 diff --git a/deploy/articles/images/2023-09-18-properties.png b/deploy/articles/images/2023-09-18-properties.png new file mode 100644 index 0000000..2c56973 --- /dev/null +++ b/deploy/articles/images/2023-09-18-properties.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8a2e9e35ed33c887fb4fe8df49961866bc887b5ad97d089042b6f1c9c5f083c +size 58422 diff --git a/deploy/articles/images/2023-09-19-calculate-seer-degradation-by-age.png b/deploy/articles/images/2023-09-19-calculate-seer-degradation-by-age.png index dccc6d7..ff0f04b 100644 --- a/deploy/articles/images/2023-09-19-calculate-seer-degradation-by-age.png +++ b/deploy/articles/images/2023-09-19-calculate-seer-degradation-by-age.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b393c2b70f014f2ed1f1ff8b812b9eab47a1889cf94d43d3372795fc770a8737 -size 439608 +oid sha256:4ff2dc6ccba5407fe9dd0fa0821bd9679cea666217a94563d7c8b6196ee47562 +size 438218 diff --git a/deploy/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png b/deploy/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png new file mode 100644 index 0000000..af5ebcf --- /dev/null +++ b/deploy/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75643941f95b1b4736b64023c767fc593ebdf975b529c15f72062698fb6365cf +size 200902 diff --git a/deploy/articles/images/2023-09-21-spotlight.png b/deploy/articles/images/2023-09-21-spotlight.png new file mode 100644 index 0000000..5215990 --- /dev/null +++ b/deploy/articles/images/2023-09-21-spotlight.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2307fceb57cd3b43df2dd728de8e7a450aecea7934ea25b9e61028493f978ce9 +size 1013259 diff --git a/deploy/articles/images/2023-09-21-terminal-line.png b/deploy/articles/images/2023-09-21-terminal-line.png new file mode 100644 index 0000000..006c4a1 --- /dev/null +++ b/deploy/articles/images/2023-09-21-terminal-line.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82740485eb5042adda77cc42aab7d90b009f6c4c6cc92bdb57b822e34aeb1818 +size 75524 diff --git a/deploy/articles/images/2023-09-21-terminal.png b/deploy/articles/images/2023-09-21-terminal.png new file mode 100644 index 0000000..6b25449 --- /dev/null +++ b/deploy/articles/images/2023-09-21-terminal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e4b5c8a77067daee92a180f226e7169ee9c41337d534b7b0aa0ac053a6ed9f5 +size 52480 diff --git a/deploy/articles/images/2023-09-22-brew-output.png b/deploy/articles/images/2023-09-22-brew-output.png new file mode 100644 index 0000000..f897eed --- /dev/null +++ b/deploy/articles/images/2023-09-22-brew-output.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:436ad3d47cd18ab4e7bef25241807e420ad149ac55325c4758be3c8cfdbde081 +size 279599 diff --git a/deploy/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png b/deploy/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png new file mode 100644 index 0000000..daee5c5 --- /dev/null +++ b/deploy/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:678e74331b50b17d5de4f8c65ed56d504b137147a26e23401614ae718a3f1b0b +size 598180 diff --git a/deploy/articles/images/2023-09-24-hello-output.png b/deploy/articles/images/2023-09-24-hello-output.png new file mode 100644 index 0000000..3c3d574 --- /dev/null +++ b/deploy/articles/images/2023-09-24-hello-output.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a2a040d510580e8211b5ad249a8e75fd3e72d258f2478c7013b47da2e9d8f3e +size 85799 diff --git a/deploy/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png b/deploy/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png new file mode 100644 index 0000000..df465c5 --- /dev/null +++ b/deploy/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74cb23ca5888002ab4c304edbf2f6c2bae50fce92453dcd34a15645ab5a81995 +size 275859 diff --git a/deploy/articles/images/2023-09-24-text-settings.png b/deploy/articles/images/2023-09-24-text-settings.png new file mode 100644 index 0000000..64f69b5 --- /dev/null +++ b/deploy/articles/images/2023-09-24-text-settings.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9193b42d7a9218c5e96f5ce38bbeae28d53dab596da8559f75df022956b671dc +size 113712 diff --git a/deploy/articles/images/2023-09-26-greet-output.png b/deploy/articles/images/2023-09-26-greet-output.png new file mode 100644 index 0000000..357d838 --- /dev/null +++ b/deploy/articles/images/2023-09-26-greet-output.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f514339163c2e852e075883856dcb0736ea2e650db22de84e1e617925e45c2a3 +size 56979 diff --git a/deploy/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png b/deploy/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png new file mode 100644 index 0000000..d760473 --- /dev/null +++ b/deploy/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:599f2391a6a1d3aecf7a28b57192a142cc88b1ac21fae9f7b5495e0e04056467 +size 954076 diff --git a/deploy/articles/images/2023-09-26-part4-banner-transparent.png b/deploy/articles/images/2023-09-26-part4-banner-transparent.png new file mode 100644 index 0000000..8b4c084 --- /dev/null +++ b/deploy/articles/images/2023-09-26-part4-banner-transparent.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2665063040c09a5040929fb2d8140f3f876833eb8398564e1a87ba06678be03d +size 975001 diff --git a/deploy/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png b/deploy/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png new file mode 100644 index 0000000..ac2bd3a --- /dev/null +++ b/deploy/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0890f8b803d2779729d7ad1e435dfd0965a162f92d6d59d92869f44fd08b3ecd +size 539103 diff --git a/deploy/articles/images/2023-10-04-sinking-boat.png b/deploy/articles/images/2023-10-04-sinking-boat.png new file mode 100644 index 0000000..2fe8695 --- /dev/null +++ b/deploy/articles/images/2023-10-04-sinking-boat.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4935a15c5fdef4bc9be30ee7524004ef35ed339552c6eb45d6b061c95d47aea1 +size 1939707 diff --git a/deploy/articles/index.html b/deploy/articles/index.html index 97c28df..edd00f2 100644 --- a/deploy/articles/index.html +++ b/deploy/articles/index.html @@ -52,7 +52,6 @@

        @@ -73,7 +72,6 @@

        @@ -87,7 +85,6 @@

        +
        +

        + Free quotes != good +

        + +

        +

        +

        +
        +
        +

        + Introduction to Programming for HVAC Part-4 +

        + +

        +

        +

        +
        +
        +

        + Introduction to Programming for HVAC Part-3 +

        + +

        +

        +

        +
        +
        +

        + Introduction to Programming for HVAC Part-2 +

        + +

        +

        +

        +
        +
        +

        + Introduction to Programming for HVAC Part-1 +

        + +

        +

        +

        +

        Calculate SEER Degradation by Age @@ -248,7 +318,6 @@ It has been one of those “when it rains, it pours” type of weeks. As...

        +
        +

        + Introducing Psychrometrics CLI +

        + +

        +

        +

        +
        +
        +

        + Dehumidifier Sizing by Latent Load +

        + +

        +

        +

        +
        +
        +

        + Why Mini Splits Stink +

        + +

        +

        +

        +
        +
        +

        + Pounds of Water Removed +

        + +

        +

        +

        +
        +
        +

        + Rss Feed +

        + +

        +

        +

        +
        +
        +

        + Coil Bypass Overview +

        + +

        +

        +

        +
        @@ -279,6 +440,12 @@ refrigerant charge losses. It should be noted that this is not true for... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/article/feed.xml b/deploy/articles/tag/article/feed.xml index 6c4d9bf..03c7f67 100644 --- a/deploy/articles/tag/article/feed.xml +++ b/deploy/articles/tag/article/feed.xml @@ -6,76 +6,76 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2023/the-struggle/ The Struggle 2025-02-19T20:53:34Z - <p>This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If<br /> + <p>This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If that is not your cup of tea then feel free to skip this article.</p> <h2>The struggle</h2> -<p>It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby<br /> +<p>It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby / complainer, which is not my intention, but here it goes.</p> -<p>My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived<br /> -in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9<br /> -years apart), so she helped raise my mother growing up. They’ve always had a close relationship and<br /> -are like two peas in a pod. They would always visit us, especially while my grand-parents were still<br /> -alive. She is currently not really awake or expected to make it. She does not eat / drink and<br /> +<p>My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived +in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9 +years apart), so she helped raise my mother growing up. They’ve always had a close relationship and +are like two peas in a pod. They would always visit us, especially while my grand-parents were still +alive. She is currently not really awake or expected to make it. She does not eat / drink and they’ve basically just been making her comfortable.</p> -<p>One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject,<br /> -but he had surgery to fuse some discs back together and should eventually be ok, however it will be<br /> +<p>One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject, +but he had surgery to fuse some discs back together and should eventually be ok, however it will be a long recovery time.</p> -<p>A few weeks ago, I commited one of the deadly sins of running a blower door test without checking /<br /> -asking about the fireplaces, which caused lord knows how much damage from the soot that was spread<br /> +<p>A few weeks ago, I commited one of the deadly sins of running a blower door test without checking / +asking about the fireplaces, which caused lord knows how much damage from the soot that was spread throughout the living room(s).</p> <p>An online friend lost her mother.</p> <p>All of these things have just got me emotional.</p> <h2>My secrets</h2> -<p>I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I<br /> -spent many years masking things through alcohol abuse and many other idiotic tendencies. I still<br /> +<p>I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I +spent many years masking things through alcohol abuse and many other idiotic tendencies. I still drink on occasion, but not as I once did.</p> -<p>I often put my faith in folks, even if I haven’t met them in person, this can often lead to being<br /> -let down. I guess I struggle sometimes with the reality of online relationships. I think that people<br /> -are genuine, because I’m that way (how I act online is the same as I act in person for the most<br /> -part). I will happily show / share the good and the bad, in hopes that someone may learn. This is<br /> -not at all something to be ashamed of, or anything that I’d like to change, however it does on<br /> +<p>I often put my faith in folks, even if I haven’t met them in person, this can often lead to being +let down. I guess I struggle sometimes with the reality of online relationships. I think that people +are genuine, because I’m that way (how I act online is the same as I act in person for the most +part). I will happily show / share the good and the bad, in hopes that someone may learn. This is +not at all something to be ashamed of, or anything that I’d like to change, however it does on occasion lead me into turmoil when I find out some true identity / personality of someone.</p> -<p>I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want<br /> -to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to<br /> -forgive people, but it is just not the way it works for me often times. It takes a lot to get me<br /> -beyond my breaking point, but once someone has gotten me there, there is likely no turning back for<br /> -that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my<br /> -life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but<br /> +<p>I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want +to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to +forgive people, but it is just not the way it works for me often times. It takes a lot to get me +beyond my breaking point, but once someone has gotten me there, there is likely no turning back for +that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my +life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but truthfully I do not.</p> -<p>My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot<br /> -of regret around these things, because I generally mean what I say, and also feel we are entitled to<br /> -opinions as well as entitled to change those opinions as often as we see fit. Although I don’t<br /> -regret them per-se, it does make me wonder what type of impression it leaves (something for future<br /> +<p>My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot +of regret around these things, because I generally mean what I say, and also feel we are entitled to +opinions as well as entitled to change those opinions as often as we see fit. Although I don’t +regret them per-se, it does make me wonder what type of impression it leaves (something for future pondering, perhaps).</p> -<p>I’m one of those that says “I don’t care what they think about me”, when I really do care what<br /> -people think about me. This often leads to fear and anxiety, especially in social settings. I’m not<br /> -the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time<br /> -to think before responding. Therefore, I’m quick to make a joke or something rather than having<br /> +<p>I’m one of those that says “I don’t care what they think about me”, when I really do care what +people think about me. This often leads to fear and anxiety, especially in social settings. I’m not +the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time +to think before responding. Therefore, I’m quick to make a joke or something rather than having thoughtful / genuine responses.</p> <h2>Community</h2> -<p>All of these things have just got me thinking about community. Community is an aspect that seems<br /> -distant nowadays, even though we have more opportunity than ever. We call ourselves part of<br /> -communities, especially online, but I’m not convinced that it is really community (or at least not<br /> +<p>All of these things have just got me thinking about community. Community is an aspect that seems +distant nowadays, even though we have more opportunity than ever. We call ourselves part of +communities, especially online, but I’m not convinced that it is really community (or at least not most of the time, not saying it can’t be / in absolute terms).</p> -<p>I have met a lot of folks online that I consider true friends. Friends that I would do anything for<br /> -and feel they would do anything for me, just like my real life friends who have stuck with me for<br /> -many years. These are people that challenge me and how I think on a regular basis. They do their<br /> +<p>I have met a lot of folks online that I consider true friends. Friends that I would do anything for +and feel they would do anything for me, just like my real life friends who have stuck with me for +many years. These are people that challenge me and how I think on a regular basis. They do their best to lift me up when I’m down.</p> -<p>It’s easy to hide when so much of our interactions are not really in person, to feel like the<br /> -relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the<br /> -benefit / trust they deserve until, at least until they don’t then see my part about holding grudges<br /> +<p>It’s easy to hide when so much of our interactions are not really in person, to feel like the +relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the +benefit / trust they deserve until, at least until they don’t then see my part about holding grudges ;)</p> -<p>Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m<br /> -trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks<br /> -Jennifer in real life, I read today about her mom and decided to take an hour or so to put together<br /> -a website for the <a href="https://hvachicks.com">HVAChicks Community</a>, hoping it would bring a moment of<br /> -happiness to her day. While I’ve deployed several websites in the past, this one for some reason was<br /> -a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and<br /> +<p>Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m +trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks +Jennifer in real life, I read today about her mom and decided to take an hour or so to put together +a website for the <a href="https://hvachicks.com">HVAChicks Community</a>, hoping it would bring a moment of +happiness to her day. While I’ve deployed several websites in the past, this one for some reason was +a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and it’s basic AF), but that truly made me feel useful / great after being down in the dumps for a bit.</p> <h2>Conclusion</h2> <p>I’ve probably rambled enough and am losing direction here, so I will end with a few things.</p> @@ -85,43 +85,43 @@ it’s basic AF), but that truly made me feel useful / great after being down in <li>Spend time with your loved ones, while you can.</li> <li>Tell someone you love them.</li> </ol> -<p>Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I<br /> +<p>Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I left you off, I’m sorry and please do not take it personally.</p> <ol> <li>Bryan Orr <ul> -<li>Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and<br /> -commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan,<br /> +<li>Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and +commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan, mostly all the following names would not even be in my vocabulary.</li> </ul> </li> <li>Ty Branaman (forget exactly how to spell his last name). <ul> -<li>Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be<br /> +<li>Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be positive all the time, however it brings me hope and joy everytime!</li> </ul> </li> <li>Dustin (mother f’n) Cole <ul> -<li>Dustin is like a brother that I never had, he’s a true master of his craft and I know that I<br /> +<li>Dustin is like a brother that I never had, he’s a true master of his craft and I know that I can rely on him anytime I need it!</li> </ul> </li> <li>Genry Garcia <ul> -<li>The cuban crusader who has taught me so much about home performance, and especially ZPD (baby,<br /> +<li>The cuban crusader who has taught me so much about home performance, and especially ZPD (baby, baby)!</li> </ul> </li> <li>Chris Hughes <ul> -<li>It’s hard to put into words here, but I know that Chris is there to talk when I need it and<br /> +<li>It’s hard to put into words here, but I know that Chris is there to talk when I need it and he’s a great motivator because of his action items :)</li> </ul> </li> <li>Eric Kaiser <ul> -<li>I think genuine when I think of Eric, I hear his voice in my head when I write reports because<br /> +<li>I think genuine when I think of Eric, I hear his voice in my head when I write reports because of guidance he has given in the past. He truly wants to help teach people.</li> </ul> </li> @@ -132,26 +132,26 @@ of guidance he has given in the past. He truly wants to help teach people.</l </li> <li>HVAChicks Jennifer (I’ll butcher her last name from memory) <ul> -<li>Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I<br /> +<li>Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I can’t wait to meet her in person one day soon!</li> </ul> </li> <li>HVAC Overtime Crew <ul> -<li>I’m lumping these guys together because I truly enjoy when I’m able to make their live stream<br /> +<li>I’m lumping these guys together because I truly enjoy when I’m able to make their live stream on Friday’s. And I interact with A-Team a lot and really appreciate him / them!</li> </ul> </li> <li>Alicia Hollon <ul> -<li>Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner,<br /> +<li>Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner, love you babe!</li> </ul> </li> </ol> -<p>Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt<br /> +<p>Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt currently. My mother is the kindest gentlest soul that I’ve ever met. I look up to all 5’ of her!</p> -<p>At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today<br /> +<p>At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today and tomorrow!</p> \ No newline at end of file diff --git a/deploy/articles/tag/article/index.html b/deploy/articles/tag/article/index.html index 2b852d7..4bb6ada 100644 --- a/deploy/articles/tag/article/index.html +++ b/deploy/articles/tag/article/index.html @@ -73,6 +73,12 @@ It has been one of those “when it rains, it pours” type of weeks. As... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/chiller/feed.xml b/deploy/articles/tag/chiller/feed.xml index 398ee60..bba4d35 100644 --- a/deploy/articles/tag/chiller/feed.xml +++ b/deploy/articles/tag/chiller/feed.xml @@ -6,53 +6,53 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2023/heat-recovery-chiller/ Heat Recovery Chiller 2025-02-19T21:08:37Z - <p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so<br /> -I’m doing it now. I did discuss this on<br /> + <p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so +I’m doing it now. I did discuss this on <a href="https://hvacrschool.com/podcasts/is-the-future-of-air-conditioning-self-contained-propane-chillers/">this episode of the HVAC School Podcast.</a></p> <h2>Heat Recovery Chillers</h2> -<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that<br /> -common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most<br /> -equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds<br /> +<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that +common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most +equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds in this article, but offer an overview of what I feel would be my dream system.</p> <h2>The Source</h2> -<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional<br /> -heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would<br /> -have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to<br /> -bank / store heat, or are running in heat only mode. There are several benefits to this style<br /> -system, the main being that while operating simultaneous heating / cooling mode the COP of the<br /> -system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of<br /> -about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level<br /> +<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional +heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would +have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to +bank / store heat, or are running in heat only mode. There are several benefits to this style +system, the main being that while operating simultaneous heating / cooling mode the COP of the +system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of +about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level performance without the need of a field.</p> <h2>Indoor Portion</h2> -<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller.<br /> -The buffer tanks give us several benefits, including longer run times for the chiller, load<br /> -matching, and the ability to size for larger load (heating or cooling) without some of the problems<br /> -that occur when over-sizing a traditional system. The buffer tanks also allow sizing more<br /> +<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller. +The buffer tanks give us several benefits, including longer run times for the chiller, load +matching, and the ability to size for larger load (heating or cooling) without some of the problems +that occur when over-sizing a traditional system. The buffer tanks also allow sizing more aggressively by having storage during peak load conditions.</p> <p><img src="/articles/images/2023-10-27-buffers2.png" alt="buffer" /></p> -<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what<br /> -circulate water through the chiller, while the vertical pumps are what distribute the water to the<br /> -load / emitters. This configuration allows for water to be used for the loads first and extra<br /> -capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps<br /> -(meaning that they won’t interfere with each other if / when there are different flow rates).<br /> -Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in<br /> -parallel to the system. This is shown by the extra tees in the hot buffer tank where we could<br /> -connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler.<br /> -You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat<br /> +<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what +circulate water through the chiller, while the vertical pumps are what distribute the water to the +load / emitters. This configuration allows for water to be used for the loads first and extra +capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps +(meaning that they won’t interfere with each other if / when there are different flow rates). +Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in +parallel to the system. This is shown by the extra tees in the hot buffer tank where we could +connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler. +You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat exchanger that would be used to supply domestic hot water.</p> <h2>Distribution System</h2> -<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators,<br /> +<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators, however I’m going to model it as a 4-pipe hydronic air handler.</p> <p><img src="/articles/images/2023-10-27-ah.png" alt="ah" /></p> -<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in<br /> -one package. With a hydronic system, it would be very easy to load match by controlling the fan<br /> -speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from<br /> -several manufacturers and come in different styles from traditional (as shown), small duct high<br /> +<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in +one package. With a hydronic system, it would be very easy to load match by controlling the fan +speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from +several manufacturers and come in different styles from traditional (as shown), small duct high velocity systems, and even ductless styles.</p> <h2>Disadvantages</h2> <ol> @@ -61,7 +61,7 @@ velocity systems, and even ductless styles.</p> <li>Lack of understanding / technicians afraid to work on this style system.</li> <li>Potentially higher upfront costs.</li> <li>Lack of design or planning could cause unhappy clients (same with traditional)</li> -<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement<br /> +<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement for traditional boiler systems)</li> </ol> <h2>Advantages</h2> @@ -75,11 +75,11 @@ for traditional boiler systems)</li> <li>Easier transition to natural / flammable refrigerants</li> </ol> <h2>Conclusion</h2> -<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the<br /> -main points is to think of the system in 3 distinct components, the source(s), thermal storage, and<br /> -distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish<br /> -this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to<br /> -dump excess heat into a pool, create ice storage during off peak hours, cascade into another water<br /> +<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the +main points is to think of the system in 3 distinct components, the source(s), thermal storage, and +distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish +this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to +dump excess heat into a pool, create ice storage during off peak hours, cascade into another water -&gt; water heat pump for higher temperature distribution, incorporate solar collectors, and so on.</p> <p>Thank you for reading all the way to the end!</p> diff --git a/deploy/articles/tag/chiller/index.html b/deploy/articles/tag/chiller/index.html index fd4278f..8754fd9 100644 --- a/deploy/articles/tag/chiller/index.html +++ b/deploy/articles/tag/chiller/index.html @@ -74,6 +74,12 @@ I have always had a love and passion for... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/design/feed.xml b/deploy/articles/tag/design/feed.xml new file mode 100644 index 0000000..fd0cb50 --- /dev/null +++ b/deploy/articles/tag/design/feed.xml @@ -0,0 +1,191 @@ + + + http://localhost:3000/articles/tag/design/feed.xml + mhoush + + Michael Housh + + + 2025-02-20T17:12:57Z + + http://localhost:3000/articles/2023/sizing-dehumidifier-by-latent-load/ + Dehumidifier Sizing by Latent Load + 2025-02-20T17:04:37Z + <p>This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure.</p> +<h2>Formulas</h2> +<p>The formula above is used to solve for the pints per hour required to size a dehumidifier.</p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Ph</td> +<td>Pints / hour</td> +</tr> +</tbody> +</table> +<p>We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day.png" alt="pints-per-day-formula" /></p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Pd</td> +<td>Pints / day</td> +</tr> +</tbody> +</table> +<p>In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized +properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during +peak cooling demand.</p> +<h2>Example</h2> +<p>Let’s imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example.png" alt="pints-per-day-formula-example" /></p> +<p>Or if we just want to cover the latent capacity at 85% of the full latent load.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example2.png" alt="pints-per-day-formula-example" /></p> +<p>This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition +we wanted to use.</p> +<p>I don’t feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an +oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application.</p> +<p>Thanks for reading!</p> + + + http://localhost:3000/articles/2023/coil-bypass-overview/ + Coil Bypass Overview + 2025-02-20T15:14:48Z + <p>This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a +coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the challenges of this style of +system.</p> +<h2>What is a Coil Bypass</h2> +<p>A coil bypass is not to be mistaken for a zoning system bypass, where airflow is “relieved” from the supply side of the system back into the +return. Instead, a coil bypass diverts a portion of the airflow around the coil using a bypass damper(s). The bypass can serve several +functions depending on the application, but in general it allows for a constant volume of air to be delivered to the space while the output +of the coil can be shifted towards more or less dehumidification. In other words, it decouples the total system airflow from the coil +airflow.</p> +<p>The bypassed air mixes with the supply air stream to act as a reheat source, however unlike a typical reheat source it does not add more +sensible load to the structure, instead it just brings the supply air temperature closer to the existing home’s temperature while still +covering the latent and sensible loads of the home. A warmer duct system reduces the losses of the duct to unconditioned spaces as well as +reduces the risk for duct condensation.</p> +<p>The coil bypass strategy, as far as I know, was pioneered by <a href="https://www.linkedin.com/in/harry-boody-9b8a4366/">Harry Boody</a> of Energy +Innovations and Scientific Environmental Design, Inc. However their websites are no longer active, so I’m not sure if they are still active +in the HVAC design space or not.</p> +<h2>The Problem</h2> +<table> +<thead> +<tr> +<th>Why</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Question</td> +<td>Why would we want to utilize a strategy such as the coil bypass?</td> +</tr> +<tr> +<td>Answer</td> +<td>Improved indoor air quality (IAQ)</td> +</tr> +</tbody> +</table> +<p>ASHRAE’s recommandation for the amount of air changes per hour (ACH) in a residential structure to be in the range of 3-5 ACH, and in +general the higher the better, along with a MERV 13+ filter. In some / most cases the system airflow does not meet that criteria, especially +low load homes or high volume homes.</p> +<p>For example, let’s imagine a single story ranch home that is 2,500 square feet with 9 foot ceilings. This home is relatively tight +construction and after doing the heating and cooling loads we’ve selected a 2.5 Ton system for this home. It is located in a green grass +climate that needs some priority on dehumidification and requires an airflow of 350 CFM/Ton (875 CFM).</p> +<p>We determine the volume of the conditioned space.</p> +<p>2,500 x 9 = 22,500 ft^3</p> +<p><img src="/articles/images/2023-08-10-volume-equation.png" alt="volume-equation" /></p> +<table> +<thead> +<tr> +<th><strong>Where:</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>V</strong></td> +<td><em>is the volume of the home</em></td> +</tr> +<tr> +<td><strong>ACH</strong></td> +<td><em>is the desired air changes per hour</em></td> +</tr> +<tr> +<td><strong>60</strong></td> +<td><em>conversion from hours to minutes</em></td> +</tr> +</tbody> +</table> +<p>Below is a table of the required CFM to meet the different air changes per hour.</p> +<table> +<thead> +<tr> +<th></th> +<th align="center">CFM</th> +</tr> +</thead> +<tbody> +<tr> +<td>(22,500 x 3)/60</td> +<td align="center"><strong><em>1,125 @ 3 ACH</em></strong></td> +</tr> +<tr> +<td>(22,500 x 4)/60</td> +<td align="center"><strong><em>1,500 @ 4 ACH</em></strong></td> +</tr> +<tr> +<td>(22,500 x 5)/60</td> +<td align="center"><strong><em>1,875 @ 5 ACH</em></strong></td> +</tr> +</tbody> +</table> +<p>As you can see we have a discrepency of meeting even the low end of 3 ACH. The high end of 5 ACH is over 2x the airflow for our 2.5 Ton +system. The coil bypass strategy is one viable way, by decoupling the total system airflow from the coil airflow without, which eliminates +the need of an auxilary fan / system that circulates air through some sort of filtration system.</p> +<h3>Multi-Stage Systems</h3> +<p>A challenge with multi-stage systems, even when sized properly, is that we often run at part-load conditions, and spend the majority of the +time in lower stages. The lower stages often do worse at dehumidification than when running at full load.</p> +<p>When the equipment runs in lower stages on a traditional system the total system airflow is reduced even further from the recommended air +changes per hour. This reduced airflow also causes the throw of the air from the registers to be reduced which can lead to increased odds of +stratification, poor air mixing, and increased potential for poor mean radiant temperatures (MRT) of the surfaces. The decreased airflow in +low stages, lowers the velocity in the duct system, while low velocity is not a concern, it does increase the duct gains and increase the +possibility of condensation on the ducts when they’re located outside of the thermal envelope of the building.</p> +<p>Let’s imagine we have a duct system that has high wall registers located in a soffit at the interior wall that moves 100 CFM and we are +trying to throw the air to the exterior wall which includes a window. The wall is @ 12 feet from the register. We’ve selected a register +that meets the criteria, at high stage airflow it has a throw of 11.5 feet (shown as the green rectangle). When the system runs in low +stage, the airflow is reduced to 70% of high stage (70 CFM), which would give us a throw from the register of @ 7 feet (shown as the red +rectangle).</p> +<p><img src="/articles/images/2023-08-10-register-throw.png" alt="register-throw" /></p> +<p>The reduced flow through the register causes the air to only make it about 60% across the room before reaching it’s terminal velocity, which +can cause the room to feel uncomfortable since the air never reaches the exterior wall and window.</p> +<p>By decoupling the fan from the coil airflow it is possible to run in low stages, still have adequate dehumidification performance out of the +system, and achieve the proper throw from the registers.</p> +<h2>Conclusion</h2> +<p>In this article we’ve begun to scratch the surface of what a coil bypass strategy is in an HVAC system, as well as some of the challenges +that it can help solve. We’ve learned about why we may desire to decouple the total system airflow from the coil airflow.</p> +<p>In future articles we will continue to explore some of the features, benefits, and challenges presented by such a strategy.</p> +<h2>Related Resources</h2> +<p><a href="https://hvacrschool.com/bypass-dehumidification-airflow-hvac-design/">HVAC School - Bypass Dehumidification / Airflow HVAC Design</a></p> + + \ No newline at end of file diff --git a/deploy/articles/tag/design/index.html b/deploy/articles/tag/design/index.html new file mode 100644 index 0000000..6848937 --- /dev/null +++ b/deploy/articles/tag/design/index.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + mhoush: Articles in design + + + + + + + + +
        + +
        + + + + \ No newline at end of file diff --git a/deploy/articles/tag/formulas/feed.xml b/deploy/articles/tag/formulas/feed.xml index 8dff54e..366823d 100644 --- a/deploy/articles/tag/formulas/feed.xml +++ b/deploy/articles/tag/formulas/feed.xml @@ -6,41 +6,41 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2023/calculate-seer-degradation-by-age/ Calculate SEER Degradation by Age 2025-02-19T21:55:30Z - <p>This is a quick tech-tip to learn how to calculate the degradation of SEER based<br /> + <p>This is a quick tech-tip to learn how to calculate the degradation of SEER based on age.</p> -<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and<br /> -refrigerant charge losses. It should be noted that this is not true for all<br /> -applications, but is used as an estimation based on research done by the <code>DOE</code><br /> +<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and +refrigerant charge losses. It should be noted that this is not true for all +applications, but is used as an estimation based on research done by the <code>DOE</code> of the average degradation based on systems tested.</p> <h2>Formula</h2> -<p>This is the formula used to calculate the SEER based on age of the evaporator<br /> +<p>This is the formula used to calculate the SEER based on age of the evaporator coil / air handler.</p> <p>$$ SEER_d = SEER_n \times (1 - M)^{age} $$</p> -<p>| Where | |<br /> -| –––– | —————————————— | — |<br /> -| $SEER_d$ | Degradated SEER rating |<br /> -| $SEER_n$ | Nominal SEER rating when equipment was new |  |<br /> -| M | Maintenance factor, 0.01-0.03 |<br /> +<p>| Where | | +| –––– | —————————————— | — | +| $SEER_d$ | Degradated SEER rating | +| $SEER_n$ | Nominal SEER rating when equipment was new |  | +| M | Maintenance factor, 0.01-0.03 | | age | The age of the equipment, in years |</p> -<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is<br /> -for unmaintained. The maintenance factor in essence is based on 1%-3%<br /> -degradation per year, however there are some<br /> -<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a><br /> -that show that this can actually be as high as 5% or above depending on climate.<br /> -We could use up to 0.05 as the maintenance factor, just to see what the “range”<br /> +<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is +for unmaintained. The maintenance factor in essence is based on 1%-3% +degradation per year, however there are some +<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a> +that show that this can actually be as high as 5% or above depending on climate. +We could use up to 0.05 as the maintenance factor, just to see what the “range” of degradation would be.</p> -<p>Interestingly, the study linked also shows that the degradation is higher the<br /> -higher the tonnage of the equipment. It also shows that the degradation is lower<br /> -per year the higher the nominal SEER rating of the system (which is corelated to<br /> -using TXV’s and lower airflow rates because of the equipment having multiple<br /> +<p>Interestingly, the study linked also shows that the degradation is higher the +higher the tonnage of the equipment. It also shows that the degradation is lower +per year the higher the nominal SEER rating of the system (which is corelated to +using TXV’s and lower airflow rates because of the equipment having multiple stages).</p> <h2>Example</h2> -<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when<br /> +<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when installed and the system is 15 years old.</p> <p>Plugging those numbers into our formula.</p> <hr /> @@ -50,9 +50,143 @@ installed and the system is 15 years old.</p> <h4>Highest Rage (5% degradation / year)</h4> <p>$$ SEER_d = 13 \times (1 - 0.05)^{15} = 6 $$</p> <hr /> -<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER<br /> -vs. a poorly maintained / dirty system that also suffers from refrigerant charge<br /> +<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER +vs. a poorly maintained / dirty system that also suffers from refrigerant charge losses can be as low as 6 SEER.</p> <p>Thanks for learning how to estimate SEER degradation based on equipment age!</p> + + http://localhost:3000/articles/2023/sizing-dehumidifier-by-latent-load/ + Dehumidifier Sizing by Latent Load + 2025-02-20T17:04:37Z + <p>This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure.</p> +<h2>Formulas</h2> +<p>The formula above is used to solve for the pints per hour required to size a dehumidifier.</p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Ph</td> +<td>Pints / hour</td> +</tr> +</tbody> +</table> +<p>We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day.png" alt="pints-per-day-formula" /></p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Pd</td> +<td>Pints / day</td> +</tr> +</tbody> +</table> +<p>In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized +properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during +peak cooling demand.</p> +<h2>Example</h2> +<p>Let’s imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example.png" alt="pints-per-day-formula-example" /></p> +<p>Or if we just want to cover the latent capacity at 85% of the full latent load.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example2.png" alt="pints-per-day-formula-example" /></p> +<p>This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition +we wanted to use.</p> +<p>I don’t feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an +oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application.</p> +<p>Thanks for reading!</p> + + + http://localhost:3000/articles/2023/pounds-of-water-removed/ + Pounds of Water Removed + 2025-02-20T16:43:21Z + <p>This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream).</p> +<p>This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This +article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here +are a couple articles to familiarize yourself.</p> +<h2>Articles</h2> +<ul> +<li><a href="https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/">Understand Dew-Point</a></li> +<li><a href="https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/">Impact of Adding or Removing Water from Air</a></li> +</ul> +<h2>Scenario</h2> +<p>Let’s imagine that we have an air-conditioner that has the following measurements taken:</p> +<ul> +<li>Return Air: 75° / 50% RH</li> +<li>Supply Air: 55° / 81% RH</li> +</ul> +<p>We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air +conditions).</p> +<p><img src="/articles/images/2023-09-08-pounds-of-water-removed.png" alt="chart" /></p> +<p>We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the +relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per +pound of air.</p> +<p>This gives us the following values:</p> +<ul> +<li>Return Air: 66 gr/lb</li> +<li>Supply Air: 52 gr/lb</li> +</ul> +<p>We can then use the following formula to calculate the pounds of water removed.</p> +<p><img src="/articles/images/2023-09-08-formula.png" alt="formula" /></p> +<table> +<thead> +<tr> +<th><strong>Where</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>W</strong></td> +<td><em>Weight of water in pounds per hour</em></td> +</tr> +<tr> +<td><strong>4.5</strong></td> +<td><em>Constant based on density / specific heat of moist air</em></td> +</tr> +<tr> +<td><strong>CFM</strong></td> +<td><em>Airflow in cubic feet per minute</em></td> +</tr> +<tr> +<td><strong>∆G</strong></td> +<td><em>Difference in grains of moisture</em></td> +</tr> +<tr> +<td><strong>7000</strong></td> +<td><em>Constant based on grains of moisture in saturated air</em></td> +</tr> +</tbody> +</table> +<h2>Solution</h2> +<p>First, we solve for the difference in grains between the two air streams.</p> +<p>∆G = 66 - 52 = 14</p> +<p>Next, we’ve measured our airflow and have determined to have <strong>797 CFM</strong> of airflow across the evaporator coil, so we can substitute our +values into the formula.</p> +<p><img src="/articles/images/2023-09-08-solution.png" alt="solution" /></p> +<p>So, we are removing about 7 pounds of water per hour at these conditions.</p> +<p>Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that +can often be rated in pints per day.</p> +<p>I hope you’ve found this article helpful, thanks for reading!</p> + \ No newline at end of file diff --git a/deploy/articles/tag/formulas/index.html b/deploy/articles/tag/formulas/index.html index 231157d..cd2a224 100644 --- a/deploy/articles/tag/formulas/index.html +++ b/deploy/articles/tag/formulas/index.html @@ -52,6 +52,33 @@ The degradation of SEER is due to fouling of the evaporator coil with dirt and refrigerant charge losses. It should be noted that this is not true for...

        +
        +

        + Dehumidifier Sizing by Latent Load +

        + +

        + This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure. +Formulas +The formula above is used to... +

        +
        +
        +

        + Pounds of Water Removed +

        + +

        + This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream). +This is useful in the field when you want to calculate the... +

        +
        \ No newline at end of file diff --git a/deploy/articles/tag/general/feed.xml b/deploy/articles/tag/general/feed.xml index b451de7..c031f66 100644 --- a/deploy/articles/tag/general/feed.xml +++ b/deploy/articles/tag/general/feed.xml @@ -6,11 +6,11 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2025/vapor-htmx-todo-app/ Vapor + HTMX - 2025-02-19T21:47:31Z + 2025-02-20T14:15:37Z Build an example application using Vapor and HTMX. @@ -25,50 +25,50 @@ http://localhost:3000/articles/2023/hope/ Hope 2025-02-19T21:13:20Z - <p>This is a piggy-back article off of<br /> + <p>This is a piggy-back article off of <a href="https://mhoush.com/posts/20231018224631-the-struggle/">The Struggle</a> article that I had recently.</p> -<p>I was a bit of a “Debbie Downer” in that article, which is okay, I get that way sometimes. In this<br /> -article I’d like to take a minute to layout some of the things that give me hope, things that I<br /> +<p>I was a bit of a “Debbie Downer” in that article, which is okay, I get that way sometimes. In this +article I’d like to take a minute to layout some of the things that give me hope, things that I focus on to try and kick myself out of the rut I can get into sometimes.</p> -<p>I believe it’s important to have <strong>hope</strong>, to realize that feeling down is normal / part of being<br /> -human. It’s just as important to have hope. For some it is a harder thing to focus on, it may be<br /> -easy for us to try and dwell in negative feelings, to some that may feel more comfortable. When<br /> +<p>I believe it’s important to have <strong>hope</strong>, to realize that feeling down is normal / part of being +human. It’s just as important to have hope. For some it is a harder thing to focus on, it may be +easy for us to try and dwell in negative feelings, to some that may feel more comfortable. When we’re feeling cynical, it’s easy to feed the negativity, although it’s rarely helpful.</p> <h2>Hope</h2> -<p>One of the things that I try to focus on is that I’m human, it brings me hope to realize that I’m<br /> -not the only one who feels the way that I do. This was evident by the feedback on my previous<br /> +<p>One of the things that I try to focus on is that I’m human, it brings me hope to realize that I’m +not the only one who feels the way that I do. This was evident by the feedback on my previous article.</p> <blockquote> <p>My problems are very much “first world problems”.</p> </blockquote> -<p>Make no mistake, I’m selfish, but it’s the selfishness that makes me feel distant or disconnected.<br /> -The times that I feel connected are without a doubt the times that I let go of my ego and focus on<br /> +<p>Make no mistake, I’m selfish, but it’s the selfishness that makes me feel distant or disconnected. +The times that I feel connected are without a doubt the times that I let go of my ego and focus on things outside of myself.</p> -<p>It’s the feeling I get from going to customers home and feeling truly appreciated. There’s no push<br /> -back on price, no one telling me how I should run my business, no “the part only costs $x on<br /> +<p>It’s the feeling I get from going to customers home and feeling truly appreciated. There’s no push +back on price, no one telling me how I should run my business, no “the part only costs $x on amazon”, etc.</p> -<p>The feeling of seeing your child smile. The safety you feel when getting a hug from your mother or<br /> +<p>The feeling of seeing your child smile. The safety you feel when getting a hug from your mother or father. When you’re looking up at the stars and realize how small you actually are.</p> -<p>When you’re out with friends and trick the DJ into playing a Mr. Bungle song and no one else<br /> +<p>When you’re out with friends and trick the DJ into playing a Mr. Bungle song and no one else appreciates it, but you. The times when your guard is completely down and you laugh with abandon.</p> -<p>The smell of your lover’s hair when you’re holding them close. The joy you receive from sitting with<br /> +<p>The smell of your lover’s hair when you’re holding them close. The joy you receive from sitting with your pets. The songs of nature, insects, birds, etc. The sounds of waves / water in the distance.</p> -<p>The feeling when you’ve helped someone learn a new skill, when something finally clicks and makes<br /> -sense. When a complex topic is understood at a fundamental level. The breakthrough of a problem<br /> +<p>The feeling when you’ve helped someone learn a new skill, when something finally clicks and makes +sense. When a complex topic is understood at a fundamental level. The breakthrough of a problem you’ve pondered for days / months / years.</p> <h2>Conclusion</h2> -<p>There are so many things to be grateful for. This does not mean that there will not be hard times,<br /> -there surely will be. This does not mean that you are wrong for having negative feelings, for<br /> -feeling depressed or anxious. There are many around you that likely feel similar (they may just not<br /> -be able to express it in the same way). You never truly know what the person next to you is dealing<br /> +<p>There are so many things to be grateful for. This does not mean that there will not be hard times, +there surely will be. This does not mean that you are wrong for having negative feelings, for +feeling depressed or anxious. There are many around you that likely feel similar (they may just not +be able to express it in the same way). You never truly know what the person next to you is dealing with. Be compassionate (including showing yourself compassion).</p> -<p>When you are feeling down, try to do something for someone else. Make your own list of things to be<br /> -thankful for. Maybe my non-exhaustive list above will give you some ideas. Write those items down<br /> +<p>When you are feeling down, try to do something for someone else. Make your own list of things to be +thankful for. Maybe my non-exhaustive list above will give you some ideas. Write those items down regularly so that you can look back on them when you feel out of balance.</p> -<p>There is plenty of negative energy in this world, be true and genuine and you will receive rewards.<br /> +<p>There is plenty of negative energy in this world, be true and genuine and you will receive rewards. When you focus on blessings then the negativity will fade.</p> <p>What impact are you going to leave with what little time we have?</p> -<p>I hope that you enjoyed this short article. Know that you are <em>NOT</em> alone, you are important, and<br /> +<p>I hope that you enjoyed this short article. Know that you are <em>NOT</em> alone, you are important, and that I appreciate <em>you!</em></p> @@ -77,25 +77,25 @@ that I appreciate <em>you!</em></p> 2025-02-19T20:51:49Z <p>This is a quick article about why you should learn markdown.</p> <h2>What is markdown</h2> -<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily<br /> -converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on<br /> +<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily +converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on this website are written in markdown, here’s an image of this article written in markdown.</p> <p><img src="/articles/images/2023-10-21-markdown.png" alt="markdown" /></p> -<p>The reason you should learn markdown is that it allows you to focus on the content / text of your<br /> -content with simple concepts for formatting. Markdown is used heavily in documenting software<br /> -projects, which is how I got introduced to it, however it can scale all the way up to writing<br /> +<p>The reason you should learn markdown is that it allows you to focus on the content / text of your +content with simple concepts for formatting. Markdown is used heavily in documenting software +projects, which is how I got introduced to it, however it can scale all the way up to writing research papers or even books.</p> -<p>I use markdown for probably 80% of all the text documents I need to write, from company documents,<br /> -web / software documentation, and so on. It allows me to get content out quickly without having to<br /> -click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of<br /> -the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using<br /> -<strong>Pages</strong> (for now at least) because I have templates that make the documents look more<br /> +<p>I use markdown for probably 80% of all the text documents I need to write, from company documents, +web / software documentation, and so on. It allows me to get content out quickly without having to +click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of +the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using +<strong>Pages</strong> (for now at least) because I have templates that make the documents look more professional, however I am working on solutions to migrate those to be markdown based.</p> -<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client<br /> -(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many<br /> +<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client +(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many common document related tasks.</p> <h2>Resources</h2> -<p>You can learn more about the syntax used for markdown at<br /> +<p>You can learn more about the syntax used for markdown at <a href="https://www.markdownguide.org/basic-syntax/">markdownguide.org</a>.</p> <h3>A non-exhaustive list of where you can use Markdown and editors.</h3> <table> @@ -127,7 +127,7 @@ common document related tasks.</p> <p>You can use tools such as <a href="https://pandoc.org/#">pandoc</a> to convert Markdown files to other formats.</p> <p><img src="/articles/images/2023-10-21-pandoc.gif" alt="pandoc" /></p> <h2>Conclusion</h2> -<p>I hope that you take the time to research and see if Markdown is good fit for your document /<br /> +<p>I hope that you take the time to research and see if Markdown is good fit for your document / content creation.</p> <p>Thanks for reading until the end!</p> @@ -135,71 +135,71 @@ content creation.</p> http://localhost:3000/articles/2023/the-struggle/ The Struggle 2025-02-19T20:53:34Z - <p>This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If<br /> + <p>This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If that is not your cup of tea then feel free to skip this article.</p> <h2>The struggle</h2> -<p>It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby<br /> +<p>It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby / complainer, which is not my intention, but here it goes.</p> -<p>My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived<br /> -in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9<br /> -years apart), so she helped raise my mother growing up. They’ve always had a close relationship and<br /> -are like two peas in a pod. They would always visit us, especially while my grand-parents were still<br /> -alive. She is currently not really awake or expected to make it. She does not eat / drink and<br /> +<p>My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived +in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9 +years apart), so she helped raise my mother growing up. They’ve always had a close relationship and +are like two peas in a pod. They would always visit us, especially while my grand-parents were still +alive. She is currently not really awake or expected to make it. She does not eat / drink and they’ve basically just been making her comfortable.</p> -<p>One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject,<br /> -but he had surgery to fuse some discs back together and should eventually be ok, however it will be<br /> +<p>One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject, +but he had surgery to fuse some discs back together and should eventually be ok, however it will be a long recovery time.</p> -<p>A few weeks ago, I commited one of the deadly sins of running a blower door test without checking /<br /> -asking about the fireplaces, which caused lord knows how much damage from the soot that was spread<br /> +<p>A few weeks ago, I commited one of the deadly sins of running a blower door test without checking / +asking about the fireplaces, which caused lord knows how much damage from the soot that was spread throughout the living room(s).</p> <p>An online friend lost her mother.</p> <p>All of these things have just got me emotional.</p> <h2>My secrets</h2> -<p>I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I<br /> -spent many years masking things through alcohol abuse and many other idiotic tendencies. I still<br /> +<p>I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I +spent many years masking things through alcohol abuse and many other idiotic tendencies. I still drink on occasion, but not as I once did.</p> -<p>I often put my faith in folks, even if I haven’t met them in person, this can often lead to being<br /> -let down. I guess I struggle sometimes with the reality of online relationships. I think that people<br /> -are genuine, because I’m that way (how I act online is the same as I act in person for the most<br /> -part). I will happily show / share the good and the bad, in hopes that someone may learn. This is<br /> -not at all something to be ashamed of, or anything that I’d like to change, however it does on<br /> +<p>I often put my faith in folks, even if I haven’t met them in person, this can often lead to being +let down. I guess I struggle sometimes with the reality of online relationships. I think that people +are genuine, because I’m that way (how I act online is the same as I act in person for the most +part). I will happily show / share the good and the bad, in hopes that someone may learn. This is +not at all something to be ashamed of, or anything that I’d like to change, however it does on occasion lead me into turmoil when I find out some true identity / personality of someone.</p> -<p>I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want<br /> -to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to<br /> -forgive people, but it is just not the way it works for me often times. It takes a lot to get me<br /> -beyond my breaking point, but once someone has gotten me there, there is likely no turning back for<br /> -that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my<br /> -life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but<br /> +<p>I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want +to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to +forgive people, but it is just not the way it works for me often times. It takes a lot to get me +beyond my breaking point, but once someone has gotten me there, there is likely no turning back for +that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my +life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but truthfully I do not.</p> -<p>My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot<br /> -of regret around these things, because I generally mean what I say, and also feel we are entitled to<br /> -opinions as well as entitled to change those opinions as often as we see fit. Although I don’t<br /> -regret them per-se, it does make me wonder what type of impression it leaves (something for future<br /> +<p>My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot +of regret around these things, because I generally mean what I say, and also feel we are entitled to +opinions as well as entitled to change those opinions as often as we see fit. Although I don’t +regret them per-se, it does make me wonder what type of impression it leaves (something for future pondering, perhaps).</p> -<p>I’m one of those that says “I don’t care what they think about me”, when I really do care what<br /> -people think about me. This often leads to fear and anxiety, especially in social settings. I’m not<br /> -the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time<br /> -to think before responding. Therefore, I’m quick to make a joke or something rather than having<br /> +<p>I’m one of those that says “I don’t care what they think about me”, when I really do care what +people think about me. This often leads to fear and anxiety, especially in social settings. I’m not +the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time +to think before responding. Therefore, I’m quick to make a joke or something rather than having thoughtful / genuine responses.</p> <h2>Community</h2> -<p>All of these things have just got me thinking about community. Community is an aspect that seems<br /> -distant nowadays, even though we have more opportunity than ever. We call ourselves part of<br /> -communities, especially online, but I’m not convinced that it is really community (or at least not<br /> +<p>All of these things have just got me thinking about community. Community is an aspect that seems +distant nowadays, even though we have more opportunity than ever. We call ourselves part of +communities, especially online, but I’m not convinced that it is really community (or at least not most of the time, not saying it can’t be / in absolute terms).</p> -<p>I have met a lot of folks online that I consider true friends. Friends that I would do anything for<br /> -and feel they would do anything for me, just like my real life friends who have stuck with me for<br /> -many years. These are people that challenge me and how I think on a regular basis. They do their<br /> +<p>I have met a lot of folks online that I consider true friends. Friends that I would do anything for +and feel they would do anything for me, just like my real life friends who have stuck with me for +many years. These are people that challenge me and how I think on a regular basis. They do their best to lift me up when I’m down.</p> -<p>It’s easy to hide when so much of our interactions are not really in person, to feel like the<br /> -relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the<br /> -benefit / trust they deserve until, at least until they don’t then see my part about holding grudges<br /> +<p>It’s easy to hide when so much of our interactions are not really in person, to feel like the +relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the +benefit / trust they deserve until, at least until they don’t then see my part about holding grudges ;)</p> -<p>Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m<br /> -trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks<br /> -Jennifer in real life, I read today about her mom and decided to take an hour or so to put together<br /> -a website for the <a href="https://hvachicks.com">HVAChicks Community</a>, hoping it would bring a moment of<br /> -happiness to her day. While I’ve deployed several websites in the past, this one for some reason was<br /> -a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and<br /> +<p>Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m +trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks +Jennifer in real life, I read today about her mom and decided to take an hour or so to put together +a website for the <a href="https://hvachicks.com">HVAChicks Community</a>, hoping it would bring a moment of +happiness to her day. While I’ve deployed several websites in the past, this one for some reason was +a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and it’s basic AF), but that truly made me feel useful / great after being down in the dumps for a bit.</p> <h2>Conclusion</h2> <p>I’ve probably rambled enough and am losing direction here, so I will end with a few things.</p> @@ -209,43 +209,43 @@ it’s basic AF), but that truly made me feel useful / great after being down in <li>Spend time with your loved ones, while you can.</li> <li>Tell someone you love them.</li> </ol> -<p>Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I<br /> +<p>Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I left you off, I’m sorry and please do not take it personally.</p> <ol> <li>Bryan Orr <ul> -<li>Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and<br /> -commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan,<br /> +<li>Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and +commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan, mostly all the following names would not even be in my vocabulary.</li> </ul> </li> <li>Ty Branaman (forget exactly how to spell his last name). <ul> -<li>Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be<br /> +<li>Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be positive all the time, however it brings me hope and joy everytime!</li> </ul> </li> <li>Dustin (mother f’n) Cole <ul> -<li>Dustin is like a brother that I never had, he’s a true master of his craft and I know that I<br /> +<li>Dustin is like a brother that I never had, he’s a true master of his craft and I know that I can rely on him anytime I need it!</li> </ul> </li> <li>Genry Garcia <ul> -<li>The cuban crusader who has taught me so much about home performance, and especially ZPD (baby,<br /> +<li>The cuban crusader who has taught me so much about home performance, and especially ZPD (baby, baby)!</li> </ul> </li> <li>Chris Hughes <ul> -<li>It’s hard to put into words here, but I know that Chris is there to talk when I need it and<br /> +<li>It’s hard to put into words here, but I know that Chris is there to talk when I need it and he’s a great motivator because of his action items :)</li> </ul> </li> <li>Eric Kaiser <ul> -<li>I think genuine when I think of Eric, I hear his voice in my head when I write reports because<br /> +<li>I think genuine when I think of Eric, I hear his voice in my head when I write reports because of guidance he has given in the past. He truly wants to help teach people.</li> </ul> </li> @@ -256,26 +256,26 @@ of guidance he has given in the past. He truly wants to help teach people.</l </li> <li>HVAChicks Jennifer (I’ll butcher her last name from memory) <ul> -<li>Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I<br /> +<li>Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I can’t wait to meet her in person one day soon!</li> </ul> </li> <li>HVAC Overtime Crew <ul> -<li>I’m lumping these guys together because I truly enjoy when I’m able to make their live stream<br /> +<li>I’m lumping these guys together because I truly enjoy when I’m able to make their live stream on Friday’s. And I interact with A-Team a lot and really appreciate him / them!</li> </ul> </li> <li>Alicia Hollon <ul> -<li>Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner,<br /> +<li>Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner, love you babe!</li> </ul> </li> </ol> -<p>Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt<br /> +<p>Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt currently. My mother is the kindest gentlest soul that I’ve ever met. I look up to all 5’ of her!</p> -<p>At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today<br /> +<p>At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today and tomorrow!</p> \ No newline at end of file diff --git a/deploy/articles/tag/general/index.html b/deploy/articles/tag/general/index.html index fe6cfc5..34c42ae 100644 --- a/deploy/articles/tag/general/index.html +++ b/deploy/articles/tag/general/index.html @@ -123,6 +123,12 @@ It has been one of those “when it rains, it pours” type of weeks. As... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/gnupgp/feed.xml b/deploy/articles/tag/gnupgp/feed.xml index 46ff013..7161293 100644 --- a/deploy/articles/tag/gnupgp/feed.xml +++ b/deploy/articles/tag/gnupgp/feed.xml @@ -6,74 +6,74 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2024/pgp-encryption-introduction/ PGP Encryption Introduction 2025-02-19T21:36:11Z <p>In this article I introduce PGP and show a use case for me, which perhaps you can use as well.</p> <h2>What is PGP</h2> -<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses<br /> +<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses cryptographic privacy and authentication and is generally used in data communication.</p> -<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired<br /> -by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s<br /> +<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired +by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s fictional town of Lake Wobegon.</p> -<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both<br /> +<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both who the commits were from as well as make sure they were not modified from the original versions.</p> -<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which<br /> +<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which are implementations of the PGP standard protocol.</p> <h2>What it does</h2> <blockquote> -<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms<br /> +<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms that I understand / make sense to me. Do what I do at your own risk!</p> </blockquote> -<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption<br /> -(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource<br /> +<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption +(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource intensive (which is generally not a problem with computers of today).</p> -<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of<br /> -the key par is meant to be shared with others freely, while the private portion needs to be secured<br /> -/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is<br /> -“air gapped”, meaning it is not connected to any network / internet, and does not save a history of<br /> +<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of +the key par is meant to be shared with others freely, while the private portion needs to be secured +/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is +“air gapped”, meaning it is not connected to any network / internet, and does not save a history of commands performed on it.</p> -<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public<br /> +<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public key. The recipients private key is required to decrypt the data once it’s been encrypted.</p> -<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can<br /> -also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it<br /> -can be tied to your same private key. This is useful for example for work vs. activism vs. software<br /> +<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can +also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it +can be tied to your same private key. This is useful for example for work vs. activism vs. software development.</p> -<p>Once your key is generated and your private key secured, you can share your public portion of the<br /> +<p>Once your key is generated and your private key secured, you can share your public portion of the key to a “keyserver” where other people can download it and verify messages were sent by you.</p> <h2>Web of Trust</h2> -<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are<br /> -encrypted by a trusted source. There are different levels of trust depending on where a key is<br /> -retrieved from. For example, if somebody gave you their public key in person and you were able to<br /> -inspect that the identity matches their government id, then you can give it a higher trust level<br /> +<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are +encrypted by a trusted source. There are different levels of trust depending on where a key is +retrieved from. For example, if somebody gave you their public key in person and you were able to +inspect that the identity matches their government id, then you can give it a higher trust level than one that is sent / retrieved from a keyserver.</p> -<p>My understanding of this portion is that over time your key is signed by other’s with their level of<br /> +<p>My understanding of this portion is that over time your key is signed by other’s with their level of certainty about you / your key, which over time increases the overall trust in your key.</p> <h2>Out of the weeds</h2> -<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use<br /> +<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use cases of PGP encryption.</p> -<p>PGP encryption is used by some email clients / applications, such as<br /> -<a href="https://canarymail.io/">Canary</a>,<br /> -<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or<br /> +<p>PGP encryption is used by some email clients / applications, such as +<a href="https://canarymail.io/">Canary</a>, +<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or <a href="https://gpgtools.tenderapp.com/">GPGSuite</a>.</p> -<p>In my understanding, it is also what is used in devices such as a<br /> +<p>In my understanding, it is also what is used in devices such as a <a href="https://www.yubico.com/">YubiKey</a>.</p> -<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons<br /> +<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons it is not very popular is that it can be hard to use PGP for the average person.</p> -<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files<br /> -that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a<br /> -computer (in reality a gang of computers in a data center). You are solely reliant that these cloud<br /> +<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files +that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a +computer (in reality a gang of computers in a data center). You are solely reliant that these cloud providers are not snooping on, inspecting, or even selling your data.</p> -<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit<br /> -of effort on your part you can at least make it very hard for anyone to know what is inside your<br /> -documents. You can be in control of the way your items are encrypted and have confidence that nobody<br /> +<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit +of effort on your part you can at least make it very hard for anyone to know what is inside your +documents. You can be in control of the way your items are encrypted and have confidence that nobody but you can access what is inside your documents.</p> -<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something<br /> +<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something get’s stolen or someone breach’s my network they will not be able to easily get to sensitive data.</p> <h2>Conclusion</h2> -<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how<br /> +<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how to use it to encrypt your data and be in control of your privacy.</p> <h3>Resources</h3> <ul> diff --git a/deploy/articles/tag/gnupgp/index.html b/deploy/articles/tag/gnupgp/index.html index 833c89d..f7a0d15 100644 --- a/deploy/articles/tag/gnupgp/index.html +++ b/deploy/articles/tag/gnupgp/index.html @@ -73,6 +73,12 @@ cryptographic privacy and authentication and is... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/how-to/feed.xml b/deploy/articles/tag/how-to/feed.xml index 9fcd75a..badccce 100644 --- a/deploy/articles/tag/how-to/feed.xml +++ b/deploy/articles/tag/how-to/feed.xml @@ -6,24 +6,24 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2024/unvr-as-nas/ UNVR as NAS 2025-02-19T21:32:01Z - <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be<br /> -used as NAS (network attached storage). Be aware that this should be done with caution and may void<br /> -any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also<br /> -possible that this setup will break when / if updating the UNVR software. With that said, let’s jump<br /> + <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be +used as NAS (network attached storage). Be aware that this should be done with caution and may void +any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also +possible that this setup will break when / if updating the UNVR software. With that said, let’s jump in.</p> -<p>This post follows along with<br /> -<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>,<br /> +<p>This post follows along with +<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>, with some adaptations to get it to work on the latest Unifi-OS release of <code>3.2.12</code>.</p> <h2>Step One - Setup SSH &amp; Login</h2> -<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password<br /> +<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password for the root user to login to the UNVR.</p> <p><img src="/articles/images/2024-03-15-ssh.png" alt="ssh.png" /></p> -<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR<br /> +<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR on your network.</p> <p><code>ssh root@192.168.1.10</code></p> <h2>Step Two - Install Samba</h2> @@ -32,14 +32,14 @@ on your network.</p> <p>Next, install samba.</p> <p><code>apt-get install samba</code></p> <h2>Step Three - Setup Samba</h2> -<p>In order to edit the configuration we are going to need to install your terminal based text editor<br /> +<p>In order to edit the configuration we are going to need to install your terminal based text editor of choice (generally nano or vim), for me I will install vim.</p> <p><code>apt-get install vim</code></p> <p>Create a backup of the default configuration.</p> <p><code>cp /etc/samba/smb.conf /etc/samba/smb.conf.bak</code></p> <p>Open the configuration file to be edited.</p> <p><code>vim /etc/samba/smb.conf</code></p> -<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to<br /> +<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to make the samba server act better for time machine backups.</p> <pre><code>#======================= MacOS Client Optimizations ======================= vfs objects = fruit streams_xattr @@ -52,11 +52,11 @@ fruit:wipe_intentionally_left_blank_rfork = yes fruit:delete_empty_adfiles = yes </code></pre> -<p>Also because we want users we create to be able to read and write to their home directories created<br /> -on the samba server, we need to change the option under the <code>[homes]</code> share definition to be<br /> +<p>Also because we want users we create to be able to read and write to their home directories created +on the samba server, we need to change the option under the <code>[homes]</code> share definition to be <code>read only = no</code>.</p> -<p>That is our primary configuration. You can add more share definitions at the bottom of the file to<br /> -suit your use case, there are decent examples of this in the original reddit post, linked in the<br /> +<p>That is our primary configuration. You can add more share definitions at the bottom of the file to +suit your use case, there are decent examples of this in the original reddit post, linked in the beginning.</p> <p>Save and exit the file.</p> <p><code>:wq</code></p> @@ -77,14 +77,40 @@ beginning.</p> <p>In the <code>Finder</code> app on macOS you can type <code>⌘k</code> to connect to a server.</p> <p>In the text field enter <code>smb://&lt;USER&gt;@&lt;UNVR_IP&gt;</code> to connect to the samba server.</p> <p><img src="/articles/images/2024-03-15-connect.png" alt="connect" /></p> -<p>You can also automatically connect to the server when you login to your client device, for this to<br /> -work you need the credentials to be stored in your keychain (ticking the box in the step above when<br /> +<p>You can also automatically connect to the server when you login to your client device, for this to +work you need the credentials to be stored in your keychain (ticking the box in the step above when you first connect to the server).</p> -<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button<br /> +<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button and select the volume you would like to mount at login.</p> <p><img src="/articles/images/2024-03-15-login.png" alt="login" /></p> -<p>Once you have it setup so that the server is connected on login, you can also set it up as location<br /> +<p>Once you have it setup so that the server is connected on login, you can also set it up as location for Time Machine Backups. <code>System Settings -&gt; General -&gt; Time Machine</code></p> <p><img src="/articles/images/2024-03-15-time-machine.png" alt="time-machine" /></p> + + http://localhost:3000/articles/2023/rss-feed/ + Rss Feed + 2025-02-20T16:50:11Z + <p>In this article I will show how to add this site’s rss feed. In particular, we will be using <a href="https://netnewswire.com">NetNewsWire</a> as the +rss reader.</p> +<h2>What is an RSS Feed</h2> +<p>An RSS feed will show you new posts, generally from a blog, without having to remember to check the website at regular intervals or signup +for an email list for notifications.</p> +<p>NetNewsWire puts an RSS feed as:</p> +<p><strong>It’s like podcasts</strong> - but for <em>reading.</em></p> +<p>You consume an RSS feed, using an RSS reader application or extension in your browser.</p> +<h2>Step One</h2> +<p>First find and download an RSS reader, you can download <a href="https://netnewswire.com">NetNewsWire</a> for macOS from the link, or for iOS from the +<a href="https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210">AppStore</a>.</p> +<h2>Step Two</h2> +<p>Add the rss feed to stay up to date when I publish new articles.</p> +<ol> +<li>Click the plus in the right side of the sidebar and select <code>New Feed...</code></li> +<li>In the URL field add: <code>https://mhoush.com/articles/feed.xml</code></li> +<li>Optionally give it a name</li> +<li>Click the <code>Add</code> button.</li> +</ol> +<p><img src="/articles/images/2023-08-10-rss-feed.gif" alt="rss gif" /></p> +<p>That’s it.</p> + \ No newline at end of file diff --git a/deploy/articles/tag/how-to/index.html b/deploy/articles/tag/how-to/index.html index 9e6ecbe..a3bf3b6 100644 --- a/deploy/articles/tag/how-to/index.html +++ b/deploy/articles/tag/how-to/index.html @@ -51,6 +51,20 @@ used as NAS (network attached storage). Be aware that this should be done with c any warranty on your UNVR as we are using it for...

        +
        +

        + Rss Feed +

        + +

        + In this article I will show how to add this site’s rss feed. In particular, we will be using NetNewsWire as the +rss reader. +What is an RSS Feed +An RSS feed will show you new posts, generally from a blog, without having to remember to check the... +

        +
        \ No newline at end of file diff --git a/deploy/articles/tag/hvac/feed.xml b/deploy/articles/tag/hvac/feed.xml index e2f1f57..399e4f3 100644 --- a/deploy/articles/tag/hvac/feed.xml +++ b/deploy/articles/tag/hvac/feed.xml @@ -6,57 +6,57 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2024/elevating-hvac/ Elevating HVAC: A Skilled Trade Beyond Labor 2025-02-19T21:25:29Z <p>This is a guest post from my good friend, <strong>Ty Branaman</strong>.</p> <h2>Introduction:</h2> -<p>Heating, Ventilation, and Air Conditioning (HVAC) is often mistakenly categorized as a simple labor<br /> -job, overshadowing the intricate skill set and technical expertise required in this field. Labor<br /> -jobs are also very important positions needed to keep society running. HVAC, like other skilled<br /> -trades, demands a high level of knowledge, precision, and adaptability. This article aims to shed<br /> -light on the misconception surrounding HVAC, emphasizing its status as a skilled trade that plays a<br /> +<p>Heating, Ventilation, and Air Conditioning (HVAC) is often mistakenly categorized as a simple labor +job, overshadowing the intricate skill set and technical expertise required in this field. Labor +jobs are also very important positions needed to keep society running. HVAC, like other skilled +trades, demands a high level of knowledge, precision, and adaptability. This article aims to shed +light on the misconception surrounding HVAC, emphasizing its status as a skilled trade that plays a pivotal role in creating comfortable and efficient living and working environments.</p> <h2>Technical Proficiency:</h2> -<p>One of the defining features that distinguish HVAC as a skilled trade is the level of technical<br /> -proficiency required. HVAC professionals must have a deep understanding of thermodynamics, fluid<br /> -mechanics, electrical circuits, Psychrometrics and air properties. This knowledge is essential for<br /> +<p>One of the defining features that distinguish HVAC as a skilled trade is the level of technical +proficiency required. HVAC professionals must have a deep understanding of thermodynamics, fluid +mechanics, electrical circuits, Psychrometrics and air properties. This knowledge is essential for designing, installing, and maintaining HVAC systems that operate seamlessly and efficiently.</p> <h2>System Design and Installation:</h2> -<p>HVAC professionals are involved in the intricate process of designing and installing heating,<br /> -ventilation, and air conditioning systems. This task requires not only a thorough understanding of<br /> -the physical principles governing HVAC but also the ability to tailor solutions to meet the unique<br /> -needs of each space. Proper system design and installation are crucial for achieving optimal energy<br /> +<p>HVAC professionals are involved in the intricate process of designing and installing heating, +ventilation, and air conditioning systems. This task requires not only a thorough understanding of +the physical principles governing HVAC but also the ability to tailor solutions to meet the unique +needs of each space. Proper system design and installation are crucial for achieving optimal energy efficiency and performance.</p> <h2>Diagnostic Skills:</h2> -<p>Troubleshooting and diagnosing issues in HVAC systems require a keen analytical mind and<br /> -problem-solving skills. Skilled HVAC technicians possess the ability to identify and rectify<br /> -problems efficiently, ensuring minimal downtime and disruption to the comfort of occupants. This<br /> +<p>Troubleshooting and diagnosing issues in HVAC systems require a keen analytical mind and +problem-solving skills. Skilled HVAC technicians possess the ability to identify and rectify +problems efficiently, ensuring minimal downtime and disruption to the comfort of occupants. This diagnostic acumen is a hallmark of a trade that goes beyond routine labor.</p> <h2>Adaptability to Advanced Technologies:</h2> -<p>The HVAC industry is in a constant state of evolution, with new technologies and innovations<br /> -continuously being introduced. Skilled HVAC professionals are adaptable and stay abreast of these<br /> -advancements. From smart thermostats to energy-efficient systems, they integrate cutting-edge<br /> +<p>The HVAC industry is in a constant state of evolution, with new technologies and innovations +continuously being introduced. Skilled HVAC professionals are adaptable and stay abreast of these +advancements. From smart thermostats to energy-efficient systems, they integrate cutting-edge technologies to provide state-of-the-art solutions for their clients.</p> <h2>Safety and Compliance:</h2> -<p>Safety is paramount in the HVAC trade. Professionals must adhere to strict safety protocols to<br /> -protect both themselves and the occupants of the spaces they work in. Additionally, compliance with<br /> -industry regulations and codes is a testament to the skilled nature of the trade, ensuring that HVAC<br /> +<p>Safety is paramount in the HVAC trade. Professionals must adhere to strict safety protocols to +protect both themselves and the occupants of the spaces they work in. Additionally, compliance with +industry regulations and codes is a testament to the skilled nature of the trade, ensuring that HVAC systems meet the highest standards of safety and efficiency.</p> <h2>Continual Learning and Certification:</h2> -<p>Unlike a labor job, HVAC professionals engage in continual learning to stay current with industry<br /> -trends and technological advancements. Many pursue certifications and attend training programs to<br /> -enhance their skills and expand their knowledge base. This commitment to ongoing education is a<br /> +<p>Unlike a labor job, HVAC professionals engage in continual learning to stay current with industry +trends and technological advancements. Many pursue certifications and attend training programs to +enhance their skills and expand their knowledge base. This commitment to ongoing education is a hallmark of skilled trades.</p> <h2>Conclusion:</h2> -<p>Heating, Ventilation, and Air Conditioning is undeniably a skilled trade that goes beyond the<br /> -perception of a labor job. Labor jobs are also very important to the function of society and I have<br /> -proudly done these jobs myself. The technical proficiency, problem-solving abilities, adaptability,<br /> -and commitment to safety make HVAC professionals essential contributors to the creation of<br /> -comfortable and efficient indoor environments. It is crucial to recognize and appreciate the skill<br /> -set inherent in the HVAC trade, as it plays a vital role in shaping the quality of life for<br /> +<p>Heating, Ventilation, and Air Conditioning is undeniably a skilled trade that goes beyond the +perception of a labor job. Labor jobs are also very important to the function of society and I have +proudly done these jobs myself. The technical proficiency, problem-solving abilities, adaptability, +and commitment to safety make HVAC professionals essential contributors to the creation of +comfortable and efficient indoor environments. It is crucial to recognize and appreciate the skill +set inherent in the HVAC trade, as it plays a vital role in shaping the quality of life for individuals and the functionality of diverse spaces.</p> <ul> <li>Ty Branaman</li> @@ -66,126 +66,126 @@ individuals and the functionality of diverse spaces.</p> http://localhost:3000/articles/2023/most-important-job/ Most Important Job 2025-02-19T21:21:54Z - <p>This short tech tip is about something one of my good friends in the trade told me a long time ago,<br /> + <p>This short tech tip is about something one of my good friends in the trade told me a long time ago, that has stuck with me through the years. It is a simple phrase / mindset.</p> <blockquote> <p>“The current job you’re on, is the most important job of your day”.</p> </blockquote> -<p>This mindset should be carried from the dispatcher, manager, and technician to make this successful.<br /> -I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use<br /> -this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging<br /> +<p>This mindset should be carried from the dispatcher, manager, and technician to make this successful. +I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use +this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging out there.</p> -<p>I do think it’s also important to acknowledge that there are times that a technician has exhausted<br /> -all their options, maybe they just don’t have the mental capacity anymore to continue with a problem<br /> -job, or need a break to come back another day with a fresh set of eyes, etc… This is also an<br /> -important thing for a technician to realize, and hopefully those type of instances are much more few<br /> +<p>I do think it’s also important to acknowledge that there are times that a technician has exhausted +all their options, maybe they just don’t have the mental capacity anymore to continue with a problem +job, or need a break to come back another day with a fresh set of eyes, etc… This is also an +important thing for a technician to realize, and hopefully those type of instances are much more few and far between, but I do want to acknowledge that scenario does also exist.</p> -<p>If you are a business owner, then this is something to consider instilling in your operations.<br /> -Empower your technicians and dispatchers to understand when things need to be shuffled around in<br /> -order to accommodate taking care of the customer at hand. It costs a lot of money to get a<br /> -technician to job, so minimizing truck rolls to the same job is important from a business<br /> +<p>If you are a business owner, then this is something to consider instilling in your operations. +Empower your technicians and dispatchers to understand when things need to be shuffled around in +order to accommodate taking care of the customer at hand. It costs a lot of money to get a +technician to job, so minimizing truck rolls to the same job is important from a business standpoint.</p> -<p>This was just a quick tech tip of something that has been rolling around in my mind lately. I hope<br /> +<p>This was just a quick tech tip of something that has been rolling around in my mind lately. I hope you find it helpful and it sticks with you through your career as it has mine.</p> http://localhost:3000/articles/2023/cancel-this/ Cancel This 2025-02-19T21:17:16Z - <p>This post is going to be hard to put into words, it’s going to seem egotistical at points, but know<br /> -that my actions / feelings online are the same as they are if you met me in person. The problem with<br /> -online interactions is tone and other subtleties do not come across, so it’s hard to tell when<br /> + <p>This post is going to be hard to put into words, it’s going to seem egotistical at points, but know +that my actions / feelings online are the same as they are if you met me in person. The problem with +online interactions is tone and other subtleties do not come across, so it’s hard to tell when someone is joking or being serious.</p> <h2>The Meat</h2> -<p>It has been brought to my attention that someone out there thinks that I’m sexist and should not<br /> -speak at the HVAC School symposium because of it. They are holding a curse word against me that I<br /> -said two years ago, in the moment A) it was fitting and B) it was one of those times that my mouth<br /> +<p>It has been brought to my attention that someone out there thinks that I’m sexist and should not +speak at the HVAC School symposium because of it. They are holding a curse word against me that I +said two years ago, in the moment A) it was fitting and B) it was one of those times that my mouth was working faster than my brain (raise your hand if that’s ever happened to you).</p> -<p>I am an open book, I am not afraid of showing failures and strengths. I’ve never claimed to be<br /> -perfect (well, actually I have but it’s always a joke). I’m not at all condoning what I’ve said in<br /> -the past, nor will I repeat it out of context now, but I communicate with people like adults and I<br /> -look at people as piers. We do not always have to agree with one another, conflict helps us learn<br /> -where to grow, but we also can not expect people to change to fit our wants / needs, that’s just not<br /> +<p>I am an open book, I am not afraid of showing failures and strengths. I’ve never claimed to be +perfect (well, actually I have but it’s always a joke). I’m not at all condoning what I’ve said in +the past, nor will I repeat it out of context now, but I communicate with people like adults and I +look at people as piers. We do not always have to agree with one another, conflict helps us learn +where to grow, but we also can not expect people to change to fit our wants / needs, that’s just not how it works.</p> -<p>I do not at all agree with the tactics used by whomever is behind this. I would happily discuss this<br /> -in private or out in the open. You can find all my contact / social information in the sidebar of<br /> -this website and I’ve offered up my cell phone number in private groups that we are all probably a<br /> +<p>I do not at all agree with the tactics used by whomever is behind this. I would happily discuss this +in private or out in the open. You can find all my contact / social information in the sidebar of +this website and I’ve offered up my cell phone number in private groups that we are all probably a part of.</p> <h2>The Potatoes</h2> -<p>I am a father of 3 girls, I have a sister, talk crap about my mom and you’ll find out who I am! I<br /> -love women, I have no problem with women in the trades, I encourage women who are in the trades. I<br /> -try to help every person that I can, if I can. I have failed more times than you can imagine! I am<br /> -self taught in about everything I do, so I give of it freely. I have all kinds of work to do to grow<br /> -into the man that I should be, but at the same time, I am not afraid to be the man that I am today.<br /> +<p>I am a father of 3 girls, I have a sister, talk crap about my mom and you’ll find out who I am! I +love women, I have no problem with women in the trades, I encourage women who are in the trades. I +try to help every person that I can, if I can. I have failed more times than you can imagine! I am +self taught in about everything I do, so I give of it freely. I have all kinds of work to do to grow +into the man that I should be, but at the same time, I am not afraid to be the man that I am today. I will greet you by whatever pronoun you want to be referred as.</p> -<p>I would love to say that I don’t judge people, but I do, just as I’m being judged! I am fine with<br /> -someone judging me and having opinions about me, I mean that is our right. I will not say that<br /> -person is wrong, because in their mind they’re right. What I will not do is stop being myself. I<br /> -know for a fact that I’ve helped more people than this person has gotten “cancelled”. I will<br /> -continue to help people in the trades, homeowners, or people in need. I also will not remain quiet!<br /> -I will give my opinion like it or not. There are people in my corner that really know me and my<br /> +<p>I would love to say that I don’t judge people, but I do, just as I’m being judged! I am fine with +someone judging me and having opinions about me, I mean that is our right. I will not say that +person is wrong, because in their mind they’re right. What I will not do is stop being myself. I +know for a fact that I’ve helped more people than this person has gotten “cancelled”. I will +continue to help people in the trades, homeowners, or people in need. I also will not remain quiet! +I will give my opinion like it or not. There are people in my corner that really know me and my intentions.</p> <h2>Final Words</h2> -<p>The trades are rough around the edges, just as am I. The trades are a slow turning ship (just look<br /> -at how many still do not follow proper practices, etc. even with the capabilities and resources<br /> +<p>The trades are rough around the edges, just as am I. The trades are a slow turning ship (just look +at how many still do not follow proper practices, etc. even with the capabilities and resources available today).</p> -<p>If you are new / coming into the trades then I hope you are not overly sensitive to foul language<br /> -and other inappropriate comments. Thick skin is valuable in the trades, but at the same time don’t<br /> -be afraid to speak up if something offends you. Remember we are adults, we can handle disagreements<br /> -like adults (well, some of us can). Adults can learn from those of any age, they can reflect on<br /> +<p>If you are new / coming into the trades then I hope you are not overly sensitive to foul language +and other inappropriate comments. Thick skin is valuable in the trades, but at the same time don’t +be afraid to speak up if something offends you. Remember we are adults, we can handle disagreements +like adults (well, some of us can). Adults can learn from those of any age, they can reflect on their own behavior and make their own decisions.</p> -<p>I personally think that being offended is not a bad thing, it causes us to reflect / repair our<br /> -foundational beliefs. I hope that we can stop with this “cancel culture” of today, stop hiding<br /> +<p>I personally think that being offended is not a bad thing, it causes us to reflect / repair our +foundational beliefs. I hope that we can stop with this “cancel culture” of today, stop hiding behind a keyboard, and be a diverse community.</p> -<p>To wrap things up, I just want to reiterate that I am not at all mad at whomever is behind this. To<br /> +<p>To wrap things up, I just want to reiterate that I am not at all mad at whomever is behind this. To everyone out there who has shown me love and support, I greatly appreciate it.</p> http://localhost:3000/articles/2023/heat-recovery-chiller/ Heat Recovery Chiller 2025-02-19T21:08:37Z - <p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so<br /> -I’m doing it now. I did discuss this on<br /> + <p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so +I’m doing it now. I did discuss this on <a href="https://hvacrschool.com/podcasts/is-the-future-of-air-conditioning-self-contained-propane-chillers/">this episode of the HVAC School Podcast.</a></p> <h2>Heat Recovery Chillers</h2> -<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that<br /> -common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most<br /> -equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds<br /> +<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that +common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most +equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds in this article, but offer an overview of what I feel would be my dream system.</p> <h2>The Source</h2> -<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional<br /> -heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would<br /> -have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to<br /> -bank / store heat, or are running in heat only mode. There are several benefits to this style<br /> -system, the main being that while operating simultaneous heating / cooling mode the COP of the<br /> -system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of<br /> -about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level<br /> +<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional +heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would +have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to +bank / store heat, or are running in heat only mode. There are several benefits to this style +system, the main being that while operating simultaneous heating / cooling mode the COP of the +system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of +about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level performance without the need of a field.</p> <h2>Indoor Portion</h2> -<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller.<br /> -The buffer tanks give us several benefits, including longer run times for the chiller, load<br /> -matching, and the ability to size for larger load (heating or cooling) without some of the problems<br /> -that occur when over-sizing a traditional system. The buffer tanks also allow sizing more<br /> +<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller. +The buffer tanks give us several benefits, including longer run times for the chiller, load +matching, and the ability to size for larger load (heating or cooling) without some of the problems +that occur when over-sizing a traditional system. The buffer tanks also allow sizing more aggressively by having storage during peak load conditions.</p> <p><img src="/articles/images/2023-10-27-buffers2.png" alt="buffer" /></p> -<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what<br /> -circulate water through the chiller, while the vertical pumps are what distribute the water to the<br /> -load / emitters. This configuration allows for water to be used for the loads first and extra<br /> -capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps<br /> -(meaning that they won’t interfere with each other if / when there are different flow rates).<br /> -Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in<br /> -parallel to the system. This is shown by the extra tees in the hot buffer tank where we could<br /> -connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler.<br /> -You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat<br /> +<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what +circulate water through the chiller, while the vertical pumps are what distribute the water to the +load / emitters. This configuration allows for water to be used for the loads first and extra +capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps +(meaning that they won’t interfere with each other if / when there are different flow rates). +Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in +parallel to the system. This is shown by the extra tees in the hot buffer tank where we could +connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler. +You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat exchanger that would be used to supply domestic hot water.</p> <h2>Distribution System</h2> -<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators,<br /> +<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators, however I’m going to model it as a 4-pipe hydronic air handler.</p> <p><img src="/articles/images/2023-10-27-ah.png" alt="ah" /></p> -<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in<br /> -one package. With a hydronic system, it would be very easy to load match by controlling the fan<br /> -speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from<br /> -several manufacturers and come in different styles from traditional (as shown), small duct high<br /> +<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in +one package. With a hydronic system, it would be very easy to load match by controlling the fan +speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from +several manufacturers and come in different styles from traditional (as shown), small duct high velocity systems, and even ductless styles.</p> <h2>Disadvantages</h2> <ol> @@ -194,7 +194,7 @@ velocity systems, and even ductless styles.</p> <li>Lack of understanding / technicians afraid to work on this style system.</li> <li>Potentially higher upfront costs.</li> <li>Lack of design or planning could cause unhappy clients (same with traditional)</li> -<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement<br /> +<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement for traditional boiler systems)</li> </ol> <h2>Advantages</h2> @@ -208,11 +208,11 @@ for traditional boiler systems)</li> <li>Easier transition to natural / flammable refrigerants</li> </ol> <h2>Conclusion</h2> -<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the<br /> -main points is to think of the system in 3 distinct components, the source(s), thermal storage, and<br /> -distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish<br /> -this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to<br /> -dump excess heat into a pool, create ice storage during off peak hours, cascade into another water<br /> +<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the +main points is to think of the system in 3 distinct components, the source(s), thermal storage, and +distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish +this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to +dump excess heat into a pool, create ice storage during off peak hours, cascade into another water -&gt; water heat pump for higher temperature distribution, incorporate solar collectors, and so on.</p> <p>Thank you for reading all the way to the end!</p> @@ -222,25 +222,25 @@ dump excess heat into a pool, create ice storage during off peak hours, cascade 2025-02-19T20:51:49Z <p>This is a quick article about why you should learn markdown.</p> <h2>What is markdown</h2> -<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily<br /> -converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on<br /> +<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily +converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on this website are written in markdown, here’s an image of this article written in markdown.</p> <p><img src="/articles/images/2023-10-21-markdown.png" alt="markdown" /></p> -<p>The reason you should learn markdown is that it allows you to focus on the content / text of your<br /> -content with simple concepts for formatting. Markdown is used heavily in documenting software<br /> -projects, which is how I got introduced to it, however it can scale all the way up to writing<br /> +<p>The reason you should learn markdown is that it allows you to focus on the content / text of your +content with simple concepts for formatting. Markdown is used heavily in documenting software +projects, which is how I got introduced to it, however it can scale all the way up to writing research papers or even books.</p> -<p>I use markdown for probably 80% of all the text documents I need to write, from company documents,<br /> -web / software documentation, and so on. It allows me to get content out quickly without having to<br /> -click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of<br /> -the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using<br /> -<strong>Pages</strong> (for now at least) because I have templates that make the documents look more<br /> +<p>I use markdown for probably 80% of all the text documents I need to write, from company documents, +web / software documentation, and so on. It allows me to get content out quickly without having to +click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of +the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using +<strong>Pages</strong> (for now at least) because I have templates that make the documents look more professional, however I am working on solutions to migrate those to be markdown based.</p> -<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client<br /> -(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many<br /> +<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client +(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many common document related tasks.</p> <h2>Resources</h2> -<p>You can learn more about the syntax used for markdown at<br /> +<p>You can learn more about the syntax used for markdown at <a href="https://www.markdownguide.org/basic-syntax/">markdownguide.org</a>.</p> <h3>A non-exhaustive list of where you can use Markdown and editors.</h3> <table> @@ -272,44 +272,618 @@ common document related tasks.</p> <p>You can use tools such as <a href="https://pandoc.org/#">pandoc</a> to convert Markdown files to other formats.</p> <p><img src="/articles/images/2023-10-21-pandoc.gif" alt="pandoc" /></p> <h2>Conclusion</h2> -<p>I hope that you take the time to research and see if Markdown is good fit for your document /<br /> +<p>I hope that you take the time to research and see if Markdown is good fit for your document / content creation.</p> <p>Thanks for reading until the end!</p> +
        + + http://localhost:3000/articles/2023/free-quotes-are-bad-for-the-industry/ + Free quotes != good + 2025-02-20T15:56:18Z + <p>I found myself re-reading the +<a href="https://www.acca.org/communities/community-home/librarydocuments/viewdocument?DocumentKey=b1d2a39d-fda8-4af9-b8de-0ae579bfe24a">ACCA Quality Installation Standard</a> +recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the +items that are required as what I’m calling “prior to installation” items.</p> +<h2>Prior to installation</h2> +<ol> +<li>Ensure ventilation calculations are performed.</li> +<li>Building heat gain / loss calculation (Manual-J / Manual-N) +<ol> +<li>Room x room for new construction or duct modifications.</li> +<li>Block load for existing (can use original if available).</li> +</ol> +</li> +<li>Proper equipment capacity selection (Manual-S / Manual-CS)</li> +<li>Properly matched systems (AHRI or CEE-AHRI)</li> +</ol> +<p>Let’s break the above items down to a rough estimated time to complete each of the items.</p> +<table> +<thead> +<tr> +<th>Item</th> +<th>Time (minutes)</th> +</tr> +</thead> +<tbody> +<tr> +<td>Ventilation calculations</td> +<td>15</td> +</tr> +<tr> +<td>Manual-J (data gathering)</td> +<td>30</td> +</tr> +<tr> +<td>Manual-J (data entry / calculation)</td> +<td>30</td> +</tr> +<tr> +<td>Manual-S</td> +<td>15</td> +</tr> +<tr> +<td>AHRI</td> +<td>15</td> +</tr> +<tr> +<td><strong>Total</strong></td> +<td>105</td> +</tr> +</tbody> +</table> +<blockquote> +<p><em>The above items are obviously just estimations and the person’s experience in the different areas / tools they use. Some of the items are +probably on the low side while others are probably on the high side.</em></p> +</blockquote> +<p>This is 1.75 hours just to do the calculations required to meet the QI Standard. This does not include any of the time spent with the +customer building value in you or your product recommendations.</p> +<p>When you want to not guess at some of the calculations then a blower door test is generally required in order to understand the leakage of +the home, which adds even more time to the estimation process. Depending on the understanding you are looking for, the blower door test can +add 30-180 minutes. This takes the total time to 2.25-4.75 hours.</p> +<h2>Pushing boxes</h2> +<p>The majority of residential HVAC companies make the bulk of their income off of equipment sales, so they have to “feed the beast” by +skipping steps in both the installation of equipment and the sales process in order to close jobs and keep the ship afloat.</p> +<p><img src="/articles/images/2023-10-04-sinking-boat.png" alt="sinking-boat" /></p> +<p>This has helped contribute to these industry statistics:<a href="DOE" title="2018">^1</a></p> +<ul> +<li><strong>Incorrect refrigerant charge in greater than 50-80% of systems.</strong></li> +<li><strong>Improper airflow:</strong> +<ul> +<li><strong>70% above the rated 0.5” w.c.</strong></li> +<li><strong>47% above 0.7” w.c.</strong></li> +<li><strong>85% undersized / inappropriate filter.</strong></li> +</ul> +</li> +<li><strong>70-80% of systems have at least one fault.</strong></li> +<li><strong>90-100% if duct leakage is considered.</strong></li> +</ul> +<h2>Consumer responsibility</h2> +<p>Let me be clear, I don’t think that all the blame is on the industry here. The culture today is that everyone wants things for free and +fast. They have been conditioned by online services and box stores. Should we not cater to those that aren’t willing to do their leg work? +Is it really our fault, if they don’t care?</p> +<h2>Liability</h2> +<p>While it’s generally easy to shrug our shoulders and think that it’s ok to just continue on because all the competitors are doing the same +thing. There is at least the possibility that skipping steps can come back to bite you. If things ever went to litigation and the steps +outlined in the QI Standard are ignored, then there is high odds you would loose.</p> +<p>No matter what you do to try and protect yourself (having customers sign-off, etc) does not adequately protect your company from litigation. +There are stories out there where contractors were still held liable for not performing load calculations even though the consumer signed +off on it, because it is not inline with “industry best practices.”</p> +<h1>Summary</h1> +<p>This has led me to the conclusion that free quotes are just bad for the industry in general. The path forward is a challenge (changing +perception is hard). I don’t know that I have answers on what the best path forward is, to be frank, but I do know that our current <em>status +quo</em> is subpar to say the least.</p> +<p>Unfortunately, I don’t think the change is going to come from the industry, but that it’s going to require the consumer base to be more +educated and demand more from the industry. There have been many organizations that have dedicated years to changing the skill levels of +technicians in the industry, they are very well needed / don’t mistake my words here, however unless a company has faced litigation or +facing requests on a regular basis that demand better results, then why would a company change!?!</p> +<p>I’ve been trying (unsuccessfully) to get rid of free quotes for 5+ years in my company. We try to educate customers during maintenance +visits and when scheduling equipment estimates, however only about 10-20% choose to go down our paid Home Performance Assessment path. Our +installation process does follow the QI Standard for the items that pertain to the setup / commissioning of the installed equipment, however +there is just no sustainable way for us to completely follow the items outlined in this article without charging for our time, because at +the end of the day we still have to be competitive in our market.</p> +<p>There are days that I can justify our actions to myself and also days that I just want to throw in the towel / not sacrifice our integrity. +Integrity is something that I take very seriously, after all our companies tag line is <em>“Since 1954, Integrity is in the Housh!”</em></p> +<p>As mentioned, I’m not sure what the best path forward is! I hate to not have answers, but some problems are just complex and somewhat beyond +our control.</p> +<p>Let me know what you think some good solutions are.</p> +<ul> +<li>Does your company follow the QI Standard?</li> +<li>What are resources that you’ve found helpful in educating your customers?</li> +</ul> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-4/ + Introduction to Programming for HVAC Part-4 + 2025-02-20T16:31:35Z + <p>This article builds upon our <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-3/">last</a> article, so make sure to catch up +before continuing with this article.</p> +<h2>Arguments</h2> +<p>Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments are +supplied to shell scripts are separated by a space <code>&quot; &quot;</code>, as opposed to options which start with a <code>-&lt;character&gt;</code> or <code>--&lt;word&gt;</code>.</p> +<p>To illustrate this, let’s change our <code>hello-world</code> script we wrote in the last article.</p> +<p><strong>Move into our scripts directory:</strong></p> +<pre><code class="language-bash">cd ~/.local/bin +</code></pre> +<p><strong>Make a copy of the hello-world script:</strong></p> +<pre><code class="language-bash">cp hello-world greet +</code></pre> +<p>Above we make a copy of the hello-world file and name the copy <code>greet</code>.</p> +<p><strong>Open the greet file:</strong></p> +<pre><code class="language-bash">open -a TextEdit greet +</code></pre> +<blockquote> +<p><strong>Note:</strong> Because the greet file is an executable, in order to open it in the <code>TextEdit</code> application we must supply the <code>-a</code> option. +Otherwise it will just run our <code>greet</code> program in another terminal. Use <code>man open</code> to read more about the open command.</p> +</blockquote> +<p><strong>Edit the greet file:</strong></p> +<pre><code class="language-bash">#!/bin/sh + +echo &quot;Hello, ${1}!&quot; +</code></pre> +<p>Make sure to save <code>⌘s</code> the file.</p> +<p>Take note that the quotes need to be changed to <code>&quot;</code> (double quotes) from our original <code>hello-world</code> program.</p> +<p>The <code>${1}</code> is indicating that we will insert / interpret the first argument passed to our program and insert it at that location. Arguments +are interpreted in order they are passed in with <code>${0}</code> always representing the filename of the program that is called (generally not needed +/ used in your scripts).</p> +<p><strong>Test it out:</strong></p> +<pre><code class="language-bash">./greet Michael +</code></pre> +<p><img src="/articles/images/2023-09-26-greet-output.png" alt="greet-output" /></p> +<p>If you’d like to supply multiple words (or arguments that contain spaces) as a single argument then you can wrap them in quotes.</p> +<pre><code class="language-bash">./greet &quot;Michael Housh&quot; +</code></pre> +<blockquote> +<p><strong>Tip:</strong> Wrapping in quotes is especially useful for commands that take file paths, if any of the folders or file names contain spaces.</p> +</blockquote> +<h2>More Useful Program</h2> +<p>At this point, it’s time to build a more useful program that we can use. First, we must download some dependencies for our program.</p> +<p><strong>Install imagemagick:</strong></p> +<pre><code class="language-bash">brew install imagemagick +</code></pre> +<blockquote> +<p><strong>Note:</strong> If you’d like to check out the documentation / website for imagemagick you can run <code>brew home imagemagick</code>.</p> +</blockquote> +<p>This will take a bit for brew to install imagemagick and it’s dependencies. When it’s completed, we can check to make sure that imagemagick +is installed by running the following command.</p> +<pre><code class="language-bash">magick --version +</code></pre> +<p>It should output something along the lines of this below.</p> +<pre><code class="language-bash">Version: ImageMagick 7.1.1-17 Q16-HDRI aarch64 21569 https://imagemagick.org +Copyright: (C) 1999 ImageMagick Studio LLC +License: https://imagemagick.org/script/license.php +Features: Cipher DPC HDRI Modules OpenMP(5.0) +Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib +Compiler: gcc (4.2) +</code></pre> +<blockquote> +<p><strong>Tip:</strong> Don’t forget, you can use the <code>clear</code> command to clear the terminal.</p> +</blockquote> +<p><strong>Create our script:</strong></p> +<pre><code class="language-bash">touch mktrans +</code></pre> +<p>We are going to name our script <code>mktrans</code> as a short for make transparent.</p> +<p><strong>Open the file:</strong></p> +<pre><code class="language-bash">open mktrans +</code></pre> +<p><strong>The program:</strong></p> +<pre><code class="language-bash">#!/bin/bash + +# The input file path, passed in as the first argument. +inputfile=&quot;${1}&quot; + +# The color to make transparent, optionally passed in as the second argument. +# by default we handle / make white backgrounds transparent. +color=&quot;${2:-white}&quot; + +# Use the built-in basename command to normalize the input file name +# this will convert a file path, such as ~/Pictures/my-image.png to my-image.png. +fullfilename=$(basename -- &quot;$inputfile&quot;) + +# Use the text of the `fullfilename` up to the first '.' as the file name. +filename=&quot;${fullfilename%%.*}&quot; + +# Use the text after the last '.' as the file extension. +extension=&quot;${fullfilename##*.}&quot; + +# Create the output file name to use. +# +# For an input file of `input.png`, our output name would be +# `input-transparent.png`. +# +# This will output the file in the directory that we are +# in when we use our script (which may different than where +# the image is located) +outputfile=&quot;${filename}-transparent.${extension}&quot; + +# Make the magick happen :) +convert &quot;${inputfile}&quot; -fuzz 10% -transparent &quot;${color}&quot; &quot;${outputfile}&quot; + +</code></pre> +<p>I’ve included comments in the program above, which is good practice, as there is high odds that you will forget what is going on when / if +you open the file up in the future to look at it. We are using a lot of what is called parameter expansion magic in this file. You can read +up more on what we are doing in the <a href="https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html">bash documentation</a>.</p> +<p>This script is far from perfect, there are a lot of things to be improved upon. For example, if you download / save the banner image of this +post and run this script, it will also remove some color in the wizards beard, eyes, and eye brows. However, it does work very well for my +general use case, which is to remove the background from screenshots of pdf documents. It should be noted that it will not work on all types +of images, some image types do not allow transparency, so it is safest to call this with input image being a <code>.png</code> image type, however you +can use the <code>imagemagick</code> program that we downloaded to convert other image types to <code>.png</code>, but that will be left up to you to figure out.</p> +<h2>Using Our Program</h2> +<p>This is going to assume that you have download the banner image at the top of this article. You can do this by right-clicking and choosing +<code>Save As</code>. This should save the image in your downloads folder, and you can keep the name of <code>part4-banner.png</code>.</p> +<p><strong>Make the program executable:</strong></p> +<pre><code class="language-bash">chmod u+x mktrans +</code></pre> +<p><strong>Make the image background transparent:</strong></p> +<pre><code class="language-bash">./mktrans ~/Downloads/part4-banner.png +</code></pre> +<p><strong>Open the image:</strong></p> +<pre><code class="language-bash">open part4-banner-transparent.png +</code></pre> +<p>It should look like below.</p> +<p><img src="/articles/images/2023-09-26-part4-banner-transparent.png" alt="banner-transparent" /></p> +<blockquote> +<p><strong>Note:</strong> If you are viewing this site in <em>light</em> mode, the image does not look that bad. Hit the moon button in the top above my profile +image to see some of the flaws of our program.</p> +</blockquote> +<hr /> +<blockquote> +<p><strong>Tip:</strong> Remove the image from the <code>~/.local/bin</code> by using <code>rm part4-banner-transparent.png</code>. Be aware that the <code>rm</code> command can not be +undone, so use with caution / knowledge. It is safer, until you are more comfortable to use the <code>Finder</code> application and move the file to +the trash. In <code>Finder</code>, you can show hidden directories by typing <code>⌘.</code> or go directly to the folder by typing <code>⇧⌘G</code> (shift + command + G) +and in the pop-up typing <code>~/.local/bin</code>.</p> +</blockquote> +<hr /> +<p>That is it for this article. In the upcoming articles we will setup our <code>shell</code> environment so that we can use the commands we’ve built +without having to navigate to the <code>~/.local/bin</code> directory. Thank you for reading to the end, I hope you’re finding this series helpful.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-3/ + Introduction to Programming for HVAC Part-3 + 2025-02-20T16:20:56Z + <p>In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up <a href="https://mhoush.com/series/programming-for-hvac/">here</a> before continuing with this article.</p> +<h2>Getting Started</h2> +<p>We are going to make our first script / program. This first program is really just setting up some building blocks for our next program we +will write, that will remove the background from an image.</p> +<h3>Creating a scripts directory</h3> +<p>We learned in the <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first article</a> how to use our terminal. Today we are +going to use some of the commands we learned to create a directory where we can store our script and future scripts that we write.</p> +<p><strong>Create a directory</strong></p> +<pre><code class="language-bash">mkdir -p ~/.local/bin +</code></pre> +<p>The above command will create a “hidden” directory in your home folder. We can go ahead and move into the directory we just created.</p> +<blockquote> +<p><strong>Note:</strong> The <code>-p</code> option allows us to create nested directories if the parent directory doesn’t exist.</p> +</blockquote> +<pre><code class="language-bash">cd ~/.local/bin +</code></pre> +<h3>Hello World</h3> +<p>It is common in programming to start out with a “Hello World” program when learning a new scripting paradigm. So let’s jump in and get +started.</p> +<p><strong>Creating our script file:</strong></p> +<pre><code class="language-bash">touch hello-world.sh +</code></pre> +<p><strong>Now open the file:</strong></p> +<pre><code class="language-bash">open hello-world.sh +</code></pre> +<p>The above command should open the file in the <code>TextEdit</code> application. In order to make the text edit application to not auto-capitalize +words and play more nicely, we need to adjust some settings. Open the settings by pressing <code>⌘,</code>.</p> +<p>In the <strong>Format</strong> section, select <em>Plain text</em> and in the <strong>Options</strong> section de-select <em>Check spelling as you type</em>.</p> +<p><img src="/articles/images/2023-09-24-text-settings.png" alt="text-settings" /></p> +<p>At this point for changes to take place, you will need to close the file and re-open.</p> +<blockquote> +<p><strong>Tip:</strong> In your terminal you can run the last command in your history by using the <code>↑</code> (Up) arrow key.</p> +</blockquote> +<p>Now that the file is open again, we will write our hello-world program. The contents of your file should look like the following:</p> +<pre><code class="language-bash">#!/bin/sh + +echo 'Hello World!' +</code></pre> +<p>The first line is referred to as the <code>shebang</code>, this tells your computer which shell interperter to run your file. I have not explained the +shell yet, but it currently would just muddy the waters a bit, but there are several shell interperters on your computer with the <code>sh</code> posix +shell being one of the most universal / lowest level ones, which is why I’m choosing this one (in other words this script would work on just +about any machine you were on).</p> +<p>The second line we are using the built-in <code>echo</code> command and passing it the ‘Hello World!’ argument.</p> +<p>Now save and close the file <code>⌘s</code> (to save) <code>⌘q</code> (to quit the text edit application).</p> +<p><strong>Run the program from your terminal:</strong></p> +<pre><code class="language-bash">/bin/sh hello-world.sh +</code></pre> +<p>You should see that <code>Hello World!</code> was printed to your console.</p> +<p><img src="/articles/images/2023-09-24-hello-output.png" alt="hello-output" /></p> +<h3>Make Executable</h3> +<p>Now that we have our basic script working, let’s make it an executable.</p> +<p><strong>In your terminal, type the following:</strong></p> +<pre><code class="language-bash">chmod u+x hello-world.sh +</code></pre> +<p>This will change the mode of the file type to be an executable.</p> +<p>Now move / rename the file so we don’t have to call it using <code>.sh</code> extension:</p> +<pre><code class="language-bash">mv hello-world.sh hello-world +</code></pre> +<p>Now that the file is executable, we can execute it by just calling the name of the file.</p> +<pre><code class="language-bash">./hello-world +</code></pre> +<blockquote> +<p><strong>Note:</strong> We have to prefix the file name with <code>./</code> in the above command so that it knows where to find our file. The <code>./</code> is saying run +this file in our current directory. In the future we will setup our shell so that it knows to look in our <code>~/.local/bin</code> directory for +scripts, so that we can call them without this prefix.</p> +</blockquote> +<h2>Conclusion</h2> +<p>Congratulations, in this article we wrote our first program. We learned how to edit the file, set it’s permissions, and execute the program +from our terminal. I should mention that the <code>TextEdit</code> application is generally not how you would program, people typically use what is +known as an <code>IDE (integrated development environment)</code>, however I chose to use the <code>TextEdit</code> application because it is built-in to <code>macOS</code> +and allowed us to accomplish our goal without downloading other software.</p> +<p>In our upcoming articles, we will write a program that I hope is useful to you / something that you can build upon and use for a long time. +Thank you for reading to this point.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-2/ + Introduction to Programming for HVAC Part-2 + 2025-02-20T16:16:09Z + <p>In this article, learn about installing a package manager. If you missed it, check out the +<a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first</a> article in the series where we learned about using your terminal. +This article builds upon that foundation.</p> +<h2>What is a Package Manager</h2> +<p>A package manager is a piece of software that helps to install software and manage updates for your system. For me, the first thing that I +do with a new machine is install <code>Homebrew</code>. <a href="https://brew.sh">Homebrew</a> is my preferred package manager for <code>macOS</code>.</p> +<h2>Why</h2> +<p>A package manager is nice because often software relies / requires other dependencies in order to work properly. By using a package manager +it will make sure that the correct dependencies are installed for the software that you need to run. It allows you to be able to update and +manage software through a centralized interface.</p> +<h2>Installation</h2> +<p>Installation is simple. Open up your terminal and enter the following command (easiest to just copy / paste from the homepage linked above).</p> +<pre><code class="language-bash">/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot; +</code></pre> +<p>This will prompt you for your password in order to create some directories and install the required software for <code>brew</code> to work. The +installation may take some time, while it downloads the command line tools for <code>Xcode</code>.</p> +<p>When completed, follow the <code>Next Steps</code> and copy / paste the command listed, that should look like below.</p> +<pre><code class="language-bash">(echo; echo 'eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;') &gt;&gt; /Users/&lt;you&gt;/.zprofile +eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot; +</code></pre> +<p><img src="/articles/images/2023-09-22-brew-output.png" alt="brew-output" /></p> +<p>The first line of this command sets up some things in your shell profile (which we have not discussed yet) that will make <code>Homebrew</code> +available to you anytime you start a new session in your terminal. The second line of the command makes it available in your current +terminal session.</p> +<p>Next run the following command and make sure that everything is setup correctly.</p> +<pre><code class="language-bash">brew doctor +</code></pre> +<p>Which should output the following:</p> +<pre><code>Your system is ready to brew. +</code></pre> +<h3>Terminology</h3> +<p>Homebrew calls command line applications <code>formula</code> and normal graphical applications <code>casks</code>. It has the ability to install both styles of +applications.</p> +<h2>Search Command</h2> +<p>The following command is used to search for software packages:</p> +<pre><code class="language-bash">brew search chrome +</code></pre> +<h2>Open a Homepage</h2> +<p>The following command can be used to view the homepage of a formula or cask in your browser:</p> +<pre><code class="language-bash">brew home google-chrome +</code></pre> +<h2>Update Homebrew</h2> +<p>The following command is used to update homebrew:</p> +<pre><code class="language-bash">brew update +</code></pre> +<h2>Update packages installed on your system</h2> +<p>The following command is used to update software that is installed / managed by homebrew.</p> +<pre><code class="language-bash">brew upgrade +</code></pre> +<p>You can combine the update and upgrade commands, which will update homebrew and upgrade all the software it manages on you machine with the +following command.</p> +<pre><code class="language-bash">brew update &amp;&amp; brew upgrade +</code></pre> +<h2>Conclusion</h2> +<p>That is it for this article. I will say that for me, when I find a piece of software that I want to use, I generally try to search for it in +<code>brew</code> first, before installing it via other means.</p> +<p>I hope you’ve found this article helpful. In the next article we will start to use the skills that we’ve learned in these first two articles +and write our first program / script.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-1/ + Introduction to Programming for HVAC Part-1 + 2025-02-20T16:12:06Z + <p>This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.</p> +<h2>Why</h2> +<p>I think if nothing else, this series can help gain knowledge, tips, and tricks to make you more comfortable with your computer. I hope that +you will at least learn how to use your <code>terminal</code> application and more specifically <code>vim</code> motions and keybindings (more on that in another +article).</p> +<p>The goal of this article is to just get a machine setup with tools and to start exploring. I am a shill for <code>macOS</code>, so all of these will be +specifically geared towards that and my workflows, most everything that is showcased should also work on <code>linux</code> machines (not sure about +<code>windows</code>), although you may have to search for specific instructions on installing software for other platforms.</p> +<p>What I have learned on my journey in programming is that the more you can lean on small software packages that focus on a single task, but +do them well, the better. The less you use your mouse, the more productive you can be. The more you can work with <code>text</code> files and formats +the more portable and transformable your workflows can be.</p> +<h2>Getting Started</h2> +<p>The first thing that we will focus on is becoming familiar with the terminal application. On macOS the terminal application is located at +<code>/Applications/Utilities/Terminal.app</code>. However, rather than click around to find it, you can use the <code>⌘&lt;space&gt;</code> to pull up your spotlight +search, then type <code>Terminal</code> to select the terminal application.</p> +<p><img src="/articles/images/2023-09-21-spotlight.png" alt="spotlight" /></p> +<h3>Terminal Overview</h3> +<p>Your terminal is a program that allows you to run programs by typing commands into it’s window. There are a lot of built-in commands and a +bunch that you can install. The terminal is very customizable (and once familiar, you will constantly be tweaking / adjusting to suit your +needs). Right now customization is not what we will focus on, however in future articles I will provide tips and tricks on customizing it. +Right now, we only need to know how to open it up and type in commands.</p> +<p><img src="/articles/images/2023-09-21-terminal.png" alt="terminal" /></p> +<p>Below is an image / explanation of what the default status line includes.</p> +<p><img src="/articles/images/2023-09-21-terminal-line.png" alt="terminal-line" /></p> +<h3>Learn Basic Commands (Built-in)</h3> +<p>Here are a few basic commands that you should familiarize yourself with, as you will use them often when working inside of a terminal.</p> +<h3>Change Directory</h3> +<p><code>cd</code> (change directory) is the command that allows you to move around your file system when inside the terminal.</p> +<blockquote> +<p><strong>Note:</strong> <code>~</code> is a representation of your <code>Home</code> directory.</p> +</blockquote> +<pre><code class="language-bash">cd ~/Documents +</code></pre> +<p>The above command will move you into your Documents directory.</p> +<blockquote> +<p><strong>Note:</strong> If there are spaces in the name of the directory you try to move to then the easiest way is to wrap the name in quotes.</p> +</blockquote> +<pre><code class="language-bash">cd &quot;~/Documents/Product Concepts&quot; +</code></pre> +<p>Some other things to understand when moving around / supplying arguments to the <code>cd</code> command.</p> +<p>You can use <code>..</code> to go backwards / move up to the parent directory. For example, say we are in the <code>~/Documents</code> directory, to go back up to +the home directory we could use the following:</p> +<pre><code class="language-bash">cd .. +</code></pre> +<p>These can be chained together as well. For example say we are located in the <code>~/Documents/Product Concepts</code> directory, we could use the +following to go up two directory levels back to the home directory.</p> +<pre><code class="language-bash">cd ../.. +</code></pre> +<blockquote> +<p><strong>Pro-Tip:</strong> You can use the <code>&lt;tab&gt;</code> key when navigating to auto-complete, generally typing a few characters followed with the <code>&lt;tab&gt;</code> key +will auto-complete for you.</p> +</blockquote> +<h3>List files</h3> +<p>Use <code>ls</code> to output a list of files and directories where you are located.</p> +<pre><code class="language-bash">ls +</code></pre> +<p><em>Example Output when in my ~/Documents directory</em></p> +<pre><code class="language-bash">Estimates.app +InkscapeDrawings +KwikModel +MyAparment +NCISummit +Personal +Product Concepts +Receipts.receipts +RingCentral +SketchUP +Tech-Tips +desktop.ini +espanso-migrate-backup +espanso-migrate-backup-2 +</code></pre> +<p>Using options with <code>ls</code> to show more statistics and hidden files. There are often hidden files on your computer that are used for +application support or other purposes, these files are not shown using the default command. Hidden files start with a <code>.</code>, below is an +example of showing hidden files in your home directory.</p> +<pre><code class="language-bash">ls -la ~/ +</code></pre> +<blockquote> +<p><strong>Note:</strong> Above I added the <code>~/</code> which will allow you to list the files in your home directory even if you currently are not there in your +terminal, if you were already there (for example by using <code>cd ~/</code> then you would not need to use that at the end of the command.</p> +</blockquote> +<p><em>Example Output</em></p> +<pre><code>total 168 +drwxr-xr-x+ 46 michael staff 1472 Sep 22 10:45 . +drwxr-xr-x 6 root admin 192 Sep 22 09:08 .. +-r-------- 1 michael staff 7 Apr 8 2021 .CFUserTextEncoding +-rw-r--r--@ 1 michael staff 14340 Sep 18 10:15 .DS_Store +drwx------+ 5 michael staff 160 Sep 20 17:03 .Trash +-rw-r--r-- 1 michael staff 186 Sep 12 15:20 .actrc +drwxr-xr-x 4 michael staff 128 Dec 13 2021 .bin +drwxr-xr-x 3 michael staff 96 Mar 6 2023 .bundle +drwxr-xr-x 7 michael staff 224 Sep 12 11:40 .cabal +drwxr-xr-x 7 michael staff 224 Sep 12 15:20 .cache +drwxr-xr-x 13 michael staff 416 Aug 10 08:47 .config +drwx------ 3 michael staff 96 Jun 21 2021 .cups +drwxr-xr-x 12 michael staff 384 Sep 15 15:22 .docker +drwxr-xr-x 20 michael staff 640 Sep 19 08:11 .dotfiles +drwxr-xr-x 4 michael staff 128 Jul 26 2021 .gem +drwxr-xr-x 3 michael staff 96 Oct 11 2021 .jssc +-rw------- 1 michael staff 20 Sep 22 10:45 .lesshst +drwxr-x--- 3 michael staff 96 Mar 29 08:47 .lldb +drwxr-xr-x 8 michael staff 256 Mar 1 2023 .local +drwxr-xr-x 4 root staff 128 Apr 12 2021 .newtek +drwxr-xr-x 5 michael staff 160 Dec 13 2021 .npm +-rw------- 1 michael staff 27436 Apr 10 10:21 .psql_history +drwxr-xr-x 7 michael staff 224 Apr 18 2022 .ssh +drwxr-xr-x 6 michael staff 192 Sep 21 09:06 .swiftpm +lrwxr-xr-x 1 michael staff 25 Dec 27 2021 .tmux.conf -&gt; .dotfiles/tmux/.tmux.conf +drwxr-xr-x 8 michael staff 256 Mar 27 16:14 .twilio-cli +drwxr-xr-x 6 michael staff 192 Sep 18 11:08 .vim +-rw------- 1 michael staff 23086 Sep 21 09:45 .viminfo +-rw-r--r-- 1 michael staff 254 Sep 21 09:32 .wget-hsts +lrwxr-xr-x 1 michael staff 43 Jan 3 2022 .zshenv -&gt; /Users/michael/.dotfiles/zsh/config/.zshenv +drwxr-xr-x 8 michael staff 256 Dec 14 2021 AmazonWorkDocsCompanion +drwx------@ 4 michael staff 128 Dec 13 2021 Applications +lrwxr-xr-x 1 michael staff 40 Jun 6 12:00 Applications (Parallels) -&gt; /Volumes/Bucket/Applications (Parallels) +drwx------@ 30 michael staff 960 Sep 21 08:54 Desktop +drwx------@ 19 michael staff 608 Sep 14 10:15 Documents +drwx------@ 21 michael staff 672 Sep 21 09:43 Downloads +drwx------+ 115 michael staff 3680 Sep 14 10:04 Library +drwxr-xr-x 3 michael staff 96 Sep 8 13:06 LocalProjects +lrwxr-xr-x 1 michael staff 29 Dec 30 2021 Movies -&gt; /Volumes/Bucket/Videos/Movies +lrwxr-xr-x 1 michael staff 21 Dec 30 2021 Music -&gt; /Volumes/Bucket/Music +drwx------@ 2 michael staff 64 Mar 6 2023 Parallels +drwx------@ 7 michael staff 224 Sep 14 09:52 Pictures +drwxr-x---+ 4 michael staff 128 Apr 8 2021 Public +drwxr-xr-x+ 3 michael staff 96 Sep 14 09:52 Sites +drwxr-xr-x 3 michael staff 96 Jun 7 2021 WorkDocs Drive +drwxr-xr-x 3 michael staff 96 Sep 18 11:36 go +</code></pre> +<p>As you can see, I have a lot of hidden files and folders, your output will probably look much different than mine.</p> +<h3>Clearing the Terminal</h3> +<p>Often times you may want to clear the terminal screen. You can use the <code>clear</code> command to clear the screen of the terminal.</p> +<pre><code class="language-bash">clear +</code></pre> +<p>Or use a keyboard shortcut <code>⌃l</code> (<code>&lt;control&gt;l</code>)</p> +<h3>Creating Directories</h3> +<p>Use <code>mkdir</code> (make directory) to create a directory.</p> +<p>First, let’s move into the <code>tmp</code> directory, the <code>tmp</code> directory is a directory on your file system that is typically used for applications +to write temporary logs / files to, it get’s erased everytime your computer is restarted. We can use the <code>cd</code> command that we learned +earlier.</p> +<pre><code class="language-bash">cd /tmp +</code></pre> +<p>Next, let’s create a new directory called “MyDirectory”.</p> +<pre><code class="language-bash">mkdir MyDirectory +</code></pre> +<h4>Gotcha’s with ‘mkdir’</h4> +<p>By default you can’t create directories that are multiple levels deep, unless the directories already existed or we provide the <code>-p</code> option. +For example, if we want to create a directory at <code>/tmp/MyOtherDirectory/Nested/Deeply</code> then we could use the following command when inside +the <code>tmp</code> directory.</p> +<pre><code class="language-bash">mkdir -p MyOtherDirectory/Nested/Deeply +</code></pre> +<p>Now, try out using the <code>&lt;tab&gt;</code> key with the <code>cd</code> command to navigate to the <code>Deeply</code> folder.</p> +<pre><code class="language-bash">cd MyOther &lt;tab&gt; &lt;tab&gt; &lt;tab&gt; +</code></pre> +<h3>Open Command</h3> +<p>You can use the open command to open files or folders in the default application for the file type.</p> +<p>For example, if we want to open a <code>Finder</code> window while in the <code>/tmp</code> directory, we can use the following command:</p> +<pre><code class="language-bash">open . +</code></pre> +<h3>Manual Pages</h3> +<p>Lastly, to learn more about commands you can use the <code>man &lt;command&gt;</code>. To bring up the manual pages for the command in the terminal. You can +use the arrow keys to navigate around the manual pages and type the letter <code>q</code> to quit / close the manual pages.</p> +<pre><code class="language-bash">man ls +</code></pre> +<p>That is it for the first installment in this series. I hope you learned something and have better understanding of using your terminal.</p> http://localhost:3000/articles/2023/calculate-seer-degradation-by-age/ Calculate SEER Degradation by Age 2025-02-19T21:55:30Z - <p>This is a quick tech-tip to learn how to calculate the degradation of SEER based<br /> + <p>This is a quick tech-tip to learn how to calculate the degradation of SEER based on age.</p> -<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and<br /> -refrigerant charge losses. It should be noted that this is not true for all<br /> -applications, but is used as an estimation based on research done by the <code>DOE</code><br /> +<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and +refrigerant charge losses. It should be noted that this is not true for all +applications, but is used as an estimation based on research done by the <code>DOE</code> of the average degradation based on systems tested.</p> <h2>Formula</h2> -<p>This is the formula used to calculate the SEER based on age of the evaporator<br /> +<p>This is the formula used to calculate the SEER based on age of the evaporator coil / air handler.</p> <p>$$ SEER_d = SEER_n \times (1 - M)^{age} $$</p> -<p>| Where | |<br /> -| –––– | —————————————— | — |<br /> -| $SEER_d$ | Degradated SEER rating |<br /> -| $SEER_n$ | Nominal SEER rating when equipment was new |  |<br /> -| M | Maintenance factor, 0.01-0.03 |<br /> +<p>| Where | | +| –––– | —————————————— | — | +| $SEER_d$ | Degradated SEER rating | +| $SEER_n$ | Nominal SEER rating when equipment was new |  | +| M | Maintenance factor, 0.01-0.03 | | age | The age of the equipment, in years |</p> -<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is<br /> -for unmaintained. The maintenance factor in essence is based on 1%-3%<br /> -degradation per year, however there are some<br /> -<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a><br /> -that show that this can actually be as high as 5% or above depending on climate.<br /> -We could use up to 0.05 as the maintenance factor, just to see what the “range”<br /> +<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is +for unmaintained. The maintenance factor in essence is based on 1%-3% +degradation per year, however there are some +<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a> +that show that this can actually be as high as 5% or above depending on climate. +We could use up to 0.05 as the maintenance factor, just to see what the “range” of degradation would be.</p> -<p>Interestingly, the study linked also shows that the degradation is higher the<br /> -higher the tonnage of the equipment. It also shows that the degradation is lower<br /> -per year the higher the nominal SEER rating of the system (which is corelated to<br /> -using TXV’s and lower airflow rates because of the equipment having multiple<br /> +<p>Interestingly, the study linked also shows that the degradation is higher the +higher the tonnage of the equipment. It also shows that the degradation is lower +per year the higher the nominal SEER rating of the system (which is corelated to +using TXV’s and lower airflow rates because of the equipment having multiple stages).</p> <h2>Example</h2> -<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when<br /> +<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when installed and the system is 15 years old.</p> <p>Plugging those numbers into our formula.</p> <hr /> @@ -319,9 +893,370 @@ installed and the system is 15 years old.</p> <h4>Highest Rage (5% degradation / year)</h4> <p>$$ SEER_d = 13 \times (1 - 0.05)^{15} = 6 $$</p> <hr /> -<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER<br /> -vs. a poorly maintained / dirty system that also suffers from refrigerant charge<br /> +<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER +vs. a poorly maintained / dirty system that also suffers from refrigerant charge losses can be as low as 6 SEER.</p> <p>Thanks for learning how to estimate SEER degradation based on equipment age!</p> + + http://localhost:3000/articles/2023/introducing-psychrometrics-cli/ + Introducing Psychrometrics CLI + 2025-02-20T16:03:19Z + <p>Today, I’m releasing a command line application that is built on top of my +<a href="https://github.com/swift-psychrometrics/swift-psychrometrics">swift-psychrometrics</a> package, that I open sourced over 2 years ago.</p> +<p>The application consists of many calculations / conversions for psychrometric properties of an air stream. The tool works for both imperial +and metric units. The application will work natively on macOS, but can also be ran through a <code>docker</code> container on other platforms.</p> +<h2>Why</h2> +<p>I spend a lot of time in my terminal, because I can work so much more efficiently. I discovered many years ago that the more I can do using +simple applications and keyboard over a mouse and a web browser or native application the more I can accomplish. I understand this is +intimidating for many who think they are <em>“not good with computers”.</em> I can assure that was me several years ago, I would only encourage you +to not be afraid and give it a shot. We are at a time in society where it is easier than ever to get informed and learned new skills.</p> +<h2>Installation</h2> +<p>For complete installation instructions, you can view the <a href="https://github.com/swift-psychrometrics/psychrometrics-cli">github</a> repository.</p> +<p>The following instructions are based on using macOS.</p> +<h3>Open your terminal application.</h3> +<p>Personally, I use <a href="https://iterm2.com/">iTerm2</a>, however you can use the default <code>Terminal</code> app. Found at +<code>/Applications/Utilities/Terminal.app</code>.</p> +<h2>Install Homebrew</h2> +<p>We use <a href="https://brew.sh">Homebrew</a> for package distribution of the pre-built application binaries. You can follow their instructions to +install.</p> +<h3>Tap our custom formula tap.</h3> +<pre><code class="language-bash">brew tap swift-psychrometrics/formula +</code></pre> +<h3>Install the psychrometrics application</h3> +<pre><code class="language-bash">brew install psychrometrics +</code></pre> +<p>That’s it!</p> +<h2>Usage</h2> +<p>I will run through a couple of the commands that are supplied with the application and show what you can expect the outputs to be.</p> +<h3>Properties</h3> +<p>The following command will output a bunch of the psychrometric properties of an air stream. There are several ways to call it, but generally +you will supply the dry bulb temperature and the relative humidity.</p> +<p>Below, we calculate the psychrometric properties based on 75°F and 50% humidity.</p> +<pre><code class="language-bash">psychrometrics --dry-bulb 75 --relative-humidity 50 +</code></pre> +<p><img src="/articles/images/2023-09-18-properties.png" alt="properties-output" /></p> +<h3>Dehumidifier Sizing</h3> +<p>If you’ve read some of my recent articles on calculating the +<a href="https://mhoush.com/posts/sizing-dehumidifier-by-latent-load/">dehumidifier size required based on the latent load</a>, the application also +ships with a calculation that will do this for you and has the ability to calculate it at different <code>coverages</code> that you can supply.</p> +<p>For example if we’ve done a load calculation and determined that we have a latent load of <code>4,334 BTU/h</code> then we could run the following +command to see what size dehumidifier is needed for <code>100%, 85%, and 70%</code> of the latent load.</p> +<pre><code class="language-bash">psychrometrics dh size --coverage 100 85 70 --verbose 4334 +</code></pre> +<p><img src="/articles/images/2023-09-18-dh-size.png" alt="dh-size" /></p> +<h3>Pounds of Water Removed</h3> +<p>I also recently wrote an article about <a href="https://mhoush.com/posts/pounds-of-water-removed/">calculating the pounds of water removed</a> from an +air stream given the grains of moisture removed.</p> +<p>Below is an example of calculating the pounds of water removed per hour based on the example in the article (14 delta-grains)</p> +<pre><code class="language-bash">psychrometrics dh pounds-removed --delta 14 --cfm 797 --verbose +</code></pre> +<p><img src="/articles/images/2023-09-18-pounds-removed.png" alt="pounds-removed" /></p> +<h3>Help</h3> +<p>You can use <code>--help</code> option to show help and the list of commands provided.</p> +<p><img src="/articles/images/2023-09-18-help.png" alt="help" /></p> +<p>If you have any questions then feel free to email or message me. I hope some of you may find this application useful.</p> + + + http://localhost:3000/articles/2023/sizing-dehumidifier-by-latent-load/ + Dehumidifier Sizing by Latent Load + 2025-02-20T17:04:37Z + <p>This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure.</p> +<h2>Formulas</h2> +<p>The formula above is used to solve for the pints per hour required to size a dehumidifier.</p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Ph</td> +<td>Pints / hour</td> +</tr> +</tbody> +</table> +<p>We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day.png" alt="pints-per-day-formula" /></p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Pd</td> +<td>Pints / day</td> +</tr> +</tbody> +</table> +<p>In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized +properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during +peak cooling demand.</p> +<h2>Example</h2> +<p>Let’s imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example.png" alt="pints-per-day-formula-example" /></p> +<p>Or if we just want to cover the latent capacity at 85% of the full latent load.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example2.png" alt="pints-per-day-formula-example" /></p> +<p>This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition +we wanted to use.</p> +<p>I don’t feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an +oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application.</p> +<p>Thanks for reading!</p> + + + http://localhost:3000/articles/2023/why-mini-splits-stink/ + Why Mini Splits Stink + 2025-02-20T17:06:24Z + <p>In this general article, I explain why I don’t generally like to use mini-splits.</p> +<h2>The Positive Sides</h2> +<p>When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted +consoles. These units do offer really high efficiency and becuase they’re “ductless” you don’t have duct gains/losses.</p> +<p>These units are common in many other countries and have been around for a long time. They do are generally quick and fairly easy to install, +but are mostly a pain in the tail to work on.</p> +<p>So, the plus side to these units are that they are really efficient, they generally have models that have a high-heat output for colder +climates, although this option is becoming more prevelant in traditional unitary style heat pumps as well. You do not have heat gains or +losses due to ductwork being in unconditioned spaces.</p> +<h2>The Down Sides</h2> +<p>Most mini-split systems do not do the greatest at humidity removal. This is partially because they use proprietary algorithms to control the +blower and compressor. They do achieve long run-times, which is often good for comfort stand points, however there is generally not a good +way to control / hack them to work towards achieving good IAQ.</p> +<p>These units offer next to no filtration, so in order to have filtration you need to utilize a stand-alone / portable filtration means. Which +a lot of the portable filtration systems have problems of their own (come bundled with UV / PCO technology or other “space” technology that +can lead to their own IAQ problems). It also introduces another fan, which may / may not be that efficient. In other words, when considering +other items to make them more comparable to what a traditional system offers, are they really that much more efficient?</p> +<p>These systems also do not have a good method of offering basic fresh air control / management, so other systems, such as an ERV need to be +installed to handle the fresh air requirements of the building.</p> +<p>The controls for these systems are often hard to understand / use. They do allow you to change fan speeds, but they control the compressor. +The fans often run all the time, which is not necessarily a bad thing, but they don’t really offer many ramping profiles or adjustments to +change the blower speed when the compressor is off vs. on.</p> +<p>These systems get dirty quickly, are generally a pain to clean properly, and are not easily repairable. Manufacturer support is often poor, +the documents aren’t always translated very well, and most technicians hate to work on them.</p> +<h1>What about ducted models?</h1> +<p>But what about the ducted models? Well, the ducted models are a step in the right direction. You can use filters on them, although some of +the manufacturer’s do not recommend installing better / improved filter cabinets (like a 4-5” media filter), however we have done that +successfully many times and always include media filters as an option on our installations, but you do need to make sure that they have a +very low pressure drop, as they a lot are not designed for very much static pressure.</p> +<p>The ducted models still generally have the same control problems, previously mentioned. If you read my introduction to the +<a href="https://mhoush.com/posts/coil-bypass-overview/">coil-bypass-system</a>, you have a basic understanding that even most traditional systems / +designers do not focus on the proper air-changes in a structure to maintain proper IAQ levels.</p> +<p>You can’t easily pair mini-splits with larger fan-coils because they are “communicating” style systems.</p> +<h2>Conclusion</h2> +<p>Don’t get me wrong, there are applications that are well suited for mini-splits. These are often applications like sun-rooms, garages, small +server-rooms / network storage rooms, and many others. But in my opinion these are not at all my favorite and are generally really far down +my list of options that I want to recommend to my clients.</p> +<p>As an industry, I feel we need to step back and refocus on the pillars of IAQ. Filtration, fresh-air, and humidity control. The +manufacturers / government should put less emphasis on chasing efficiency just to shoot ourselves in the foot and loose the qualities that +make traditional / unitary style systems cover more if not all of the 3 pillars of proper IAQ.</p> +<p>There’s plenty that I did not cover and I’m sure I missed some things, but just needed to rant for a few minutes… Thank you for making it +to the end!</p> + + + http://localhost:3000/articles/2023/pounds-of-water-removed/ + Pounds of Water Removed + 2025-02-20T16:43:21Z + <p>This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream).</p> +<p>This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This +article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here +are a couple articles to familiarize yourself.</p> +<h2>Articles</h2> +<ul> +<li><a href="https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/">Understand Dew-Point</a></li> +<li><a href="https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/">Impact of Adding or Removing Water from Air</a></li> +</ul> +<h2>Scenario</h2> +<p>Let’s imagine that we have an air-conditioner that has the following measurements taken:</p> +<ul> +<li>Return Air: 75° / 50% RH</li> +<li>Supply Air: 55° / 81% RH</li> +</ul> +<p>We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air +conditions).</p> +<p><img src="/articles/images/2023-09-08-pounds-of-water-removed.png" alt="chart" /></p> +<p>We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the +relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per +pound of air.</p> +<p>This gives us the following values:</p> +<ul> +<li>Return Air: 66 gr/lb</li> +<li>Supply Air: 52 gr/lb</li> +</ul> +<p>We can then use the following formula to calculate the pounds of water removed.</p> +<p><img src="/articles/images/2023-09-08-formula.png" alt="formula" /></p> +<table> +<thead> +<tr> +<th><strong>Where</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>W</strong></td> +<td><em>Weight of water in pounds per hour</em></td> +</tr> +<tr> +<td><strong>4.5</strong></td> +<td><em>Constant based on density / specific heat of moist air</em></td> +</tr> +<tr> +<td><strong>CFM</strong></td> +<td><em>Airflow in cubic feet per minute</em></td> +</tr> +<tr> +<td><strong>∆G</strong></td> +<td><em>Difference in grains of moisture</em></td> +</tr> +<tr> +<td><strong>7000</strong></td> +<td><em>Constant based on grains of moisture in saturated air</em></td> +</tr> +</tbody> +</table> +<h2>Solution</h2> +<p>First, we solve for the difference in grains between the two air streams.</p> +<p>∆G = 66 - 52 = 14</p> +<p>Next, we’ve measured our airflow and have determined to have <strong>797 CFM</strong> of airflow across the evaporator coil, so we can substitute our +values into the formula.</p> +<p><img src="/articles/images/2023-09-08-solution.png" alt="solution" /></p> +<p>So, we are removing about 7 pounds of water per hour at these conditions.</p> +<p>Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that +can often be rated in pints per day.</p> +<p>I hope you’ve found this article helpful, thanks for reading!</p> + + + http://localhost:3000/articles/2023/coil-bypass-overview/ + Coil Bypass Overview + 2025-02-20T15:14:48Z + <p>This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a +coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the challenges of this style of +system.</p> +<h2>What is a Coil Bypass</h2> +<p>A coil bypass is not to be mistaken for a zoning system bypass, where airflow is “relieved” from the supply side of the system back into the +return. Instead, a coil bypass diverts a portion of the airflow around the coil using a bypass damper(s). The bypass can serve several +functions depending on the application, but in general it allows for a constant volume of air to be delivered to the space while the output +of the coil can be shifted towards more or less dehumidification. In other words, it decouples the total system airflow from the coil +airflow.</p> +<p>The bypassed air mixes with the supply air stream to act as a reheat source, however unlike a typical reheat source it does not add more +sensible load to the structure, instead it just brings the supply air temperature closer to the existing home’s temperature while still +covering the latent and sensible loads of the home. A warmer duct system reduces the losses of the duct to unconditioned spaces as well as +reduces the risk for duct condensation.</p> +<p>The coil bypass strategy, as far as I know, was pioneered by <a href="https://www.linkedin.com/in/harry-boody-9b8a4366/">Harry Boody</a> of Energy +Innovations and Scientific Environmental Design, Inc. However their websites are no longer active, so I’m not sure if they are still active +in the HVAC design space or not.</p> +<h2>The Problem</h2> +<table> +<thead> +<tr> +<th>Why</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Question</td> +<td>Why would we want to utilize a strategy such as the coil bypass?</td> +</tr> +<tr> +<td>Answer</td> +<td>Improved indoor air quality (IAQ)</td> +</tr> +</tbody> +</table> +<p>ASHRAE’s recommandation for the amount of air changes per hour (ACH) in a residential structure to be in the range of 3-5 ACH, and in +general the higher the better, along with a MERV 13+ filter. In some / most cases the system airflow does not meet that criteria, especially +low load homes or high volume homes.</p> +<p>For example, let’s imagine a single story ranch home that is 2,500 square feet with 9 foot ceilings. This home is relatively tight +construction and after doing the heating and cooling loads we’ve selected a 2.5 Ton system for this home. It is located in a green grass +climate that needs some priority on dehumidification and requires an airflow of 350 CFM/Ton (875 CFM).</p> +<p>We determine the volume of the conditioned space.</p> +<p>2,500 x 9 = 22,500 ft^3</p> +<p><img src="/articles/images/2023-08-10-volume-equation.png" alt="volume-equation" /></p> +<table> +<thead> +<tr> +<th><strong>Where:</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>V</strong></td> +<td><em>is the volume of the home</em></td> +</tr> +<tr> +<td><strong>ACH</strong></td> +<td><em>is the desired air changes per hour</em></td> +</tr> +<tr> +<td><strong>60</strong></td> +<td><em>conversion from hours to minutes</em></td> +</tr> +</tbody> +</table> +<p>Below is a table of the required CFM to meet the different air changes per hour.</p> +<table> +<thead> +<tr> +<th></th> +<th align="center">CFM</th> +</tr> +</thead> +<tbody> +<tr> +<td>(22,500 x 3)/60</td> +<td align="center"><strong><em>1,125 @ 3 ACH</em></strong></td> +</tr> +<tr> +<td>(22,500 x 4)/60</td> +<td align="center"><strong><em>1,500 @ 4 ACH</em></strong></td> +</tr> +<tr> +<td>(22,500 x 5)/60</td> +<td align="center"><strong><em>1,875 @ 5 ACH</em></strong></td> +</tr> +</tbody> +</table> +<p>As you can see we have a discrepency of meeting even the low end of 3 ACH. The high end of 5 ACH is over 2x the airflow for our 2.5 Ton +system. The coil bypass strategy is one viable way, by decoupling the total system airflow from the coil airflow without, which eliminates +the need of an auxilary fan / system that circulates air through some sort of filtration system.</p> +<h3>Multi-Stage Systems</h3> +<p>A challenge with multi-stage systems, even when sized properly, is that we often run at part-load conditions, and spend the majority of the +time in lower stages. The lower stages often do worse at dehumidification than when running at full load.</p> +<p>When the equipment runs in lower stages on a traditional system the total system airflow is reduced even further from the recommended air +changes per hour. This reduced airflow also causes the throw of the air from the registers to be reduced which can lead to increased odds of +stratification, poor air mixing, and increased potential for poor mean radiant temperatures (MRT) of the surfaces. The decreased airflow in +low stages, lowers the velocity in the duct system, while low velocity is not a concern, it does increase the duct gains and increase the +possibility of condensation on the ducts when they’re located outside of the thermal envelope of the building.</p> +<p>Let’s imagine we have a duct system that has high wall registers located in a soffit at the interior wall that moves 100 CFM and we are +trying to throw the air to the exterior wall which includes a window. The wall is @ 12 feet from the register. We’ve selected a register +that meets the criteria, at high stage airflow it has a throw of 11.5 feet (shown as the green rectangle). When the system runs in low +stage, the airflow is reduced to 70% of high stage (70 CFM), which would give us a throw from the register of @ 7 feet (shown as the red +rectangle).</p> +<p><img src="/articles/images/2023-08-10-register-throw.png" alt="register-throw" /></p> +<p>The reduced flow through the register causes the air to only make it about 60% across the room before reaching it’s terminal velocity, which +can cause the room to feel uncomfortable since the air never reaches the exterior wall and window.</p> +<p>By decoupling the fan from the coil airflow it is possible to run in low stages, still have adequate dehumidification performance out of the +system, and achieve the proper throw from the registers.</p> +<h2>Conclusion</h2> +<p>In this article we’ve begun to scratch the surface of what a coil bypass strategy is in an HVAC system, as well as some of the challenges +that it can help solve. We’ve learned about why we may desire to decouple the total system airflow from the coil airflow.</p> +<p>In future articles we will continue to explore some of the features, benefits, and challenges presented by such a strategy.</p> +<h2>Related Resources</h2> +<p><a href="https://hvacrschool.com/bypass-dehumidification-airflow-hvac-design/">HVAC School - Bypass Dehumidification / Airflow HVAC Design</a></p> + \ No newline at end of file diff --git a/deploy/articles/tag/hvac/index.html b/deploy/articles/tag/hvac/index.html index ad68b3f..55302f6 100644 --- a/deploy/articles/tag/hvac/index.html +++ b/deploy/articles/tag/hvac/index.html @@ -110,6 +110,77 @@ Markdown is a “mark-up” language. It allows you to write content in plain te converted to other formats, such as html, pdf, docx, and many more. All...

        +
        +

        + Free quotes != good +

        + +

        + I found myself re-reading the +ACCA Quality Installation Standard +recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the +items that are required as what I’m calling... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-4 +

        + +

        + This article builds upon our last article, so make sure to catch up +before continuing with this article. +Arguments +Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-3 +

        + +

        + In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up here before continuing with this article. +Getting Started +We are going to make... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-2 +

        + +

        + In this article, learn about installing a package manager. If you missed it, check out the +first article in the series where we learned about using your terminal. +This article builds upon that foundation. +What is a Package Manager +A package manager... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-1 +

        + +

        + This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers. +Why +I... +

        +

        Calculate SEER Degradation by Age @@ -124,6 +195,72 @@ The degradation of SEER is due to fouling of the evaporator coil with dirt and refrigerant charge losses. It should be noted that this is not true for...

        +
        +

        + Introducing Psychrometrics CLI +

        + +

        + Today, I’m releasing a command line application that is built on top of my +swift-psychrometrics package, that I open sourced over 2 years ago. +The application consists of many calculations / conversions for psychrometric properties of an air stream.... +

        +
        +
        +

        + Dehumidifier Sizing by Latent Load +

        + +

        + This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure. +Formulas +The formula above is used to... +

        +
        +
        +

        + Why Mini Splits Stink +

        + +

        + In this general article, I explain why I don’t generally like to use mini-splits. +The Positive Sides +When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted +consoles.... +

        +
        +
        +

        + Pounds of Water Removed +

        + +

        + This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream). +This is useful in the field when you want to calculate the... +

        +
        +
        +

        + Coil Bypass Overview +

        + +

        + This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a +coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the... +

        +
        \ No newline at end of file diff --git a/deploy/articles/tag/hydronics/feed.xml b/deploy/articles/tag/hydronics/feed.xml index 5917746..30b84bf 100644 --- a/deploy/articles/tag/hydronics/feed.xml +++ b/deploy/articles/tag/hydronics/feed.xml @@ -6,53 +6,53 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2023/heat-recovery-chiller/ Heat Recovery Chiller 2025-02-19T21:08:37Z - <p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so<br /> -I’m doing it now. I did discuss this on<br /> + <p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so +I’m doing it now. I did discuss this on <a href="https://hvacrschool.com/podcasts/is-the-future-of-air-conditioning-self-contained-propane-chillers/">this episode of the HVAC School Podcast.</a></p> <h2>Heat Recovery Chillers</h2> -<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that<br /> -common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most<br /> -equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds<br /> +<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that +common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most +equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds in this article, but offer an overview of what I feel would be my dream system.</p> <h2>The Source</h2> -<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional<br /> -heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would<br /> -have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to<br /> -bank / store heat, or are running in heat only mode. There are several benefits to this style<br /> -system, the main being that while operating simultaneous heating / cooling mode the COP of the<br /> -system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of<br /> -about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level<br /> +<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional +heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would +have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to +bank / store heat, or are running in heat only mode. There are several benefits to this style +system, the main being that while operating simultaneous heating / cooling mode the COP of the +system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of +about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level performance without the need of a field.</p> <h2>Indoor Portion</h2> -<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller.<br /> -The buffer tanks give us several benefits, including longer run times for the chiller, load<br /> -matching, and the ability to size for larger load (heating or cooling) without some of the problems<br /> -that occur when over-sizing a traditional system. The buffer tanks also allow sizing more<br /> +<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller. +The buffer tanks give us several benefits, including longer run times for the chiller, load +matching, and the ability to size for larger load (heating or cooling) without some of the problems +that occur when over-sizing a traditional system. The buffer tanks also allow sizing more aggressively by having storage during peak load conditions.</p> <p><img src="/articles/images/2023-10-27-buffers2.png" alt="buffer" /></p> -<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what<br /> -circulate water through the chiller, while the vertical pumps are what distribute the water to the<br /> -load / emitters. This configuration allows for water to be used for the loads first and extra<br /> -capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps<br /> -(meaning that they won’t interfere with each other if / when there are different flow rates).<br /> -Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in<br /> -parallel to the system. This is shown by the extra tees in the hot buffer tank where we could<br /> -connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler.<br /> -You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat<br /> +<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what +circulate water through the chiller, while the vertical pumps are what distribute the water to the +load / emitters. This configuration allows for water to be used for the loads first and extra +capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps +(meaning that they won’t interfere with each other if / when there are different flow rates). +Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in +parallel to the system. This is shown by the extra tees in the hot buffer tank where we could +connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler. +You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat exchanger that would be used to supply domestic hot water.</p> <h2>Distribution System</h2> -<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators,<br /> +<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators, however I’m going to model it as a 4-pipe hydronic air handler.</p> <p><img src="/articles/images/2023-10-27-ah.png" alt="ah" /></p> -<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in<br /> -one package. With a hydronic system, it would be very easy to load match by controlling the fan<br /> -speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from<br /> -several manufacturers and come in different styles from traditional (as shown), small duct high<br /> +<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in +one package. With a hydronic system, it would be very easy to load match by controlling the fan +speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from +several manufacturers and come in different styles from traditional (as shown), small duct high velocity systems, and even ductless styles.</p> <h2>Disadvantages</h2> <ol> @@ -61,7 +61,7 @@ velocity systems, and even ductless styles.</p> <li>Lack of understanding / technicians afraid to work on this style system.</li> <li>Potentially higher upfront costs.</li> <li>Lack of design or planning could cause unhappy clients (same with traditional)</li> -<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement<br /> +<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement for traditional boiler systems)</li> </ol> <h2>Advantages</h2> @@ -75,11 +75,11 @@ for traditional boiler systems)</li> <li>Easier transition to natural / flammable refrigerants</li> </ol> <h2>Conclusion</h2> -<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the<br /> -main points is to think of the system in 3 distinct components, the source(s), thermal storage, and<br /> -distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish<br /> -this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to<br /> -dump excess heat into a pool, create ice storage during off peak hours, cascade into another water<br /> +<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the +main points is to think of the system in 3 distinct components, the source(s), thermal storage, and +distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish +this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to +dump excess heat into a pool, create ice storage during off peak hours, cascade into another water -&gt; water heat pump for higher temperature distribution, incorporate solar collectors, and so on.</p> <p>Thank you for reading all the way to the end!</p> diff --git a/deploy/articles/tag/hydronics/index.html b/deploy/articles/tag/hydronics/index.html index d7c45c3..3e48c1e 100644 --- a/deploy/articles/tag/hydronics/index.html +++ b/deploy/articles/tag/hydronics/index.html @@ -74,6 +74,12 @@ I have always had a love and passion for... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/nas/feed.xml b/deploy/articles/tag/nas/feed.xml index cd8107f..ea8ea1b 100644 --- a/deploy/articles/tag/nas/feed.xml +++ b/deploy/articles/tag/nas/feed.xml @@ -6,24 +6,24 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2024/unvr-as-nas/ UNVR as NAS 2025-02-19T21:32:01Z - <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be<br /> -used as NAS (network attached storage). Be aware that this should be done with caution and may void<br /> -any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also<br /> -possible that this setup will break when / if updating the UNVR software. With that said, let’s jump<br /> + <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be +used as NAS (network attached storage). Be aware that this should be done with caution and may void +any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also +possible that this setup will break when / if updating the UNVR software. With that said, let’s jump in.</p> -<p>This post follows along with<br /> -<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>,<br /> +<p>This post follows along with +<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>, with some adaptations to get it to work on the latest Unifi-OS release of <code>3.2.12</code>.</p> <h2>Step One - Setup SSH &amp; Login</h2> -<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password<br /> +<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password for the root user to login to the UNVR.</p> <p><img src="/articles/images/2024-03-15-ssh.png" alt="ssh.png" /></p> -<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR<br /> +<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR on your network.</p> <p><code>ssh root@192.168.1.10</code></p> <h2>Step Two - Install Samba</h2> @@ -32,14 +32,14 @@ on your network.</p> <p>Next, install samba.</p> <p><code>apt-get install samba</code></p> <h2>Step Three - Setup Samba</h2> -<p>In order to edit the configuration we are going to need to install your terminal based text editor<br /> +<p>In order to edit the configuration we are going to need to install your terminal based text editor of choice (generally nano or vim), for me I will install vim.</p> <p><code>apt-get install vim</code></p> <p>Create a backup of the default configuration.</p> <p><code>cp /etc/samba/smb.conf /etc/samba/smb.conf.bak</code></p> <p>Open the configuration file to be edited.</p> <p><code>vim /etc/samba/smb.conf</code></p> -<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to<br /> +<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to make the samba server act better for time machine backups.</p> <pre><code>#======================= MacOS Client Optimizations ======================= vfs objects = fruit streams_xattr @@ -52,11 +52,11 @@ fruit:wipe_intentionally_left_blank_rfork = yes fruit:delete_empty_adfiles = yes </code></pre> -<p>Also because we want users we create to be able to read and write to their home directories created<br /> -on the samba server, we need to change the option under the <code>[homes]</code> share definition to be<br /> +<p>Also because we want users we create to be able to read and write to their home directories created +on the samba server, we need to change the option under the <code>[homes]</code> share definition to be <code>read only = no</code>.</p> -<p>That is our primary configuration. You can add more share definitions at the bottom of the file to<br /> -suit your use case, there are decent examples of this in the original reddit post, linked in the<br /> +<p>That is our primary configuration. You can add more share definitions at the bottom of the file to +suit your use case, there are decent examples of this in the original reddit post, linked in the beginning.</p> <p>Save and exit the file.</p> <p><code>:wq</code></p> @@ -77,13 +77,13 @@ beginning.</p> <p>In the <code>Finder</code> app on macOS you can type <code>⌘k</code> to connect to a server.</p> <p>In the text field enter <code>smb://&lt;USER&gt;@&lt;UNVR_IP&gt;</code> to connect to the samba server.</p> <p><img src="/articles/images/2024-03-15-connect.png" alt="connect" /></p> -<p>You can also automatically connect to the server when you login to your client device, for this to<br /> -work you need the credentials to be stored in your keychain (ticking the box in the step above when<br /> +<p>You can also automatically connect to the server when you login to your client device, for this to +work you need the credentials to be stored in your keychain (ticking the box in the step above when you first connect to the server).</p> -<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button<br /> +<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button and select the volume you would like to mount at login.</p> <p><img src="/articles/images/2024-03-15-login.png" alt="login" /></p> -<p>Once you have it setup so that the server is connected on login, you can also set it up as location<br /> +<p>Once you have it setup so that the server is connected on login, you can also set it up as location for Time Machine Backups. <code>System Settings -&gt; General -&gt; Time Machine</code></p> <p><img src="/articles/images/2024-03-15-time-machine.png" alt="time-machine" /></p> diff --git a/deploy/articles/tag/nas/index.html b/deploy/articles/tag/nas/index.html index 3345acb..7651afc 100644 --- a/deploy/articles/tag/nas/index.html +++ b/deploy/articles/tag/nas/index.html @@ -72,6 +72,12 @@ any warranty on your UNVR as we are using it for... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/networking/feed.xml b/deploy/articles/tag/networking/feed.xml index dbd2ef7..9f7e62b 100644 --- a/deploy/articles/tag/networking/feed.xml +++ b/deploy/articles/tag/networking/feed.xml @@ -6,24 +6,24 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2024/unvr-as-nas/ UNVR as NAS 2025-02-19T21:32:01Z - <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be<br /> -used as NAS (network attached storage). Be aware that this should be done with caution and may void<br /> -any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also<br /> -possible that this setup will break when / if updating the UNVR software. With that said, let’s jump<br /> + <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be +used as NAS (network attached storage). Be aware that this should be done with caution and may void +any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also +possible that this setup will break when / if updating the UNVR software. With that said, let’s jump in.</p> -<p>This post follows along with<br /> -<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>,<br /> +<p>This post follows along with +<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>, with some adaptations to get it to work on the latest Unifi-OS release of <code>3.2.12</code>.</p> <h2>Step One - Setup SSH &amp; Login</h2> -<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password<br /> +<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password for the root user to login to the UNVR.</p> <p><img src="/articles/images/2024-03-15-ssh.png" alt="ssh.png" /></p> -<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR<br /> +<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR on your network.</p> <p><code>ssh root@192.168.1.10</code></p> <h2>Step Two - Install Samba</h2> @@ -32,14 +32,14 @@ on your network.</p> <p>Next, install samba.</p> <p><code>apt-get install samba</code></p> <h2>Step Three - Setup Samba</h2> -<p>In order to edit the configuration we are going to need to install your terminal based text editor<br /> +<p>In order to edit the configuration we are going to need to install your terminal based text editor of choice (generally nano or vim), for me I will install vim.</p> <p><code>apt-get install vim</code></p> <p>Create a backup of the default configuration.</p> <p><code>cp /etc/samba/smb.conf /etc/samba/smb.conf.bak</code></p> <p>Open the configuration file to be edited.</p> <p><code>vim /etc/samba/smb.conf</code></p> -<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to<br /> +<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to make the samba server act better for time machine backups.</p> <pre><code>#======================= MacOS Client Optimizations ======================= vfs objects = fruit streams_xattr @@ -52,11 +52,11 @@ fruit:wipe_intentionally_left_blank_rfork = yes fruit:delete_empty_adfiles = yes </code></pre> -<p>Also because we want users we create to be able to read and write to their home directories created<br /> -on the samba server, we need to change the option under the <code>[homes]</code> share definition to be<br /> +<p>Also because we want users we create to be able to read and write to their home directories created +on the samba server, we need to change the option under the <code>[homes]</code> share definition to be <code>read only = no</code>.</p> -<p>That is our primary configuration. You can add more share definitions at the bottom of the file to<br /> -suit your use case, there are decent examples of this in the original reddit post, linked in the<br /> +<p>That is our primary configuration. You can add more share definitions at the bottom of the file to +suit your use case, there are decent examples of this in the original reddit post, linked in the beginning.</p> <p>Save and exit the file.</p> <p><code>:wq</code></p> @@ -77,13 +77,13 @@ beginning.</p> <p>In the <code>Finder</code> app on macOS you can type <code>⌘k</code> to connect to a server.</p> <p>In the text field enter <code>smb://&lt;USER&gt;@&lt;UNVR_IP&gt;</code> to connect to the samba server.</p> <p><img src="/articles/images/2024-03-15-connect.png" alt="connect" /></p> -<p>You can also automatically connect to the server when you login to your client device, for this to<br /> -work you need the credentials to be stored in your keychain (ticking the box in the step above when<br /> +<p>You can also automatically connect to the server when you login to your client device, for this to +work you need the credentials to be stored in your keychain (ticking the box in the step above when you first connect to the server).</p> -<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button<br /> +<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button and select the volume you would like to mount at login.</p> <p><img src="/articles/images/2024-03-15-login.png" alt="login" /></p> -<p>Once you have it setup so that the server is connected on login, you can also set it up as location<br /> +<p>Once you have it setup so that the server is connected on login, you can also set it up as location for Time Machine Backups. <code>System Settings -&gt; General -&gt; Time Machine</code></p> <p><img src="/articles/images/2024-03-15-time-machine.png" alt="time-machine" /></p> diff --git a/deploy/articles/tag/networking/index.html b/deploy/articles/tag/networking/index.html index a4bfc90..3a27c1b 100644 --- a/deploy/articles/tag/networking/index.html +++ b/deploy/articles/tag/networking/index.html @@ -72,6 +72,12 @@ any warranty on your UNVR as we are using it for... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/open-source/feed.xml b/deploy/articles/tag/open-source/feed.xml index f8de1d2..a839b53 100644 --- a/deploy/articles/tag/open-source/feed.xml +++ b/deploy/articles/tag/open-source/feed.xml @@ -6,7 +6,7 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2024/free-as-in-freedom/ Free As In Freedom diff --git a/deploy/articles/tag/open-source/index.html b/deploy/articles/tag/open-source/index.html index d830afb..f5668d1 100644 --- a/deploy/articles/tag/open-source/index.html +++ b/deploy/articles/tag/open-source/index.html @@ -70,6 +70,12 @@ | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/pgp/feed.xml b/deploy/articles/tag/pgp/feed.xml index eb6cd61..e239edb 100644 --- a/deploy/articles/tag/pgp/feed.xml +++ b/deploy/articles/tag/pgp/feed.xml @@ -6,74 +6,74 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2024/pgp-encryption-introduction/ PGP Encryption Introduction 2025-02-19T21:36:11Z <p>In this article I introduce PGP and show a use case for me, which perhaps you can use as well.</p> <h2>What is PGP</h2> -<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses<br /> +<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses cryptographic privacy and authentication and is generally used in data communication.</p> -<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired<br /> -by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s<br /> +<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired +by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s fictional town of Lake Wobegon.</p> -<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both<br /> +<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both who the commits were from as well as make sure they were not modified from the original versions.</p> -<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which<br /> +<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which are implementations of the PGP standard protocol.</p> <h2>What it does</h2> <blockquote> -<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms<br /> +<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms that I understand / make sense to me. Do what I do at your own risk!</p> </blockquote> -<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption<br /> -(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource<br /> +<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption +(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource intensive (which is generally not a problem with computers of today).</p> -<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of<br /> -the key par is meant to be shared with others freely, while the private portion needs to be secured<br /> -/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is<br /> -“air gapped”, meaning it is not connected to any network / internet, and does not save a history of<br /> +<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of +the key par is meant to be shared with others freely, while the private portion needs to be secured +/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is +“air gapped”, meaning it is not connected to any network / internet, and does not save a history of commands performed on it.</p> -<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public<br /> +<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public key. The recipients private key is required to decrypt the data once it’s been encrypted.</p> -<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can<br /> -also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it<br /> -can be tied to your same private key. This is useful for example for work vs. activism vs. software<br /> +<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can +also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it +can be tied to your same private key. This is useful for example for work vs. activism vs. software development.</p> -<p>Once your key is generated and your private key secured, you can share your public portion of the<br /> +<p>Once your key is generated and your private key secured, you can share your public portion of the key to a “keyserver” where other people can download it and verify messages were sent by you.</p> <h2>Web of Trust</h2> -<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are<br /> -encrypted by a trusted source. There are different levels of trust depending on where a key is<br /> -retrieved from. For example, if somebody gave you their public key in person and you were able to<br /> -inspect that the identity matches their government id, then you can give it a higher trust level<br /> +<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are +encrypted by a trusted source. There are different levels of trust depending on where a key is +retrieved from. For example, if somebody gave you their public key in person and you were able to +inspect that the identity matches their government id, then you can give it a higher trust level than one that is sent / retrieved from a keyserver.</p> -<p>My understanding of this portion is that over time your key is signed by other’s with their level of<br /> +<p>My understanding of this portion is that over time your key is signed by other’s with their level of certainty about you / your key, which over time increases the overall trust in your key.</p> <h2>Out of the weeds</h2> -<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use<br /> +<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use cases of PGP encryption.</p> -<p>PGP encryption is used by some email clients / applications, such as<br /> -<a href="https://canarymail.io/">Canary</a>,<br /> -<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or<br /> +<p>PGP encryption is used by some email clients / applications, such as +<a href="https://canarymail.io/">Canary</a>, +<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or <a href="https://gpgtools.tenderapp.com/">GPGSuite</a>.</p> -<p>In my understanding, it is also what is used in devices such as a<br /> +<p>In my understanding, it is also what is used in devices such as a <a href="https://www.yubico.com/">YubiKey</a>.</p> -<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons<br /> +<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons it is not very popular is that it can be hard to use PGP for the average person.</p> -<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files<br /> -that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a<br /> -computer (in reality a gang of computers in a data center). You are solely reliant that these cloud<br /> +<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files +that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a +computer (in reality a gang of computers in a data center). You are solely reliant that these cloud providers are not snooping on, inspecting, or even selling your data.</p> -<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit<br /> -of effort on your part you can at least make it very hard for anyone to know what is inside your<br /> -documents. You can be in control of the way your items are encrypted and have confidence that nobody<br /> +<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit +of effort on your part you can at least make it very hard for anyone to know what is inside your +documents. You can be in control of the way your items are encrypted and have confidence that nobody but you can access what is inside your documents.</p> -<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something<br /> +<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something get’s stolen or someone breach’s my network they will not be able to easily get to sensitive data.</p> <h2>Conclusion</h2> -<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how<br /> +<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how to use it to encrypt your data and be in control of your privacy.</p> <h3>Resources</h3> <ul> diff --git a/deploy/articles/tag/pgp/index.html b/deploy/articles/tag/pgp/index.html index 7e88814..2d2166b 100644 --- a/deploy/articles/tag/pgp/index.html +++ b/deploy/articles/tag/pgp/index.html @@ -73,6 +73,12 @@ cryptographic privacy and authentication and is... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/programming/feed.xml b/deploy/articles/tag/programming/feed.xml index 73e20ae..eb247e7 100644 --- a/deploy/articles/tag/programming/feed.xml +++ b/deploy/articles/tag/programming/feed.xml @@ -5,14 +5,14 @@ Michael Housh - - 2025-02-19T21:55:31Z + + 2025-02-20T17:12:57Z http://localhost:3000/articles/2025/vapor-htmx-todo-app/ Vapor + HTMX - 2025-02-19T21:47:31Z + 2025-02-20T14:15:37Z Build an example application using Vapor and HTMX. - + http://localhost:3000/articles/2024/pgp-encryption-introduction/ @@ -20,67 +20,67 @@ 2025-02-19T21:36:11Z <p>In this article I introduce PGP and show a use case for me, which perhaps you can use as well.</p> <h2>What is PGP</h2> -<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses<br /> +<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses cryptographic privacy and authentication and is generally used in data communication.</p> -<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired<br /> -by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s<br /> +<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired +by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s fictional town of Lake Wobegon.</p> -<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both<br /> +<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both who the commits were from as well as make sure they were not modified from the original versions.</p> -<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which<br /> +<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which are implementations of the PGP standard protocol.</p> <h2>What it does</h2> <blockquote> -<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms<br /> +<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms that I understand / make sense to me. Do what I do at your own risk!</p> </blockquote> -<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption<br /> -(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource<br /> +<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption +(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource intensive (which is generally not a problem with computers of today).</p> -<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of<br /> -the key par is meant to be shared with others freely, while the private portion needs to be secured<br /> -/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is<br /> -“air gapped”, meaning it is not connected to any network / internet, and does not save a history of<br /> +<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of +the key par is meant to be shared with others freely, while the private portion needs to be secured +/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is +“air gapped”, meaning it is not connected to any network / internet, and does not save a history of commands performed on it.</p> -<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public<br /> +<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public key. The recipients private key is required to decrypt the data once it’s been encrypted.</p> -<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can<br /> -also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it<br /> -can be tied to your same private key. This is useful for example for work vs. activism vs. software<br /> +<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can +also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it +can be tied to your same private key. This is useful for example for work vs. activism vs. software development.</p> -<p>Once your key is generated and your private key secured, you can share your public portion of the<br /> +<p>Once your key is generated and your private key secured, you can share your public portion of the key to a “keyserver” where other people can download it and verify messages were sent by you.</p> <h2>Web of Trust</h2> -<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are<br /> -encrypted by a trusted source. There are different levels of trust depending on where a key is<br /> -retrieved from. For example, if somebody gave you their public key in person and you were able to<br /> -inspect that the identity matches their government id, then you can give it a higher trust level<br /> +<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are +encrypted by a trusted source. There are different levels of trust depending on where a key is +retrieved from. For example, if somebody gave you their public key in person and you were able to +inspect that the identity matches their government id, then you can give it a higher trust level than one that is sent / retrieved from a keyserver.</p> -<p>My understanding of this portion is that over time your key is signed by other’s with their level of<br /> +<p>My understanding of this portion is that over time your key is signed by other’s with their level of certainty about you / your key, which over time increases the overall trust in your key.</p> <h2>Out of the weeds</h2> -<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use<br /> +<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use cases of PGP encryption.</p> -<p>PGP encryption is used by some email clients / applications, such as<br /> -<a href="https://canarymail.io/">Canary</a>,<br /> -<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or<br /> +<p>PGP encryption is used by some email clients / applications, such as +<a href="https://canarymail.io/">Canary</a>, +<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or <a href="https://gpgtools.tenderapp.com/">GPGSuite</a>.</p> -<p>In my understanding, it is also what is used in devices such as a<br /> +<p>In my understanding, it is also what is used in devices such as a <a href="https://www.yubico.com/">YubiKey</a>.</p> -<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons<br /> +<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons it is not very popular is that it can be hard to use PGP for the average person.</p> -<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files<br /> -that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a<br /> -computer (in reality a gang of computers in a data center). You are solely reliant that these cloud<br /> +<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files +that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a +computer (in reality a gang of computers in a data center). You are solely reliant that these cloud providers are not snooping on, inspecting, or even selling your data.</p> -<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit<br /> -of effort on your part you can at least make it very hard for anyone to know what is inside your<br /> -documents. You can be in control of the way your items are encrypted and have confidence that nobody<br /> +<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit +of effort on your part you can at least make it very hard for anyone to know what is inside your +documents. You can be in control of the way your items are encrypted and have confidence that nobody but you can access what is inside your documents.</p> -<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something<br /> +<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something get’s stolen or someone breach’s my network they will not be able to easily get to sensitive data.</p> <h2>Conclusion</h2> -<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how<br /> +<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how to use it to encrypt your data and be in control of your privacy.</p> <h3>Resources</h3> <ul> @@ -94,19 +94,19 @@ to use it to encrypt your data and be in control of your privacy.</p> http://localhost:3000/articles/2024/unvr-as-nas/ UNVR as NAS 2025-02-19T21:32:01Z - <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be<br /> -used as NAS (network attached storage). Be aware that this should be done with caution and may void<br /> -any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also<br /> -possible that this setup will break when / if updating the UNVR software. With that said, let’s jump<br /> + <p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be +used as NAS (network attached storage). Be aware that this should be done with caution and may void +any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also +possible that this setup will break when / if updating the UNVR software. With that said, let’s jump in.</p> -<p>This post follows along with<br /> -<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>,<br /> +<p>This post follows along with +<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>, with some adaptations to get it to work on the latest Unifi-OS release of <code>3.2.12</code>.</p> <h2>Step One - Setup SSH &amp; Login</h2> -<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password<br /> +<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password for the root user to login to the UNVR.</p> <p><img src="/articles/images/2024-03-15-ssh.png" alt="ssh.png" /></p> -<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR<br /> +<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR on your network.</p> <p><code>ssh root@192.168.1.10</code></p> <h2>Step Two - Install Samba</h2> @@ -115,14 +115,14 @@ on your network.</p> <p>Next, install samba.</p> <p><code>apt-get install samba</code></p> <h2>Step Three - Setup Samba</h2> -<p>In order to edit the configuration we are going to need to install your terminal based text editor<br /> +<p>In order to edit the configuration we are going to need to install your terminal based text editor of choice (generally nano or vim), for me I will install vim.</p> <p><code>apt-get install vim</code></p> <p>Create a backup of the default configuration.</p> <p><code>cp /etc/samba/smb.conf /etc/samba/smb.conf.bak</code></p> <p>Open the configuration file to be edited.</p> <p><code>vim /etc/samba/smb.conf</code></p> -<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to<br /> +<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to make the samba server act better for time machine backups.</p> <pre><code>#======================= MacOS Client Optimizations ======================= vfs objects = fruit streams_xattr @@ -135,11 +135,11 @@ fruit:wipe_intentionally_left_blank_rfork = yes fruit:delete_empty_adfiles = yes </code></pre> -<p>Also because we want users we create to be able to read and write to their home directories created<br /> -on the samba server, we need to change the option under the <code>[homes]</code> share definition to be<br /> +<p>Also because we want users we create to be able to read and write to their home directories created +on the samba server, we need to change the option under the <code>[homes]</code> share definition to be <code>read only = no</code>.</p> -<p>That is our primary configuration. You can add more share definitions at the bottom of the file to<br /> -suit your use case, there are decent examples of this in the original reddit post, linked in the<br /> +<p>That is our primary configuration. You can add more share definitions at the bottom of the file to +suit your use case, there are decent examples of this in the original reddit post, linked in the beginning.</p> <p>Save and exit the file.</p> <p><code>:wq</code></p> @@ -160,13 +160,13 @@ beginning.</p> <p>In the <code>Finder</code> app on macOS you can type <code>⌘k</code> to connect to a server.</p> <p>In the text field enter <code>smb://&lt;USER&gt;@&lt;UNVR_IP&gt;</code> to connect to the samba server.</p> <p><img src="/articles/images/2024-03-15-connect.png" alt="connect" /></p> -<p>You can also automatically connect to the server when you login to your client device, for this to<br /> -work you need the credentials to be stored in your keychain (ticking the box in the step above when<br /> +<p>You can also automatically connect to the server when you login to your client device, for this to +work you need the credentials to be stored in your keychain (ticking the box in the step above when you first connect to the server).</p> -<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button<br /> +<p>This is found in <code>System Settings -&gt; General -&gt; Login Items -&gt; Open at Login</code>. Click the plus button and select the volume you would like to mount at login.</p> <p><img src="/articles/images/2024-03-15-login.png" alt="login" /></p> -<p>Once you have it setup so that the server is connected on login, you can also set it up as location<br /> +<p>Once you have it setup so that the server is connected on login, you can also set it up as location for Time Machine Backups. <code>System Settings -&gt; General -&gt; Time Machine</code></p> <p><img src="/articles/images/2024-03-15-time-machine.png" alt="time-machine" /></p> @@ -176,25 +176,25 @@ for Time Machine Backups. <code>System Settings -&gt; General -&gt 2025-02-19T20:51:49Z <p>This is a quick article about why you should learn markdown.</p> <h2>What is markdown</h2> -<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily<br /> -converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on<br /> +<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily +converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on this website are written in markdown, here’s an image of this article written in markdown.</p> <p><img src="/articles/images/2023-10-21-markdown.png" alt="markdown" /></p> -<p>The reason you should learn markdown is that it allows you to focus on the content / text of your<br /> -content with simple concepts for formatting. Markdown is used heavily in documenting software<br /> -projects, which is how I got introduced to it, however it can scale all the way up to writing<br /> +<p>The reason you should learn markdown is that it allows you to focus on the content / text of your +content with simple concepts for formatting. Markdown is used heavily in documenting software +projects, which is how I got introduced to it, however it can scale all the way up to writing research papers or even books.</p> -<p>I use markdown for probably 80% of all the text documents I need to write, from company documents,<br /> -web / software documentation, and so on. It allows me to get content out quickly without having to<br /> -click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of<br /> -the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using<br /> -<strong>Pages</strong> (for now at least) because I have templates that make the documents look more<br /> +<p>I use markdown for probably 80% of all the text documents I need to write, from company documents, +web / software documentation, and so on. It allows me to get content out quickly without having to +click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of +the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using +<strong>Pages</strong> (for now at least) because I have templates that make the documents look more professional, however I am working on solutions to migrate those to be markdown based.</p> -<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client<br /> -(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many<br /> +<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client +(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many common document related tasks.</p> <h2>Resources</h2> -<p>You can learn more about the syntax used for markdown at<br /> +<p>You can learn more about the syntax used for markdown at <a href="https://www.markdownguide.org/basic-syntax/">markdownguide.org</a>.</p> <h3>A non-exhaustive list of where you can use Markdown and editors.</h3> <table> @@ -226,8 +226,467 @@ common document related tasks.</p> <p>You can use tools such as <a href="https://pandoc.org/#">pandoc</a> to convert Markdown files to other formats.</p> <p><img src="/articles/images/2023-10-21-pandoc.gif" alt="pandoc" /></p> <h2>Conclusion</h2> -<p>I hope that you take the time to research and see if Markdown is good fit for your document /<br /> +<p>I hope that you take the time to research and see if Markdown is good fit for your document / content creation.</p> <p>Thanks for reading until the end!</p>
        + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-4/ + Introduction to Programming for HVAC Part-4 + 2025-02-20T16:31:35Z + <p>This article builds upon our <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-3/">last</a> article, so make sure to catch up +before continuing with this article.</p> +<h2>Arguments</h2> +<p>Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments are +supplied to shell scripts are separated by a space <code>&quot; &quot;</code>, as opposed to options which start with a <code>-&lt;character&gt;</code> or <code>--&lt;word&gt;</code>.</p> +<p>To illustrate this, let’s change our <code>hello-world</code> script we wrote in the last article.</p> +<p><strong>Move into our scripts directory:</strong></p> +<pre><code class="language-bash">cd ~/.local/bin +</code></pre> +<p><strong>Make a copy of the hello-world script:</strong></p> +<pre><code class="language-bash">cp hello-world greet +</code></pre> +<p>Above we make a copy of the hello-world file and name the copy <code>greet</code>.</p> +<p><strong>Open the greet file:</strong></p> +<pre><code class="language-bash">open -a TextEdit greet +</code></pre> +<blockquote> +<p><strong>Note:</strong> Because the greet file is an executable, in order to open it in the <code>TextEdit</code> application we must supply the <code>-a</code> option. +Otherwise it will just run our <code>greet</code> program in another terminal. Use <code>man open</code> to read more about the open command.</p> +</blockquote> +<p><strong>Edit the greet file:</strong></p> +<pre><code class="language-bash">#!/bin/sh + +echo &quot;Hello, ${1}!&quot; +</code></pre> +<p>Make sure to save <code>⌘s</code> the file.</p> +<p>Take note that the quotes need to be changed to <code>&quot;</code> (double quotes) from our original <code>hello-world</code> program.</p> +<p>The <code>${1}</code> is indicating that we will insert / interpret the first argument passed to our program and insert it at that location. Arguments +are interpreted in order they are passed in with <code>${0}</code> always representing the filename of the program that is called (generally not needed +/ used in your scripts).</p> +<p><strong>Test it out:</strong></p> +<pre><code class="language-bash">./greet Michael +</code></pre> +<p><img src="/articles/images/2023-09-26-greet-output.png" alt="greet-output" /></p> +<p>If you’d like to supply multiple words (or arguments that contain spaces) as a single argument then you can wrap them in quotes.</p> +<pre><code class="language-bash">./greet &quot;Michael Housh&quot; +</code></pre> +<blockquote> +<p><strong>Tip:</strong> Wrapping in quotes is especially useful for commands that take file paths, if any of the folders or file names contain spaces.</p> +</blockquote> +<h2>More Useful Program</h2> +<p>At this point, it’s time to build a more useful program that we can use. First, we must download some dependencies for our program.</p> +<p><strong>Install imagemagick:</strong></p> +<pre><code class="language-bash">brew install imagemagick +</code></pre> +<blockquote> +<p><strong>Note:</strong> If you’d like to check out the documentation / website for imagemagick you can run <code>brew home imagemagick</code>.</p> +</blockquote> +<p>This will take a bit for brew to install imagemagick and it’s dependencies. When it’s completed, we can check to make sure that imagemagick +is installed by running the following command.</p> +<pre><code class="language-bash">magick --version +</code></pre> +<p>It should output something along the lines of this below.</p> +<pre><code class="language-bash">Version: ImageMagick 7.1.1-17 Q16-HDRI aarch64 21569 https://imagemagick.org +Copyright: (C) 1999 ImageMagick Studio LLC +License: https://imagemagick.org/script/license.php +Features: Cipher DPC HDRI Modules OpenMP(5.0) +Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib +Compiler: gcc (4.2) +</code></pre> +<blockquote> +<p><strong>Tip:</strong> Don’t forget, you can use the <code>clear</code> command to clear the terminal.</p> +</blockquote> +<p><strong>Create our script:</strong></p> +<pre><code class="language-bash">touch mktrans +</code></pre> +<p>We are going to name our script <code>mktrans</code> as a short for make transparent.</p> +<p><strong>Open the file:</strong></p> +<pre><code class="language-bash">open mktrans +</code></pre> +<p><strong>The program:</strong></p> +<pre><code class="language-bash">#!/bin/bash + +# The input file path, passed in as the first argument. +inputfile=&quot;${1}&quot; + +# The color to make transparent, optionally passed in as the second argument. +# by default we handle / make white backgrounds transparent. +color=&quot;${2:-white}&quot; + +# Use the built-in basename command to normalize the input file name +# this will convert a file path, such as ~/Pictures/my-image.png to my-image.png. +fullfilename=$(basename -- &quot;$inputfile&quot;) + +# Use the text of the `fullfilename` up to the first '.' as the file name. +filename=&quot;${fullfilename%%.*}&quot; + +# Use the text after the last '.' as the file extension. +extension=&quot;${fullfilename##*.}&quot; + +# Create the output file name to use. +# +# For an input file of `input.png`, our output name would be +# `input-transparent.png`. +# +# This will output the file in the directory that we are +# in when we use our script (which may different than where +# the image is located) +outputfile=&quot;${filename}-transparent.${extension}&quot; + +# Make the magick happen :) +convert &quot;${inputfile}&quot; -fuzz 10% -transparent &quot;${color}&quot; &quot;${outputfile}&quot; + +</code></pre> +<p>I’ve included comments in the program above, which is good practice, as there is high odds that you will forget what is going on when / if +you open the file up in the future to look at it. We are using a lot of what is called parameter expansion magic in this file. You can read +up more on what we are doing in the <a href="https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html">bash documentation</a>.</p> +<p>This script is far from perfect, there are a lot of things to be improved upon. For example, if you download / save the banner image of this +post and run this script, it will also remove some color in the wizards beard, eyes, and eye brows. However, it does work very well for my +general use case, which is to remove the background from screenshots of pdf documents. It should be noted that it will not work on all types +of images, some image types do not allow transparency, so it is safest to call this with input image being a <code>.png</code> image type, however you +can use the <code>imagemagick</code> program that we downloaded to convert other image types to <code>.png</code>, but that will be left up to you to figure out.</p> +<h2>Using Our Program</h2> +<p>This is going to assume that you have download the banner image at the top of this article. You can do this by right-clicking and choosing +<code>Save As</code>. This should save the image in your downloads folder, and you can keep the name of <code>part4-banner.png</code>.</p> +<p><strong>Make the program executable:</strong></p> +<pre><code class="language-bash">chmod u+x mktrans +</code></pre> +<p><strong>Make the image background transparent:</strong></p> +<pre><code class="language-bash">./mktrans ~/Downloads/part4-banner.png +</code></pre> +<p><strong>Open the image:</strong></p> +<pre><code class="language-bash">open part4-banner-transparent.png +</code></pre> +<p>It should look like below.</p> +<p><img src="/articles/images/2023-09-26-part4-banner-transparent.png" alt="banner-transparent" /></p> +<blockquote> +<p><strong>Note:</strong> If you are viewing this site in <em>light</em> mode, the image does not look that bad. Hit the moon button in the top above my profile +image to see some of the flaws of our program.</p> +</blockquote> +<hr /> +<blockquote> +<p><strong>Tip:</strong> Remove the image from the <code>~/.local/bin</code> by using <code>rm part4-banner-transparent.png</code>. Be aware that the <code>rm</code> command can not be +undone, so use with caution / knowledge. It is safer, until you are more comfortable to use the <code>Finder</code> application and move the file to +the trash. In <code>Finder</code>, you can show hidden directories by typing <code>⌘.</code> or go directly to the folder by typing <code>⇧⌘G</code> (shift + command + G) +and in the pop-up typing <code>~/.local/bin</code>.</p> +</blockquote> +<hr /> +<p>That is it for this article. In the upcoming articles we will setup our <code>shell</code> environment so that we can use the commands we’ve built +without having to navigate to the <code>~/.local/bin</code> directory. Thank you for reading to the end, I hope you’re finding this series helpful.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-3/ + Introduction to Programming for HVAC Part-3 + 2025-02-20T16:20:56Z + <p>In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up <a href="https://mhoush.com/series/programming-for-hvac/">here</a> before continuing with this article.</p> +<h2>Getting Started</h2> +<p>We are going to make our first script / program. This first program is really just setting up some building blocks for our next program we +will write, that will remove the background from an image.</p> +<h3>Creating a scripts directory</h3> +<p>We learned in the <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first article</a> how to use our terminal. Today we are +going to use some of the commands we learned to create a directory where we can store our script and future scripts that we write.</p> +<p><strong>Create a directory</strong></p> +<pre><code class="language-bash">mkdir -p ~/.local/bin +</code></pre> +<p>The above command will create a “hidden” directory in your home folder. We can go ahead and move into the directory we just created.</p> +<blockquote> +<p><strong>Note:</strong> The <code>-p</code> option allows us to create nested directories if the parent directory doesn’t exist.</p> +</blockquote> +<pre><code class="language-bash">cd ~/.local/bin +</code></pre> +<h3>Hello World</h3> +<p>It is common in programming to start out with a “Hello World” program when learning a new scripting paradigm. So let’s jump in and get +started.</p> +<p><strong>Creating our script file:</strong></p> +<pre><code class="language-bash">touch hello-world.sh +</code></pre> +<p><strong>Now open the file:</strong></p> +<pre><code class="language-bash">open hello-world.sh +</code></pre> +<p>The above command should open the file in the <code>TextEdit</code> application. In order to make the text edit application to not auto-capitalize +words and play more nicely, we need to adjust some settings. Open the settings by pressing <code>⌘,</code>.</p> +<p>In the <strong>Format</strong> section, select <em>Plain text</em> and in the <strong>Options</strong> section de-select <em>Check spelling as you type</em>.</p> +<p><img src="/articles/images/2023-09-24-text-settings.png" alt="text-settings" /></p> +<p>At this point for changes to take place, you will need to close the file and re-open.</p> +<blockquote> +<p><strong>Tip:</strong> In your terminal you can run the last command in your history by using the <code>↑</code> (Up) arrow key.</p> +</blockquote> +<p>Now that the file is open again, we will write our hello-world program. The contents of your file should look like the following:</p> +<pre><code class="language-bash">#!/bin/sh + +echo 'Hello World!' +</code></pre> +<p>The first line is referred to as the <code>shebang</code>, this tells your computer which shell interperter to run your file. I have not explained the +shell yet, but it currently would just muddy the waters a bit, but there are several shell interperters on your computer with the <code>sh</code> posix +shell being one of the most universal / lowest level ones, which is why I’m choosing this one (in other words this script would work on just +about any machine you were on).</p> +<p>The second line we are using the built-in <code>echo</code> command and passing it the ‘Hello World!’ argument.</p> +<p>Now save and close the file <code>⌘s</code> (to save) <code>⌘q</code> (to quit the text edit application).</p> +<p><strong>Run the program from your terminal:</strong></p> +<pre><code class="language-bash">/bin/sh hello-world.sh +</code></pre> +<p>You should see that <code>Hello World!</code> was printed to your console.</p> +<p><img src="/articles/images/2023-09-24-hello-output.png" alt="hello-output" /></p> +<h3>Make Executable</h3> +<p>Now that we have our basic script working, let’s make it an executable.</p> +<p><strong>In your terminal, type the following:</strong></p> +<pre><code class="language-bash">chmod u+x hello-world.sh +</code></pre> +<p>This will change the mode of the file type to be an executable.</p> +<p>Now move / rename the file so we don’t have to call it using <code>.sh</code> extension:</p> +<pre><code class="language-bash">mv hello-world.sh hello-world +</code></pre> +<p>Now that the file is executable, we can execute it by just calling the name of the file.</p> +<pre><code class="language-bash">./hello-world +</code></pre> +<blockquote> +<p><strong>Note:</strong> We have to prefix the file name with <code>./</code> in the above command so that it knows where to find our file. The <code>./</code> is saying run +this file in our current directory. In the future we will setup our shell so that it knows to look in our <code>~/.local/bin</code> directory for +scripts, so that we can call them without this prefix.</p> +</blockquote> +<h2>Conclusion</h2> +<p>Congratulations, in this article we wrote our first program. We learned how to edit the file, set it’s permissions, and execute the program +from our terminal. I should mention that the <code>TextEdit</code> application is generally not how you would program, people typically use what is +known as an <code>IDE (integrated development environment)</code>, however I chose to use the <code>TextEdit</code> application because it is built-in to <code>macOS</code> +and allowed us to accomplish our goal without downloading other software.</p> +<p>In our upcoming articles, we will write a program that I hope is useful to you / something that you can build upon and use for a long time. +Thank you for reading to this point.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-2/ + Introduction to Programming for HVAC Part-2 + 2025-02-20T16:16:09Z + <p>In this article, learn about installing a package manager. If you missed it, check out the +<a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first</a> article in the series where we learned about using your terminal. +This article builds upon that foundation.</p> +<h2>What is a Package Manager</h2> +<p>A package manager is a piece of software that helps to install software and manage updates for your system. For me, the first thing that I +do with a new machine is install <code>Homebrew</code>. <a href="https://brew.sh">Homebrew</a> is my preferred package manager for <code>macOS</code>.</p> +<h2>Why</h2> +<p>A package manager is nice because often software relies / requires other dependencies in order to work properly. By using a package manager +it will make sure that the correct dependencies are installed for the software that you need to run. It allows you to be able to update and +manage software through a centralized interface.</p> +<h2>Installation</h2> +<p>Installation is simple. Open up your terminal and enter the following command (easiest to just copy / paste from the homepage linked above).</p> +<pre><code class="language-bash">/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot; +</code></pre> +<p>This will prompt you for your password in order to create some directories and install the required software for <code>brew</code> to work. The +installation may take some time, while it downloads the command line tools for <code>Xcode</code>.</p> +<p>When completed, follow the <code>Next Steps</code> and copy / paste the command listed, that should look like below.</p> +<pre><code class="language-bash">(echo; echo 'eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;') &gt;&gt; /Users/&lt;you&gt;/.zprofile +eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot; +</code></pre> +<p><img src="/articles/images/2023-09-22-brew-output.png" alt="brew-output" /></p> +<p>The first line of this command sets up some things in your shell profile (which we have not discussed yet) that will make <code>Homebrew</code> +available to you anytime you start a new session in your terminal. The second line of the command makes it available in your current +terminal session.</p> +<p>Next run the following command and make sure that everything is setup correctly.</p> +<pre><code class="language-bash">brew doctor +</code></pre> +<p>Which should output the following:</p> +<pre><code>Your system is ready to brew. +</code></pre> +<h3>Terminology</h3> +<p>Homebrew calls command line applications <code>formula</code> and normal graphical applications <code>casks</code>. It has the ability to install both styles of +applications.</p> +<h2>Search Command</h2> +<p>The following command is used to search for software packages:</p> +<pre><code class="language-bash">brew search chrome +</code></pre> +<h2>Open a Homepage</h2> +<p>The following command can be used to view the homepage of a formula or cask in your browser:</p> +<pre><code class="language-bash">brew home google-chrome +</code></pre> +<h2>Update Homebrew</h2> +<p>The following command is used to update homebrew:</p> +<pre><code class="language-bash">brew update +</code></pre> +<h2>Update packages installed on your system</h2> +<p>The following command is used to update software that is installed / managed by homebrew.</p> +<pre><code class="language-bash">brew upgrade +</code></pre> +<p>You can combine the update and upgrade commands, which will update homebrew and upgrade all the software it manages on you machine with the +following command.</p> +<pre><code class="language-bash">brew update &amp;&amp; brew upgrade +</code></pre> +<h2>Conclusion</h2> +<p>That is it for this article. I will say that for me, when I find a piece of software that I want to use, I generally try to search for it in +<code>brew</code> first, before installing it via other means.</p> +<p>I hope you’ve found this article helpful. In the next article we will start to use the skills that we’ve learned in these first two articles +and write our first program / script.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-1/ + Introduction to Programming for HVAC Part-1 + 2025-02-20T16:12:06Z + <p>This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.</p> +<h2>Why</h2> +<p>I think if nothing else, this series can help gain knowledge, tips, and tricks to make you more comfortable with your computer. I hope that +you will at least learn how to use your <code>terminal</code> application and more specifically <code>vim</code> motions and keybindings (more on that in another +article).</p> +<p>The goal of this article is to just get a machine setup with tools and to start exploring. I am a shill for <code>macOS</code>, so all of these will be +specifically geared towards that and my workflows, most everything that is showcased should also work on <code>linux</code> machines (not sure about +<code>windows</code>), although you may have to search for specific instructions on installing software for other platforms.</p> +<p>What I have learned on my journey in programming is that the more you can lean on small software packages that focus on a single task, but +do them well, the better. The less you use your mouse, the more productive you can be. The more you can work with <code>text</code> files and formats +the more portable and transformable your workflows can be.</p> +<h2>Getting Started</h2> +<p>The first thing that we will focus on is becoming familiar with the terminal application. On macOS the terminal application is located at +<code>/Applications/Utilities/Terminal.app</code>. However, rather than click around to find it, you can use the <code>⌘&lt;space&gt;</code> to pull up your spotlight +search, then type <code>Terminal</code> to select the terminal application.</p> +<p><img src="/articles/images/2023-09-21-spotlight.png" alt="spotlight" /></p> +<h3>Terminal Overview</h3> +<p>Your terminal is a program that allows you to run programs by typing commands into it’s window. There are a lot of built-in commands and a +bunch that you can install. The terminal is very customizable (and once familiar, you will constantly be tweaking / adjusting to suit your +needs). Right now customization is not what we will focus on, however in future articles I will provide tips and tricks on customizing it. +Right now, we only need to know how to open it up and type in commands.</p> +<p><img src="/articles/images/2023-09-21-terminal.png" alt="terminal" /></p> +<p>Below is an image / explanation of what the default status line includes.</p> +<p><img src="/articles/images/2023-09-21-terminal-line.png" alt="terminal-line" /></p> +<h3>Learn Basic Commands (Built-in)</h3> +<p>Here are a few basic commands that you should familiarize yourself with, as you will use them often when working inside of a terminal.</p> +<h3>Change Directory</h3> +<p><code>cd</code> (change directory) is the command that allows you to move around your file system when inside the terminal.</p> +<blockquote> +<p><strong>Note:</strong> <code>~</code> is a representation of your <code>Home</code> directory.</p> +</blockquote> +<pre><code class="language-bash">cd ~/Documents +</code></pre> +<p>The above command will move you into your Documents directory.</p> +<blockquote> +<p><strong>Note:</strong> If there are spaces in the name of the directory you try to move to then the easiest way is to wrap the name in quotes.</p> +</blockquote> +<pre><code class="language-bash">cd &quot;~/Documents/Product Concepts&quot; +</code></pre> +<p>Some other things to understand when moving around / supplying arguments to the <code>cd</code> command.</p> +<p>You can use <code>..</code> to go backwards / move up to the parent directory. For example, say we are in the <code>~/Documents</code> directory, to go back up to +the home directory we could use the following:</p> +<pre><code class="language-bash">cd .. +</code></pre> +<p>These can be chained together as well. For example say we are located in the <code>~/Documents/Product Concepts</code> directory, we could use the +following to go up two directory levels back to the home directory.</p> +<pre><code class="language-bash">cd ../.. +</code></pre> +<blockquote> +<p><strong>Pro-Tip:</strong> You can use the <code>&lt;tab&gt;</code> key when navigating to auto-complete, generally typing a few characters followed with the <code>&lt;tab&gt;</code> key +will auto-complete for you.</p> +</blockquote> +<h3>List files</h3> +<p>Use <code>ls</code> to output a list of files and directories where you are located.</p> +<pre><code class="language-bash">ls +</code></pre> +<p><em>Example Output when in my ~/Documents directory</em></p> +<pre><code class="language-bash">Estimates.app +InkscapeDrawings +KwikModel +MyAparment +NCISummit +Personal +Product Concepts +Receipts.receipts +RingCentral +SketchUP +Tech-Tips +desktop.ini +espanso-migrate-backup +espanso-migrate-backup-2 +</code></pre> +<p>Using options with <code>ls</code> to show more statistics and hidden files. There are often hidden files on your computer that are used for +application support or other purposes, these files are not shown using the default command. Hidden files start with a <code>.</code>, below is an +example of showing hidden files in your home directory.</p> +<pre><code class="language-bash">ls -la ~/ +</code></pre> +<blockquote> +<p><strong>Note:</strong> Above I added the <code>~/</code> which will allow you to list the files in your home directory even if you currently are not there in your +terminal, if you were already there (for example by using <code>cd ~/</code> then you would not need to use that at the end of the command.</p> +</blockquote> +<p><em>Example Output</em></p> +<pre><code>total 168 +drwxr-xr-x+ 46 michael staff 1472 Sep 22 10:45 . +drwxr-xr-x 6 root admin 192 Sep 22 09:08 .. +-r-------- 1 michael staff 7 Apr 8 2021 .CFUserTextEncoding +-rw-r--r--@ 1 michael staff 14340 Sep 18 10:15 .DS_Store +drwx------+ 5 michael staff 160 Sep 20 17:03 .Trash +-rw-r--r-- 1 michael staff 186 Sep 12 15:20 .actrc +drwxr-xr-x 4 michael staff 128 Dec 13 2021 .bin +drwxr-xr-x 3 michael staff 96 Mar 6 2023 .bundle +drwxr-xr-x 7 michael staff 224 Sep 12 11:40 .cabal +drwxr-xr-x 7 michael staff 224 Sep 12 15:20 .cache +drwxr-xr-x 13 michael staff 416 Aug 10 08:47 .config +drwx------ 3 michael staff 96 Jun 21 2021 .cups +drwxr-xr-x 12 michael staff 384 Sep 15 15:22 .docker +drwxr-xr-x 20 michael staff 640 Sep 19 08:11 .dotfiles +drwxr-xr-x 4 michael staff 128 Jul 26 2021 .gem +drwxr-xr-x 3 michael staff 96 Oct 11 2021 .jssc +-rw------- 1 michael staff 20 Sep 22 10:45 .lesshst +drwxr-x--- 3 michael staff 96 Mar 29 08:47 .lldb +drwxr-xr-x 8 michael staff 256 Mar 1 2023 .local +drwxr-xr-x 4 root staff 128 Apr 12 2021 .newtek +drwxr-xr-x 5 michael staff 160 Dec 13 2021 .npm +-rw------- 1 michael staff 27436 Apr 10 10:21 .psql_history +drwxr-xr-x 7 michael staff 224 Apr 18 2022 .ssh +drwxr-xr-x 6 michael staff 192 Sep 21 09:06 .swiftpm +lrwxr-xr-x 1 michael staff 25 Dec 27 2021 .tmux.conf -&gt; .dotfiles/tmux/.tmux.conf +drwxr-xr-x 8 michael staff 256 Mar 27 16:14 .twilio-cli +drwxr-xr-x 6 michael staff 192 Sep 18 11:08 .vim +-rw------- 1 michael staff 23086 Sep 21 09:45 .viminfo +-rw-r--r-- 1 michael staff 254 Sep 21 09:32 .wget-hsts +lrwxr-xr-x 1 michael staff 43 Jan 3 2022 .zshenv -&gt; /Users/michael/.dotfiles/zsh/config/.zshenv +drwxr-xr-x 8 michael staff 256 Dec 14 2021 AmazonWorkDocsCompanion +drwx------@ 4 michael staff 128 Dec 13 2021 Applications +lrwxr-xr-x 1 michael staff 40 Jun 6 12:00 Applications (Parallels) -&gt; /Volumes/Bucket/Applications (Parallels) +drwx------@ 30 michael staff 960 Sep 21 08:54 Desktop +drwx------@ 19 michael staff 608 Sep 14 10:15 Documents +drwx------@ 21 michael staff 672 Sep 21 09:43 Downloads +drwx------+ 115 michael staff 3680 Sep 14 10:04 Library +drwxr-xr-x 3 michael staff 96 Sep 8 13:06 LocalProjects +lrwxr-xr-x 1 michael staff 29 Dec 30 2021 Movies -&gt; /Volumes/Bucket/Videos/Movies +lrwxr-xr-x 1 michael staff 21 Dec 30 2021 Music -&gt; /Volumes/Bucket/Music +drwx------@ 2 michael staff 64 Mar 6 2023 Parallels +drwx------@ 7 michael staff 224 Sep 14 09:52 Pictures +drwxr-x---+ 4 michael staff 128 Apr 8 2021 Public +drwxr-xr-x+ 3 michael staff 96 Sep 14 09:52 Sites +drwxr-xr-x 3 michael staff 96 Jun 7 2021 WorkDocs Drive +drwxr-xr-x 3 michael staff 96 Sep 18 11:36 go +</code></pre> +<p>As you can see, I have a lot of hidden files and folders, your output will probably look much different than mine.</p> +<h3>Clearing the Terminal</h3> +<p>Often times you may want to clear the terminal screen. You can use the <code>clear</code> command to clear the screen of the terminal.</p> +<pre><code class="language-bash">clear +</code></pre> +<p>Or use a keyboard shortcut <code>⌃l</code> (<code>&lt;control&gt;l</code>)</p> +<h3>Creating Directories</h3> +<p>Use <code>mkdir</code> (make directory) to create a directory.</p> +<p>First, let’s move into the <code>tmp</code> directory, the <code>tmp</code> directory is a directory on your file system that is typically used for applications +to write temporary logs / files to, it get’s erased everytime your computer is restarted. We can use the <code>cd</code> command that we learned +earlier.</p> +<pre><code class="language-bash">cd /tmp +</code></pre> +<p>Next, let’s create a new directory called “MyDirectory”.</p> +<pre><code class="language-bash">mkdir MyDirectory +</code></pre> +<h4>Gotcha’s with ‘mkdir’</h4> +<p>By default you can’t create directories that are multiple levels deep, unless the directories already existed or we provide the <code>-p</code> option. +For example, if we want to create a directory at <code>/tmp/MyOtherDirectory/Nested/Deeply</code> then we could use the following command when inside +the <code>tmp</code> directory.</p> +<pre><code class="language-bash">mkdir -p MyOtherDirectory/Nested/Deeply +</code></pre> +<p>Now, try out using the <code>&lt;tab&gt;</code> key with the <code>cd</code> command to navigate to the <code>Deeply</code> folder.</p> +<pre><code class="language-bash">cd MyOther &lt;tab&gt; &lt;tab&gt; &lt;tab&gt; +</code></pre> +<h3>Open Command</h3> +<p>You can use the open command to open files or folders in the default application for the file type.</p> +<p>For example, if we want to open a <code>Finder</code> window while in the <code>/tmp</code> directory, we can use the following command:</p> +<pre><code class="language-bash">open . +</code></pre> +<h3>Manual Pages</h3> +<p>Lastly, to learn more about commands you can use the <code>man &lt;command&gt;</code>. To bring up the manual pages for the command in the terminal. You can +use the arrow keys to navigate around the manual pages and type the letter <code>q</code> to quit / close the manual pages.</p> +<pre><code class="language-bash">man ls +</code></pre> +<p>That is it for the first installment in this series. I hope you learned something and have better understanding of using your terminal.</p> + \ No newline at end of file diff --git a/deploy/articles/tag/programming/index.html b/deploy/articles/tag/programming/index.html index e7615d7..fff913b 100644 --- a/deploy/articles/tag/programming/index.html +++ b/deploy/articles/tag/programming/index.html @@ -90,6 +90,63 @@ Markdown is a “mark-up” language. It allows you to write content in plain te converted to other formats, such as html, pdf, docx, and many more. All...

        +
        +

        + Introduction to Programming for HVAC Part-4 +

        + +

        + This article builds upon our last article, so make sure to catch up +before continuing with this article. +Arguments +Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-3 +

        + +

        + In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up here before continuing with this article. +Getting Started +We are going to make... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-2 +

        + +

        + In this article, learn about installing a package manager. If you missed it, check out the +first article in the series where we learned about using your terminal. +This article builds upon that foundation. +What is a Package Manager +A package manager... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-1 +

        + +

        + This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers. +Why +I... +

        +
        \ No newline at end of file diff --git a/deploy/articles/tag/psychrometric-chart/feed.xml b/deploy/articles/tag/psychrometric-chart/feed.xml new file mode 100644 index 0000000..9c78e9d --- /dev/null +++ b/deploy/articles/tag/psychrometric-chart/feed.xml @@ -0,0 +1,84 @@ + + + http://localhost:3000/articles/tag/psychrometric-chart/feed.xml + mhoush + + Michael Housh + + + 2025-02-20T17:12:57Z + + http://localhost:3000/articles/2023/pounds-of-water-removed/ + Pounds of Water Removed + 2025-02-20T16:43:21Z + <p>This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream).</p> +<p>This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This +article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here +are a couple articles to familiarize yourself.</p> +<h2>Articles</h2> +<ul> +<li><a href="https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/">Understand Dew-Point</a></li> +<li><a href="https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/">Impact of Adding or Removing Water from Air</a></li> +</ul> +<h2>Scenario</h2> +<p>Let’s imagine that we have an air-conditioner that has the following measurements taken:</p> +<ul> +<li>Return Air: 75° / 50% RH</li> +<li>Supply Air: 55° / 81% RH</li> +</ul> +<p>We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air +conditions).</p> +<p><img src="/articles/images/2023-09-08-pounds-of-water-removed.png" alt="chart" /></p> +<p>We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the +relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per +pound of air.</p> +<p>This gives us the following values:</p> +<ul> +<li>Return Air: 66 gr/lb</li> +<li>Supply Air: 52 gr/lb</li> +</ul> +<p>We can then use the following formula to calculate the pounds of water removed.</p> +<p><img src="/articles/images/2023-09-08-formula.png" alt="formula" /></p> +<table> +<thead> +<tr> +<th><strong>Where</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>W</strong></td> +<td><em>Weight of water in pounds per hour</em></td> +</tr> +<tr> +<td><strong>4.5</strong></td> +<td><em>Constant based on density / specific heat of moist air</em></td> +</tr> +<tr> +<td><strong>CFM</strong></td> +<td><em>Airflow in cubic feet per minute</em></td> +</tr> +<tr> +<td><strong>∆G</strong></td> +<td><em>Difference in grains of moisture</em></td> +</tr> +<tr> +<td><strong>7000</strong></td> +<td><em>Constant based on grains of moisture in saturated air</em></td> +</tr> +</tbody> +</table> +<h2>Solution</h2> +<p>First, we solve for the difference in grains between the two air streams.</p> +<p>∆G = 66 - 52 = 14</p> +<p>Next, we’ve measured our airflow and have determined to have <strong>797 CFM</strong> of airflow across the evaporator coil, so we can substitute our +values into the formula.</p> +<p><img src="/articles/images/2023-09-08-solution.png" alt="solution" /></p> +<p>So, we are removing about 7 pounds of water per hour at these conditions.</p> +<p>Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that +can often be rated in pints per day.</p> +<p>I hope you’ve found this article helpful, thanks for reading!</p> + + \ No newline at end of file diff --git a/deploy/articles/tag/psychrometric-chart/index.html b/deploy/articles/tag/psychrometric-chart/index.html new file mode 100644 index 0000000..fba6549 --- /dev/null +++ b/deploy/articles/tag/psychrometric-chart/index.html @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + mhoush: Articles in psychrometric-chart + + + + + + + + +
        + +
        + + + + \ No newline at end of file diff --git a/deploy/articles/tag/psychrometrics/feed.xml b/deploy/articles/tag/psychrometrics/feed.xml new file mode 100644 index 0000000..fad1640 --- /dev/null +++ b/deploy/articles/tag/psychrometrics/feed.xml @@ -0,0 +1,143 @@ + + + http://localhost:3000/articles/tag/psychrometrics/feed.xml + mhoush + + Michael Housh + + + 2025-02-20T17:12:57Z + + http://localhost:3000/articles/2023/introducing-psychrometrics-cli/ + Introducing Psychrometrics CLI + 2025-02-20T16:03:19Z + <p>Today, I’m releasing a command line application that is built on top of my +<a href="https://github.com/swift-psychrometrics/swift-psychrometrics">swift-psychrometrics</a> package, that I open sourced over 2 years ago.</p> +<p>The application consists of many calculations / conversions for psychrometric properties of an air stream. The tool works for both imperial +and metric units. The application will work natively on macOS, but can also be ran through a <code>docker</code> container on other platforms.</p> +<h2>Why</h2> +<p>I spend a lot of time in my terminal, because I can work so much more efficiently. I discovered many years ago that the more I can do using +simple applications and keyboard over a mouse and a web browser or native application the more I can accomplish. I understand this is +intimidating for many who think they are <em>“not good with computers”.</em> I can assure that was me several years ago, I would only encourage you +to not be afraid and give it a shot. We are at a time in society where it is easier than ever to get informed and learned new skills.</p> +<h2>Installation</h2> +<p>For complete installation instructions, you can view the <a href="https://github.com/swift-psychrometrics/psychrometrics-cli">github</a> repository.</p> +<p>The following instructions are based on using macOS.</p> +<h3>Open your terminal application.</h3> +<p>Personally, I use <a href="https://iterm2.com/">iTerm2</a>, however you can use the default <code>Terminal</code> app. Found at +<code>/Applications/Utilities/Terminal.app</code>.</p> +<h2>Install Homebrew</h2> +<p>We use <a href="https://brew.sh">Homebrew</a> for package distribution of the pre-built application binaries. You can follow their instructions to +install.</p> +<h3>Tap our custom formula tap.</h3> +<pre><code class="language-bash">brew tap swift-psychrometrics/formula +</code></pre> +<h3>Install the psychrometrics application</h3> +<pre><code class="language-bash">brew install psychrometrics +</code></pre> +<p>That’s it!</p> +<h2>Usage</h2> +<p>I will run through a couple of the commands that are supplied with the application and show what you can expect the outputs to be.</p> +<h3>Properties</h3> +<p>The following command will output a bunch of the psychrometric properties of an air stream. There are several ways to call it, but generally +you will supply the dry bulb temperature and the relative humidity.</p> +<p>Below, we calculate the psychrometric properties based on 75°F and 50% humidity.</p> +<pre><code class="language-bash">psychrometrics --dry-bulb 75 --relative-humidity 50 +</code></pre> +<p><img src="/articles/images/2023-09-18-properties.png" alt="properties-output" /></p> +<h3>Dehumidifier Sizing</h3> +<p>If you’ve read some of my recent articles on calculating the +<a href="https://mhoush.com/posts/sizing-dehumidifier-by-latent-load/">dehumidifier size required based on the latent load</a>, the application also +ships with a calculation that will do this for you and has the ability to calculate it at different <code>coverages</code> that you can supply.</p> +<p>For example if we’ve done a load calculation and determined that we have a latent load of <code>4,334 BTU/h</code> then we could run the following +command to see what size dehumidifier is needed for <code>100%, 85%, and 70%</code> of the latent load.</p> +<pre><code class="language-bash">psychrometrics dh size --coverage 100 85 70 --verbose 4334 +</code></pre> +<p><img src="/articles/images/2023-09-18-dh-size.png" alt="dh-size" /></p> +<h3>Pounds of Water Removed</h3> +<p>I also recently wrote an article about <a href="https://mhoush.com/posts/pounds-of-water-removed/">calculating the pounds of water removed</a> from an +air stream given the grains of moisture removed.</p> +<p>Below is an example of calculating the pounds of water removed per hour based on the example in the article (14 delta-grains)</p> +<pre><code class="language-bash">psychrometrics dh pounds-removed --delta 14 --cfm 797 --verbose +</code></pre> +<p><img src="/articles/images/2023-09-18-pounds-removed.png" alt="pounds-removed" /></p> +<h3>Help</h3> +<p>You can use <code>--help</code> option to show help and the list of commands provided.</p> +<p><img src="/articles/images/2023-09-18-help.png" alt="help" /></p> +<p>If you have any questions then feel free to email or message me. I hope some of you may find this application useful.</p> + + + http://localhost:3000/articles/2023/pounds-of-water-removed/ + Pounds of Water Removed + 2025-02-20T16:43:21Z + <p>This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream).</p> +<p>This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This +article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here +are a couple articles to familiarize yourself.</p> +<h2>Articles</h2> +<ul> +<li><a href="https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/">Understand Dew-Point</a></li> +<li><a href="https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/">Impact of Adding or Removing Water from Air</a></li> +</ul> +<h2>Scenario</h2> +<p>Let’s imagine that we have an air-conditioner that has the following measurements taken:</p> +<ul> +<li>Return Air: 75° / 50% RH</li> +<li>Supply Air: 55° / 81% RH</li> +</ul> +<p>We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air +conditions).</p> +<p><img src="/articles/images/2023-09-08-pounds-of-water-removed.png" alt="chart" /></p> +<p>We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the +relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per +pound of air.</p> +<p>This gives us the following values:</p> +<ul> +<li>Return Air: 66 gr/lb</li> +<li>Supply Air: 52 gr/lb</li> +</ul> +<p>We can then use the following formula to calculate the pounds of water removed.</p> +<p><img src="/articles/images/2023-09-08-formula.png" alt="formula" /></p> +<table> +<thead> +<tr> +<th><strong>Where</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>W</strong></td> +<td><em>Weight of water in pounds per hour</em></td> +</tr> +<tr> +<td><strong>4.5</strong></td> +<td><em>Constant based on density / specific heat of moist air</em></td> +</tr> +<tr> +<td><strong>CFM</strong></td> +<td><em>Airflow in cubic feet per minute</em></td> +</tr> +<tr> +<td><strong>∆G</strong></td> +<td><em>Difference in grains of moisture</em></td> +</tr> +<tr> +<td><strong>7000</strong></td> +<td><em>Constant based on grains of moisture in saturated air</em></td> +</tr> +</tbody> +</table> +<h2>Solution</h2> +<p>First, we solve for the difference in grains between the two air streams.</p> +<p>∆G = 66 - 52 = 14</p> +<p>Next, we’ve measured our airflow and have determined to have <strong>797 CFM</strong> of airflow across the evaporator coil, so we can substitute our +values into the formula.</p> +<p><img src="/articles/images/2023-09-08-solution.png" alt="solution" /></p> +<p>So, we are removing about 7 pounds of water per hour at these conditions.</p> +<p>Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that +can often be rated in pints per day.</p> +<p>I hope you’ve found this article helpful, thanks for reading!</p> + + \ No newline at end of file diff --git a/deploy/articles/tag/psychrometrics/index.html b/deploy/articles/tag/psychrometrics/index.html new file mode 100644 index 0000000..db84fc3 --- /dev/null +++ b/deploy/articles/tag/psychrometrics/index.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + mhoush: Articles in psychrometrics + + + + + + + + +
        + +
        + + + + \ No newline at end of file diff --git a/deploy/articles/tag/security/feed.xml b/deploy/articles/tag/security/feed.xml index a060703..33b3a2a 100644 --- a/deploy/articles/tag/security/feed.xml +++ b/deploy/articles/tag/security/feed.xml @@ -5,75 +5,75 @@ Michael Housh - - 2025-02-19T21:55:31Z + + 2025-02-20T17:12:57Z http://localhost:3000/articles/2024/pgp-encryption-introduction/ PGP Encryption Introduction 2025-02-19T21:36:11Z <p>In this article I introduce PGP and show a use case for me, which perhaps you can use as well.</p> <h2>What is PGP</h2> -<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses<br /> +<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses cryptographic privacy and authentication and is generally used in data communication.</p> -<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired<br /> -by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s<br /> +<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired +by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s fictional town of Lake Wobegon.</p> -<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both<br /> +<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both who the commits were from as well as make sure they were not modified from the original versions.</p> -<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which<br /> +<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which are implementations of the PGP standard protocol.</p> <h2>What it does</h2> <blockquote> -<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms<br /> +<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms that I understand / make sense to me. Do what I do at your own risk!</p> </blockquote> -<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption<br /> -(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource<br /> +<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption +(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource intensive (which is generally not a problem with computers of today).</p> -<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of<br /> -the key par is meant to be shared with others freely, while the private portion needs to be secured<br /> -/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is<br /> -“air gapped”, meaning it is not connected to any network / internet, and does not save a history of<br /> +<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of +the key par is meant to be shared with others freely, while the private portion needs to be secured +/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is +“air gapped”, meaning it is not connected to any network / internet, and does not save a history of commands performed on it.</p> -<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public<br /> +<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public key. The recipients private key is required to decrypt the data once it’s been encrypted.</p> -<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can<br /> -also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it<br /> -can be tied to your same private key. This is useful for example for work vs. activism vs. software<br /> +<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can +also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it +can be tied to your same private key. This is useful for example for work vs. activism vs. software development.</p> -<p>Once your key is generated and your private key secured, you can share your public portion of the<br /> +<p>Once your key is generated and your private key secured, you can share your public portion of the key to a “keyserver” where other people can download it and verify messages were sent by you.</p> <h2>Web of Trust</h2> -<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are<br /> -encrypted by a trusted source. There are different levels of trust depending on where a key is<br /> -retrieved from. For example, if somebody gave you their public key in person and you were able to<br /> -inspect that the identity matches their government id, then you can give it a higher trust level<br /> +<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are +encrypted by a trusted source. There are different levels of trust depending on where a key is +retrieved from. For example, if somebody gave you their public key in person and you were able to +inspect that the identity matches their government id, then you can give it a higher trust level than one that is sent / retrieved from a keyserver.</p> -<p>My understanding of this portion is that over time your key is signed by other’s with their level of<br /> +<p>My understanding of this portion is that over time your key is signed by other’s with their level of certainty about you / your key, which over time increases the overall trust in your key.</p> <h2>Out of the weeds</h2> -<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use<br /> +<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use cases of PGP encryption.</p> -<p>PGP encryption is used by some email clients / applications, such as<br /> -<a href="https://canarymail.io/">Canary</a>,<br /> -<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or<br /> +<p>PGP encryption is used by some email clients / applications, such as +<a href="https://canarymail.io/">Canary</a>, +<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or <a href="https://gpgtools.tenderapp.com/">GPGSuite</a>.</p> -<p>In my understanding, it is also what is used in devices such as a<br /> +<p>In my understanding, it is also what is used in devices such as a <a href="https://www.yubico.com/">YubiKey</a>.</p> -<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons<br /> +<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons it is not very popular is that it can be hard to use PGP for the average person.</p> -<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files<br /> -that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a<br /> -computer (in reality a gang of computers in a data center). You are solely reliant that these cloud<br /> +<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files +that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a +computer (in reality a gang of computers in a data center). You are solely reliant that these cloud providers are not snooping on, inspecting, or even selling your data.</p> -<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit<br /> -of effort on your part you can at least make it very hard for anyone to know what is inside your<br /> -documents. You can be in control of the way your items are encrypted and have confidence that nobody<br /> +<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit +of effort on your part you can at least make it very hard for anyone to know what is inside your +documents. You can be in control of the way your items are encrypted and have confidence that nobody but you can access what is inside your documents.</p> -<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something<br /> +<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something get’s stolen or someone breach’s my network they will not be able to easily get to sensitive data.</p> <h2>Conclusion</h2> -<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how<br /> +<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how to use it to encrypt your data and be in control of your privacy.</p> <h3>Resources</h3> <ul> diff --git a/deploy/articles/tag/security/index.html b/deploy/articles/tag/security/index.html index a014491..fcc1bbc 100644 --- a/deploy/articles/tag/security/index.html +++ b/deploy/articles/tag/security/index.html @@ -73,6 +73,12 @@ cryptographic privacy and authentication and is... | Email

        + + + \ No newline at end of file diff --git a/deploy/articles/tag/software/feed.xml b/deploy/articles/tag/software/feed.xml index 6cf4e60..273217f 100644 --- a/deploy/articles/tag/software/feed.xml +++ b/deploy/articles/tag/software/feed.xml @@ -5,20 +5,564 @@ Michael Housh - - 2025-02-19T21:55:31Z + + 2025-02-20T17:12:57Z http://localhost:3000/articles/2025/vapor-htmx-todo-app/ Vapor + HTMX - 2025-02-19T21:47:31Z + 2025-02-20T14:15:37Z Build an example application using Vapor and HTMX. - + http://localhost:3000/articles/2024/free-as-in-freedom/ Free As In Freedom 2025-02-19T21:39:28Z Salute to open-source software engineers - + + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-4/ + Introduction to Programming for HVAC Part-4 + 2025-02-20T16:31:35Z + <p>This article builds upon our <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-3/">last</a> article, so make sure to catch up +before continuing with this article.</p> +<h2>Arguments</h2> +<p>Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments are +supplied to shell scripts are separated by a space <code>&quot; &quot;</code>, as opposed to options which start with a <code>-&lt;character&gt;</code> or <code>--&lt;word&gt;</code>.</p> +<p>To illustrate this, let’s change our <code>hello-world</code> script we wrote in the last article.</p> +<p><strong>Move into our scripts directory:</strong></p> +<pre><code class="language-bash">cd ~/.local/bin +</code></pre> +<p><strong>Make a copy of the hello-world script:</strong></p> +<pre><code class="language-bash">cp hello-world greet +</code></pre> +<p>Above we make a copy of the hello-world file and name the copy <code>greet</code>.</p> +<p><strong>Open the greet file:</strong></p> +<pre><code class="language-bash">open -a TextEdit greet +</code></pre> +<blockquote> +<p><strong>Note:</strong> Because the greet file is an executable, in order to open it in the <code>TextEdit</code> application we must supply the <code>-a</code> option. +Otherwise it will just run our <code>greet</code> program in another terminal. Use <code>man open</code> to read more about the open command.</p> +</blockquote> +<p><strong>Edit the greet file:</strong></p> +<pre><code class="language-bash">#!/bin/sh + +echo &quot;Hello, ${1}!&quot; +</code></pre> +<p>Make sure to save <code>⌘s</code> the file.</p> +<p>Take note that the quotes need to be changed to <code>&quot;</code> (double quotes) from our original <code>hello-world</code> program.</p> +<p>The <code>${1}</code> is indicating that we will insert / interpret the first argument passed to our program and insert it at that location. Arguments +are interpreted in order they are passed in with <code>${0}</code> always representing the filename of the program that is called (generally not needed +/ used in your scripts).</p> +<p><strong>Test it out:</strong></p> +<pre><code class="language-bash">./greet Michael +</code></pre> +<p><img src="/articles/images/2023-09-26-greet-output.png" alt="greet-output" /></p> +<p>If you’d like to supply multiple words (or arguments that contain spaces) as a single argument then you can wrap them in quotes.</p> +<pre><code class="language-bash">./greet &quot;Michael Housh&quot; +</code></pre> +<blockquote> +<p><strong>Tip:</strong> Wrapping in quotes is especially useful for commands that take file paths, if any of the folders or file names contain spaces.</p> +</blockquote> +<h2>More Useful Program</h2> +<p>At this point, it’s time to build a more useful program that we can use. First, we must download some dependencies for our program.</p> +<p><strong>Install imagemagick:</strong></p> +<pre><code class="language-bash">brew install imagemagick +</code></pre> +<blockquote> +<p><strong>Note:</strong> If you’d like to check out the documentation / website for imagemagick you can run <code>brew home imagemagick</code>.</p> +</blockquote> +<p>This will take a bit for brew to install imagemagick and it’s dependencies. When it’s completed, we can check to make sure that imagemagick +is installed by running the following command.</p> +<pre><code class="language-bash">magick --version +</code></pre> +<p>It should output something along the lines of this below.</p> +<pre><code class="language-bash">Version: ImageMagick 7.1.1-17 Q16-HDRI aarch64 21569 https://imagemagick.org +Copyright: (C) 1999 ImageMagick Studio LLC +License: https://imagemagick.org/script/license.php +Features: Cipher DPC HDRI Modules OpenMP(5.0) +Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib +Compiler: gcc (4.2) +</code></pre> +<blockquote> +<p><strong>Tip:</strong> Don’t forget, you can use the <code>clear</code> command to clear the terminal.</p> +</blockquote> +<p><strong>Create our script:</strong></p> +<pre><code class="language-bash">touch mktrans +</code></pre> +<p>We are going to name our script <code>mktrans</code> as a short for make transparent.</p> +<p><strong>Open the file:</strong></p> +<pre><code class="language-bash">open mktrans +</code></pre> +<p><strong>The program:</strong></p> +<pre><code class="language-bash">#!/bin/bash + +# The input file path, passed in as the first argument. +inputfile=&quot;${1}&quot; + +# The color to make transparent, optionally passed in as the second argument. +# by default we handle / make white backgrounds transparent. +color=&quot;${2:-white}&quot; + +# Use the built-in basename command to normalize the input file name +# this will convert a file path, such as ~/Pictures/my-image.png to my-image.png. +fullfilename=$(basename -- &quot;$inputfile&quot;) + +# Use the text of the `fullfilename` up to the first '.' as the file name. +filename=&quot;${fullfilename%%.*}&quot; + +# Use the text after the last '.' as the file extension. +extension=&quot;${fullfilename##*.}&quot; + +# Create the output file name to use. +# +# For an input file of `input.png`, our output name would be +# `input-transparent.png`. +# +# This will output the file in the directory that we are +# in when we use our script (which may different than where +# the image is located) +outputfile=&quot;${filename}-transparent.${extension}&quot; + +# Make the magick happen :) +convert &quot;${inputfile}&quot; -fuzz 10% -transparent &quot;${color}&quot; &quot;${outputfile}&quot; + +</code></pre> +<p>I’ve included comments in the program above, which is good practice, as there is high odds that you will forget what is going on when / if +you open the file up in the future to look at it. We are using a lot of what is called parameter expansion magic in this file. You can read +up more on what we are doing in the <a href="https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html">bash documentation</a>.</p> +<p>This script is far from perfect, there are a lot of things to be improved upon. For example, if you download / save the banner image of this +post and run this script, it will also remove some color in the wizards beard, eyes, and eye brows. However, it does work very well for my +general use case, which is to remove the background from screenshots of pdf documents. It should be noted that it will not work on all types +of images, some image types do not allow transparency, so it is safest to call this with input image being a <code>.png</code> image type, however you +can use the <code>imagemagick</code> program that we downloaded to convert other image types to <code>.png</code>, but that will be left up to you to figure out.</p> +<h2>Using Our Program</h2> +<p>This is going to assume that you have download the banner image at the top of this article. You can do this by right-clicking and choosing +<code>Save As</code>. This should save the image in your downloads folder, and you can keep the name of <code>part4-banner.png</code>.</p> +<p><strong>Make the program executable:</strong></p> +<pre><code class="language-bash">chmod u+x mktrans +</code></pre> +<p><strong>Make the image background transparent:</strong></p> +<pre><code class="language-bash">./mktrans ~/Downloads/part4-banner.png +</code></pre> +<p><strong>Open the image:</strong></p> +<pre><code class="language-bash">open part4-banner-transparent.png +</code></pre> +<p>It should look like below.</p> +<p><img src="/articles/images/2023-09-26-part4-banner-transparent.png" alt="banner-transparent" /></p> +<blockquote> +<p><strong>Note:</strong> If you are viewing this site in <em>light</em> mode, the image does not look that bad. Hit the moon button in the top above my profile +image to see some of the flaws of our program.</p> +</blockquote> +<hr /> +<blockquote> +<p><strong>Tip:</strong> Remove the image from the <code>~/.local/bin</code> by using <code>rm part4-banner-transparent.png</code>. Be aware that the <code>rm</code> command can not be +undone, so use with caution / knowledge. It is safer, until you are more comfortable to use the <code>Finder</code> application and move the file to +the trash. In <code>Finder</code>, you can show hidden directories by typing <code>⌘.</code> or go directly to the folder by typing <code>⇧⌘G</code> (shift + command + G) +and in the pop-up typing <code>~/.local/bin</code>.</p> +</blockquote> +<hr /> +<p>That is it for this article. In the upcoming articles we will setup our <code>shell</code> environment so that we can use the commands we’ve built +without having to navigate to the <code>~/.local/bin</code> directory. Thank you for reading to the end, I hope you’re finding this series helpful.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-3/ + Introduction to Programming for HVAC Part-3 + 2025-02-20T16:20:56Z + <p>In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up <a href="https://mhoush.com/series/programming-for-hvac/">here</a> before continuing with this article.</p> +<h2>Getting Started</h2> +<p>We are going to make our first script / program. This first program is really just setting up some building blocks for our next program we +will write, that will remove the background from an image.</p> +<h3>Creating a scripts directory</h3> +<p>We learned in the <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first article</a> how to use our terminal. Today we are +going to use some of the commands we learned to create a directory where we can store our script and future scripts that we write.</p> +<p><strong>Create a directory</strong></p> +<pre><code class="language-bash">mkdir -p ~/.local/bin +</code></pre> +<p>The above command will create a “hidden” directory in your home folder. We can go ahead and move into the directory we just created.</p> +<blockquote> +<p><strong>Note:</strong> The <code>-p</code> option allows us to create nested directories if the parent directory doesn’t exist.</p> +</blockquote> +<pre><code class="language-bash">cd ~/.local/bin +</code></pre> +<h3>Hello World</h3> +<p>It is common in programming to start out with a “Hello World” program when learning a new scripting paradigm. So let’s jump in and get +started.</p> +<p><strong>Creating our script file:</strong></p> +<pre><code class="language-bash">touch hello-world.sh +</code></pre> +<p><strong>Now open the file:</strong></p> +<pre><code class="language-bash">open hello-world.sh +</code></pre> +<p>The above command should open the file in the <code>TextEdit</code> application. In order to make the text edit application to not auto-capitalize +words and play more nicely, we need to adjust some settings. Open the settings by pressing <code>⌘,</code>.</p> +<p>In the <strong>Format</strong> section, select <em>Plain text</em> and in the <strong>Options</strong> section de-select <em>Check spelling as you type</em>.</p> +<p><img src="/articles/images/2023-09-24-text-settings.png" alt="text-settings" /></p> +<p>At this point for changes to take place, you will need to close the file and re-open.</p> +<blockquote> +<p><strong>Tip:</strong> In your terminal you can run the last command in your history by using the <code>↑</code> (Up) arrow key.</p> +</blockquote> +<p>Now that the file is open again, we will write our hello-world program. The contents of your file should look like the following:</p> +<pre><code class="language-bash">#!/bin/sh + +echo 'Hello World!' +</code></pre> +<p>The first line is referred to as the <code>shebang</code>, this tells your computer which shell interperter to run your file. I have not explained the +shell yet, but it currently would just muddy the waters a bit, but there are several shell interperters on your computer with the <code>sh</code> posix +shell being one of the most universal / lowest level ones, which is why I’m choosing this one (in other words this script would work on just +about any machine you were on).</p> +<p>The second line we are using the built-in <code>echo</code> command and passing it the ‘Hello World!’ argument.</p> +<p>Now save and close the file <code>⌘s</code> (to save) <code>⌘q</code> (to quit the text edit application).</p> +<p><strong>Run the program from your terminal:</strong></p> +<pre><code class="language-bash">/bin/sh hello-world.sh +</code></pre> +<p>You should see that <code>Hello World!</code> was printed to your console.</p> +<p><img src="/articles/images/2023-09-24-hello-output.png" alt="hello-output" /></p> +<h3>Make Executable</h3> +<p>Now that we have our basic script working, let’s make it an executable.</p> +<p><strong>In your terminal, type the following:</strong></p> +<pre><code class="language-bash">chmod u+x hello-world.sh +</code></pre> +<p>This will change the mode of the file type to be an executable.</p> +<p>Now move / rename the file so we don’t have to call it using <code>.sh</code> extension:</p> +<pre><code class="language-bash">mv hello-world.sh hello-world +</code></pre> +<p>Now that the file is executable, we can execute it by just calling the name of the file.</p> +<pre><code class="language-bash">./hello-world +</code></pre> +<blockquote> +<p><strong>Note:</strong> We have to prefix the file name with <code>./</code> in the above command so that it knows where to find our file. The <code>./</code> is saying run +this file in our current directory. In the future we will setup our shell so that it knows to look in our <code>~/.local/bin</code> directory for +scripts, so that we can call them without this prefix.</p> +</blockquote> +<h2>Conclusion</h2> +<p>Congratulations, in this article we wrote our first program. We learned how to edit the file, set it’s permissions, and execute the program +from our terminal. I should mention that the <code>TextEdit</code> application is generally not how you would program, people typically use what is +known as an <code>IDE (integrated development environment)</code>, however I chose to use the <code>TextEdit</code> application because it is built-in to <code>macOS</code> +and allowed us to accomplish our goal without downloading other software.</p> +<p>In our upcoming articles, we will write a program that I hope is useful to you / something that you can build upon and use for a long time. +Thank you for reading to this point.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-2/ + Introduction to Programming for HVAC Part-2 + 2025-02-20T16:16:09Z + <p>In this article, learn about installing a package manager. If you missed it, check out the +<a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first</a> article in the series where we learned about using your terminal. +This article builds upon that foundation.</p> +<h2>What is a Package Manager</h2> +<p>A package manager is a piece of software that helps to install software and manage updates for your system. For me, the first thing that I +do with a new machine is install <code>Homebrew</code>. <a href="https://brew.sh">Homebrew</a> is my preferred package manager for <code>macOS</code>.</p> +<h2>Why</h2> +<p>A package manager is nice because often software relies / requires other dependencies in order to work properly. By using a package manager +it will make sure that the correct dependencies are installed for the software that you need to run. It allows you to be able to update and +manage software through a centralized interface.</p> +<h2>Installation</h2> +<p>Installation is simple. Open up your terminal and enter the following command (easiest to just copy / paste from the homepage linked above).</p> +<pre><code class="language-bash">/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot; +</code></pre> +<p>This will prompt you for your password in order to create some directories and install the required software for <code>brew</code> to work. The +installation may take some time, while it downloads the command line tools for <code>Xcode</code>.</p> +<p>When completed, follow the <code>Next Steps</code> and copy / paste the command listed, that should look like below.</p> +<pre><code class="language-bash">(echo; echo 'eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;') &gt;&gt; /Users/&lt;you&gt;/.zprofile +eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot; +</code></pre> +<p><img src="/articles/images/2023-09-22-brew-output.png" alt="brew-output" /></p> +<p>The first line of this command sets up some things in your shell profile (which we have not discussed yet) that will make <code>Homebrew</code> +available to you anytime you start a new session in your terminal. The second line of the command makes it available in your current +terminal session.</p> +<p>Next run the following command and make sure that everything is setup correctly.</p> +<pre><code class="language-bash">brew doctor +</code></pre> +<p>Which should output the following:</p> +<pre><code>Your system is ready to brew. +</code></pre> +<h3>Terminology</h3> +<p>Homebrew calls command line applications <code>formula</code> and normal graphical applications <code>casks</code>. It has the ability to install both styles of +applications.</p> +<h2>Search Command</h2> +<p>The following command is used to search for software packages:</p> +<pre><code class="language-bash">brew search chrome +</code></pre> +<h2>Open a Homepage</h2> +<p>The following command can be used to view the homepage of a formula or cask in your browser:</p> +<pre><code class="language-bash">brew home google-chrome +</code></pre> +<h2>Update Homebrew</h2> +<p>The following command is used to update homebrew:</p> +<pre><code class="language-bash">brew update +</code></pre> +<h2>Update packages installed on your system</h2> +<p>The following command is used to update software that is installed / managed by homebrew.</p> +<pre><code class="language-bash">brew upgrade +</code></pre> +<p>You can combine the update and upgrade commands, which will update homebrew and upgrade all the software it manages on you machine with the +following command.</p> +<pre><code class="language-bash">brew update &amp;&amp; brew upgrade +</code></pre> +<h2>Conclusion</h2> +<p>That is it for this article. I will say that for me, when I find a piece of software that I want to use, I generally try to search for it in +<code>brew</code> first, before installing it via other means.</p> +<p>I hope you’ve found this article helpful. In the next article we will start to use the skills that we’ve learned in these first two articles +and write our first program / script.</p> + + + http://localhost:3000/articles/2023/introduction-to-programming-for-hvac-1/ + Introduction to Programming for HVAC Part-1 + 2025-02-20T16:12:06Z + <p>This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.</p> +<h2>Why</h2> +<p>I think if nothing else, this series can help gain knowledge, tips, and tricks to make you more comfortable with your computer. I hope that +you will at least learn how to use your <code>terminal</code> application and more specifically <code>vim</code> motions and keybindings (more on that in another +article).</p> +<p>The goal of this article is to just get a machine setup with tools and to start exploring. I am a shill for <code>macOS</code>, so all of these will be +specifically geared towards that and my workflows, most everything that is showcased should also work on <code>linux</code> machines (not sure about +<code>windows</code>), although you may have to search for specific instructions on installing software for other platforms.</p> +<p>What I have learned on my journey in programming is that the more you can lean on small software packages that focus on a single task, but +do them well, the better. The less you use your mouse, the more productive you can be. The more you can work with <code>text</code> files and formats +the more portable and transformable your workflows can be.</p> +<h2>Getting Started</h2> +<p>The first thing that we will focus on is becoming familiar with the terminal application. On macOS the terminal application is located at +<code>/Applications/Utilities/Terminal.app</code>. However, rather than click around to find it, you can use the <code>⌘&lt;space&gt;</code> to pull up your spotlight +search, then type <code>Terminal</code> to select the terminal application.</p> +<p><img src="/articles/images/2023-09-21-spotlight.png" alt="spotlight" /></p> +<h3>Terminal Overview</h3> +<p>Your terminal is a program that allows you to run programs by typing commands into it’s window. There are a lot of built-in commands and a +bunch that you can install. The terminal is very customizable (and once familiar, you will constantly be tweaking / adjusting to suit your +needs). Right now customization is not what we will focus on, however in future articles I will provide tips and tricks on customizing it. +Right now, we only need to know how to open it up and type in commands.</p> +<p><img src="/articles/images/2023-09-21-terminal.png" alt="terminal" /></p> +<p>Below is an image / explanation of what the default status line includes.</p> +<p><img src="/articles/images/2023-09-21-terminal-line.png" alt="terminal-line" /></p> +<h3>Learn Basic Commands (Built-in)</h3> +<p>Here are a few basic commands that you should familiarize yourself with, as you will use them often when working inside of a terminal.</p> +<h3>Change Directory</h3> +<p><code>cd</code> (change directory) is the command that allows you to move around your file system when inside the terminal.</p> +<blockquote> +<p><strong>Note:</strong> <code>~</code> is a representation of your <code>Home</code> directory.</p> +</blockquote> +<pre><code class="language-bash">cd ~/Documents +</code></pre> +<p>The above command will move you into your Documents directory.</p> +<blockquote> +<p><strong>Note:</strong> If there are spaces in the name of the directory you try to move to then the easiest way is to wrap the name in quotes.</p> +</blockquote> +<pre><code class="language-bash">cd &quot;~/Documents/Product Concepts&quot; +</code></pre> +<p>Some other things to understand when moving around / supplying arguments to the <code>cd</code> command.</p> +<p>You can use <code>..</code> to go backwards / move up to the parent directory. For example, say we are in the <code>~/Documents</code> directory, to go back up to +the home directory we could use the following:</p> +<pre><code class="language-bash">cd .. +</code></pre> +<p>These can be chained together as well. For example say we are located in the <code>~/Documents/Product Concepts</code> directory, we could use the +following to go up two directory levels back to the home directory.</p> +<pre><code class="language-bash">cd ../.. +</code></pre> +<blockquote> +<p><strong>Pro-Tip:</strong> You can use the <code>&lt;tab&gt;</code> key when navigating to auto-complete, generally typing a few characters followed with the <code>&lt;tab&gt;</code> key +will auto-complete for you.</p> +</blockquote> +<h3>List files</h3> +<p>Use <code>ls</code> to output a list of files and directories where you are located.</p> +<pre><code class="language-bash">ls +</code></pre> +<p><em>Example Output when in my ~/Documents directory</em></p> +<pre><code class="language-bash">Estimates.app +InkscapeDrawings +KwikModel +MyAparment +NCISummit +Personal +Product Concepts +Receipts.receipts +RingCentral +SketchUP +Tech-Tips +desktop.ini +espanso-migrate-backup +espanso-migrate-backup-2 +</code></pre> +<p>Using options with <code>ls</code> to show more statistics and hidden files. There are often hidden files on your computer that are used for +application support or other purposes, these files are not shown using the default command. Hidden files start with a <code>.</code>, below is an +example of showing hidden files in your home directory.</p> +<pre><code class="language-bash">ls -la ~/ +</code></pre> +<blockquote> +<p><strong>Note:</strong> Above I added the <code>~/</code> which will allow you to list the files in your home directory even if you currently are not there in your +terminal, if you were already there (for example by using <code>cd ~/</code> then you would not need to use that at the end of the command.</p> +</blockquote> +<p><em>Example Output</em></p> +<pre><code>total 168 +drwxr-xr-x+ 46 michael staff 1472 Sep 22 10:45 . +drwxr-xr-x 6 root admin 192 Sep 22 09:08 .. +-r-------- 1 michael staff 7 Apr 8 2021 .CFUserTextEncoding +-rw-r--r--@ 1 michael staff 14340 Sep 18 10:15 .DS_Store +drwx------+ 5 michael staff 160 Sep 20 17:03 .Trash +-rw-r--r-- 1 michael staff 186 Sep 12 15:20 .actrc +drwxr-xr-x 4 michael staff 128 Dec 13 2021 .bin +drwxr-xr-x 3 michael staff 96 Mar 6 2023 .bundle +drwxr-xr-x 7 michael staff 224 Sep 12 11:40 .cabal +drwxr-xr-x 7 michael staff 224 Sep 12 15:20 .cache +drwxr-xr-x 13 michael staff 416 Aug 10 08:47 .config +drwx------ 3 michael staff 96 Jun 21 2021 .cups +drwxr-xr-x 12 michael staff 384 Sep 15 15:22 .docker +drwxr-xr-x 20 michael staff 640 Sep 19 08:11 .dotfiles +drwxr-xr-x 4 michael staff 128 Jul 26 2021 .gem +drwxr-xr-x 3 michael staff 96 Oct 11 2021 .jssc +-rw------- 1 michael staff 20 Sep 22 10:45 .lesshst +drwxr-x--- 3 michael staff 96 Mar 29 08:47 .lldb +drwxr-xr-x 8 michael staff 256 Mar 1 2023 .local +drwxr-xr-x 4 root staff 128 Apr 12 2021 .newtek +drwxr-xr-x 5 michael staff 160 Dec 13 2021 .npm +-rw------- 1 michael staff 27436 Apr 10 10:21 .psql_history +drwxr-xr-x 7 michael staff 224 Apr 18 2022 .ssh +drwxr-xr-x 6 michael staff 192 Sep 21 09:06 .swiftpm +lrwxr-xr-x 1 michael staff 25 Dec 27 2021 .tmux.conf -&gt; .dotfiles/tmux/.tmux.conf +drwxr-xr-x 8 michael staff 256 Mar 27 16:14 .twilio-cli +drwxr-xr-x 6 michael staff 192 Sep 18 11:08 .vim +-rw------- 1 michael staff 23086 Sep 21 09:45 .viminfo +-rw-r--r-- 1 michael staff 254 Sep 21 09:32 .wget-hsts +lrwxr-xr-x 1 michael staff 43 Jan 3 2022 .zshenv -&gt; /Users/michael/.dotfiles/zsh/config/.zshenv +drwxr-xr-x 8 michael staff 256 Dec 14 2021 AmazonWorkDocsCompanion +drwx------@ 4 michael staff 128 Dec 13 2021 Applications +lrwxr-xr-x 1 michael staff 40 Jun 6 12:00 Applications (Parallels) -&gt; /Volumes/Bucket/Applications (Parallels) +drwx------@ 30 michael staff 960 Sep 21 08:54 Desktop +drwx------@ 19 michael staff 608 Sep 14 10:15 Documents +drwx------@ 21 michael staff 672 Sep 21 09:43 Downloads +drwx------+ 115 michael staff 3680 Sep 14 10:04 Library +drwxr-xr-x 3 michael staff 96 Sep 8 13:06 LocalProjects +lrwxr-xr-x 1 michael staff 29 Dec 30 2021 Movies -&gt; /Volumes/Bucket/Videos/Movies +lrwxr-xr-x 1 michael staff 21 Dec 30 2021 Music -&gt; /Volumes/Bucket/Music +drwx------@ 2 michael staff 64 Mar 6 2023 Parallels +drwx------@ 7 michael staff 224 Sep 14 09:52 Pictures +drwxr-x---+ 4 michael staff 128 Apr 8 2021 Public +drwxr-xr-x+ 3 michael staff 96 Sep 14 09:52 Sites +drwxr-xr-x 3 michael staff 96 Jun 7 2021 WorkDocs Drive +drwxr-xr-x 3 michael staff 96 Sep 18 11:36 go +</code></pre> +<p>As you can see, I have a lot of hidden files and folders, your output will probably look much different than mine.</p> +<h3>Clearing the Terminal</h3> +<p>Often times you may want to clear the terminal screen. You can use the <code>clear</code> command to clear the screen of the terminal.</p> +<pre><code class="language-bash">clear +</code></pre> +<p>Or use a keyboard shortcut <code>⌃l</code> (<code>&lt;control&gt;l</code>)</p> +<h3>Creating Directories</h3> +<p>Use <code>mkdir</code> (make directory) to create a directory.</p> +<p>First, let’s move into the <code>tmp</code> directory, the <code>tmp</code> directory is a directory on your file system that is typically used for applications +to write temporary logs / files to, it get’s erased everytime your computer is restarted. We can use the <code>cd</code> command that we learned +earlier.</p> +<pre><code class="language-bash">cd /tmp +</code></pre> +<p>Next, let’s create a new directory called “MyDirectory”.</p> +<pre><code class="language-bash">mkdir MyDirectory +</code></pre> +<h4>Gotcha’s with ‘mkdir’</h4> +<p>By default you can’t create directories that are multiple levels deep, unless the directories already existed or we provide the <code>-p</code> option. +For example, if we want to create a directory at <code>/tmp/MyOtherDirectory/Nested/Deeply</code> then we could use the following command when inside +the <code>tmp</code> directory.</p> +<pre><code class="language-bash">mkdir -p MyOtherDirectory/Nested/Deeply +</code></pre> +<p>Now, try out using the <code>&lt;tab&gt;</code> key with the <code>cd</code> command to navigate to the <code>Deeply</code> folder.</p> +<pre><code class="language-bash">cd MyOther &lt;tab&gt; &lt;tab&gt; &lt;tab&gt; +</code></pre> +<h3>Open Command</h3> +<p>You can use the open command to open files or folders in the default application for the file type.</p> +<p>For example, if we want to open a <code>Finder</code> window while in the <code>/tmp</code> directory, we can use the following command:</p> +<pre><code class="language-bash">open . +</code></pre> +<h3>Manual Pages</h3> +<p>Lastly, to learn more about commands you can use the <code>man &lt;command&gt;</code>. To bring up the manual pages for the command in the terminal. You can +use the arrow keys to navigate around the manual pages and type the letter <code>q</code> to quit / close the manual pages.</p> +<pre><code class="language-bash">man ls +</code></pre> +<p>That is it for the first installment in this series. I hope you learned something and have better understanding of using your terminal.</p> + + + http://localhost:3000/articles/2023/introducing-psychrometrics-cli/ + Introducing Psychrometrics CLI + 2025-02-20T16:03:19Z + <p>Today, I’m releasing a command line application that is built on top of my +<a href="https://github.com/swift-psychrometrics/swift-psychrometrics">swift-psychrometrics</a> package, that I open sourced over 2 years ago.</p> +<p>The application consists of many calculations / conversions for psychrometric properties of an air stream. The tool works for both imperial +and metric units. The application will work natively on macOS, but can also be ran through a <code>docker</code> container on other platforms.</p> +<h2>Why</h2> +<p>I spend a lot of time in my terminal, because I can work so much more efficiently. I discovered many years ago that the more I can do using +simple applications and keyboard over a mouse and a web browser or native application the more I can accomplish. I understand this is +intimidating for many who think they are <em>“not good with computers”.</em> I can assure that was me several years ago, I would only encourage you +to not be afraid and give it a shot. We are at a time in society where it is easier than ever to get informed and learned new skills.</p> +<h2>Installation</h2> +<p>For complete installation instructions, you can view the <a href="https://github.com/swift-psychrometrics/psychrometrics-cli">github</a> repository.</p> +<p>The following instructions are based on using macOS.</p> +<h3>Open your terminal application.</h3> +<p>Personally, I use <a href="https://iterm2.com/">iTerm2</a>, however you can use the default <code>Terminal</code> app. Found at +<code>/Applications/Utilities/Terminal.app</code>.</p> +<h2>Install Homebrew</h2> +<p>We use <a href="https://brew.sh">Homebrew</a> for package distribution of the pre-built application binaries. You can follow their instructions to +install.</p> +<h3>Tap our custom formula tap.</h3> +<pre><code class="language-bash">brew tap swift-psychrometrics/formula +</code></pre> +<h3>Install the psychrometrics application</h3> +<pre><code class="language-bash">brew install psychrometrics +</code></pre> +<p>That’s it!</p> +<h2>Usage</h2> +<p>I will run through a couple of the commands that are supplied with the application and show what you can expect the outputs to be.</p> +<h3>Properties</h3> +<p>The following command will output a bunch of the psychrometric properties of an air stream. There are several ways to call it, but generally +you will supply the dry bulb temperature and the relative humidity.</p> +<p>Below, we calculate the psychrometric properties based on 75°F and 50% humidity.</p> +<pre><code class="language-bash">psychrometrics --dry-bulb 75 --relative-humidity 50 +</code></pre> +<p><img src="/articles/images/2023-09-18-properties.png" alt="properties-output" /></p> +<h3>Dehumidifier Sizing</h3> +<p>If you’ve read some of my recent articles on calculating the +<a href="https://mhoush.com/posts/sizing-dehumidifier-by-latent-load/">dehumidifier size required based on the latent load</a>, the application also +ships with a calculation that will do this for you and has the ability to calculate it at different <code>coverages</code> that you can supply.</p> +<p>For example if we’ve done a load calculation and determined that we have a latent load of <code>4,334 BTU/h</code> then we could run the following +command to see what size dehumidifier is needed for <code>100%, 85%, and 70%</code> of the latent load.</p> +<pre><code class="language-bash">psychrometrics dh size --coverage 100 85 70 --verbose 4334 +</code></pre> +<p><img src="/articles/images/2023-09-18-dh-size.png" alt="dh-size" /></p> +<h3>Pounds of Water Removed</h3> +<p>I also recently wrote an article about <a href="https://mhoush.com/posts/pounds-of-water-removed/">calculating the pounds of water removed</a> from an +air stream given the grains of moisture removed.</p> +<p>Below is an example of calculating the pounds of water removed per hour based on the example in the article (14 delta-grains)</p> +<pre><code class="language-bash">psychrometrics dh pounds-removed --delta 14 --cfm 797 --verbose +</code></pre> +<p><img src="/articles/images/2023-09-18-pounds-removed.png" alt="pounds-removed" /></p> +<h3>Help</h3> +<p>You can use <code>--help</code> option to show help and the list of commands provided.</p> +<p><img src="/articles/images/2023-09-18-help.png" alt="help" /></p> +<p>If you have any questions then feel free to email or message me. I hope some of you may find this application useful.</p> + + + http://localhost:3000/articles/2023/rss-feed/ + Rss Feed + 2025-02-20T16:50:11Z + <p>In this article I will show how to add this site’s rss feed. In particular, we will be using <a href="https://netnewswire.com">NetNewsWire</a> as the +rss reader.</p> +<h2>What is an RSS Feed</h2> +<p>An RSS feed will show you new posts, generally from a blog, without having to remember to check the website at regular intervals or signup +for an email list for notifications.</p> +<p>NetNewsWire puts an RSS feed as:</p> +<p><strong>It’s like podcasts</strong> - but for <em>reading.</em></p> +<p>You consume an RSS feed, using an RSS reader application or extension in your browser.</p> +<h2>Step One</h2> +<p>First find and download an RSS reader, you can download <a href="https://netnewswire.com">NetNewsWire</a> for macOS from the link, or for iOS from the +<a href="https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210">AppStore</a>.</p> +<h2>Step Two</h2> +<p>Add the rss feed to stay up to date when I publish new articles.</p> +<ol> +<li>Click the plus in the right side of the sidebar and select <code>New Feed...</code></li> +<li>In the URL field add: <code>https://mhoush.com/articles/feed.xml</code></li> +<li>Optionally give it a name</li> +<li>Click the <code>Add</code> button.</li> +</ol> +<p><img src="/articles/images/2023-08-10-rss-feed.gif" alt="rss gif" /></p> +<p>That’s it.</p> \ No newline at end of file diff --git a/deploy/articles/tag/software/index.html b/deploy/articles/tag/software/index.html index 6139978..496cde1 100644 --- a/deploy/articles/tag/software/index.html +++ b/deploy/articles/tag/software/index.html @@ -60,6 +60,90 @@ Salute to open-source software engineers

        +
        +

        + Introduction to Programming for HVAC Part-4 +

        + +

        + This article builds upon our last article, so make sure to catch up +before continuing with this article. +Arguments +Before we start creating our program that will remove the background from images let’s go over arguments in shell scripts. Arguments... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-3 +

        + +

        + In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first +articles, then you can catch up here before continuing with this article. +Getting Started +We are going to make... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-2 +

        + +

        + In this article, learn about installing a package manager. If you missed it, check out the +first article in the series where we learned about using your terminal. +This article builds upon that foundation. +What is a Package Manager +A package manager... +

        +
        +
        +

        + Introduction to Programming for HVAC Part-1 +

        + +

        + This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can +help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers. +Why +I... +

        +
        +
        +

        + Introducing Psychrometrics CLI +

        + +

        + Today, I’m releasing a command line application that is built on top of my +swift-psychrometrics package, that I open sourced over 2 years ago. +The application consists of many calculations / conversions for psychrometric properties of an air stream.... +

        +
        +
        +

        + Rss Feed +

        + +

        + In this article I will show how to add this site’s rss feed. In particular, we will be using NetNewsWire as the +rss reader. +What is an RSS Feed +An RSS feed will show you new posts, generally from a blog, without having to remember to check the... +

        +
        \ No newline at end of file diff --git a/deploy/articles/tag/tech-tip/feed.xml b/deploy/articles/tag/tech-tip/feed.xml index e2cf23c..75faf0a 100644 --- a/deploy/articles/tag/tech-tip/feed.xml +++ b/deploy/articles/tag/tech-tip/feed.xml @@ -6,67 +6,67 @@ Michael Housh - 2025-02-19T21:55:31Z + 2025-02-20T17:12:57Z http://localhost:3000/articles/2023/most-important-job/ Most Important Job 2025-02-19T21:21:54Z - <p>This short tech tip is about something one of my good friends in the trade told me a long time ago,<br /> + <p>This short tech tip is about something one of my good friends in the trade told me a long time ago, that has stuck with me through the years. It is a simple phrase / mindset.</p> <blockquote> <p>“The current job you’re on, is the most important job of your day”.</p> </blockquote> -<p>This mindset should be carried from the dispatcher, manager, and technician to make this successful.<br /> -I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use<br /> -this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging<br /> +<p>This mindset should be carried from the dispatcher, manager, and technician to make this successful. +I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use +this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging out there.</p> -<p>I do think it’s also important to acknowledge that there are times that a technician has exhausted<br /> -all their options, maybe they just don’t have the mental capacity anymore to continue with a problem<br /> -job, or need a break to come back another day with a fresh set of eyes, etc… This is also an<br /> -important thing for a technician to realize, and hopefully those type of instances are much more few<br /> +<p>I do think it’s also important to acknowledge that there are times that a technician has exhausted +all their options, maybe they just don’t have the mental capacity anymore to continue with a problem +job, or need a break to come back another day with a fresh set of eyes, etc… This is also an +important thing for a technician to realize, and hopefully those type of instances are much more few and far between, but I do want to acknowledge that scenario does also exist.</p> -<p>If you are a business owner, then this is something to consider instilling in your operations.<br /> -Empower your technicians and dispatchers to understand when things need to be shuffled around in<br /> -order to accommodate taking care of the customer at hand. It costs a lot of money to get a<br /> -technician to job, so minimizing truck rolls to the same job is important from a business<br /> +<p>If you are a business owner, then this is something to consider instilling in your operations. +Empower your technicians and dispatchers to understand when things need to be shuffled around in +order to accommodate taking care of the customer at hand. It costs a lot of money to get a +technician to job, so minimizing truck rolls to the same job is important from a business standpoint.</p> -<p>This was just a quick tech tip of something that has been rolling around in my mind lately. I hope<br /> +<p>This was just a quick tech tip of something that has been rolling around in my mind lately. I hope you find it helpful and it sticks with you through your career as it has mine.</p> http://localhost:3000/articles/2023/calculate-seer-degradation-by-age/ Calculate SEER Degradation by Age 2025-02-19T21:55:30Z - <p>This is a quick tech-tip to learn how to calculate the degradation of SEER based<br /> + <p>This is a quick tech-tip to learn how to calculate the degradation of SEER based on age.</p> -<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and<br /> -refrigerant charge losses. It should be noted that this is not true for all<br /> -applications, but is used as an estimation based on research done by the <code>DOE</code><br /> +<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and +refrigerant charge losses. It should be noted that this is not true for all +applications, but is used as an estimation based on research done by the <code>DOE</code> of the average degradation based on systems tested.</p> <h2>Formula</h2> -<p>This is the formula used to calculate the SEER based on age of the evaporator<br /> +<p>This is the formula used to calculate the SEER based on age of the evaporator coil / air handler.</p> <p>$$ SEER_d = SEER_n \times (1 - M)^{age} $$</p> -<p>| Where | |<br /> -| –––– | —————————————— | — |<br /> -| $SEER_d$ | Degradated SEER rating |<br /> -| $SEER_n$ | Nominal SEER rating when equipment was new |  |<br /> -| M | Maintenance factor, 0.01-0.03 |<br /> +<p>| Where | | +| –––– | —————————————— | — | +| $SEER_d$ | Degradated SEER rating | +| $SEER_n$ | Nominal SEER rating when equipment was new |  | +| M | Maintenance factor, 0.01-0.03 | | age | The age of the equipment, in years |</p> -<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is<br /> -for unmaintained. The maintenance factor in essence is based on 1%-3%<br /> -degradation per year, however there are some<br /> -<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a><br /> -that show that this can actually be as high as 5% or above depending on climate.<br /> -We could use up to 0.05 as the maintenance factor, just to see what the “range”<br /> +<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is +for unmaintained. The maintenance factor in essence is based on 1%-3% +degradation per year, however there are some +<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a> +that show that this can actually be as high as 5% or above depending on climate. +We could use up to 0.05 as the maintenance factor, just to see what the “range” of degradation would be.</p> -<p>Interestingly, the study linked also shows that the degradation is higher the<br /> -higher the tonnage of the equipment. It also shows that the degradation is lower<br /> -per year the higher the nominal SEER rating of the system (which is corelated to<br /> -using TXV’s and lower airflow rates because of the equipment having multiple<br /> +<p>Interestingly, the study linked also shows that the degradation is higher the +higher the tonnage of the equipment. It also shows that the degradation is lower +per year the higher the nominal SEER rating of the system (which is corelated to +using TXV’s and lower airflow rates because of the equipment having multiple stages).</p> <h2>Example</h2> -<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when<br /> +<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when installed and the system is 15 years old.</p> <p>Plugging those numbers into our formula.</p> <hr /> @@ -76,9 +76,143 @@ installed and the system is 15 years old.</p> <h4>Highest Rage (5% degradation / year)</h4> <p>$$ SEER_d = 13 \times (1 - 0.05)^{15} = 6 $$</p> <hr /> -<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER<br /> -vs. a poorly maintained / dirty system that also suffers from refrigerant charge<br /> +<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER +vs. a poorly maintained / dirty system that also suffers from refrigerant charge losses can be as low as 6 SEER.</p> <p>Thanks for learning how to estimate SEER degradation based on equipment age!</p> + + http://localhost:3000/articles/2023/sizing-dehumidifier-by-latent-load/ + Dehumidifier Sizing by Latent Load + 2025-02-20T17:04:37Z + <p>This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure.</p> +<h2>Formulas</h2> +<p>The formula above is used to solve for the pints per hour required to size a dehumidifier.</p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Ph</td> +<td>Pints / hour</td> +</tr> +</tbody> +</table> +<p>We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day.png" alt="pints-per-day-formula" /></p> +<table> +<thead> +<tr> +<th>Where</th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td>Ql</td> +<td>Latent load</td> +</tr> +<tr> +<td>Pd</td> +<td>Pints / day</td> +</tr> +</tbody> +</table> +<p>In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized +properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during +peak cooling demand.</p> +<h2>Example</h2> +<p>Let’s imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example.png" alt="pints-per-day-formula-example" /></p> +<p>Or if we just want to cover the latent capacity at 85% of the full latent load.</p> +<p><img src="/articles/images/2023-09-15-pints-per-day-example2.png" alt="pints-per-day-formula-example" /></p> +<p>This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition +we wanted to use.</p> +<p>I don’t feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an +oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application.</p> +<p>Thanks for reading!</p> + + + http://localhost:3000/articles/2023/pounds-of-water-removed/ + Pounds of Water Removed + 2025-02-20T16:43:21Z + <p>This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream).</p> +<p>This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This +article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here +are a couple articles to familiarize yourself.</p> +<h2>Articles</h2> +<ul> +<li><a href="https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/">Understand Dew-Point</a></li> +<li><a href="https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/">Impact of Adding or Removing Water from Air</a></li> +</ul> +<h2>Scenario</h2> +<p>Let’s imagine that we have an air-conditioner that has the following measurements taken:</p> +<ul> +<li>Return Air: 75° / 50% RH</li> +<li>Supply Air: 55° / 81% RH</li> +</ul> +<p>We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air +conditions).</p> +<p><img src="/articles/images/2023-09-08-pounds-of-water-removed.png" alt="chart" /></p> +<p>We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the +relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per +pound of air.</p> +<p>This gives us the following values:</p> +<ul> +<li>Return Air: 66 gr/lb</li> +<li>Supply Air: 52 gr/lb</li> +</ul> +<p>We can then use the following formula to calculate the pounds of water removed.</p> +<p><img src="/articles/images/2023-09-08-formula.png" alt="formula" /></p> +<table> +<thead> +<tr> +<th><strong>Where</strong></th> +<th></th> +</tr> +</thead> +<tbody> +<tr> +<td><strong>W</strong></td> +<td><em>Weight of water in pounds per hour</em></td> +</tr> +<tr> +<td><strong>4.5</strong></td> +<td><em>Constant based on density / specific heat of moist air</em></td> +</tr> +<tr> +<td><strong>CFM</strong></td> +<td><em>Airflow in cubic feet per minute</em></td> +</tr> +<tr> +<td><strong>∆G</strong></td> +<td><em>Difference in grains of moisture</em></td> +</tr> +<tr> +<td><strong>7000</strong></td> +<td><em>Constant based on grains of moisture in saturated air</em></td> +</tr> +</tbody> +</table> +<h2>Solution</h2> +<p>First, we solve for the difference in grains between the two air streams.</p> +<p>∆G = 66 - 52 = 14</p> +<p>Next, we’ve measured our airflow and have determined to have <strong>797 CFM</strong> of airflow across the evaporator coil, so we can substitute our +values into the formula.</p> +<p><img src="/articles/images/2023-09-08-solution.png" alt="solution" /></p> +<p>So, we are removing about 7 pounds of water per hour at these conditions.</p> +<p>Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that +can often be rated in pints per day.</p> +<p>I hope you’ve found this article helpful, thanks for reading!</p> + \ No newline at end of file diff --git a/deploy/articles/tag/tech-tip/index.html b/deploy/articles/tag/tech-tip/index.html index c094861..8f63a96 100644 --- a/deploy/articles/tag/tech-tip/index.html +++ b/deploy/articles/tag/tech-tip/index.html @@ -68,6 +68,33 @@ The degradation of SEER is due to fouling of the evaporator coil with dirt and refrigerant charge losses. It should be noted that this is not true for...

        +
        +

        + Dehumidifier Sizing by Latent Load +

        + +

        + This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if +you’ve done a load calculation and know the latent load of the structure. +Formulas +The formula above is used to... +

        +
        +
        +

        + Pounds of Water Removed +

        + +

        + This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air +stream) and the outlet conditions (supply air stream). +This is useful in the field when you want to calculate the... +

        +
        \ No newline at end of file diff --git a/deploy/index.html b/deploy/index.html index 41c5155..3bb4a5f 100644 --- a/deploy/index.html +++ b/deploy/index.html @@ -69,6 +69,12 @@ | Email

        + + + \ No newline at end of file diff --git a/deploy/static/prism.css b/deploy/static/prism.css index 4d91118..daad55d 100644 --- a/deploy/static/prism.css +++ b/deploy/static/prism.css @@ -1,16 +1,15 @@ -/* PrismJS 1.23.0 -https://prismjs.com/download.html#themes=prism&languages=css+clike+javascript+c+objectivec+python+swift */ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+swift */ /** - * prism.js default theme for JavaScript, CSS and HTML - * Based on dabblet (http://dabblet.com) - * @author Lea Verou + * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/chriskempson/tomorrow-theme + * @author Rose Pritchard */ code[class*="language-"], pre[class*="language-"] { - color: black; + color: #ccc; background: none; - text-shadow: 0 1px white; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; @@ -28,25 +27,7 @@ pre[class*="language-"] { -moz-hyphens: none; -ms-hyphens: none; hyphens: none; -} -pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; -} - -pre[class*="language-"]::selection, pre[class*="language-"] ::selection, -code[class*="language-"]::selection, code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; -} - -@media print { - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } } /* Code blocks */ @@ -58,7 +39,7 @@ pre[class*="language-"] { :not(pre) > code[class*="language-"], pre[class*="language-"] { - background: #f5f2f0; + background: #2d2d2d; } /* Inline code */ @@ -69,64 +50,61 @@ pre[class*="language-"] { } .token.comment, +.token.block-comment, .token.prolog, .token.doctype, .token.cdata { - color: slategray; -} - -.token.punctuation { color: #999; } -.token.namespace { - opacity: .7; +.token.punctuation { + color: #ccc; +} + +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted { + color: #e2777a; +} + +.token.function-name { + color: #6196cc; +} + +.token.boolean, +.token.number, +.token.function { + color: #f08d49; } .token.property, -.token.tag, -.token.boolean, -.token.number, +.token.class-name, .token.constant, -.token.symbol, -.token.deleted { - color: #905; +.token.symbol { + color: #f8c555; } .token.selector, -.token.attr-name, +.token.important, +.token.atrule, +.token.keyword, +.token.builtin { + color: #cc99cd; +} + .token.string, .token.char, -.token.builtin, -.token.inserted { - color: #690; +.token.attr-value, +.token.regex, +.token.variable { + color: #7ec699; } .token.operator, .token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: #9a6e3a; - /* This background color was intended by the author of this theme. */ - background: hsla(0, 0%, 100%, .5); -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #07a; -} - -.token.function, -.token.class-name { - color: #DD4A68; -} - -.token.regex, -.token.important, -.token.variable { - color: #e90; +.token.url { + color: #67cdcc; } .token.important, @@ -140,3 +118,7 @@ pre[class*="language-"] { .token.entity { cursor: help; } + +.token.inserted { + color: green; +}