Na minha série em três partes eu mostrei os portões, o alarme e o carro, a guerra do piso aquecido e o diagnóstico de CO₂ e as automações chatas que de fato protegem a casa.
O que eu não contei foi como tudo isso foi construído.
Vou confessar: eu mal digitei esse YAML. Quase todas as linhas (as automações, o dashboard, os cards animados, os scripts que pareiam e renomeiam dispositivos) foram escritas pelo Claude Code, rodando dentro da própria caixa do Home Assistant. Eu falo com ele em português, quase sempre pelo celular. Ele edita o /config, valida, recarrega, confere se a coisa realmente funcionou e anota tudo o que deu errado pelo caminho.
Então este aqui é o making of: como está ligado, as skills em que ele se apoia, como o dashboard saiu do YAML e virou código, de onde vieram as animações, como parear dispositivos quando o seu assistente não tem mãos e, no fim, um tour por todas as páginas do dashboard, direto do meu celular.
A casa em números
| Desde junho de 2026 | |
|---|---|
| Commits | 580 |
| Automações · scripts | 129 · 73 |
| Dispositivos · entidades | 147 · 1.163 |
| Dashboard | 10 abas, 60 pop-ups, gerado por 7.600 linhas de Python |
| Cards feitos em casa | 17 custom elements, sem bibliotecas |
| Notas que ele escreveu para si mesmo | 25 arquivos, ~105.000 palavras |
Passo zero: o Claude Code mora num add-on
A casa roda num Home Assistant Green com Home Assistant OS, o que significa que você não pode simplesmente sair instalando coisas no host. O que você pode fazer é usar o add-on Advanced SSH & Web Terminal: um pequeno container Alpine com o /config montado, a CLI ha e um token do Supervisor. No fim, é tudo de que ele precisa.
Claro que tem um porém (sempre tem): os containers de add-on são recriados. Tudo o que você instala com npm, apk ou pip some depois de um restart do add-on, e o seu login vai junto. A solução está na própria configuração do add-on: reinstalar a cada boot e manter a pasta do Claude dentro do /config, que sobrevive a tudo.
# Settings → Add-ons → Advanced SSH & Web Terminal → Configuration
packages:
- nodejs
- npm
- git
init_commands:
- mkdir -p /config/.claude-box
- ln -sfn /config/.claude-box /root/.claude
- "[ -f /config/.claude-box/claude.json ] || echo '{\"hasCompletedOnboarding\": true}' > /config/.claude-box/claude.json"
- ln -sf /config/.claude-box/claude.json /root/.claude.json
- npm i -g @anthropic-ai/claude-code >/dev/null 2>&1 || true
Basicamente, cada boot coloca o Node e o Claude Code de volta, e os symlinks apontam o Claude para uma pasta que nunca some. Login, configurações, memória e skills ficam todos em /config/.claude-box (que está no .gitignore, obviamente). Eu abro o Terminal pela barra lateral do Home Assistant, no notebook ou no celular, digito claude e pronto.

De lá, ele chega ao Home Assistant por quatro portas:
- Arquivos. O
/configé o repositório git. O que está no repo é o que roda. - A CLI
ha.ha core checkantes de tudo, reload sempre que possível, restart só quando não tem jeito. - O websocket. Dashboards, o registro de entidades, renderização de templates. O cliente é o
tools/haws.py, um cliente websocket só com a biblioteca padrão. Ele escreveu esse depois que o primeiro ferramental, feito em cima doaiohttp, parou de rodar no dia em que o add-on reiniciou (lembra do porém?). Pelo mesmo motivo, todas as ferramentas do repo usam só a biblioteca padrão. - MCP. A integração oficial MCP Server do Home Assistant, para o estado ao vivo.
O segredo está no que ele lê primeiro
Toda sessão começa carregando o CLAUDE.md, as regras que valem para a casa inteira. Cada regra ali custou pelo menos um diagnóstico, e o arquivo anota quanto custou. Duas das minhas favoritas (a primeira ainda dói):
condition:dentro dethen:/choose:NÃO para o script — só aborta aquele bloco, e a próxima ação roda mesmo assim. Guardas que precisam parar tudo ficam no nível de cima, ou usamstop:. Isso custou 5 desarmes do alarme com a casa vazia.
Prefira reload. Cada restart deixa as lâmpadas Govee offline por alguns minutos.
Os detalhes ficam em docs/notas/: 25 notas, uma por assunto (alarme, piso aquecido, TV, Zigbee, energia, irrigação…), todas escritas pelo Claude conforme ia trabalhando. A regra é simples: "antes de mexer num assunto, leia a nota dele". É por isso que uma sessão em novembro não repete os erros que uma sessão cometeu em agosto.
Além disso, o Claude Code mantém a própria memória: 47 arquivinhos sobre como eu trabalho. Alguns só existem porque eu me irritei:
- Sempre português do Brasil, nunca de Portugal. Ele vivia escrevendo telemóvel em vez de celular.
- Informação não é pedido de edição. Uma vez eu expliquei como os termostatos de parede conversam entre si, só para ele entender a casa, e ele foi lá e editou dois packages. Agora, quando eu explico alguma coisa, ele absorve e para por aí.
- Visual se decide olhando. Mais sobre isso abaixo.

