Integração e API
Adaptador de Integração
Como um transformador de interfaces, o adaptador de integração traduz o contrato de um dispositivo ou serviço para o modelo esperado pela plataforma. Desde o padrão Adapter formalizado no movimento de padrões de projeto dos anos 1990, implementações passaram a mapear REST, MQTT, Modbus, Zigbee e APIs proprietárias. A escolha exige definir direção, estado, erros e versionamento. O risco é esconder diferenças semânticas: converter campos não garante equivalência de comportamento.
🔀 Tipos de Comunicação
PROTOCOL
Adaptação de protocolo
Um adaptador de protocolo recebe mensagens numa tecnologia e produz mensagens noutra. Um gateway Modbus TCP–MQTT pode ler registradores de um medidor e publicar `casa/energia/potencia` em JSON. A conversão precisa definir endianness, escala, unidade, qualidade e frequência. Um registrador `0x0012` com valor 2345 pode significar 234,5 V, mas essa semântica não existe no MQTT por si só. O adaptador precisa carregar o mapa. Buffers e filas tratam ritmos diferentes. O Modbus usa polling; MQTT é orientado a publicação. O adaptador pode publicar a cada 5 s ou apenas quando muda. A decisão afeta tráfego, latência e perda de eventos. Não se deve chamar essa transformação de transparência completa: timeout, confirmação e endereçamento continuam diferentes.
MAPPING
Adaptação de modelo de dados
O componente traduz objetos e atributos sem mudar necessariamente o transporte. Uma API de fabricante pode retornar `{"power":1,"brightness":127}`; a plataforma espera uma entidade `light` com brilho de 0 a 255 e estado booleano. O adaptador converte faixa, nomes, enumerações, unidades e estruturas. Ele também precisa representar ausência, desconhecido e indisponível. Mapear `null` para zero é erro frequente. O modelo de destino pode não suportar um recurso, como efeito RGBIC por segmento. Nesse caso, o adaptador expõe subconjunto, cria entidade auxiliar ou documenta a perda. A decisão deve ser estável, porque automações passam a depender dos nomes. Mudanças exigem migração e versão.
CALL
Adaptação de chamada e ciclo de vida
Uma biblioteca síncrona pode ser encapsulada numa API assíncrona; callbacks podem virar eventos; polling pode simular notificações. Em Home Assistant, uma integração costuma manter um coordenador de atualização e entidades que leem estado em cache, evitando uma chamada por propriedade. O adaptador precisa iniciar, autenticar, descobrir, atualizar, reconectar e encerrar. Chamadas bloqueantes não devem travar o event loop. Timeouts são obrigatórios. Um dispositivo Bluetooth pode aceitar apenas uma conexão por vez, exigindo fila. A adaptação de ciclo de vida é tão importante quanto o payload. Uma função que funciona em teste único pode falhar após 24 h por vazamento de sessão ou reconexão mal tratada.
ACL
Adaptação anti-corrupção entre domínios
Em arquitetura orientada a domínio, uma anti-corruption layer impede que conceitos proprietários contaminem o modelo interno. O fabricante pode chamar uma casa de `site`, um cômodo de `zone` e uma cena de `mood`. O adaptador traduz para entidades canônicas. Isso facilita trocar fornecedor. A camada precisa preservar identificadores estáveis e metadados necessários. Ela não deve apenas renomear. Regras como “modo away desarma gravação interna” têm significado operacional. O adaptador deve representar capacidade, permissões e limitações. Quanto mais lógica acumula, mais ele se aproxima de um serviço de integração independente, que exige testes, observabilidade e versão.
✅ Vantagens Arquiteturais
⚡
Isola mudanças do fornecedor
Quando a API externa muda de `/v1/devices` para `/v2/assets`, somente o adaptador precisa conhecer a alteração; o restante da plataforma continua consumindo a interface interna. Esse isolamento reduz custo de manutenção. Só funciona se a interface interna for realmente estável. Copiar o JSON externo integralmente para dentro não cria isolamento. O adaptador deve escolher campos canônicos. Mudanças inevitáveis precisam de compatibilidade. Testes de contrato com respostas gravadas ou sandbox detectam. Um adaptador sem monitoramento pode falhar silenciosamente quando o fornecedor adiciona paginação, altera token ou muda limites. Métricas de erro, latência e última atualização são essenciais.
⚡
Permite combinar protocolos heterogêneos
Uma residência pode ter BACnet no HVAC, Modbus no medidor, Zigbee nos sensores e REST numa nuvem. Adaptadores convertem cada origem para um event bus, MQTT ou modelo comum. O benefício é criar automações transversais sem implementar quatro protocolos em cada consumidor. O custo é manter quatro adaptadores. A arquitetura deve evitar uma cadeia longa: Modbus→MQTT→Node-RED→REST→Home Assistant aumenta pontos de falha. Sempre que possível, cada origem entra uma vez no modelo central. O caminho precisa ser documentado. Latência e responsabilidade por comandos devem ser conhecidas. Duplicar uma entidade por duas rotas causa conflito.
⚡
Simplifica testes por interfaces substituíveis
Uma interface interna permite usar adaptador falso em teste. Em vez de ligar uma bomba real, a automação recebe um `PumpAdapter` simulado que reproduz estados e falhas. Isso melhora cobertura de cenários como timeout, sobrecorrente e perda de rede. O contrato precisa incluir erros e eventos, não apenas caso feliz. Testes de unidade validam mapeamento. Testes de integração usam o dispositivo real ou emulador. Testes de contrato comparam versões da API. Um mock excessivamente simples pode mascarar incompatibilidade. Dados de produção devem ser anonimizados antes de virar fixture. O adaptador favorece testabilidade quando seus limites são explícitos.
⚡
Reduz acoplamento entre lógica e biblioteca
Bibliotecas de fabricantes mudam classes, métodos e autenticação. O adaptador oferece métodos próprios, como `set_target_temperature(22.0)`, e traduz para o SDK atual. A lógica da casa não importa diretamente a biblioteca. Isso facilita trocar implementação, usar chamada local em vez de nuvem ou suportar dois modelos. A camada acrescenta código e precisa justificar. Para uma integração de 50 linhas sem perspectiva de mudança, uma abstração complexa pode ser excesso. O critério é volatilidade, número de consumidores e criticidade. A analogia de transformador é útil: ele adapta níveis, mas também introduz perdas e custo.
⚡
Documenta as perdas de interoperabilidade
Um bom adaptador declara capacidades. Se a câmera suporta PTZ, mas a plataforma só expõe stream, a limitação aparece. Se Matter representa ligar e brilho, mas não uma cena dinâmica proprietária, o adaptador não inventa paridade. Flags, feature bits e diagnósticos permitem que a interface mostre. Isso evita automações que tentam comando inexistente. A documentação deve listar leitura, escrita, frequência, unidades, autenticação e comportamento offline. A consequência prática é escolher dispositivos com base no que realmente será integrado, não apenas no logotipo de compatibilidade.