<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Michael Bernhart</title>
    <description>The latest articles on DEV Community by Michael Bernhart (@cloudapp_dev).</description>
    <link>https://dev.to/cloudapp_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3974608%2Fc22d5e7e-7665-4ecb-b10b-4d4bb29e2c04.png</url>
      <title>DEV Community: Michael Bernhart</title>
      <link>https://dev.to/cloudapp_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cloudapp_dev"/>
    <language>en</language>
    <item>
      <title>Caching a Huawei SUN2000 over Modbus for Home Assistant</title>
      <dc:creator>Michael Bernhart</dc:creator>
      <pubDate>Mon, 08 Jun 2026 18:06:57 +0000</pubDate>
      <link>https://dev.to/cloudapp_dev/caching-a-huawei-sun2000-over-modbus-for-home-assistant-59j0</link>
      <guid>https://dev.to/cloudapp_dev/caching-a-huawei-sun2000-over-modbus-for-home-assistant-59j0</guid>
      <description>&lt;p&gt;My Huawei SDongle accepts exactly one Modbus connection at a time — but Home Assistant, my AC·THOR and evcc all want to read the inverter at once. Polling it from three clients just gave me dropped connections and gaps in my data. So I wrote a small asyncio cache server (~300 lines) that does one quiet poll of the SUN2000 and serves every client from that cached snapshot. Here's how it works, and the full code.&lt;/p&gt;

&lt;p&gt;The fault that finally pushed me into writing my own Modbus server wasn't dramatic. It was a hole. Every evening, right around the time the boiler heater kicked in, my energy dashboard in Home Assistant would flatline for a few minutes and then snap back. Not a crash — just a gap, the kind you stop noticing until you're squinting at a graph trying to work out where 0.4 kWh went.&lt;/p&gt;

&lt;h2&gt;
  
  
  One connection, and everyone wants it
&lt;/h2&gt;

&lt;p&gt;I run a &lt;strong&gt;Huawei SUN2000-8KTL-M1&lt;/strong&gt; with a LUNA2000 battery. The inverter talks to the outside world through a little SDongle, and the SDongle speaks Modbus TCP on port 502. The catch — and it's one a lot of Huawei owners walk straight into — is that the SDongle accepts exactly &lt;strong&gt;one&lt;/strong&gt; Modbus TCP connection at a time.&lt;/p&gt;

&lt;p&gt;And I had four things that wanted it: Home Assistant's Huawei Solar integration for the dashboard, the &lt;strong&gt;AC·THOR 9s&lt;/strong&gt; that dumps PV surplus into the hot-water boiler and needs a live meter reading to modulate, evcc for the wallbox, and the FusionSolar cloud. FusionSolar is the lucky one — it rides its own channel up to Huawei's servers and never touches Modbus. The other three were elbowing each other off the single slot. Whoever connected last won; the rest got connection resets, and the dashboard got that flatline.&lt;/p&gt;

&lt;h2&gt;
  
  
  First fix: a transparent proxy
&lt;/h2&gt;

&lt;p&gt;The obvious answer is a proxy: one process holds the single connection to the SDongle, every client talks to the proxy instead. I started with the &lt;a href="https://github.com/TCzerny/ha-modbusproxy" rel="noopener noreferrer"&gt;ha-modbusproxy add-on&lt;/a&gt; — point it at the SDongle, have it listen on 5502, repoint Home Assistant and the AC·THOR there.&lt;/p&gt;

&lt;p&gt;It worked. For a while. But a transparent proxy still forwards every client's read straight through to the inverter, and that surfaced a subtler problem. Modbus TCP tags each request with a transaction id, and several clients sharing one upstream connection don't coordinate those ids. Under load you can get a client receiving a response meant for someone else's request, decoding it, and quietly believing the battery sits at 7% when it's really at 70%. Rare — but wrong in the worst possible way, because it's silent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix that stuck: stop talking to the inverter
&lt;/h2&gt;

&lt;p&gt;So I stopped letting the clients talk to the inverter at all. Instead of forwarding reads, I poll the SDongle myself, once, on a schedule, cache every register I care about, and serve all the clients out of that cache. It's about 300 lines of asyncio Python, it runs as a systemd service on port 5502, and the inverter only ever sees one polite reader.&lt;/p&gt;

