https://github.com/brutella/hc — прекрасная библиотека для написания обработчиков своих аксессуаров по протоколу HomeKit.
Что предоставляет библиотека? Удобный интерфейс для объявления своего аксессуара и обработка сигналов с пульта управления Home App в ios. Давайте попробуем написать новый обработчик аксессуара и добавить его внутри домашней сети.
Простейшая реализация будет выглядеть как-то так:
package main import ( "log" "github.com/brutella/hc" "github.com/brutella/hc/accessory" ) func main() { // create an accessory, let's assume that we are managing new fancy Lamp info := accessory.Info{Name: "New Lamp"} ac := accessory.NewSwitch(info) // configure the ip transport, setup PIN to be able to pair with client config := hc.Config{Pin: "00102003"} t, err := hc.NewIPTransport(config, ac.Accessory) if err != nil { log.Panic(err) } ac.Switch.On.OnValueRemoteUpdate(func(on bool) { if on == true { log.Println("Switch is on") } else { log.Println("Switch is off") } }) hc.OnTermination(func() { <-t.Stop() }) t.Start() }
Здесь мы создаем новый аксессуар и называем его New Lamp. Далее мы добавляем пароль для добавления аксессуара и стартуем сервер для получения сигналов с Apple HomeKit приложения.
Окей, запускаем приложение:
go run main.go INFO 2020/09/20 20:41:43 ip_transport.go:184: Listening on port 58420
Далее идем в приложение Дом на ios, жмем Добавить аксессуар — пропускаем шаг со сканированием кода и выбираем ручное добавление найденного нового аксессуара — New Lamp. Вводим PIN код и готово!
Теперь наше приложение может отслеживать сигналы включения — включим нашу импровизированную лампу из приложения Дом:
INFO 2020/09/20 20:49:20 ip_transport.go:184: Listening on port 58487 2020/09/20 20:52:53 Switch is on
Выключим:
2020/09/20 20:53:25 Switch is off
Теперь у нас есть способ создания собственных аксессуаров и подключения их в Apple HomeKit.
Также как и любое другое устройство HomeKit важно понимать, что оно всегда должно быть в домашней сети чтобы нормально работать. Как решение мы можем залить приложение на Raspberry Pi и всегда держать его подключенным.