http://localhost:3000/articles/feed.xml mhoush Michael Housh 2025-02-20T17:12:57Z http://localhost:3000/articles/2025/vapor-htmx-todo-app/ Vapor + HTMX 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/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 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 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 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 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 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 (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 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 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 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 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 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 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 cases of PGP encryption.</p> <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 <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 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 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 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 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 to use it to encrypt your data and be in control of your privacy.</p> <h3>Resources</h3> <ul> <li><a href="https://gnupg.org/">GnuPG</a></li> <li><a href="https://www.openpgp.org/">OpenPGP</a></li> <li><a href="https://gpg.wtf/">gpg.wtf</a></li> <li><a href="https://www.ietf.org/rfc/rfc4880.html">RFC4880</a></li> </ul> 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 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 <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 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 on your network.</p> <p><code>ssh root@192.168.1.10</code></p> <h2>Step Two - Install Samba</h2> <p>First, we’ll update the package registry information.</p> <p><code>apt-get update</code></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 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 make the samba server act better for time machine backups.</p> <pre><code>#======================= MacOS Client Optimizations ======================= vfs objects = fruit streams_xattr fruit:metadata = stream fruit:model = MacSamba fruit:posix_rename = yes fruit:veto_appledouble = no fruit:nfs_aces = no 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 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 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> <h2>Step Four - Start Samba</h2> <p>Use the following command to start the samba server.</p> <p><code>sudo service smbd start</code></p> <p>You can check the status, by running the following command.</p> <p><code>systemctl status smbd</code></p> <p><img src="/articles/images/2024-03-15-status.png" alt="status" /></p> <p>Enable the samba server to start on boot.</p> <p><code>systemctl enable smbd.service</code></p> <h2>Step Five - Create Users</h2> <p>Create a user with a home directory that they can use.</p> <p><code>useradd --create-home michael</code></p> <p>Give the user a password to login to the samba server.</p> <p><code>smbpasswd michael</code></p> <h2>Step Six - Login to Samba Server from Client</h2> <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 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 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 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/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 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 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, 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 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 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 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 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 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> </ul> 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, 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. 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 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. 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 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 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 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 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 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 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 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 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 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 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 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 <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 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 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 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. 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 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 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 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 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 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, 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 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. 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 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 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 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 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. 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 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, 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 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> <li>Not highly available in the U.S.</li> <li>When the chiller is down nothing works (not much different than traditional)</li> <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 for traditional boiler systems)</li> </ol> <h2>Advantages</h2> <ol> <li>Central plant for heating, cooling, and DHW (also a disadvantage)</li> <li>Flexible distribution options / methods.</li> <li>Self contained refrigerant circuit</li> <li>Ability to produce / store thermal energy during off peak electrical hours</li> <li>Ability to move BTU’s more efficiently through water than air</li> <li>Long life for distribution system (50-100+ years)</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 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> http://localhost:3000/articles/2023/you-should-learn-markdown/ You Should Learn Markdown 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 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 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, 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 (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 <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> <thead> <tr> <th>Platform</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>Google</td> <td>Most goggle tools support markdown, docs, sheets, etc.</td> </tr> <tr> <td>Outlook</td> <td>Although I hate outlook email client, it does support markdown.</td> </tr> <tr> <td>Dillinger.io</td> <td>An online tool for writing / previewing markdown</td> </tr> <tr> <td>MarkText</td> <td>A multi-platform editor for writing markdown</td> </tr> </tbody> </table> <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 / content creation.</p> <p>Thanks for reading until the end!</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 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 / 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 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, 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 / 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 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 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 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 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 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 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 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 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 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> <ol> <li>Build the community around you that you want / deserve.</li> <li>Don’t be so quick to pass judgment.</li> <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 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 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 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 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, 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 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 of guidance he has given in the past. He truly wants to help teach people.</li> </ul> </li> <li>Michael Cianfracco (??) <ul> <li>Man does he make me laugh and we share a passion for the 4-Roses.</li> </ul> </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 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 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, 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 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 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 on age.</p> <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 coil / air handler.</p> <p>$$ SEER_d = SEER_n \times (1 - M)^{age} $$</p> <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 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 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 installed and the system is 15 years old.</p> <p>Plugging those numbers into our formula.</p> <hr /> <h4>Lowest Range (1% degradation / year)</h4> <p>$$ SEER_d = 13 \times (1 - 0.01)^{15} = 11.2 $$</p> <hr /> <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 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>