&lt;p&gt;The reader side is a list of register batches and a loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;REGISTER_BATCHES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32106&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# cumulative energy yield (uint32)
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32114&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# daily energy yield
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;37113&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# active grid power (int32)
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;37760&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# battery SOC
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;37765&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;# battery power (int32)
&lt;/span&gt;    &lt;span class="c1"&gt;# ...thirteen batches in total
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# one connection, walk every batch 50 ms apart, then sleep 10 s
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;REGISTER_BATCHES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;read_batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;register_cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each batch is a plain function-code-3 read. I keep 50 ms between them so I'm not rushing a device that's slower than a normal Modbus meter, and the whole sweep repeats every ten seconds. That's the only conversation the SDongle ever has.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serving the clients from cache
&lt;/h2&gt;

&lt;p&gt;The server side speaks just enough Modbus to be useful. A read never touches the inverter — it's answered straight from the dict, and crucially I build the response against the calling client's own header, so the transaction-id problem simply cannot happen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# read holding registers — served from cache, never the inverter
&lt;/span&gt;    &lt;span class="n"&gt;reg_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reg_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;HH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pdu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;register_cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reg_addr&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reg_count&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;resp_pdu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;BB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reg_count&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resp_pdu&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;H&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;reg_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# built against THIS client's own header → no transaction-id mix-ups
&lt;/span&gt;    &lt;span class="n"&gt;resp_header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;HHHB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tx_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp_pdu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;client_writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp_header&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;resp_pdu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Writes are the exception. A write (function code 6) is usually battery control — telling the inverter to charge or discharge — and that has to reach real hardware, so I forward those straight to the SDongle and pass the result back. Reads are cached, writes are real. That one split is the whole design.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually bought me
&lt;/h2&gt;

&lt;p&gt;The part I didn't expect to enjoy this much is the decoupling. A client's poll rate is now completely independent of the inverter's. Home Assistant can ask every five seconds, the AC·THOR every second, evcc whenever it feels like it — and the SDongle still sees exactly one reader, once every ten. The flatline is gone, and the AC·THOR hasn't lost its meter value since.&lt;/p&gt;

&lt;p&gt;It also gave me a clean place to hang the numbers I actually care about. On top of those cached registers I built a handful of template sensors: self-consumption sitting around &lt;strong&gt;65.9%&lt;/strong&gt; , autarky &lt;strong&gt;76.9%&lt;/strong&gt; , the battery turning in &lt;strong&gt;97.2%&lt;/strong&gt; round-trip efficiency. Those are exactly the figures the FusionSolar app never quite shows you in one place — and they're the subject of the next part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest gotcha
&lt;/h2&gt;

&lt;p&gt;A cache can go stale, and an energy dashboard that lies confidently is worse than one with an honest gap. If the SDongle drops — a firmware reboot, a flaky switch — the reader loop keeps failing and the cached values quietly age. So I log it: once the cache is older than 120 seconds a warning fires, and the retry backs off instead of hammering a device that isn't answering. Clients keep getting the last-known value, which for a power graph is the right failure mode — a held line beats a hole — but you do want to know when it's happening.&lt;/p&gt;

&lt;p&gt;If you run Home Assistant on a VM like I do — I wrote earlier about &lt;a href="https://www.cloudapp.dev/home-assistant-how-to-install-via-docker-on-an-azure-linux-vm" rel="noopener noreferrer"&gt;getting it onto an Azure Linux box&lt;/a&gt; — dropping a 300-line Python service next to it costs almost nothing, and it's been the single most stable part of my solar setup ever since. Next part: turning those cached registers into the autarky and self-consumption numbers that actually tell you whether the battery was worth buying.&lt;/p&gt;

