{"id":50,"date":"2026-03-24T17:20:46","date_gmt":"2026-03-25T01:20:46","guid":{"rendered":"https:\/\/satchnet.io\/?p=50"},"modified":"2026-03-24T17:23:35","modified_gmt":"2026-03-25T01:23:35","slug":"google-ha-adventure-blog","status":"publish","type":"post","link":"https:\/\/satchnet.io\/?p=50","title":{"rendered":"How I Paid Google $5 to Access My Own Devices, Then Fought Their Console for 6 Hours"},"content":{"rendered":"\n<p><em>A tale of OAuth hell, quota purgatory, and the sweet victory of saying &#8220;Hey Google, turn on Test Switch&#8221;<\/em><\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Mission<\/h2>\n\n\n\n<p>It started innocently enough. I wanted to connect Google Home to Home Assistant so I could voice control things that Google doesn&#8217;t natively support. Maybe yell at my Tesla to charge. Perhaps get a sarcastic weather report from my local Ollama instance. You know, normal homelab shit.<\/p>\n\n\n\n<p>What I didn&#8217;t realize was that I was about to enter the ninth circle of Google Console Hell.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act I: The $5 Shakedown<\/h2>\n\n\n\n<p>First, you need to understand that Google charges you $5 to access the Nest Device Access API. Five dollars. To access devices <strong>you already own<\/strong>. Devices sitting in <strong>your own house<\/strong>. Google looked at the smart home market and said, &#8220;You know what this needs? A cover charge.&#8221;<\/p>\n\n\n\n<p>Fine. Whatever. I paid the $5. I&#8217;m a professional.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act II: Pub\/Sub? More Like Pub\/Suffering<\/h2>\n\n\n\n<p>Setting up the Nest integration requires something called Pub\/Sub, which is Google&#8217;s way of saying &#8220;we&#8217;re going to make you create a messaging queue just to know when your doorbell rings.&#8221;<\/p>\n\n\n\n<p>The setup instructions said to add a service account as a Publisher. Easy enough. I pasted in <code>cloud-device-manager@system.gserviceaccount.com<\/code> like a good boy.<\/p>\n\n\n\n<p><strong>Google:<\/strong> &#8220;Email addresses and domains must be associated with an active Google Account.&#8221;<\/p>\n\n\n\n<p>What? It&#8217;s YOUR service account, Google. YOU made it.<\/p>\n\n\n\n<p>Three searches later, I found the magic incantation: <code>sdm-publisher@googlegroups.com<\/code>. Because of course it&#8217;s a Google Group. Why would anything make sense?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act III: Project Quota: A Horror Story<\/h2>\n\n\n\n<p>With Nest working, I moved on to the Google Assistant integration. This requires creating a project in the Google Home Developer Console. Simple, right?<\/p>\n\n\n\n<p><strong>Google:<\/strong> &#8220;Resource has been exhausted. Check quota.&#8221;<\/p>\n\n\n\n<p>I had two active projects. TWO. Apparently, Google&#8217;s definition of &#8220;exhausted&#8221; is different from mine. I&#8217;ve seen my toddler&#8217;s toy box more exhausted than my project quota.<\/p>\n\n\n\n<p>I started deleting old projects like a madman. &#8220;My First Project&#8221;? Gone. &#8220;BMC Services Group&#8221; from a business I forgot existed? Terminated. I was a project-killing machine.<\/p>\n\n\n\n<p><strong>Google:<\/strong> &#8220;Resource has been exhausted.&#8221;<\/p>\n\n\n\n<p>WHAT. I just deleted projects!<\/p>\n\n\n\n<p>Turns out, deleted projects go into a 30-day &#8220;soft delete&#8221; limbo where they still count against your quota. Because Google hates you specifically.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act IV: The Quota Increase Request<\/h2>\n\n\n\n<p>I submitted a quota increase request. Google&#8217;s form asked why I needed more projects.<\/p>\n\n\n\n<p>&#8220;Setting up Home Assistant smart home integration.&#8221;<\/p>\n\n\n\n<p>Translation: &#8220;Please let me control my own lights.&#8221;<\/p>\n\n\n\n<p>They approved it in about an hour, which was genuinely shocking. I had prepared myself for a 2-week wait and a blood sacrifice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act V: The Console That Wouldn&#8217;t Save<\/h2>\n\n\n\n<p>Project quota? Fixed. Time to create my cloud-to-cloud integration.<\/p>\n\n\n\n<p>I filled out all the fields. Device types? Selected all of them because I&#8217;m not doing this twice. OAuth settings? Configured. Fulfillment URL? Entered.<\/p>\n\n\n\n<p>I clicked Save.<\/p>\n\n\n\n<p>The page hung. And hung. Chrome asked if I wanted to kill it.<\/p>\n\n\n\n<p>I switched to Firefox. Same thing.<\/p>\n\n\n\n<p>The console just&#8230; didn&#8217;t want to save. It would spin for 90 seconds, then dump me back to a blank form. I watched my carefully entered data vanish into the void three times.<\/p>\n\n\n\n<p>On the fourth attempt, it hung for two full minutes. I was about to throw my laptop out the window when I noticed something: the integration had actually been created. It saved. It just didn&#8217;t bother telling me.<\/p>\n\n\n\n<p>Google&#8217;s UX team, if you&#8217;re reading this: what the actual fuck?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act VI: &#8220;Light&#8221; Is The Only Device Type<\/h2>\n\n\n\n<p>Remember when I said I selected all device types? Yeah, Google only saved &#8220;Light.&#8221;<\/p>\n\n\n\n<p>I went back and selected them all again. Saved. Checked.<\/p>\n\n\n\n<p>Still just &#8220;Light.&#8221;<\/p>\n\n\n\n<p>At this point, I had been at this for about five hours. I decided Light would be fine. Most voice control is lights anyway. I&#8217;ll fight this battle another day.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act VII: The Attic of Misfit Devices<\/h2>\n\n\n\n<p>Finally, I linked Home Assistant to Google Home. It worked! Devices appeared!<\/p>\n\n\n\n<p>&#8230;including duplicates of things Google already controlled natively. My Nest thermostat showed up twice. A Wemo switch I forgot existed emerged from the depths. A light named &#8220;Shrek&#8221; in my kid&#8217;s room decided to make an appearance.<\/p>\n\n\n\n<p>I tried to delete the duplicates. Google wouldn&#8217;t let me \u2014 they were coming from Home Assistant now, so I couldn&#8217;t remove them from Google Home directly.<\/p>\n\n\n\n<p>My solution? I created a room called &#8220;Attic&#8221; and dumped all the duplicates there. Out of sight, out of mind. They can live in the attic with the Christmas decorations and my broken dreams.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Payoff<\/h2>\n\n\n\n<p>After all that suffering, I created a test input_boolean in Home Assistant, synced my devices, and said the magic words:<\/p>\n\n\n\n<p>&#8220;Hey Google, turn on Test Switch.&#8221;<\/p>\n\n\n\n<p>And it fucking worked.<\/p>\n\n\n\n<p>Six hours of wrestling with OAuth, quotas, hanging consoles, and mysterious Pub\/Sub permissions \u2014 all for the privilege of toggling a virtual switch with my voice.<\/p>\n\n\n\n<p>But here&#8217;s the thing: now I can voice control <strong>anything<\/strong> Home Assistant touches. Scripts. Automations. Entities. I can chain voice commands to Ollama and get sarcastic weather reports. I can yell at my Tesla (once I set up Tessie integration). The possibilities are endless.<\/p>\n\n\n\n<p>Was it worth it? Ask me again after I build that voice-activated weather roast system.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lessons Learned<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Google charges you to access your own devices.<\/strong> Accept this and move on.<\/li>\n\n\n\n<li><strong>Deleted projects haunt you for 30 days.<\/strong> Plan accordingly.<\/li>\n\n\n\n<li><strong>Google&#8217;s Developer Console will hang.<\/strong> Don&#8217;t panic. It might have worked anyway.<\/li>\n\n\n\n<li><strong>Create an &#8220;Attic&#8221; room in Google Home.<\/strong> You&#8217;ll need it for duplicate devices.<\/li>\n\n\n\n<li><strong><code>sdm-publisher@googlegroups.com<\/code> is the Pub\/Sub publisher.<\/strong> Write this down. Tattoo it on your arm. You&#8217;ll need it.<\/li>\n\n\n\n<li><strong>Always add <code>input_boolean<\/code> to your exposed domains.<\/strong> Your AI assistant will forget to tell you this until you&#8217;ve already restarted Home Assistant twice.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s Next<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Voice-activated sarcastic weather reports via Ollama<\/li>\n\n\n\n<li>Tesla voice control through Home Assistant<\/li>\n\n\n\n<li>Probably more fights with Google&#8217;s console<\/li>\n\n\n\n<li>Therapy<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><em>Dave runs a homelab at where he documents his adventures in self-hosted chaos. He paid Google $5 and regrets nothing. Mostly.<\/em><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A tale of OAuth hell, quota purgatory, and the sweet victory of saying &#8220;Hey Google, turn on Test Switch&#8221; The Mission It started innocently enough. I wanted to connect Google Home to Home Assistant so I could voice control things that Google doesn&#8217;t natively support. Maybe yell at my Tesla to charge. Perhaps get a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-50","post","type-post","status-publish","format-standard","hentry","category-home-assistant"],"_links":{"self":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/50","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=50"}],"version-history":[{"count":3,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/50\/revisions"}],"predecessor-version":[{"id":53,"href":"https:\/\/satchnet.io\/index.php?rest_route=\/wp\/v2\/posts\/50\/revisions\/53"}],"wp:attachment":[{"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/satchnet.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}