O Homebridge, reescrito em Swift

Todos os dispositivos, na app Casa.

O Homeswift leva para o HomeKit as luzes, os aparelhos de ar condicionado, as câmaras e as fechaduras que a Apple nunca certificou. Um único binário pequeno executa a configuração e os plugins do Homebridge, sem Node.js nem npm, e em repouso ocupa menos de 10 MB.

v0.12.0, versão preliminarmacOS 14+ e LinuxLicença MIT

Luz da secretáriaLigado · 70 %
Brilho70 %
Sala de estarA aquecer até 21,5°
19,5°Interior
21,5°Aquecer até
60 %
Estore do quartoAberto · 60 %
Luz do alpendreLigado
Máquina de caféDesligado
Porta da entradaTrancada
PUT/characteristics {"aid":2,"iid":10,"value":true}

Uma demonstração ao vivo da interface web da ponte. Toque, arraste ou mantenha premida a porta. Explorar o sistema de design →

Desempenho

Tão leve que se esquece que está a correr.

O mesmo controlador HomeKit comandou duas pontes com as mesmas 30 lâmpadas: o Homeswift e o HAP-NodeJS, a biblioteca no coração do Homebridge.

HomeswiftHAP-NodeJS 2.2.2

Apple M1, macOS 27.0.1, 21 de outubro de 2026, uma execução de cada em loopback. Em todas as linhas, menos é melhor. A tabela completa, com o débito e as linhas em que o HAP-NodeJS gasta menos CPU por pedido, está em Benchmarks/README.md.

O que traz

Tudo o que uma ponte precisa. Nada a mais.

Adicione-a com o código da etiqueta

Emparelhamento com um código de 8 dígitos por SRP-6a, sessões cifradas em cada pedido, até 16 controladores. Cada acessório mantém os seus IDs, por isso divisões, cenas e automatizações sobrevivem aos reinícios.

0052
1956

A configuração do Homebridge, tal como está

Lê um config.json ao estilo do Homebridge. Os plugins mantêm os nomes de plataforma e de opções, as pontes secundárias funcionam da mesma forma, e cada alteração é validada com o esquema do plugin antes de ser guardada.

Câmaras e campainhas

Vídeo em direto e instantâneos por SRTP, gravação com HomeKit Secure Video, áudio bidirecional e o toque da campainha, com o FFmpeg a tratar da codificação.

Uma interface web à imagem da Casa

Cada acessório é um widget num mural organizado à medida. Estado, plugins, configuração, registos e cópias de segurança ficam ao lado, protegidos por contas próprias, com autenticação de dois fatores opcional.

Um Assistente, para quem o quiser

Pergunte porque é que uma luz deixou de responder, peça a explicação de um registo ou receba um resumo diário. Opcional, com orçamento, e tudo o que é sensível é ocultado antes de chegar a um fornecedor.

A casa no Claude e noutras apps de IA

Um servidor MCP que o claude.ai e as apps Claude adicionam como conector: inicia-se sessão com a conta da interface web e escolhe-se o que pode fazer. Tudo o que é destrutivo pede confirmação primeiro, cada alteração fica registada, e fechaduras, portas de garagem e alarmes passam por uma única ferramenta protegida.

Corre onde a casa corre

Um contentor para amd64 e arm64, um pacote Synology para o DSM 7, ou um simples binário em macOS 14 e Linux.

Gráfico

A sua casa inteira, numa só página.

A página Acessórios desenha o que o Homeswift executa como um mapa: as suas pontes, os plugins de cada uma, os seus tipos de dispositivo e cada acessório, cada plugin com a sua própria cor e o logótipo da sua marca.

  • Pesquise um nome ou uma marca, ou filtre por ponte, por tipo de dispositivo ou pelo que não responde: o gráfico reorganiza-se em torno do que resta.
  • Clique em qualquer nó para ver a sua ficha: a imagem em direto de uma câmara, as leituras de um sensor agrupadas por serviço, cada valor explicado ao passar o rato.
  • Aperte, deslize ou clique num ramo para o ampliar; uma tabela dá as mesmas linhas aos leitores de ecrã.

Plugins

Catorze plugins, já incluídos.

Dez são adaptações dos plugins do Homebridge que talvez já estejam em uso; o Philips Hue e o IKEA DIRIGERA falam com as suas pontes na rede; o Wingman junta os acessórios da app Casa; o EcoFlow lê as suas estações de energia a partir da nuvem da EcoFlow. Cada um é testado com uma simulação do dispositivo ou da nuvem.

EK
Elgato Key LightsKey Light, Ring Light
UP
UniFi ProtectCâmaras, campainhas, sensores
UA
UniFi AccessFechaduras e leitores
DC
Daikin CloudAr condicionado
DY
Dyson Pure CoolPurificadores e ventoinhas
LG
LG ThinQEletrodomésticos
PH
Philips Ambilight TVTelevisor, comando
GV
GoveeLuzes
HU
Philips HueLuzes, cenas, efeitos
IK
IKEA DIRIGERALuzes, tomadas, sensores
eW
eWeLinkInterruptores e tomadas Sonoff
DL
DolphinRobôs de piscina
EF
EcoFlowEstações de energia, baterias
WingmanA app Casa, através de um Mac
+
Adaptar um pluginDe Node.js para Swift, passo a passo

Instalação

A funcionar em cinco minutos.

# amd64 e arm64. A rede do anfitrião permite ao HomeKit encontrar a ponte por mDNS.
docker run -d --name homeswift --network host \
  --restart unless-stopped \
  -v ~/homeswift:/homeswift \
  ghcr.io/mp-consulting/homeswift:latest
  1. Abra a interface web

    Na porta 8581 da máquina onde corre a ponte.

  2. Crie a conta

    Com o código de configuração que a ponte mostra ao arrancar.

  3. Adicione plugins

    Escolha-os na página Plugins e preencha as definições.

  4. Adicione a ponte na app Casa

    Leia o código QR na página Estado ou introduza o código de 8 dígitos.

Para programadores

Um candeeiro em vinte linhas.

  • Os 73 serviços e 252 características que o HomeKit conhece, com unidades, intervalos e valores válidos.
  • Concorrência do Swift 6: os handlers são async, e um erro lançado aparece como «Sem resposta» na app Casa.
  • Defina um valor quando o dispositivo muda e todas as apps Casa subscritas se atualizam.
import Homeswift

let light = Service(.lightbulb, name: "Desk Lamp",
                    optional: [.brightness], isPrimary: true)

light.characteristic(.on).onWrite(changesOnly: true) { value in
    try await lamp.setPower(value.boolValue ?? false)
}

let accessory = Accessory(
    id: "desk-lamp", name: "Desk Lamp",
    manufacturer: "Acme", model: "L1",
    category: .lightbulb, services: [light])

let server = try HAPServer(bridge: bridge, accessories: [accessory],
                           storage: FileStorage(name: "my-bridge"))
print("Setup code:", server.setupCode)  // 1234-5678
try await server.run()