{"id":70,"date":"2026-05-12T13:22:06","date_gmt":"2026-05-12T21:22:06","guid":{"rendered":"https:\/\/satchnet.io\/?p=70"},"modified":"2026-05-12T13:22:06","modified_gmt":"2026-05-12T21:22:06","slug":"i-fought-my-thermostat-and-my-ai-and-im-not-sure-who-won","status":"publish","type":"post","link":"https:\/\/satchnet.io\/?p=70","title":{"rendered":"I Fought My Thermostat (And My AI) And I&#8217;m Not Sure Who Won"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>How I replaced a Nest thermostat with an Aqara W200, argued with two different AIs for six hours, and learned that &#8220;just adjust the setpoint&#8221; is apparently the most controversial sentence in home automation.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">There comes a point in every homelab owner&#8217;s life when you look at a perfectly functional piece of hardware and say, &#8220;This needs to go.&#8221; For me, that moment arrived when I realized my Google Nest Learning Thermostat \u2014 the one I paid good money for \u2014 was essentially a $250 cloud-dependent temperature display that ignored everything Home Assistant told it to do.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My climate automations? Dead. My game room compensation? A joke. My eco mode triggers? Fighting a Google API that treated every command like a suggestion. The Nest wasn&#8217;t a thermostat. It was a middle manager \u2014 nodding along in meetings, agreeing to everything, then doing whatever the hell it wanted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So I did what any reasonable person would do: I replaced it with something that speaks Matter, runs locally, and actually listens when Home Assistant tells it to do something. Enter the Aqara W200 Thermostat Hub.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Shopping Phase (AKA &#8220;Analysis Paralysis With a Side of Frustration&#8221;)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Zigbee thermostat market for US HVAC systems is, to put it politely, a wasteland. The Lux KONOz exists, and it technically works, but its ZHA integration has the kind of quirks that make you question your life choices. It doesn&#8217;t report &#8220;Idle&#8221; properly. It confuses fan modes with HVAC modes. It&#8217;s the thermostat equivalent of that coworker who marks every email as urgent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I briefly considered adding Z-Wave to my setup just for a thermostat. My exact words to Claude were &#8220;I don&#8217;t want to add Z-Wave because it&#8217;s just another protocol.&#8221; I stand by this. My Zigbee coordinator has enough responsibilities without introducing a roommate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then the Aqara W200 entered the chat. Matter over WiFi. Local control. Built-in Zigbee hub. Thread border router. mmWave presence sensor. Four-inch touchscreen. It&#8217;s not a thermostat \u2014 it&#8217;s a thermostat that went to grad school. At $159.99, it was the obvious choice. I ordered it before I finished reading the spec sheet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also ordered an Aqara temperature sensor for the game room because my whole climate strategy depends on knowing what temperature it is where I actually sit, not where the thermostat hangs in the upstairs hallway pretending everything is fine.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Installation (AKA &#8220;Why Aren&#8217;t These Wires Working&#8221;)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pulling the Nest off the wall was therapeutic. Five wires \u2014 Y1, G, Rc, W1, C \u2014 all neatly labeled with blue tape from whoever installed it. I photographed everything because I&#8217;m not an animal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The W200 went up in about ten minutes. Mounted the base, matched the wires to the same terminals, snapped the display on, and&#8230; &#8220;Wiring error detected.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cool. Cool cool cool.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Turns out the wires weren&#8217;t fully seated in the spring clamps. I yanked the display off, shoved the wires in harder (technical term), and it powered up perfectly. The Aqara app walked me through HVAC configuration, WiFi setup, and Matter pairing without any issues.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then came the fun part: pairing it to Home Assistant via Matter. The web UI told me I needed the Companion app. The Companion app asked if I wanted to use Google Home or &#8220;other.&#8221; I picked &#8220;other,&#8221; entered the pairing code, and thirty seconds later: <code>climate.thermostat_hub_w200<\/code> appeared in HA with heat, cool, heat_cool, off, AND preset modes including home, away, sleep, and vacation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The presets were exposed over Matter. I didn&#8217;t need the Scene\/Signal Sync workaround. I didn&#8217;t need to bridge anything through the Aqara app. It just worked.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I sat there for a full minute processing this. A thermostat. That just worked. With Home Assistant. Locally. I&#8217;d forgotten what that felt like.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Automation Rewrite (AKA &#8220;Claude Terminal Pro Goes Rogue&#8221;)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is where things got&#8230; educational.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have Claude Terminal Pro installed as an add-on in Home Assistant. It&#8217;s like having a junior sysadmin who&#8217;s enthusiastic, technically capable, and occasionally decides to rewrite your entire dashboard when you asked it to change one line.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I gave it a clear, detailed prompt: update the four existing climate automations to use the new W200, add game room compensation, add override detection, clean up the old Nest references. Simple, right?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It started strong. Updated the entity references, created input helpers for saving setpoints, built the presence automations with all three tracked persons. Beautiful YAML. Clean logic. Then it got creative.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It started pulling logic from my five disabled legacy automations. You know, the ones I specifically said to keep as reference only. It added delta temperature calculations I didn&#8217;t ask for. It built nested choose blocks three levels deep. It created dashboard chips with arrows pointing in every direction. At one point it tried to add a sensor schedule that automatically switched between upstairs and downstairs sensors based on time of day \u2014 which sounds useful until you realize I never asked for it and it was using entities that no longer existed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I told it to stop. It apologized. Then it did it again.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Compensation Saga (AKA &#8220;Six Hours of &#8216;That&#8217;s Not What I Meant'&#8221;)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s where I need to be honest: the concept of temperature compensation is simple. The execution nearly broke me.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The problem: my thermostat is upstairs. My game room is downstairs. The game room can be five degrees different from the hallway. If I set the thermostat to 70, the hallway hits 70 and the thermostat idles \u2014 while the game room sits at 65 wondering what it did wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The solution: HA reads the game room sensor, calculates the difference between the thermostat&#8217;s reading and the game room&#8217;s reading, and adjusts the setpoint to compensate. If the game room is 5 degrees colder, HA bumps the setpoint up by 5.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sounds straightforward. It is straightforward. But explaining this to Claude Terminal Pro was like teaching a golden retriever to use a doorknob. It understood the individual concepts. It could not stop itself from adding features.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First attempt: It built a compensation system with hysteresis, deadbands, half-degree rounding, and a 2-degree offset for heat_cool mode. I didn&#8217;t ask for any of this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Second attempt: I told it to simplify. It responded by proposing to turn the thermostat OFF when the game room was in range and back ON when it wasn&#8217;t. I don&#8217;t want my thermostat turning on and off like a strobe light at a rave.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Third attempt: It asked me if I wanted it to switch HVAC modes based on the game room temperature. No. I want to set the mode. I&#8217;m the pilot here. The thermostat is the autopilot. It does what I tell it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fourth attempt: It suggested widening the setpoints to 40\u00b0F\/99\u00b0F when the game room was comfortable. I stared at this suggestion for thirty seconds and then typed something unpublishable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fifth attempt: I wrote a prompt so detailed it could have been filed as a legal brief. &#8220;Calculate delta. Add delta to target. Set thermostat. That&#8217;s it. Don&#8217;t turn it off. Don&#8217;t change the mode. Don&#8217;t set setpoints to 40 or 99. Don&#8217;t reference the disabled automations. Don&#8217;t touch the dashboard.&#8221; It finally got it right.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The working automation is beautiful in its simplicity: every ten minutes, <code>thermostat_temp - game_room_temp = delta<\/code>. <code>Target + delta = adjusted setpoint<\/code>. Set the thermostat. Done. Five variables, one condition, one action. That&#8217;s all it ever needed to be.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Override Revelation (AKA &#8220;Why Didn&#8217;t We Just Do This From The Start&#8221;)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After the compensation was working, I realized there was another problem: what happens when I manually change the thermostat?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The original design paused compensation for an hour and then resumed with the old targets. Which means if I bumped the temperature from 70 to 72, the system would fight me an hour later and set it back to 70.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I asked Claude (the regular one, not Terminal Pro) a simple question: &#8220;What if I change the thermostat and HA just&#8230; uses my new number?&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The response was essentially: &#8220;Yeah, we should have done that from the beginning.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So now: you change the thermostat anywhere \u2014 on the wall, in the Aqara app, in HA \u2014 and the override detection automation reads your new setpoints, saves them as the new targets, pauses compensation for ten minutes so you can finish tweaking, and then resumes using YOUR numbers. You&#8217;re always the boss. HA always adapts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is what I wanted from the start. This is what should have been built first. But sometimes you have to build the wrong thing five times before the right thing becomes obvious.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Moment It All Clicked<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I left the house to run to the store. My phone buzzed: &#8220;Thermostat switched to Away mode.&#8221; The W200 set itself to 61-78\u00b0F. All lights off. Garage closed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I walked back in the door. Phone buzzed again: &#8220;Welcome Home.&#8221; Thermostat restored to heat_cool at 68-73. Garage opened. Game room lamp turned on.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ten minutes later, the compensation automation fired. Thermostat reads 75, game room reads 70, delta is 5. Adjusted setpoints: 73-78. The AC, which had been running because it saw 75 against a 73 cool target, shut off. The fan ran for about a minute pushing the last of the cold air through the ducts, then stopped.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The game room was 70 degrees. My targets were 68-73. The system was idle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I sat on the couch, looked at the dashboard \u2014 game room temp chip showing 70.7\u00b0, &#8220;Home&#8221; preset, &#8220;Auto \u00b7 Downstairs&#8221; sensor mode \u2014 and felt something I haven&#8217;t felt since I started this homelab journey:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nothing needed fixing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I Learned<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>The Nest had to go.<\/strong> Cloud-dependent smart home devices are the ex you keep going back to because &#8220;they&#8217;re not that bad.&#8221; They are that bad. Local control or bust.<\/li>\n\n\n\n<li><strong>Matter actually works.<\/strong> I was skeptical. The W200 paired to HA in thirty seconds and responds to commands instantly. No API rate limits, no cloud round-trips, no &#8220;sorry, I can&#8217;t reach Google right now.&#8221;<\/li>\n\n\n\n<li><strong>Temperature compensation is simple math wrapped in complex feelings.<\/strong> The concept is one line of arithmetic. The implementation required me to have an existential crisis about what &#8220;idle&#8221; means.<\/li>\n\n\n\n<li><strong>AI coding assistants are like interns.<\/strong> They&#8217;re smart, they&#8217;re fast, they&#8217;re eager to help, and they will absolutely rebuild your kitchen when you asked them to change a lightbulb. Clear, aggressive prompts are not optional.<\/li>\n\n\n\n<li><strong>The 5\u00b0F deadband is real.<\/strong> The W200 enforces a minimum 5-degree spread in heat_cool mode. This is a hardware limitation to protect your HVAC from short-cycling. Don&#8217;t fight it.<\/li>\n\n\n\n<li><strong>The fan runs for about a minute after the compressor stops.<\/strong> This is normal. Stop panicking.<\/li>\n\n\n\n<li><strong>Always back up before you celebrate.<\/strong> HA snapshot + Proxmox VM backup. Belt and suspenders. Because the homelab gods are always watching.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">The Final Tally<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Aqara W200 Thermostat Hub:<\/strong> $159.99<\/li>\n\n\n\n<li><strong>Aqara Temperature Sensor:<\/strong> $19.98<\/li>\n\n\n\n<li><strong>Hours spent arguing with AI about setpoint math:<\/strong> ~6<\/li>\n\n\n\n<li><strong>Times Claude Terminal Pro was told to stop touching the dashboard:<\/strong> 4<\/li>\n\n\n\n<li><strong>Manual override notifications received while coming home:<\/strong> 1 (bug, now fixed)<\/li>\n\n\n\n<li><strong>Moments of genuine satisfaction when the AC shut off on schedule:<\/strong> 1<\/li>\n\n\n\n<li><strong>Worth it?<\/strong> Absolutely.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Dave is a commercial airline pilot who runs a Proxmox homelab, automates everything with Home Assistant and n8n, and firmly believes that if your thermostat requires a Google account, you&#8217;ve already lost. He writes about his homelab adventures at satchnet.io when he&#8217;s not arguing with AI assistants about the definition of &#8220;simple.&#8221;<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>How I replaced a Nest thermostat with an Aqara W200, argued with two different AIs for six hours, and learned that &#8220;just adjust the setpoint&#8221; is apparently the most controversial sentence in home automation. There comes a point in every homelab owner&#8217;s life when you look at a perfectly functional piece of hardware and say, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,12],"tags":[],"class_list":["post-70","post","type-post","status-publish","format-standard","hentry","category-automation","category-home-assistant"],"_links":{"self":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/70","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=70"}],"version-history":[{"count":1,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/70\/revisions"}],"predecessor-version":[{"id":71,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/70\/revisions\/71"}],"wp:attachment":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=70"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=70"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=70"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}