</description>
      <category>python</category>
      <category>homeassistant</category>
      <category>selfhosted</category>
      <category>iot</category>
    </item>
    <item>
      <title>Why the Home Assistant Community Store (HACS) is a Must-Have for Every HA User</title>
      <dc:creator>Michael Bernhart</dc:creator>
      <pubDate>Wed, 08 Jan 2025 00:00:00 +0000</pubDate>
      <link>https://dev.to/cloudapp_dev/why-the-home-assistant-community-store-hacs-is-a-must-have-for-every-ha-user-4f1k</link>
      <guid>https://dev.to/cloudapp_dev/why-the-home-assistant-community-store-hacs-is-a-must-have-for-every-ha-user-4f1k</guid>
      <description>&lt;p&gt;For my first few months with Home Assistant I stuck to the built-in integrations and wondered why everyone online had dashboards and devices I just couldn't find. The answer was HACS — the Home Assistant Community Store. It's the one add-on that unlocks the huge ecosystem of community integrations, cards and themes that aren't in core, and it's the first thing I install on any fresh HA setup now. Here's what HACS is, why it matters, and how it changed the way I run my smart home.&lt;/p&gt;

&lt;p&gt;Home automation is all about customization and flexibility. For those using &lt;a href="https://www.home-assistant.io/" rel="noopener noreferrer"&gt;Home Assistant&lt;/a&gt;, the open-source platform for managing your smart home, you likely already appreciate its powerful integrations and ability to grow alongside your needs. But even with its extensive core capabilities, there’s a way to unlock even more potential: the &lt;strong&gt;Home Assistant Community Store (HACS)&lt;/strong&gt;.In this story, we’ll explore HACS, why it’s a game-changer, and how to get started with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is HACS?
&lt;/h2&gt;

&lt;p&gt;HACS — the &lt;strong&gt;Home Assistant Community Store&lt;/strong&gt; — is a free, open-source add-on that lets you discover, install, and update community-built integrations, themes, dashboard cards, and automations inside Home Assistant, all from one place. It isn’t part of Home Assistant by default and isn’t an official add-on store; think of it as a community-run “app store” that fills the gap between Home Assistant’s built-in integrations and the thousands of custom ones the community maintains on GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use HACS?
&lt;/h2&gt;

&lt;p&gt;Here are a few compelling reasons to add HACS to your Home Assistant setup:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Expand Home Assistant’s Capabilities
&lt;/h2&gt;

&lt;p&gt;Home Assistant already supports many devices and services, but HACS takes it further by introducing custom integrations. For instance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Want to integrate niche smart devices or APIs not officially supported? HACS has got you covered.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you need a new feature, like advanced analytics or a custom card for your dashboard? HACS is where you’ll find it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Stunning Custom Dashboards
&lt;/h2&gt;

&lt;p&gt;Home Assistant’s Lovelace UI is flexible out of the box, but HACS brings a treasure trove of &lt;strong&gt;custom Lovelace cards and themes&lt;/strong&gt;. With these, you can build sleek, visually appealing dashboards tailored to your preferences.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Community-Driven Innovation
&lt;/h2&gt;

&lt;p&gt;The Home Assistant community is packed with talented developers, and HACS is the go-to platform for their creations. You’ll often find cutting-edge integrations or solutions to common challenges here before they’re available in the core platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Seamless Updates
&lt;/h2&gt;

&lt;p&gt;HACS makes managing custom components simple. With its intuitive interface, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Install new integrations in a few clicks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Receive notifications when updates are available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update integrations directly within the Home Assistant UI.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Completely Open Source
&lt;/h2&gt;

&lt;p&gt;True to Home Assistant’s ethos, HACS is 100% open source, ensuring transparency and fostering a collaborative ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Popular HACS Integrations and Plugins
&lt;/h2&gt;

&lt;p&gt;Some standout offerings available through HACS include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mini Graph Card&lt;/strong&gt; : Create beautiful graphs for temperature, power usage, and more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lovelace Auto-Entities&lt;/strong&gt; : Dynamically display entities on your dashboard based on filters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Garbage Collection&lt;/strong&gt; : Stay on top of your trash and recycling schedule.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom Animated Weather Cards&lt;/strong&gt; : Add visually stunning weather widgets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI Themes&lt;/strong&gt; : Transform the look and feel of your Home Assistant interface with themes like “Dark Mode” or “Google Material Design.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Install and Use HACS
&lt;/h2&gt;

&lt;p&gt;Installing HACS is straightforward, but it requires a few steps. Here’s a quick guide to get you started:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Prepare Home Assistant
&lt;/h2&gt;