O passo 7 é o que rende juros: uma armadilha encontrada hoje vira uma linha numa nota, e a próxima sessão já começa sabendo.
As skills
Skills são instruções empacotadas que o Claude carrega quando a tarefa combina com elas. Estas foram as que fizeram o trabalho pesado:
- home-assistant-manager do komal-SkyNET — a disciplina de deploy: editar →
ha core check→ reload ou restart → provar com logs, traces e o estado das entidades. De longe a mais usada (85 vezes e contando). Ela assume que você entra por SSH de fora, então o meuCLAUDE.mdsobrescreve essa parte: a gente já está dentro. - artifact-design, dataviz e artifact-diagramming — quando eu digo "deixa mais bonito", o Claude não aplica mais só o seu melhor palpite. Ele monta uma página privada com 2–4 opções lado a lado, usando os botões de verdade, e eu escolho pelo celular ("gostei da B"). Ele aprendeu isso do jeito difícil: uma paleta ajustada "pelos números" ganhou um "não estou vendo nenhuma mudança significativa" meu.
- security-review — uma auditoria das mudanças pendentes antes de irem para produção. Depois disso, segurança virou hábito: a última varredura fechou as portas MQTT na rede local, removeu uma página HTML antiga que estava acessível publicamente em
/local/(ops) e fez logins com falha e IPs banidos notificarem o meu celular.
O dashboard agora é código
O dashboard se chama Prisma. 10 abas, 60 pop-ups, e ninguém edita pela interface. Ele é gerado pelo tools/build_prisma_dashboard.py (umas 7.600 linhas, com o raciocínio de cada escolha escrito em comentários) e enviado direto para o Home Assistant pelo websocket. Sem restart.
python3 tools/conferir_prisma.py # does the generator still match what is live? exits 1 with a diff
python3 tools/build_prisma_dashboard.py # rebuilds the whole dashboard
cd i18n && python3 gerar.py # Spanish version, must print "sem tradução: 0"
python3 publicar.py # pushes them all over the websocket
Por que a primeira linha? Porque uma edição feita pela interface foi apagada em silêncio pelo gerador cinco vezes antes de a gente criar essa checagem.
O mesmo dashboard também sai em espanhol e inglês, gerado a partir de um dicionário de trechos. As capturas abaixo são da versão em inglês, e é por isso que alguns estados ao vivo ainda aparecem em português: o gerador traduz os cards, nunca o estado de uma entidade.
As peças são Bubble Card (os pop-ups), Mushroom, navbar-card (a barra de baixo), kiosk-mode (sem cabeçalho), um tema próprio com alternância claro/escuro e os cards que ele escreveu do zero. O que me leva à parte divertida.
Animações: desenhando o que ninguém tinha desenhado
O Marketplace tem cards animados para máquinas de lavar, clima, energia e ventiladores. Algo que desenhe uma TV, uma caixa de som ou um PC? Nada. Então o Claude escreveu o casa-media-cards.js: 17 custom elements em ~4.800 linhas de JavaScript puro. Sem biblioteca, sem chamadas de rede.
A TV acende quando é ligada, assume a cor da entrada ativa e faz uma varredura lenta:

O PC abre a tela como um monitor CRT antigo e a recolhe de volta ao desligar. O truque é que o SVG nunca é recriado, só uma classe muda, então a transição CSS roda nos dois sentidos (recrie o SVG e o desligar vira um corte seco):

O Music Frame (uma caixa de som em formato de porta-retrato) mostra a capa do álbum dentro de uma moldura de madeira, com um equalizador de 7 barras cuja altura acompanha o volume:

A lava e seca e a lava-louças usam o washing-machine-card da comunidade, com um patch do Claude para o anel contar a partir do início real do ciclo e mostrar o tempo como 1h47. Toda atualização do Marketplace sobrescreve esse patch, então uma automação o reaplica sem alarde.


