Как использовать яблочный homekit в связке с Raspberry pi в качестве сервера автоматизации всех имеющихся датчиков и управляемых устройств и при этом управлять любым копеешным электрческим говном всем, что у вас есть из айфона?
Начиная с IOS 10, Аpple выпустила замечательную вещь — homekit. Вы можете видеть это в телефоне как программу Дом. Айтишные «Робин Гуды» сразу пропатчили этот функционал в правильную сторону, чтобы работать можно было с чем угодно. Даже с самым дешманским датчиком за семь рублей пятьдесят копеек, а не только со сверх-супер-пупер-сертифицированной продукцией (обычные датчики/устройства, но продаваемые за бешеные деньги с одобрения Аpple).
Для любителей коротких обзоров и желающих убедиться воочию, что из этого выходит, мы подготовили небольшое видео:
А для желающих собрать нечто подобное самостоятельно — немного терпения и добро пожаловать 🙂
Подготовка системы
Делаем апдейт и апгрейд:
1 2 |
$ sudo apt-get update $ sudo apt-get upgrade |
ставим git и make, если не установлены
1 |
$ sudo apt-get install git make |
Если у вас установлена RASPBIAN JESSIE, все в порядке. У вас уже установлен необходимый компилятор, но на всякий случай лучше проверить.
Версия должна быть такой, как показано ниже:
1 2 3 |
$ g++-4.9 -v ... gcc version 4.9.2 (Raspbian 4.9.2-10) |
Если же у вас другой дистрибутив или версия компилятора ниже, то придется поставить:
1 |
$ sudo apt-get install g++ |
Установка NodeJS
Начиная с 4.0.0 версии NodeJS стала поддерживать ARM платформы по умолчанию. Львиная доля одноплатников работает именно на чипе ARM. Raspberry pi — не исключение.
Для желающих поставить NodeJS вручную на вашу малину или произвольный arm-одноплатник, можно воспользоваться этой ссылкой:
Установка ручками NodeJS для всех версий Raspberry pi.
Установка ручками NodeJS для Raspberry pi3.
Но стоит учесть, что homebridge, если не ошибаюсь, начинает работать с версии Nodejs 5.10 , поэтому стоит несколько модифицировать инструкции в ссылках и выбрать Nodejs посвежее.
Лично я предпочитаю не усложнять себе ситуацию совместимостью версий и поставлю последнюю доступную:
1 2 |
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - $ sudo apt-get install -y nodejs |
проверяем версию:
1 2 |
$ nodejs -v v6.9.5 |
Установка Homebridge
Устанавливаем Avahi и другие зависимости. Это необходимо для пакета mdns из библиотеки HAP-NodeJS.
1 |
$ sudo apt-get install avahi-daemon avahi-discover libnss-mdns libavahi-compat-libdnssd-dev |
Проверьте ваши пути! Если вы все-таки ставили пакет ручками, а не через apt-get install — пути должны быть /usr/local/lib вместо /usr/lib/
Теперь ставим сам Homebridge и зависимости:
1 2 3 4 5 |
$ sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp $ cd /usr/lib/node_modules/homebridge/ $ sudo npm install --unsafe-perm bignum $ cd /usr/lib/node_modules/hap-nodejs/node_modules/mdns $ sudo node-gyp BUILDTYPE=Release rebuild |
Можем проверить тестовым запуском:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ homebridge ... [2017-02-10 14:43:01] --- [2017-02-10 14:43:01] config.json (/home/pi/.homebridge/config.json) not found. Scan this code with your HomeKit App on your iOS device to pair with Homebridge: ┌────────────┐ │ 031-45-154 │ └────────────┘ [2017-02-10 14:43:01] Homebridge is running on port 44204 ... |
Если видите что-то похожее, значит, все функционирует.
Строка: config.json (/home/pi/.homebridge/config.json) not found говорит, что не существует конфига для пользователя из-под которого мы совершили запуск. Нужно определиться с тем, из под кого мы будем запускать службу, и создать все необходимые директории и этот конфиг для выбранного пользователя.
Из-под кого все запускать? Конечно, в целях безопасности лучше из-под отдельного специально созданного пользователя, но тогда получим кучу геморроя с модулями, которые будут дергать различные системные скрипты и сценарии, придется много дебажить по каждому плагину и сценарию. Рекомендую для проверки использовать пользователя root, а в дальнейшем перевести всю работу на специально созданного пользователя. Создаем директорию и конфиг:
1 2 3 |
$ sudo -i # mkdir /root/.homebridge # touch /root/.homebridge/config.json |
Пример минимального рабочего конфига можно скопировать из
/usr/lib/node_modules/homebridge/config-sample.json:
1 |
# vim /root/.homebridge/config.json |
1 2 3 4 5 6 7 8 |
{ "bridge": { "name": "My bridge to RPI", "username": "CC:22:3D:E3:CE:32", "port": 51827, "pin": "031-45-155" } } |
Проверим, все ли правильно:
1 |
$ homebridge |
Должны увидеть, что строка с отсутствием конфигурационного файла пропала.
Теперь необходимо сделать homebridge демоном и добавить его в автозагрузку. Для этого нам потребуется создать небольшой init скрипт:
1 |
# vim /etc/init.d/homebridge |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
#!/bin/sh ### BEGIN INIT INFO # Provides: homebridge # Required-Start: $network $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO dir="/root" cmd="DEBUG=* /usr/bin/homebridge" user="root" name=`basename $0` pid_file="/var/run/$name.pid" stdout_log="/var/log/$name.log" stderr_log="/var/log/$name.err" get_pid() { cat "$pid_file" } is_running() { [ -f "$pid_file" ] && ps `get_pid` > /dev/null 2>&1 } case "$1" in start) if is_running; then echo "Already started" else echo "Starting $name" cd "$dir" if [ -z "$user" ]; then sudo $cmd >> "$stdout_log" 2>> "$stderr_log" & else sudo -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" & fi echo $! > "$pid_file" if ! is_running; then echo "Unable to start, see $stdout_log and $stderr_log" exit 1 fi fi ;; stop) if is_running; then echo -n "Stopping $name.." kill `get_pid` for i in {1..10} do if ! is_running; then break fi echo -n "." sleep 1 done echo if is_running; then echo "Not stopped; may still be shutting down or shutdown may have failed" exit 1 else echo "Stopped" if [ -f "$pid_file" ]; then rm "$pid_file" fi fi else echo "Not running" fi ;; restart) $0 stop if is_running; then echo "Unable to stop, will not attempt to start" exit 1 fi $0 start ;; status) if is_running; then echo "Running" else echo "Stopped" exit 1 fi ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0 |
Делаем скрипт исполняемым и добавляем в стандартные уровни загрузки:
1 2 |
# chmod 755 /etc/init.d/homebridge # update-rc.d homebridge enable |
Теперь при загрузке homebridge будет стартовать автоматически.
Проверим запуск и останов в ручном режиме, все должно отрабатывать:
1 2 3 4 5 6 7 |
# /etc/init.d/homebridge start Starting homebridge # /etc/init.d/homebridge status Running # /etc/init.d/homebridge stop Stopping homebridge.. Stopped |
Последний штрих — добавление аксессуара «My bridge to RPI» в homekit вашего айфона.
Для этого в айфоне должен быть включен bluetooth и оба девайса должы находится в одной сети WiFi.
Останавливаем службу homebridge, если она запущена и запускаем из-под root homebridge в интерактивном режиме:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# service homebridge stop Stopping homebridge.. Stopped # homebridge ... [2017-02-10 14:43:01] --- Scan this code with your HomeKit App on your iOS device to pair with Homebridge: ┌────────────┐ │ 031-45-155 │ └────────────┘ [2017-02-10 14:43:01] Homebridge is running on port 54204 ... |
Заходим в приложение Дом на айфоне, создаем новый дом, и нажимаем ‘добавить аксессуар’. Включится поиск (bluetooth должен работать на всех девайсах) и вскоре будет обнаружен ваш мост «My bridge to RPI». Добавляем мост, вводим руками пароль из homebridge (пароль из рамочки), со всем соглашаемся, радуемся!
Готово. Можно проверить перезагрузкой малины ваш результат: после перезагрузки мост должен снова стать активен в вашем телефоне.
Установка плагинов homebridge
Переходим к вопросам насущным: ноду поставили, а как присобачить в нее наше имеющееся добро?
Потребуются плагины. Можно писать самим, если квалификация позволяет, можно воспользоваться готовыми.
Мы поставим несколько простых и в то же время очень мощных инструментов — это плагины включения, выключения и димирования ваших устройств. Для примера этого хватит. В дальнейшем рекомендую поискать в разделе плагинов что-то в духе термометра/влажности/объемника из файла или скрипта, чтобы окончательно перекрыть вопросы с имеющимися у вас датчиками и устройствами, не поддерживающими прямую коммуникацию с apple.
cmdswitch2
Простое включение/выключение устройств из скриптов. Ставим:
1 |
$ sudo npm install -g homebridge-cmdswitch2 |
homebridge-cmd_light_control
Включение/выключение/димирование света скриптами. Ставим:
1 |
$ sudo npm install -g homebridge-cmd_light_control |
Теперь нам необходимо скорректировать конфигурационный файл homebridge и добавить в него ваши имеющиеся девайсы. Для примера будет лампа и вентилятор, подключенные через реле на 220 вольт.
1 |
# vim /root/.homebridge/config.json |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
{ "bridge": { "name": "My bridge to RPI", "username": "CC:22:3D:E3:CE:32", "port": 51827, "pin": "031-45-155" }, "accessories": [ { "accessory": "CMD", "service": "Light", "brightnessHandling": "no", "name": "лампа", "on_cmd": "/home/pi/light_on.py", "off_cmd": "/home/pi/light_off.py", "get_status_cmd": "/home/pi/light_state.py" }], "platforms": [{ "platform": "cmdSwitch2", "switches": [{ "name" : "вентилятор", "on_cmd": "/home/pi/spin_on.py", "off_cmd": "/home/pi/spin_off.py", "state_cmd": "/home/pi/spin_state.py" "manufacturer": "рога и копыта", "model": "допотопный вращатель", "serial": "шта?" }] }] } |
Как видно из конфига, все управляется скриптами и обратная связь происходит тоже через скрипт. И это прекрасно! Ниже приведу простейшие примеры включения/выключения реле 220v и их обратного контроля, которые будут коммутировать фазу лампы и вентилятора. Кстати, кто не знает, как подключить такие реле и где нужно быть аккуратным — вам стоит прочитать подобную инструкцию. Рекомендую подойти ответственно и очень внимательно прочесть, если еще не сталкивались с управлением и коммутацией 220V.
1 2 3 4 5 6 7 |
#!/usr/bin/env python import RPi.GPIO as GPIO gpio_pin_number=20 GPIO.setmode(GPIO.BCM) # BCM pin numbering GPIO.setwarnings(False) GPIO.setup(gpio_pin_number, GPIO.OUT) GPIO.output(gpio_pin_number, GPIO.HIGH) |
1 2 3 4 5 6 7 |
#!/usr/bin/env python import RPi.GPIO as GPIO gpio_pin_number=20 GPIO.setmode(GPIO.BCM) # BCM pin numbering GPIO.setwarnings(False) GPIO.setup(gpio_pin_number, GPIO.OUT) GPIO.output(gpio_pin_number, GPIO.LOW) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess from subprocess import Popen, PIPE pin_number=20 proc = Popen( "echo %s > /sys/class/gpio/export" % pin_number, shell=True, stdout=PIPE, stderr=PIPE ) proc.wait() proc = Popen( "cat /sys/class/gpio/gpio%s/value" % pin_number, shell=True, stdout=PIPE, stderr=PIPE ) proc.wait() res = proc.communicate() # get tuple('stdout', 'stderr') count = res[0].replace("\n","") count = int(count) if count == 0: id=0 else: print('1').replace("\n","") |
Для лампы скрипты полностью аналогичны, только смените pin, на который вы подключаете сигнальный провод реле лампы. Делаем все скрипты исполняемыми, при необходимости ставим питоновские библиотеки для корректного исполнения скриптов.
Перезапускаем homebridge:
1 |
# service homebridge restart |
Заходим в айфон, в приложение дом — должны появиться 2 новых девайса.
Ура! Реле подключены как управляемые выключатель (switch) и лампа. Все, теперь мы владельцы сертифицированного и одобренного Apple вентилятора 89-го года выпуска и умнейшей диодной лампы за 32 рубля!
Шугар-он-топ
«Где же обещанные маты?» — спросите вы. Все просто:
снова идем в приложение Дом, нажимаем на плюсик, добавляем сценарий, выбираем пользовательский и именуем сценарий как хотим. Тоже самое касается девайсов. Их можно переименовывать как угодно. Стоит учесть регистр — иногда он влияет на результат распознания. В процессе распознания Siri пишет с заглавной только первое слово, а при именовании сценария — заглавная буква вылезает после каждого пробела.
Также хочу привести пример возможных команд по управлению устройствами для Siri. Хоть пример и на английском, но думаю, вам не составит труда перевести эти незамысловатые фразы:
“Turn on the lights” or “Turn off the lights.”
“Dim the lights” or “Set the brightness to 50%.”
“Set the temperature to 68 degrees.”
“Turn on the coffee maker.”
“Turn on the upstairs lights.”
“Turn off Chloe’s light.”
“Turn down the kitchen lights”
“Dim the lights in the dining room to 50%.”
“Make the living room lights the brightest.”
“Set the Tahoe house to 72 degrees.”
“Set the thermostat downstairs to 70.”
“Turn on the printer in the office.”
“Set up for a party, Siri.”
“Set the dinner scene.”
“Set my bedtime scene.”
Последние 3 фразы относятся к сценариям.
Ложка дегтя в бочке меда
Увы, сейчас нет возможности (может, мы об этом не знаем) нормально работать с Siri через SiriProxy.
С точки зрения мата, да и вообще произвольных речевых конструкций, SiriProxy — полная свобода действий. В ней можно было закладывать в свои программы различные фразы, проксируя распознанные запросы. Это было шикарно 🙂
Но, увы, протокол и логику Siri несколько переписали и с 7 версии IOS и выше SiriProxy работает в холостую. Согласитесь, жить на IOS6 сейчас будет несколько проблемно. Но мы не расстраиваемся и ждем очередной дыры подарков от Apple в использовании функционала на свое усмотрение!
Приветствую.
Данная инструкция работает для RPi2 или только для RPi3?
Будет работать на любом микрокомпьютере с процессором ARM.
Ставил на pi zero, pi3, orange pi plus2, banana.
Здравствуйте, не подскажете:
Все настроил, работает на ура, но только при ручном запуске homebridge -D
Если же перезагрузить малинку, то при запуске также все запускается без ошибок, но iPhone не видит моста. В логах показывается успешный запуск, в процессах — homebridge запущен также, в логах ошибок — ничего нет.
Как понимаю все запущено и работает. Также на компьютере пробую открыть в браузере http://192.162.x.x:port тоже открывает белый экран с ответом 200.
Т.е. по факту все работает вроде, но iphone не видит моста, когда его запускает юзер homebridge после перезагрузки. А если сделать service homebridge stop а потом homebridge -D, то iPhone сново видит мост.
В чем может быть проблема?
с вашего описания — похоже нахватает прав. вы в ручном режиме запускаете из под рута?
а сервис из под кого пытается стартовать homebridge?
Для чистоты эксперимента можете настроить и проинсталлировать все с руторскими правами. После этого если все функционировать начинать заниматься безопасностью
Спасибо за ответ! Посмотрите, пожалуйста: https://ibb.co/e2mi2v
Добавил 2 моста с разными именами/mac/pin чтобы убедиться в работе первого.
Мост iBridge — запускаю из под рута, вместе с ним его аксессуары включаются успешно
Мост iBridge2 — запускается по крону, тоже становится активным, но его аксессуары не включаются. Подозрение, что питон скрипты не отвечают.
Скрипты, конфиги все идентичные. Относительно пользователя, под которым запускает /init.d/ его сделал по инструкции https://github.com/nfarina/homebridge/wiki/Homebridge-autostart-at-boot-(init.d)-on-Ubuntu-(linux)
Большие сомнения, что мост и все работают, а вот python не отвечает..
Да, в ручном режиме из под root-а запускаю
Заметил вот такое в /var/log/homebridge.err
https://pastebin.com/MeK6JKjF
писал Вам на почту, еще раз продублирую: перешлите питоновские скрипты и дайте вывод прав на них и вывод прав на файлы конфигураций и желательно директории конфигураций (ls -al). у вас недостаточно прав в каких то файлах или директориях. пользователь homebridge, как я понял, а файлы скорее всего были созданы из под рута.
Мучаюсь с аналогичной проблемой. Подскажите, как Вам удалось ее решить?
Здравствуйте. Хочу заказывать «Малинку». Если не трудно, посмотрите по ссылке (как вариант) это то, что сейчас самое новое или есть ещё новее?? Стоит это брать? Спасибо.
https://m.banggood.com/ru/4-In-1-Raspberry-Pi-3-Model-B-V31-Acrylic-Case-Pi-Fan-Aluminum-Heatsink-Set-p-1048293.html?admitad_uid=c2edee64f0ad36d58ec3c528b8c54e08
Здравствуйте. Новее нет, только Pi Zero W, но это совсем другая весовая категория.
по поводу этого выбора — корпус ужасный, максимум что с ним можно сделать — поставить на стол.
кулер вам не потребуется — малина и так нормально себя чувствует (плюс этот кулер еще и займет питание если вы его включите на пины).
радиаторы без термоскотча — тоже считайте мимо. сами будете потом искать термоскотч или нормальную пасту?)
если вы живете в центральной части россии — закажите в москве с гарантией год за 2800-2900р
нормальная английская версия будет.
а стоит или нет — сами определяйтесь зачем она вам: если поиграть — тогда сколько не жалко денег, столько и тратьте. в целях развития и обучения на стенде — нормальный вариант — со временем пустите может в какой проект. Должна быть цель 🙂
Спасибо. Цель..😀 Пробовать создать «Умный» дом.. Сначало в виде стенда, потом установка «на место»..Поэтому и в корпусе сиотрел.. Поэксперементировать так сказать.. Смотрел связку Вера и малинка.. но так понял, Вера и не обязательна. .можно привязывать датчики сразу к малинке?..
Извиняюсь за пару оЧепяток.. Ещё вопрос, а там по ссылке- Китайская версия??😀 Дайте пожалуйста ссылку , где купить. Если они в регионы высылают конечно..
Спасибо за подробное описание! В сети крайне мало толковых материалов на русском языке. Подскажите как можно объеденить малину с установленным node js с реле по wifi через esp8266
Добрый день!
Подскажите пож. можно ли как-то вызывать по http те устройства, что работают на Homebridge. Предположим завели мы в Apple Home Kit универсальный пульт ДУ Broadlink rm pro, через Сири все работает, но вот хотелось бы эти устройства из виртуального устр-ва на Fibaro HC2 запустить. Можно ли такое сделать не подскажете?
Добрый день!
Подскажите, развернул homebridge по инструкции (огромное Вам спасибо) на одном устройстве добавил в дом аксессуары, а вот на втором устройстве под другим apple id не удается добавить сначало пишет что не может добавить а потом говорит что устройство уже добавлено. в чем может быть проблема
Здравствуйте!
Все установил, все работает, но при попытке обновления состояния лампочки (светодиод подключенный напрямую к 20-му пину GPIO) всегда показывает «Вкл» и в командной строке сразу всплывает «[cmdSwitch2] лампочка is on», хотя в этот момент 20-й пин GPIO в положении LOW (лампочка соответственно не горит). В чем может быть проблема?
P.s. Скрипты просто копировал и вставлял, поменял только «вентелятор» на «лампочка»
Доброе время суток! В этой схеме можно подключить отдельный внешний включатель
Здравствуйте, есть Raspberry pi3B+ на нем установлен retropie хотелось бы чтобы там еще крутился homebridge получится это сделать как вы описали выше? На русском информацию не нашел на каком то немецком форуме вроде пишут что можно, я в этом не силен нужна помощь. Спасибо.
У меня не работает(пишет недоступно) и когда я делал в автозагрузку вылезала ошибка.