&lt;p&gt;Before you begin, ensure you’re running Home Assistant Core on a supported platform like Docker, a Raspberry Pi, or a virtual machine.We will continue with the docker installation, which was done in the first step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cloudapp.dev/home-assistant-how-to-install-via-docker-on-an-azure-linux-vm" rel="noopener noreferrer"&gt;How to install Homeassistant via Docker on an Azure Linux VM&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Install HACS
&lt;/h2&gt;

&lt;p&gt;HACS installation is best done via Home Assistant’s CLI:&lt;/p&gt;

&lt;p&gt;Official Documentation: &lt;a href="https://hacs.xyz/docs/use/configuration/basic/#to-set-up-the-hacs-integration" rel="noopener noreferrer"&gt;https://hacs.xyz/docs/use/configuration/basic/#to-set-up-the-hacs-integration&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SSH into your Home Assistant setup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change to your config-volume, which in our case is mounted under /home/xxxUserDirxxx/homeassistant&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the following command to install HACS:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;curl -sfSL https://get.hacs.xyz | bash -&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Integrate HACS with Home Assistant
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Once installed, restart Home Assistant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcby0utrcz7zznhilpex6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcby0utrcz7zznhilpex6.png" alt="HACS Setup 1" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Settings &amp;gt; Integrations&lt;/strong&gt; in the Home Assistant UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff48zjyqmu2qkq2zj1lq1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff48zjyqmu2qkq2zj1lq1.png" alt="HACS Setup 2" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Search for “HACS” and follow the on-screen instructions to complete setup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Follow this detailed how-to for the final steps -&amp;gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Start Exploring
&lt;/h2&gt;

&lt;p&gt;After setup, HACS will appear in your sidebar. Browse and install custom integrations, themes, and plugins with just a few clicks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yz7m2hab3qkk1plzbd9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yz7m2hab3qkk1plzbd9.png" alt="HACS Setup 3" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, I needed the integration “Fusion Solar” to connect my Huawei PV-Solution, and I installed the “Mobile App” as well. The next step will be installing the KNX/EIB solution so that I can interact with my home.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions about HACS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is HACS in Home Assistant?
&lt;/h3&gt;

&lt;p&gt;HACS (Home Assistant Community Store) is a community-maintained store for installing and updating custom integrations, themes, and Lovelace cards that aren’t in Home Assistant’s official integration list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is HACS official or safe to use?
&lt;/h3&gt;

&lt;p&gt;HACS isn’t an official Home Assistant project, but it’s widely used and open source. The integrations you install through it are community-made, so review a repository’s popularity and source before installing — just as you would with any third-party software.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need HACS for Home Assistant?
&lt;/h3&gt;

&lt;p&gt;No — Home Assistant works fully without it. You only need HACS once you want a custom integration, theme, or dashboard card that isn’t available in the built-in catalog.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I install HACS?
&lt;/h3&gt;

&lt;p&gt;The quickest way is the official one-line installer run from your Home Assistant CLI, then adding HACS as an integration and authorizing it with a GitHub account. See the step-by-step section above.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the must-have HACS integrations?
&lt;/h3&gt;

&lt;p&gt;Popular picks include custom Lovelace cards such as Mushroom and mini-graph-card, the Card Mod and Browser Mod tools, and device-specific integrations the core doesn’t ship — see the “Popular HACS Integrations” section above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudapp-dev, and before you leave us
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Thank you for reading until the end. Before you go:&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Please consider&lt;/em&gt; &lt;strong&gt;&lt;em&gt;clapping&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;and&lt;/em&gt; &lt;strong&gt;&lt;em&gt;following&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;the writer! 👏 on our&lt;/em&gt; &lt;a href="https://medium.com/@cloudapp_dev" rel="noopener noreferrer"&gt;&lt;em&gt;Medium Account&lt;/em&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://x.com/Cloudapp_dev" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Or follow us on twitter -&amp;gt; Cloudapp.dev&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>homeassistant</category>
      <category>tutorial</category>
      <category>selfhosted</category>
      <category>smarthome</category>
    </item>
  </channel>
</rss>