(Estes GIFs foram gravados num navegador headless, com os estados simulados só naquela aba do navegador. A minha TV de verdade ficou desligada o tempo todo.)
E alguns detalhes menores, porque eu queria que o dashboard parecesse mais vivo: cada botão ganha um degradê suave na cor do seu ícone, e os botões dos portões vibram ao tocar e de novo quando a API do prédio responde, terminando em Aberto ou Não abriu. As sequências a pé fazem contagem regressiva ao vivo até o próximo portão.
Você deve estar se perguntando: como uma IA testa uma animação? De dois jeitos. O bundle dos cards roda no Node com linkedom, então ele consegue chamar setConfig() com a configuração real e ler de volta o que o card calculou. E para o teste de verdade, ele sobe um Chromium headless, faz login no frontend real e tira screenshots. Foi exatamente assim que todas as imagens deste post foram feitas.
Pareando dispositivos quando a sua IA não tem mãos
Eu aperto o botão no dispositivo. O Claude faz todo o resto.
Os sensores de CO₂ (Matter). Primeiro eu adicionei o AirGuard no app SmartThings, e ele apareceu no Home Assistant pela nuvem da Samsung. O Claude não gostou nada disso: esse sensor alimenta o piso aquecido da sala, então se a nuvem cair, a sala fica sem termômetro. Ele descobriu que o Matter estava desativado por configuração (integração ignorada, sem o add-on Matter Server), instalou o add-on e me guiou pelo Matter multi-admin: o app SmartThings gera um código de compartilhamento (válido por 15 minutos, com a tela aberta), e o Home Assistant entra como um segundo "fabric". O dispositivo já estava no Wi-Fi, então foi comissionado por IP. E isso importa, porque o Green não tem Bluetooth nenhum.
Zigbee. A regra aqui é renomear no dia do pareamento. Os nomes de fábrica são cortados em 32 caracteres, e renomear um dispositivo não renomeia as entidades dele, então o Claude renomeia os dois pelo registro, seguindo um padrão de nomes que o dashboard varre. Dê a um termômetro novo o nome termometro_<cômodo> → ele aparece sozinho na aba Sensores, no relatório diário de baterias e no card da Home. Nenhuma edição no dashboard.
As sondas de tubulação no coletor da bomba de calor. Antes mesmo de elas chegarem, ele me escreveu um guia de instalação com fotos, numa página privada. Depois de instaladas, eu mandei fotos de volta e ele confirmou qual era a ida e qual era o retorno. Ele também contestou (com razão!) uma análise de fora que dizia que uma das sondas estava solta: a outra simplesmente ainda estava quente da minha mão, e esfriou 8 minutos depois.
Também pareados assim: sensores de porta e um detector de fumaça (Zigbee), uma válvula de irrigação Zigbee, a cortina rolô da cozinha, os relés Shelly das persianas e do piso aquecido, e um Samsung SmartTag no meu chaveiro, através de um fork comunitário do SmartThings Find que ele também teve que corrigir.
Todos os cenários que eu consegui imaginar
As partes 1–3 se aprofundam na maioria deles. Aqui estão todos numa tabela só:
| Cenário | O que acontece | A armadilha que ele encontrou |
|---|---|---|
| Chegando em casa | O alarme desarma pelo Wi-Fi de casa, por um portão + presença, ou por GPS com a aproximação detectada | GPS sozinho já desarmou o alarme sem ninguém chegando |
| Saindo | O alarme arma e as lâmpadas apagam | A presença precisa de person.*, não device_tracker.*: o last_changed dele é reescrito a cada ping de GPS |
| Noite | As luzes acendem se alguém levanta, e uma varredura depois da meia-noite apaga o que ficou esquecido | Um gatilho de movimento precisa ser from: "off", senão um sensor voltando de unavailable dispara o alarme |
| Piso aquecido | O Home Assistant só consegue subtrair: um Shelly corta o fio de demanda | O termostato de parede sempre ganha, então o HA detecta quando está sendo passado por cima |
| Eletrodomésticos | Cada ciclo de lavagem é reconstruído na mão: duração, energia, custo | A Samsung informa o kWh acumulado da vida toda e a Bosch não informa nada |
| Irrigação | O tempo de rega segue a evapotranspiração, e pula quando chove | A válvula fecha sozinha aos 10 minutos |
| Roupa no varal e toldo | Um toque: uma foto da câmera + o Gemini responde "tem roupa lá fora, e vai chover?" | A câmera fica muda enquanto a detecção de movimento está desligada, então o script liga só para a foto |
| Trajeto | Status da linha 3 do metrô na aba Home, dias úteis das 07:30 às 08:30 | Não tem API, então ele lê o site, que bloqueia bots a menos que você pareça um navegador |
| Contas | As contas de luz se importam sozinhas; a de água entra por um bookmarklet | O captcha é comigo, o resto é com a casa |
| Voz | O Assist roda no Gemini | A minha assinatura do Claude não cobre chamadas de API, e a chave do Google já estava paga |
E o melhor bug de todos: "certificado não confiável" no celular pelo 4G, só em certos horários, enquanto no Wi-Fi estava tudo bem. Parecia um problema do Home Assistant. Não era. A minha operadora intercepta faixas de IP da Cloudflare durante os horários de jogos de futebol, com um certificado falso. Sim, futebol. A solução é um DNS rewrite no celular apontando para outro edge da Cloudflare. E a regra que ele salvou na memória: anote o horário antes de começar a teorizar.
O tour: todas as páginas, direto do celular
Gastos, imagens das câmeras, mapas e rostos estão borrados. Todo o resto é exatamente o que eu vejo.
Home
Clima, presença, alarme, climatização, luzes, persianas, TV e música, PC, eletrodomésticos e sensores. Cada seção abre o seu próprio pop-up.

