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 и всегда держать его подключенным.