Climatização
Os três termostatos com os seus presets, a temperatura da água no coletor, o ar de cada cômodo e os controles.

Acesso
Todos os portões do prédio, as sequências a pé com os tempos ajustados no cronômetro, a garagem e as áreas comuns.
Os portões rodam no Alfred Smart, que não tem integração oficial com o Home Assistant (a parte 1 conta a história da engenharia reversa). Então eu criei uma: ha-alfred-smart, que dá para instalar pelo HACS como repositório personalizado. Ela descobre todos os portões, garagens e portas que a sua conta pode usar, dá a cada um um botão Abrir e um sensor Última abertura, e nunca tenta abrir de novo. Por que não? Porque o Alfred não responder não quer dizer que o portão ficou fechado. Se o seu prédio também usa Alfred Smart, experimenta.

Reservas e áreas comuns
Horários da academia e do Agora Club, reservados com um toque, e as portas dos espaços compartilhados.

Câmeras
As câmeras Ring, com a detecção de movimento acompanhando o alarme. As imagens ao vivo estão borradas, por motivos óbvios.

Carro
Combustível, autonomia, portas e janelas, travar e destravar, alertas de manutenção e o mapa (borrado, claro).

Contas
Luz, a bomba de calor do prédio e água, mês a mês. Você vê o formato, não os números.

Sensores
Vazamentos, fumaça, temperatura, CO₂, umidade e todas as baterias da casa.

Irrigação
A rega de hoje, a programação e o pop-up "ajustar ao clima" com a conta da evapotranspiração.

Pop-ups
A persiana desenhada que acompanha a posição real, o clima, a linha do metrô e as minhas chaves:

O controle da TV, o Music Frame, a lava e seca e a lava-louças:

Os presets do aquecimento, quem está no comando agora, a qualidade do ar e as baterias:

Presença, o alarme, as luzes e as portas do carro:

Se você quiser tentar
- Coloque dentro da caixa. Como add-on, ele roda
ha core check, lê os logs e recarrega sozinho. Sem malabarismo de SSH, sem ficar copiando arquivo de um lado para o outro. - Transforme o
/confignum repositório git antes do primeiro prompt. Cada mudança vira um diff que você consegue ler e reverter. - Escreva as regras, e deixe ele escrever as notas.
CLAUDE.mdpara o que vale em todo lugar, uma nota por assunto para o resto. - Exija prova, não "deve funcionar". Estado real, o trace da automação, o log cru. A minha regra favorita do arquivo inteiro: não diga "isso não tem conserto" antes de ler o log cru.
- Quando o dashboard crescer, gere ele. Edições pela interface e um dashboard com 60 pop-ups não combinam (cinco edições apagadas me ensinaram isso).
- Decida o visual olhando, no aparelho que você realmente usa.
- Deixe o
secrets.yamlfora do alcance. O meu está, por regra.
O engraçado é que, há anos, o meu trabalho é transformar fluxos manuais em algo que roda sozinho e prova que funciona. Aqui eu fui parar do outro lado da mesa: eu sou quem sabe como a casa deve se comportar, e o Claude é o engenheiro que constrói, testa e mantém um registro de cada bug que já encontrou.
A casa continua sendo um sistema sob teste. Só que agora tem um pair programmer muito rápido morando dentro dela.
Rodando Home Assistant Green, YAML-first (bom, Claude-first), com um dashboard feito em Bubble Card, Mushroom e 17 cards meus. E você? Deixaria uma IA morar dentro da caixa do seu Home Assistant, ou nem pensar? Deixa um comentário, e pode perguntar o que quiser sobre o setup. Vou adorar saber!
